give auth to holder of items, give auth to closest player if item is far away, hopefully these fix items being messed up

This commit is contained in:
bgkillas 2024-11-24 01:13:47 -05:00
parent 91c3f20747
commit d98c63cdfa
2 changed files with 75 additions and 18 deletions

View file

@ -86,7 +86,7 @@ end
local function allocate_global_id()
local current = tonumber(GlobalsGetValue("ew_global_item_id", "1"))
GlobalsSetValue("ew_global_item_id", tostring(current + 1))
return ctx.my_player.peer_id .. ":" .. current
return ctx.my_id .. ":" .. current
end
-- Try to guess if the item is in world.
@ -242,6 +242,31 @@ local function is_my_item(gid)
return string.sub(gid, 1, 16) == ctx.my_id
end
function item_sync.take_authority(gid)
if not is_my_item(gid) then
local new_id = allocate_global_id()
rpc.give_authority_to(gid, new_id)
end
end
rpc.opts_everywhere()
rpc.opts_reliable()
function rpc.give_authority_to(gid, new_id)
local item = item_sync.find_by_gid(gid)
if item ~= nil then
local var = EntityGetFirstComponentIncludingDisabled(item, "VariableStorageComponent", "ew_global_item_id")
ComponentSetValue2(var, "value_string", new_id)
end
end
rpc.opts_reliable()
function rpc.hand_authority_over_to(peer_id, gid)
if peer_id == ctx.my_id then
item_sync.take_authority(gid)
end
end
rpc.opts_reliable()
function rpc.handle_death_data(death_data)
for _, remote_data in ipairs(death_data) do
@ -304,30 +329,58 @@ local DISTANCE_LIMIT = 128 * 4
local function send_item_positions(all)
local position_data = {}
local cx, cy = EntityGetTransform(ctx.my_player.entity)
for _, item in ipairs(EntityGetWithTag("ew_global_item")) do
local gid = item_sync.get_global_item_id(item)
-- Only send info about items created by us.
if is_my_item(gid) and is_item_on_ground(item) then
local phys_info = util.get_phys_info(item, true)
local x, y = EntityGetTransform(item)
if ((phys_info[1] ~= nil and phys_info[1][1] ~= nil)
or (phys_info[2] ~= nil and phys_info[2][1] ~= nil)
or all)
and (#EntityGetInRadiusWithTag(x, y, DISTANCE_LIMIT, "ew_peer") ~= 0
or #EntityGetInRadiusWithTag(x, y, DISTANCE_LIMIT, "polymorphed_player") ~= 0) then
local costcom = EntityGetFirstComponentIncludingDisabled(item, "ItemCostComponent")
local cost = 0
if costcom ~= nil then
cost = ComponentGetValue2(costcom, "cost")
local mx, my = GameGetCameraPos()
if math.abs(mx - x) < 1024 and math.abs(my - y) < 1024
and EntityGetFirstComponentIncludingDisabled(item, "VariableStorageComponent", "ew_try_stealable") then
ComponentSetValue2(costcom, "stealable", true)
local dx, dy = x - cx, y - cy
if dx * dx + dy * dy > 1024 * 1024 then
local ent = EntityGetClosestWithTag(x, y, "ew_peer")
local nx, ny
local ndx, ndy
if ent ~= 0 then
nx, ny = EntityGetTransform(ent)
ndx, ndy = x - nx, y - ny
end
if ent == 0 or ndx * ndx + ndy * ndy > DISTANCE_LIMIT * DISTANCE_LIMIT then
ent = EntityGetClosestWithTag(x, y, "polymorphed_player")
if ent ~= 0 then
nx, ny = EntityGetTransform(ent)
ndx, ndy = x - nx, y - ny
end
if ent == 0 or ndx * ndx + ndy * ndy > DISTANCE_LIMIT * DISTANCE_LIMIT then
goto continue
end
end
position_data[gid] = {x, y, phys_info, cost}
local data = player_fns.get_player_data_by_local_entity_id(ent)
if data ~= nil then
local peer = data.peer_id
rpc.hand_authority_over_to(peer, gid)
end
else
local phys_info = util.get_phys_info(item, true)
if ((phys_info[1] ~= nil and phys_info[1][1] ~= nil)
or (phys_info[2] ~= nil and phys_info[2][1] ~= nil)
or all)
and (#EntityGetInRadiusWithTag(x, y, DISTANCE_LIMIT, "ew_peer") ~= 0
or #EntityGetInRadiusWithTag(x, y, DISTANCE_LIMIT, "polymorphed_player") ~= 0) then
local costcom = EntityGetFirstComponentIncludingDisabled(item, "ItemCostComponent")
local cost = 0
if costcom ~= nil then
cost = ComponentGetValue2(costcom, "cost")
local mx, my = GameGetCameraPos()
if math.abs(mx - x) < 1024 and math.abs(my - y) < 1024
and EntityGetFirstComponentIncludingDisabled(item, "VariableStorageComponent", "ew_try_stealable") then
ComponentSetValue2(costcom, "stealable", true)
end
end
position_data[gid] = {x, y, phys_info, cost}
end
end
end
::continue::
end
rpc.update_positions(position_data, all)
if #dead_entities > 0 then
@ -350,6 +403,7 @@ function item_sync.on_world_update_host()
and EntityHasTag(EntityGetRootEntity(picked_item), "ew_peer") then
local gid = item_sync.get_global_item_id(picked_item)
item_sync.host_localize_item(gid, ctx.my_id)
item_sync.take_authority(gid)
end
remove_client_items_from_world()
end
@ -369,6 +423,7 @@ function item_sync.on_world_update_client()
and EntityHasTag(EntityGetRootEntity(picked_item), "ew_peer") then
local gid = item_sync.get_global_item_id(picked_item)
rpc.item_localize_req(gid)
item_sync.take_authority(gid)
end
remove_client_items_from_world()
end
@ -577,7 +632,7 @@ function rpc.update_positions(position_data, all)
util.log("Requesting again "..gid)
if wait_for_gid[gid] == nil then
rpc.request_send_again(gid)
wait_for_gid[gid] = GameGetFrameNum() + 120
wait_for_gid[gid] = GameGetFrameNum() + 300
end
end
end

View file

@ -28,7 +28,9 @@ function player_color(player_entity)
return
end
ComponentSetValue( player_sprite_component, "image_file", player_sprite_file )
ComponentSetValue( player_sprite_component_lukki, "image_file", player_sprite_file_lukki )
if player_sprite_component_lukki ~= nil then
ComponentSetValue( player_sprite_component_lukki, "image_file", player_sprite_file_lukki )
end
local player_arm_sprite_file = "mods/quant.ew/files/system/player/tmp/" .. ctx.my_id .. "_arm.xml"
ComponentSetValue( player_arm_sprite_component, "image_file", player_arm_sprite_file )