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: 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 Taiwanzh-tworiginal), 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
- 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_nEffectGroupis 0. - 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.
- Resist Break does nothing (read). Its row sets state 19, and neither the server nor the client reads state 19.
- 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_fGAAFof 0 counts as 1.0, so they roll the launcher's full damage.
- 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(bulletitemrow 155), with the Full Moon oneibdbr36(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.dbcalls them "Power Grenade", "Full Moon Power Grenade" and "Slim Power Grenade[Cash]". - rfdatabase.net/ammo/stun-grenade agrees: Grenade Launcher B/C/D (
m_strBulletTypeMNO), "Make your target opponent to faint by using light shocking wave" (the en-ph text). - Their
m_strEffectIndexis "6", which isbulletitemeffectcode6, named "Stun".
- The retail English client names these rows "Stun Grenade", "??? Stun Grenade" and "Slim Stun Grenade[Cash]". The Taiwan name is 動力榴彈.
- How the effect row is found (read).
gamedata.(*Data).loadBulletEffectMap0x1404ea2a0matchesbulletitem.m_strEffectIndextobulletitemeffect.m_strCodeas lower-cased text (SQL at0x140c09394and0x140c09c60).BulletEffect0x1404ea080reads the row withsfEffect("bulletitemeffect", 3, row).(*Server).applyRoundEffects0x14079fbc0runsapplyBulletEffect0x14079f2a0on the round's hit targets. It is called fromhandleAttack(0x1407dff1a),handleAttackSkill,meleeSpreadSwingandpvpMeleeAttack. - No stun (read).
applyBulletEffectreturns when the effect's temp type (+0x78) and continuous type (+0x48) are both −1. Row 5, code6"Stun", has both at −1, and every parameter is −1 too.- Stun exists elsewhere:
applySFTempEffect0x1408345e0dispatches on the temp type through the table at0x140dceb20, and entry 23 (0x140834719) callssfTempStunEffect0x1408f5280→stunTarget. In the DB, type 23 is on the class skills410ECCompoundSiege and410EFMightblastSiege. bulletitemeffectonly uses the temp types −1, 3, 7, 8, 9, 10, 24 and 25.
- Stun exists elsewhere:
- No splash (read).
meleeSpreadShapesplashes only forbulletAoEgroups 5 and 6 (frombulletitem.m_nEffectGroup). All three Stun Grenade rows are 0. - Damage is right (read). The NPC rows have
m_fGAAF1.5 and the cash row 2.0, the same as the Taiwan client'sItem.edf(240-byte bullet records,+0x9C).
2. Mental Break: state 4 where the text means state 3
- Items (read):
ibfir55Mental Break,ibdbr35"??? Mental Break",ibcsb13Slim Mental Wave[Cash]: effect5, a 30 s continuous effect that setsstate[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 forstate[0..4]. The target's client does:- Its state handler
0x440690counts each state on a byte of the avatar's effect block. - Its skill/force use check
0x414670refuses 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_nContEffectType0 (harmful), 3 =m_nContEffectType1 (helpful). - The client maps the states as: 0 attack skills, 1 attack forces, 2 helpful skills, 3 helpful forces, 4 harmful forces.
- Its state handler
- 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.dbmakes the item do the opposite of its text.
3. Resist Break does nothing
- Items (read):
ibfir60Resist Break,ibdbr40"??? Register Break",ibcsb18Slim Resist Break[Cash]: effectA, 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.pvpBlocksreads state 11, andregenPoolsreads 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.
- On the server,
4. Healing and Cure Grenades only reach enemies
- Items (read):
ibfir82Healing Grenade andibcsb26Slim Healing Grenade[Cash] (effect14: temp type 3,m_fTempValue0.1, "It heals the target's HP for a certain amount").ibfir81Cure Grenade andibcsb25(effect13: temp type 9, "It removes the target's latest curse force"). All of them havem_nEffectGroup6 (splash) andm_fGAAF0. - Whom the shot reaches (read). The grenade is fired as a normal attack. Its splash admits targets through
aoeAdmits0x1407802c0:- a live, unpetrified monster;
- a player of the same race, only when the shooter is in Chaos mode (
inChaos0x1408fdbe0); - a player of another race, only where
pvpAllowed0x14090fde0.
- Whom the heal reaches (read).
applySFTempEffectresolves the hit target withinstantTarget0x14095b3c0→castTarget0x1408a9ba0→(*world).playerBySerial. A monster's serial finds no player, so a monster gets nothing. The heal issfTempPoolInc0x14095b540→raisePool+sendVitals, and the cure issfTempLateDamageRemove. - The damage (read).
bulletFactor0x1408f3020returns 1.0 whenm_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) setsplus[0],plus[1](melee and ranged hit −30, both work), andplus[2],plus[30]andplus[31], which nothing reads. - Acid Shower (code
7) setsrate[0],rate[1]andrate[4](melee, ranged and force attack −50 %, all work), andrate[2]andrate[3], which nothing reads. - The Snow Batteries'
state[7]has no server reader.
- Smog Grenade (code
- 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]; meleerate[0]works throughmonsterMelee); - 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).
- Smog Grenade (hit rate), Microrom Gas (
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 check0x51f350use 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 inregenPools. - The server checks none of these when the target acts, so a modified client ignores them.
- 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
- 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
6a stun: temp type 23 with a duration inbulletitemeffect, or map it tosfTempStunEffectin code.sfTempStunEffectlooks up monsters itself (monsterByIndex), so it isn't limited to players like the other temp handlers. We didn't trace whetherapplyBulletEffect's arguments reach it for a monster target. - Make the three Stun Grenade rows splash (
m_nEffectGroup6, like the other launcher splash ammo), as 4.151 says.
- Give effect
- Mental Break: set effect
5'sm_nContParamIndexto 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.