Perk sync

This commit is contained in:
IQuant 2024-05-07 23:46:15 +03:00
parent ca80f1ac60
commit b321f7e3f0
8 changed files with 142 additions and 14 deletions

View file

@ -323,5 +323,9 @@
volume_autofade_speed="0.05"
></AudioLoopComponent>
<VariableStorageComponent
_tags="ew_current_perks"
value_string=""
>
</VariableStorageComponent>
</Entity>

View file

@ -95,4 +95,8 @@ function net.send_player_inventory(inventory_state)
net.send("inventory", inventory_state, true)
end
function net.send_player_perks(perk_data)
net.send("perks", perk_data, true)
end
return net

View file

@ -1,5 +1,6 @@
local player_fns = dofile_once("mods/quant.ew/files/src/player_fns.lua")
local ctx = dofile_once("mods/quant.ew/files/src/ctx.lua")
local perk_fns = dofile_once("mods/quant.ew/files/src/perk_fns.lua")
local net_handling = {
proxy = {},
@ -40,7 +41,15 @@ function net_handling.mod.inventory(peer_id, inventory_state)
end
local player_data = player_fns.peer_get_player_data(peer_id)
player_fns.deserialize_items(inventory_state, player_data)
GamePrint("synced inventory")
-- GamePrint("synced inventory")
end
function net_handling.mod.perks(peer_id, perk_data)
if not player_fns.peer_has_player(peer_id) then
return
end
local player_data = player_fns.peer_get_player_data(peer_id)
perk_fns.update_perks(perk_data, player_data)
end
return net_handling

65
files/src/perk_fns.lua Normal file
View file

@ -0,0 +1,65 @@
dofile_once("data/scripts/perks/perk_list.lua")
local util = dofile_once("mods/quant.ew/files/src/util.lua")
local perk_fns = {}
function perk_fns.get_my_perks()
local perks = {}
for i=1, #perk_list do
local perk_flag_name = get_perk_picked_flag_name(perk_list[i].id)
local perk_count = tonumber(GlobalsGetValue(perk_flag_name .. "_PICKUP_COUNT", "0"))
if perk_count > 0 then
perks[perk_list[i].id] = perk_count
end
end
return perks
end
local function give_one_perk(entity_who_picked, perk_info, count)
-- add game effect
if perk_info.game_effect ~= nil then
local game_effect_comp = GetGameEffectLoadTo( entity_who_picked, perk_info.game_effect, true )
if game_effect_comp ~= nil then
ComponentSetValue( game_effect_comp, "frames", "-1" )
end
end
if perk_info.game_effect2 ~= nil then
local game_effect_comp = GetGameEffectLoadTo( entity_who_picked, perk_info.game_effect2, true )
if game_effect_comp ~= nil then
ComponentSetValue( game_effect_comp, "frames", "-1" )
end
end
if perk_info.func ~= nil then
perk_info.func( 0, entity_who_picked, "", count )
end
end
function perk_fns.update_perks(perk_data, player_data)
local entity = player_data.entity
local current_counts = util.get_ent_variable(entity, "ew_current_perks") or {}
for perk_id, count in pairs(perk_data) do
local current = (current_counts[perk_id] or 0)
local diff = count - current
-- TODO handle diff < 0?
if diff ~= 0 then
local perk_info = get_perk_with_id(perk_list, perk_id)
if perk_info == nil then
print("Unknown perk id: "..perk_id)
goto continue
end
if diff > 0 then
GamePrint("Player " .. player_data.name .. " got perk " .. GameTextGetTranslatedOrNot(perk_info.ui_name))
for i=current+1, count do
give_one_perk(entity, perk_info, i)
end
end
end
::continue::
end
util.set_ent_variable(entity, "ew_current_perks", perk_data)
end
return perk_fns

View file

@ -326,10 +326,12 @@ local player_fns = {
return c
end
end,
make_playerdata_for = function(entity_id)
make_playerdata_for = function(entity_id, peer_id)
GamePrint("Made playerdata for "..entity_id)
return {
entity = entity_id,
peer_id = peer_id,
name = "[Peer "..peer_id.."]",
controls = {},
}
end,
@ -392,7 +394,7 @@ end
function player_fns.spawn_player_for(peer_id, x, y)
GamePrint("Spawning player for "..peer_id)
local new = EntityLoad("mods/quant.ew/files/entities/client.xml", x, y)
local new_playerdata = player_fns.make_playerdata_for(new)
local new_playerdata = player_fns.make_playerdata_for(new, peer_id)
ctx.players[peer_id] = new_playerdata
end

18
files/src/util.lua Normal file
View file

@ -0,0 +1,18 @@
local bitser = dofile_once("mods/quant.ew/files/lib/bitser.lua")
local util = {}
function util.get_ent_variable(entity, key)
local storage = EntityGetFirstComponentIncludingDisabled(entity, "VariableStorageComponent", key)
local value = ComponentGetValue2(storage, "value_string")
if value == "" then
return nil
end
return bitser.loads(value)
end
function util.set_ent_variable(entity, key, value)
local storage = EntityGetFirstComponentIncludingDisabled(entity, "VariableStorageComponent", key)
ComponentSetValue2(storage, "value_string", bitser.dumps(value))
end
return util

View file

@ -12,6 +12,7 @@ local player_fns = dofile_once("mods/quant.ew/files/src/player_fns.lua")
local net = dofile_once("mods/quant.ew/files/src/net.lua")
local ctx = dofile_once("mods/quant.ew/files/src/ctx.lua")
local pretty = dofile_once("mods/quant.ew/files/lib/pretty_print.lua")
local perk_fns = dofile_once("mods/quant.ew/files/src/perk_fns.lua")
function OnProjectileFired(shooter_id, projectile_id, rng, position_x, position_y, target_x, target_y, send_message,
unknown1, multicast_index, unknown3)
@ -72,10 +73,18 @@ local my_player = nil
function OnPlayerSpawned( player_entity ) -- This runs when player entity has been created
GamePrint( "OnPlayerSpawned() - Player entity id: " .. tostring(player_entity) )
my_player = player_fns.make_playerdata_for(player_entity)
my_player = player_fns.make_playerdata_for(player_entity, ctx.my_id)
GamePrint("My peer_id: "..ctx.my_id)
ctx.players[ctx.my_id] = my_player
ctx.ready = true
np.SetPauseState(4)
np.SetPauseState(0)
dofile_once("data/scripts/perks/perk.lua")
local x, y = EntityGetFirstHitboxCenter(player_entity)
perk_spawn(x, y, "LASER_AIM")
perk_spawn(x-50, y, "GLASS_CANNON")
end
function OnWorldPreUpdate() -- This is called every time the game is about to start updating the world
@ -93,8 +102,9 @@ function OnWorldPreUpdate() -- This is called every time the game is about to st
if GameGetFrameNum() % 120 == 0 then
local inventory_state = player_fns.serialize_items(my_player)
net.send_player_inventory(inventory_state)
-- print(pretty.table(inventory_state))
GamePrint("sent inventory sync")
local perk_data = perk_fns.get_my_perks()
-- print(pretty.table(perk_data))
net.send_player_perks(perk_data)
end
-- for i=1,#events do

View file

@ -1,15 +1,31 @@
- Синхронизация перков
+ Синхронизация перков
#- ShotEffectComponent
- Общее хп
- Синхронизация хп
- Проверка окончания игры
- Удаление лишних клиентов при загрузке игры
#- Immunities
#- Sectors
#- Telekenesis
#- Unli
- Fix weird no gui mode
- Figure out what to do with one-off perks,
- remove perks, remove other perks
- Позволить менять сид мира
- Никнеймы игроков
k Лимит на длину сообщения
- Улучшеная синхронизация инвентаря
- ...и текущего предмета
- Улучшеная синхронизация инвентаря и перков
+ ...и текущего предмета
- reliability
+ Сжатие пакетов
- Общее хп
- Синхронизация противников
- Перекидывание предметов
- Синхронизация мира
? Фикс наведения на клиентов
- Проверка окончания игры
- Удаление лишних клиентов при загрузке игры
- fungal shift-ы
- test tangled better
- test tangled better
- poly on clients