- Status
- Offline
- Joined
- Mar 3, 2026
- Messages
- 421
- Reaction score
- 7
CryEngine internals are always a headache when it comes to server-side rate limiting.
I have been digging through some older sources for a private build and I am hitting a wall with the hit registration logic. Specifically, when the rate of fire is pushed beyond the intended limits or when simulating high-frequency hits, the server-side check triggers an immediate kick from the room.
The current implementation for sending hits relies on the RequestHit function within the GameRules. Here is the core structure being used:
The Technical Conflict
The server monitors the frequency of these packets. If you are calling RequestHit too frequently—standard for "Magic Bullet" or high-ROF exploits—the server-side logic flags it as a flood. The timeStamp multiplier (currently * 10.f) might also be causing desync issues if the server expects a different clock synchronization.
Points for Optimization:
Has anyone found the hard limit for hit requests on these older CryEngine builds without catching a kick?
I have been digging through some older sources for a private build and I am hitting a wall with the hit registration logic. Specifically, when the rate of fire is pushed beyond the intended limits or when simulating high-frequency hits, the server-side check triggers an immediate kick from the room.
The current implementation for sending hits relies on the RequestHit function within the GameRules. Here is the core structure being used:
Code:
HitInfo info;
info.shooterId = p_actor->m_entityId;
info.targetId = pTarget->GetEntityId();
info.projectileId = dwProjectileId;
info.material = pGameRules->GetHitMaterialId(HitMaterial(pTarget, ClassName));
info.type = pGameRules->GetHitTypeId("bullet"); // supports: melee, melee_secondary, bullet
info.partId = nPartId;
info.pos = vPos;
info.dir = info.pos - movement.weaponPosition;
info.distance = 0.1f;
info.dir = info.dir / info.distance;
info.shootPos = movement.weaponPosition;
info.itemId = p_curet_items->GetItemId();
info.itemType = 100;
info.normal = info.dir * -1.f;
info.timeStamp = IGameFramework::Singleton()->GetCurrTimeMillis() * 10.f;
pGameRules->RequestHit(&info);
The Technical Conflict
The server monitors the frequency of these packets. If you are calling RequestHit too frequently—standard for "Magic Bullet" or high-ROF exploits—the server-side logic flags it as a flood. The timeStamp multiplier (currently * 10.f) might also be causing desync issues if the server expects a different clock synchronization.
Points for Optimization:
- Throttling: We need to find the maximum allowed packets-per-second (PPS) the server accepts before the kick trigger.
- Bullet Manipulation: Instead of increasing the number of requests, we should look into whether the material or partId can be spoofed to maximize damage per single request.
- Timestamp Accuracy: Verify if the GetCurrTimeMillis sync is actually matching the server's tick rate.
Has anyone found the hard limit for hit requests on these older CryEngine builds without catching a kick?