feat: server-side rpc_request_set_smart_tag shadow — flip testify around the request handler so client auto-mark requests stop dying in the server's aim-cone/LOS re-check at packet arrival (OMNI-CONFIRM measured 34% silent rejects, heaviest on ranged breeds); armed from SmartTagSystem:update hook_safe so it installs in the server state too (client ticks never run there); OMNI-BOOT probe proves whether/where mod code executes
This commit is contained in:
@@ -36,7 +36,48 @@ local CANCEL_INTERVAL = 0.5
|
|||||||
-- (_generate_tag_id -> _create_tag_locally -> group limit -> rpc to clients) minus the gate.
|
-- (_generate_tag_id -> _create_tag_locally -> group limit -> rpc to clients) minus the gate.
|
||||||
local function ensure_automark_tag_hook()
|
local function ensure_automark_tag_hook()
|
||||||
local smart_tag_system = context.smart_tag_system
|
local smart_tag_system = context.smart_tag_system
|
||||||
if not smart_tag_system or mod.omni_hack_patched_sys == smart_tag_system then
|
if not smart_tag_system then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if smart_tag_system._is_server then
|
||||||
|
if mod.omni_rpc_patched_sys == smart_tag_system then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local orig_rpc = smart_tag_system.rpc_request_set_smart_tag
|
||||||
|
if type(orig_rpc) ~= "function" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- SERVER STATE: clients' mark requests land here and die in _tagger_is_looking_at_target
|
||||||
|
-- (OMNI-CONFIRM measured 34% of outgoing auto-mark requests silently rejected: the server
|
||||||
|
-- re-checks aim cone + LOS at packet-arrival time, by which time the player has turned).
|
||||||
|
-- Rawset-shadow the handler on this instance and flip GameParameters.testify around the
|
||||||
|
-- synchronous original call so the look-check short-circuits; everything else in the
|
||||||
|
-- handler (templates, group limits, start(), rpc broadcast, telemetry) runs untouched.
|
||||||
|
-- Other testify consumers (dialogue, backend, talent, triggers) do not execute inside
|
||||||
|
-- this synchronous window.
|
||||||
|
local patched_rpc = function(self, channel_id, template_name_id, ...)
|
||||||
|
if mod_settings.debug_mode and not mod.omni_rpc_shadow_fired then
|
||||||
|
mod.omni_rpc_shadow_fired = true
|
||||||
|
mod:diag("OMNI-RPC-SHADOW FIRE (server-side testify window)")
|
||||||
|
end
|
||||||
|
local target_game_object_id, target_level_index, target_location = ...
|
||||||
|
local saved_testify = GameParameters.testify
|
||||||
|
GameParameters.testify = true
|
||||||
|
local ok = pcall(function()
|
||||||
|
orig_rpc(self, channel_id, template_name_id, target_game_object_id, target_level_index, target_location)
|
||||||
|
end)
|
||||||
|
GameParameters.testify = saved_testify
|
||||||
|
if not ok and mod_settings.debug_mode and not mod.omni_rpc_shadow_err_logged then
|
||||||
|
mod.omni_rpc_shadow_err_logged = true
|
||||||
|
mod:diag("OMNI-RPC-SHADOW orig handler threw")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rawset(smart_tag_system, "rpc_request_set_smart_tag", patched_rpc)
|
||||||
|
mod.omni_rpc_patched_sys = smart_tag_system
|
||||||
|
mod:diag("OMNI-RPC-SHADOW INSTALLED on server-state system")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if mod.omni_hack_patched_sys == smart_tag_system then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local orig_set_tag = smart_tag_system.set_tag
|
local orig_set_tag = smart_tag_system.set_tag
|
||||||
@@ -97,6 +138,17 @@ local function ensure_automark_tag_hook()
|
|||||||
end
|
end
|
||||||
mod.ensure_automark_tag_hook = ensure_automark_tag_hook
|
mod.ensure_automark_tag_hook = ensure_automark_tag_hook
|
||||||
|
|
||||||
|
-- the server-side state never runs our auto_hack/mark ticks (no local player), so arm the
|
||||||
|
-- rpc-handler shadow from the tag system's own per-frame update, which runs in every state.
|
||||||
|
mod:hook_safe(CLASS.SmartTagSystem, "update",
|
||||||
|
function(self, ...)
|
||||||
|
if not mod.omni_update_hook_seen then
|
||||||
|
mod.omni_update_hook_seen = true
|
||||||
|
mod:diag("OMNI-BOOT smart_tag_system:update seen, is_server=", tostring(self._is_server), " ctx_same=", tostring(self == context.smart_tag_system))
|
||||||
|
end
|
||||||
|
ensure_automark_tag_hook()
|
||||||
|
end)
|
||||||
|
|
||||||
local function servo_skull_mark_callback()
|
local function servo_skull_mark_callback()
|
||||||
local smart_tag_system = context.smart_tag_system
|
local smart_tag_system = context.smart_tag_system
|
||||||
if not smart_tag_system then
|
if not smart_tag_system then
|
||||||
|
|||||||
Reference in New Issue
Block a user