mirror of
https://github.com/IntQuant/noita_entangled_worlds.git
synced 2025-10-19 07:03:16 +00:00
Clients can pick up hearts now. Full heal hearts now only heal a part of maximum health according to amount of players
This commit is contained in:
parent
02f441d9cb
commit
2bca59260f
11 changed files with 206 additions and 1 deletions
7
quant.ew/files/append/heart.lua
Normal file
7
quant.ew/files/append/heart.lua
Normal file
|
@ -0,0 +1,7 @@
|
|||
local old_fn = item_pickup
|
||||
|
||||
function item_pickup(entity_item, entity_who_picked, name)
|
||||
GlobalsSetValue("ew_heart_pickup", "normal")
|
||||
|
||||
old_fn(entity_item, entity_who_picked, name)
|
||||
end
|
7
quant.ew/files/append/heart_better.lua
Normal file
7
quant.ew/files/append/heart_better.lua
Normal file
|
@ -0,0 +1,7 @@
|
|||
local old_fn = item_pickup
|
||||
|
||||
function item_pickup(entity_item, entity_who_picked, name)
|
||||
GlobalsSetValue("ew_heart_pickup", "better")
|
||||
|
||||
old_fn(entity_item, entity_who_picked, name)
|
||||
end
|
7
quant.ew/files/append/heart_evil.lua
Normal file
7
quant.ew/files/append/heart_evil.lua
Normal file
|
@ -0,0 +1,7 @@
|
|||
local old_fn = item_pickup
|
||||
|
||||
function item_pickup(entity_item, entity_who_picked, name)
|
||||
GlobalsSetValue("ew_heart_pickup", "evil")
|
||||
|
||||
old_fn(entity_item, entity_who_picked, name)
|
||||
end
|
30
quant.ew/files/append/heart_fullhp.lua
Normal file
30
quant.ew/files/append/heart_fullhp.lua
Normal file
|
@ -0,0 +1,30 @@
|
|||
dofile( "data/scripts/game_helpers.lua" )
|
||||
|
||||
function item_pickup( entity_item, entity_who_picked, name )
|
||||
GlobalsSetValue("ew_heart_pickup", "fullhp")
|
||||
|
||||
local max_hp = 0
|
||||
local healing = 0
|
||||
|
||||
local x, y = EntityGetTransform( entity_item )
|
||||
local player_count = tonumber(GlobalsGetValue("ew_player_count", "1"))
|
||||
|
||||
local damagemodels = EntityGetComponent( entity_who_picked, "DamageModelComponent" )
|
||||
if( damagemodels ~= nil ) then
|
||||
for i,damagemodel in ipairs(damagemodels) do
|
||||
max_hp = tonumber( ComponentGetValue( damagemodel, "max_hp" ) )
|
||||
local hp = tonumber( ComponentGetValue( damagemodel, "hp" ) )
|
||||
|
||||
healing = math.min(max_hp - hp, max_hp / player_count)
|
||||
|
||||
ComponentSetValue( damagemodel, "hp", hp+healing)
|
||||
end
|
||||
end
|
||||
|
||||
EntityLoad("data/entities/particles/image_emitters/heart_fullhp_effect.xml", x, y-12)
|
||||
EntityLoad("data/entities/particles/heart_out.xml", x, y-8)
|
||||
GamePrintImportant( "$log_heart_fullhp", GameTextGet( "$logdesc_heart_fullhp", tostring(math.floor(max_hp*25)), tostring(math.floor(healing*25)) ) )
|
||||
|
||||
-- remove the item from the game
|
||||
EntityKill( entity_item )
|
||||
end
|
42
quant.ew/files/append/heart_fullhp_temple.lua
Normal file
42
quant.ew/files/append/heart_fullhp_temple.lua
Normal file
|
@ -0,0 +1,42 @@
|
|||
dofile( "data/scripts/game_helpers.lua" )
|
||||
|
||||
function item_pickup( entity_item, entity_who_picked, name )
|
||||
GlobalsSetValue("ew_heart_pickup", "temple")
|
||||
|
||||
local max_hp = 0
|
||||
local max_hp_addition = 0.4
|
||||
local healing = 0
|
||||
|
||||
local x, y = EntityGetTransform( entity_item )
|
||||
local player_count = tonumber(GlobalsGetValue("ew_player_count", "1"))
|
||||
|
||||
local damagemodels = EntityGetComponent( entity_who_picked, "DamageModelComponent" )
|
||||
if( damagemodels ~= nil ) then
|
||||
for i,damagemodel in ipairs(damagemodels) do
|
||||
max_hp = tonumber( ComponentGetValue( damagemodel, "max_hp" ) )
|
||||
local max_hp_cap = tonumber( ComponentGetValue( damagemodel, "max_hp_cap" ) )
|
||||
local hp = tonumber( ComponentGetValue( damagemodel, "hp" ) )
|
||||
|
||||
max_hp = max_hp + max_hp_addition
|
||||
|
||||
if ( max_hp_cap > 0 ) then
|
||||
max_hp_cap = math.max( max_hp, max_hp_cap )
|
||||
end
|
||||
|
||||
healing = math.min(max_hp - hp, max_hp / player_count)
|
||||
|
||||
-- if( hp > max_hp ) then hp = max_hp end
|
||||
ComponentSetValue( damagemodel, "max_hp_cap", max_hp_cap)
|
||||
ComponentSetValue( damagemodel, "max_hp", max_hp)
|
||||
ComponentSetValue( damagemodel, "hp", hp+healing)
|
||||
end
|
||||
end
|
||||
|
||||
EntityLoad("data/entities/particles/image_emitters/heart_fullhp_effect.xml", x, y-12)
|
||||
EntityLoad("data/entities/particles/heart_out.xml", x, y-8)
|
||||
GamePrintImportant( "$log_heart_fullhp_temple", GameTextGet( "$logdesc_heart_fullhp_temple", tostring(math.floor(max_hp_addition * 25)), tostring(math.floor(max_hp * 25)), tostring(math.floor(healing * 25)) ) )
|
||||
--GameTriggerMusicEvent( "music/temple/enter", true, x, y )
|
||||
|
||||
-- remove the item from the game
|
||||
EntityKill( entity_item )
|
||||
end
|
|
@ -96,6 +96,10 @@ function net.send(key, value, reliable)
|
|||
net.send_internal(encoded_msg, DEST_BROADCAST, reliable)
|
||||
end
|
||||
|
||||
function net.send_to_host(key, value, reliable)
|
||||
net.send(key, value, reliable) -- TODO actually only send to host
|
||||
end
|
||||
|
||||
function net.proxy_send(key, value)
|
||||
net.send_internal(key.." "..value, DEST_PROXY)
|
||||
end
|
||||
|
@ -157,7 +161,11 @@ function net.send_localize_request(item_id)
|
|||
end
|
||||
|
||||
function net.send_item_upload(item_data)
|
||||
net.send("item_upload", item_data, true)
|
||||
net.send_to_host("item_upload", item_data, true)
|
||||
end
|
||||
|
||||
function net.send_heart_pickup(heart_pickup)
|
||||
net.send("heart_pickup", heart_pickup, true)
|
||||
end
|
||||
|
||||
return net
|
|
@ -206,4 +206,52 @@ function net_handling.mod.welcome(peer_id, _)
|
|||
ctx.events.new_player_just_connected = true
|
||||
end
|
||||
|
||||
function net_handling.mod.heart_pickup(peer_id, heart_pickup)
|
||||
local multiplier = tonumber( GlobalsGetValue( "HEARTS_MORE_EXTRA_HP_MULTIPLIER", "1" ) )
|
||||
local do_heal_table = {
|
||||
fullhp = true,
|
||||
temple = true,
|
||||
}
|
||||
local max_hp_increase_table = {
|
||||
normal = {1, false},
|
||||
better = {2, false},
|
||||
evil = {2, false},
|
||||
temple = {0.4, true},
|
||||
}
|
||||
local do_heal = do_heal_table[heart_pickup] or false
|
||||
local max_hp_increase = max_hp_increase_table[heart_pickup]
|
||||
|
||||
local hp, max_hp = util.get_ent_health(ctx.my_player.entity)
|
||||
local cap = util.get_ent_health_cap(ctx.my_player.entity)
|
||||
local player_count = tonumber(GlobalsGetValue("ew_player_count", "1"))
|
||||
|
||||
local max_hp_old = max_hp
|
||||
|
||||
if max_hp_increase ~= nil then
|
||||
max_hp = max_hp + max_hp_increase[1] * multiplier
|
||||
local adjust_cap = max_hp_increase[2]
|
||||
if adjust_cap then
|
||||
util.set_ent_health_cap(max_hp)
|
||||
end
|
||||
end
|
||||
|
||||
if do_heal then
|
||||
local healing = math.min(max_hp - hp, max_hp / player_count)
|
||||
hp = hp + healing
|
||||
end
|
||||
|
||||
util.set_ent_health(ctx.my_player.entity, {hp, max_hp})
|
||||
|
||||
local peer_data = player_fns.peer_get_player_data(peer_id)
|
||||
if max_hp ~= max_hp_old and heart_pickup == "evil" then
|
||||
local entity_who_picked = peer_data.entity
|
||||
local x_pos, y_pos = EntityGetTransform( entity_who_picked )
|
||||
local child_id = EntityLoad("data/entities/misc/effect_poison_big.xml", x_pos, y_pos)
|
||||
EntityAddChild(entity_who_picked, child_id)
|
||||
end
|
||||
|
||||
GamePrint("Player "..peer_data.name.." picked up a heart")
|
||||
GameTriggerMusicCue( "item" )
|
||||
end
|
||||
|
||||
return net_handling
|
|
@ -420,6 +420,10 @@ function player_fns.spawn_player_for(peer_id, x, y)
|
|||
local we = GameGetWorldStateEntity()
|
||||
local seen = util.get_ent_variable(we, "player_seen") or {}
|
||||
ctx.events.new_player_seen = seen[peer_id] == nil
|
||||
if ctx.events.new_player_seen then
|
||||
local count = tonumber(GlobalsGetValue("ew_player_count", "1")) + 1
|
||||
GlobalsSetValue("ew_player_count", tostring(count))
|
||||
end
|
||||
seen[peer_id] = true
|
||||
util.set_ent_variable(we, "player_seen", seen)
|
||||
end
|
||||
|
|
|
@ -88,6 +88,23 @@ function util.set_ent_air(entity, air_data)
|
|||
end
|
||||
end
|
||||
|
||||
function util.get_ent_health_cap(entity)
|
||||
local damage_model = EntityGetFirstComponentIncludingDisabled(entity, "DamageModelComponent")
|
||||
if damage_model == nil then
|
||||
return 0
|
||||
end
|
||||
local cap = ComponentGetValue2(damage_model, "max_hp_cap")
|
||||
return cap
|
||||
end
|
||||
|
||||
function util.set_ent_health_cap(entity, cap)
|
||||
local damage_model = EntityGetFirstComponentIncludingDisabled(entity, "DamageModelComponent")
|
||||
if damage_model == nil then
|
||||
return 0
|
||||
end
|
||||
ComponentSetValue2(damage_model, "max_hp_cap", cap)
|
||||
end
|
||||
|
||||
function util.lerp(a, b, alpha)
|
||||
return a * alpha + b * (1 - alpha)
|
||||
end
|
||||
|
|
|
@ -22,6 +22,12 @@ local inventory_helper = dofile_once("mods/quant.ew/files/src/inventory_helper.l
|
|||
ModLuaFileAppend("data/scripts/gun/gun.lua", "mods/quant.ew/files/append/gun.lua")
|
||||
ModLuaFileAppend("data/scripts/gun/gun_actions.lua", "mods/quant.ew/files/append/action_fix.lua")
|
||||
|
||||
ModLuaFileAppend("data/scripts/items/heart.lua", "mods/quant.ew/files/append/heart.lua")
|
||||
ModLuaFileAppend("data/scripts/items/heart_better.lua", "mods/quant.ew/files/append/heart_better.lua")
|
||||
ModLuaFileAppend("data/scripts/items/heart_evil.lua", "mods/quant.ew/files/append/heart_evil.lua")
|
||||
ModLuaFileAppend("data/scripts/items/heart_fullhp.lua", "mods/quant.ew/files/append/heart_fullhp.lua")
|
||||
ModLuaFileAppend("data/scripts/items/heart_fullhp_temple.lua", "mods/quant.ew/files/append/heart_fullhp_temple.lua")
|
||||
|
||||
local my_player = nil
|
||||
|
||||
function OnProjectileFired(shooter_id, projectile_id, initial_rng, position_x, position_y, target_x, target_y, send_message,
|
||||
|
@ -113,6 +119,10 @@ end
|
|||
function OnPlayerSpawned( player_entity ) -- This runs when player entity has been created
|
||||
GamePrint( "OnPlayerSpawned() - Player entity id: " .. tostring(player_entity) )
|
||||
|
||||
if GlobalsGetValue("ew_player_count", "") == "" then
|
||||
GlobalsSetValue("ew_player_count", "1")
|
||||
end
|
||||
|
||||
for _, client in pairs(EntityGetWithTag("ew_client")) do
|
||||
GamePrint("Removing previous client: "..client)
|
||||
EntityKill(client)
|
||||
|
@ -126,6 +136,7 @@ function OnPlayerSpawned( player_entity ) -- This runs when player entity has be
|
|||
ctx.players[ctx.my_id] = my_player
|
||||
ctx.player_data_by_local_entity[player_entity] = my_player
|
||||
ctx.ready = true
|
||||
ctx.my_player = my_player
|
||||
|
||||
np.SetPauseState(4)
|
||||
np.SetPauseState(0)
|
||||
|
@ -151,6 +162,7 @@ function OnPlayerSpawned( player_entity ) -- This runs when player entity has be
|
|||
perk_spawn(x, y, "LASER_AIM", true)
|
||||
perk_spawn(x-50, y, "GLASS_CANNON", true)
|
||||
perk_spawn(x-25, y, "EDIT_WANDS_EVERYWHERE", true)
|
||||
EntityLoad("data/entities/items/pickup/heart.xml", x-75, y-20)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -255,6 +267,12 @@ local function on_world_pre_update_inner()
|
|||
net.send_player_perks(perk_data)
|
||||
end
|
||||
end
|
||||
|
||||
local heart_pickup = GlobalsGetValue("ew_heart_pickup", "")
|
||||
if heart_pickup ~= "" then
|
||||
net.send_heart_pickup(heart_pickup)
|
||||
GlobalsSetValue("ew_heart_pickup", "")
|
||||
end
|
||||
end
|
||||
|
||||
function OnWorldPreUpdate() -- This is called every time the game is about to start updating the world
|
||||
|
|
17
redist/release_text.md
Normal file
17
redist/release_text.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
# Installation
|
||||
Download Noita Proxy (noita-proxy-win.zip) and unpack it somewhere.
|
||||
|
||||
Download the mod in quant.ew.zip
|
||||
|
||||
Go to Noita mod folder (can be done from in-game Mods menu item) and unpack the archive here. There should now be quant.ew folder inside the mods folder. Enable the mod in noita.
|
||||
|
||||
# Running
|
||||
|
||||
Note: order is important.
|
||||
|
||||
Start the game, start the proxy.
|
||||
|
||||
Now you'll probably want to use Steam for connection. Use "Create lobby" and "Connect to lobby in clipboard" buttons to do so.
|
||||
Another option is to connect by ip. Proxy creates a socket on port 5123, UDP protocol.
|
||||
|
||||
Press new game button in Noita now.
|
Loading…
Add table
Add a link
Reference in a new issue