mirror of
https://github.com/IntQuant/noita_entangled_worlds.git
synced 2025-10-19 07:03:16 +00:00
Perk sync
This commit is contained in:
parent
ca80f1ac60
commit
b321f7e3f0
8 changed files with 142 additions and 14 deletions
|
@ -323,5 +323,9 @@
|
|||
volume_autofade_speed="0.05"
|
||||
></AudioLoopComponent>
|
||||
|
||||
|
||||
<VariableStorageComponent
|
||||
_tags="ew_current_perks"
|
||||
value_string=""
|
||||
>
|
||||
</VariableStorageComponent>
|
||||
</Entity>
|
|
@ -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
|
|
@ -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
65
files/src/perk_fns.lua
Normal 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
|
|
@ -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
18
files/src/util.lua
Normal 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
|
16
init.lua
16
init.lua
|
@ -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
|
||||
|
|
30
todo.txt
30
todo.txt
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue