Old School Ops

RF455-100 RF 4.55: grenade effects: the Stun Grenade neither stuns nor splashes, Mental Break and Resist Break are wrong, heal grenades can't heal allies

Game server RF Online: Dragonborn v0.4.0 low · filed by cybercyber
New

Game: RF 4.55 (Dragonborn), server v0.4.0, Windows build (stock gameserver.exe). Client: the supported Taiwan build, RF_Online.bin SHA-256 46528aac…2bbc558 (2025-07-16), Language=Taiwan. Expected:

  • Wiki: Update 4.151 "Ataraxia's Arrival" gives the Stun Grenade AoE. Update 4.55 "Dragonborn" cuts its big hits by 30 % (cash) and 40 % (NPC), so it is still a stun weapon in 4.55.
  • For the other grenades, their own item texts in the retail client (DataTable\en-ph\NDItem.edf, and the Taiwan zh-tw original), quoted per item below.

v0.4.0 applies a bullet's effect on every hit, so most grenades now work. This report covers the ones that don't. Each finding says how it is known. Read means from code (gameserver.exe symbols, the client disassembly) or from the data (gamedata_rf455.db, the client's DataTable). The per-effect table is from our read-only ammo_audit.py, which matches every bulletitem to its bulletitemeffect row and each slot to the v0.4.0 function that reads it.

Summary

  1. The Stun Grenade never stuns and never splashes (read). Its effect row "Stun" is empty, no bullet effect uses the server's stun type 23, and its m_nEffectGroup is 0.
  2. Mental Break blocks the wrong forces (read). Its text says the target can't use helpful lasting (support) forces. Its row sets state 4, which the client treats as "no harmful forces". The helpful-forces state is 3.
  3. Resist Break does nothing (read). Its row sets state 19, and neither the server nor the client reads state 19.
  4. Healing and Cure Grenades can't heal or cure an ally (read).
    • They hit like any shot. Outside Chaos mode the shot and its splash only take monsters and enemy players.
    • The heal or cure lands only on a player. So on a monster the grenade only does damage, and on an enemy player in a PvP zone it does full damage and then heals them 10 %.
    • Their m_fGAAF of 0 counts as 1.0, so they roll the launcher's full damage.
  5. Minor (read):
    • Smog Grenade and Acid Shower have slots that nothing reads.
    • Several grenades do nothing to a monster.
    • The state debuffs are enforced only by the target's own client.
    • The DB's English names for the Stun Grenades are "Power Grenade".

1. Stun Grenade

  • Which item (read). The Stun Grenade is ibfir56 (bulletitem row 155), with the Full Moon one ibdbr36 (239) and the Slim Stun Grenade[Cash] ibcsb14 (378).
    • The retail English client names these rows "Stun Grenade", "??? Stun Grenade" and "Slim Stun Grenade[Cash]". The Taiwan name is 動力榴彈. gamedata_rf455.db calls them "Power Grenade", "Full Moon Power Grenade" and "Slim Power Grenade[Cash]".
    • rfdatabase.net/ammo/stun-grenade agrees: Grenade Launcher B/C/D (m_strBulletType MNO), "Make your target opponent to faint by using light shocking wave" (the en-ph text).
    • Their m_strEffectIndex is "6", which is bulletitemeffect code 6, named "Stun".
  • How the effect row is found (read). gamedata.(*Data).loadBulletEffectMap 0x1404ea2a0 matches bulletitem.m_strEffectIndex to bulletitemeffect.m_strCode as lower-cased text (SQL at 0x140c09394 and 0x140c09c60). BulletEffect 0x1404ea080 reads the row with sfEffect("bulletitemeffect", 3, row). (*Server).applyRoundEffects 0x14079fbc0 runs applyBulletEffect 0x14079f2a0 on the round's hit targets. It is called from handleAttack (0x1407dff1a), handleAttackSkill, meleeSpreadSwing and pvpMeleeAttack.
  • No stun (read). applyBulletEffect returns when the effect's temp type (+0x78) and continuous type (+0x48) are both −1. Row 5, code 6 "Stun", has both at −1, and every parameter is −1 too.
    • Stun exists elsewhere: applySFTempEffect 0x1408345e0 dispatches on the temp type through the table at 0x140dceb20, and entry 23 (0x140834719) calls sfTempStunEffect 0x1408f5280 → stunTarget. In the DB, type 23 is on the class skills 410EC CompoundSiege and 410EF MightblastSiege.
    • bulletitemeffect only uses the temp types −1, 3, 7, 8, 9, 10, 24 and 25.
  • No splash (read). meleeSpreadShape splashes only for bulletAoE groups 5 and 6 (from bulletitem.m_nEffectGroup). All three Stun Grenade rows are 0.
  • Damage is right (read). The NPC rows have m_fGAAF 1.5 and the cash row 2.0, the same as the Taiwan client's Item.edf (240-byte bullet records, +0x9C).

2. Mental Break: state 4 where the text means state 3

  • Items (read): ibfir55 Mental Break, ibdbr35 "??? Mental Break", ibcsb13 Slim Mental Wave[Cash]: effect 5, a 30 s continuous effect that sets state[4] = 1.
  • The text (read): en-ph "Discharge opponent's support force by using shocking wave"; TW 發射精神脈衝,限制敵族使用持續助益的輔助能力。 ("restricts the enemy from using lasting helpful support forces").
  • What state 4 does (read; the server sends the state to the hit player as 11/0A, 0x1408a7765). The server has no reader for state[0..4]. The target's client does:
    • Its state handler 0x440690 counts each state on a byte of the avatar's effect block.
    • Its skill/force use check 0x414670 refuses with NDLanguage 139 "Unable to use selected skill/force" when the byte for (skill or force, effect kind) is set.
    • The effect kind is a byte per effect block in SkillForce.edf (record +0x90 + 0x28·k). On every force, skill and class-skill row it matches the DB: 0 = m_bAttackable, 1 = a temp effect, 2 = m_nContEffectType 0 (harmful), 3 = m_nContEffectType 1 (helpful).
    • The client maps the states as: 0 attack skills, 1 attack forces, 2 helpful skills, 3 helpful forces, 4 harmful forces.
  • So Mental Break stops the target's curse forces and leaves their buffs usable, the opposite of its text. Mind Control (code 10, states 0 and 1, "unable to use skill and offensive force") uses the same scheme and matches its text, which supports the reading.
  • This value may come from the retail data. We haven't decoded the client's own copy of this row, so we can't say. Either way, the row in gamedata_rf455.db makes the item do the opposite of its text.

3. Resist Break does nothing

  • Items (read): ibfir60 Resist Break, ibdbr40 "??? Register Break", ibcsb18 Slim Resist Break[Cash]: effect A, 30 s, state[19] = 1. Text: en-ph "Reverse the target opponent's effectiveness of defense by Nanomachine", TW 藉由藥劑,使其敵族所有抗性反轉。 ("reverses all the enemy's resistances").
  • No reader (read).
    • On the server, state[19] has no reader. pvpBlocks reads state 11, and regenPools reads states 10, 15, 16 and 17.
    • On the client, the state handler's jump table (0x440b48) sends state 19 to the default case, which stores nothing.
    • So the effect only shows a buff icon. Nothing in the server computes a "reversed" resistance.

4. Healing and Cure Grenades only reach enemies

  • Items (read): ibfir82 Healing Grenade and ibcsb26 Slim Healing Grenade[Cash] (effect 14: temp type 3, m_fTempValue 0.1, "It heals the target's HP for a certain amount"). ibfir81 Cure Grenade and ibcsb25 (effect 13: temp type 9, "It removes the target's latest curse force"). All of them have m_nEffectGroup 6 (splash) and m_fGAAF 0.
  • Whom the shot reaches (read). The grenade is fired as a normal attack. Its splash admits targets through aoeAdmits 0x1407802c0:
    • a live, unpetrified monster;
    • a player of the same race, only when the shooter is in Chaos mode (inChaos 0x1408fdbe0);
    • a player of another race, only where pvpAllowed 0x14090fde0.
  • Whom the heal reaches (read). applySFTempEffect resolves the hit target with instantTarget 0x14095b3c0 → castTarget 0x1408a9ba0 → (*world).playerBySerial. A monster's serial finds no player, so a monster gets nothing. The heal is sfTempPoolInc 0x14095b540 → raisePool + sendVitals, and the cure is sfTempLateDamageRemove.
  • The damage (read). bulletFactor 0x1408f3020 returns 1.0 when m_fGAAF ≤ 0 (0x1408f304f). The grenade therefore deals the launcher's full damage before healing.
  • Result: outside Chaos mode the Healing Grenade can't heal a party member. It damages a monster without healing it, and it damages an enemy player and then heals them 10 %. The Cure Grenade likewise only "cures" enemies.
  • Inferred: the item texts ("heals the target") and the 0 attack factor suggest a support item meant for allies. We have no retail capture of how it behaved.

5. Minor

  • Slots with no reader (read, ammo_audit.py).
    • Smog Grenade (code 3) sets plus[0], plus[1] (melee and ranged hit −30, both work), and plus[2], plus[30] and plus[31], which nothing reads.
    • Acid Shower (code 7) sets rate[0], rate[1] and rate[4] (melee, ranged and force attack −50 %, all work), and rate[2] and rate[3], which nothing reads.
    • The Snow Batteries' state[7] has no server reader.
  • On monsters (read). These effects have no monster reader, so a monster keeps the icon only:
    • Smog Grenade (hit rate), Microrom Gas (plus[20] speed), Virus Inject (rate[18]);
    • Acid Shower's ranged and force parts (rate[1], rate[4]; melee rate[0] works through monsterMelee);
    • Mental Break, Resist Break, Flash Wave and Mind Control (states 4, 19, 18, 0 and 1);
    • Limited Force and Breaking Strength (states 16, 17);
    • every temp effect (Shock Wave, Impact Explosion, the FP/SP cuts).

The ones that work on a monster are Acid Grenade (defence), Piklin Grenade (critical), Acid Shower (melee attack) and Holding Web (moveLocked 0x1408c2280 reads state 6). The TW texts say these grenades act on 敵族 ("the enemy race"), so the monster side may be by design (inferred).

  • States enforced only by the client (read).
    • Mind Control and Mental Break (the skill/force check above), Holding Web (the client's move lock, as for the class skill Magnetic Net), and Flash Wave are applied by the hit player's own client only. Flash Wave's state[18] makes the client's visibility check 0x51f350 use a view limit of 0, so the other characters aren't drawn.
    • Limited Force and Breaking Strength also make the client refuse FP and Stamina potions (0x41ec60, NDLanguage 158). The server reads their states 16 and 17 in regenPools.
    • The server checks none of these when the target acts, so a modified client ignores them.
  • Names (read). The DB's English names for the Stun Grenade rows are "Power Grenade"; the retail English client calls them "Stun Grenade".

Suggested fix

  • Stun Grenade:
    • Give effect 6 a stun: temp type 23 with a duration in bulletitemeffect, or map it to sfTempStunEffect in code. sfTempStunEffect looks up monsters itself (monsterByIndex), so it isn't limited to players like the other temp handlers. We didn't trace whether applyBulletEffect's arguments reach it for a monster target.
    • Make the three Stun Grenade rows splash (m_nEffectGroup 6, like the other launcher splash ammo), as 4.151 says.
  • Mental Break: set effect 5's m_nContParamIndex to 3 (no helpful forces), if the retail behaviour is the one its text describes.
  • Resist Break: implement state 19, as resistances reversed or negated in the element/resistance reader (elementTol), or confirm it is cut.
  • Healing / Cure Grenades: let them reach allies (same-race players and the party within the splash), and skip the damage roll for a 0 attack factor instead of treating 0 as 1.0.
  • Optional: rename the Stun Grenade rows to the retail names; add server-side checks for the client-only states.

Local workaround

None.

Reported on version 0.4.0

Replies

Nobody has replied yet.

Sign in to comment.

Top xp sources

How xp works
Loading…

Open the full search page