mirror of
https://github.com/IntQuant/noita_entangled_worlds.git
synced 2025-10-19 07:03:16 +00:00
"fix" chained entities duping, add a bunch more physics objects to be synced
This commit is contained in:
parent
d0b21de34c
commit
89ca377f99
2 changed files with 204 additions and 9 deletions
153
quant.ew/data/scripts/props/chain_to_ceiling.lua
Normal file
153
quant.ew/data/scripts/props/chain_to_ceiling.lua
Normal file
|
@ -0,0 +1,153 @@
|
|||
--[[
|
||||
Creates a chain to ceiling from a given offset.
|
||||
Script looks for variable storages named "chain_n_x" and "chain_n_y" where n is 0...9 and generates one or more chains based on them.
|
||||
If no variable storages are found a single chain with 0 offsets is created.
|
||||
NOTE: Requires PhysicsBody2Component with body_id 100
|
||||
|
||||
XML:
|
||||
<LuaComponent
|
||||
script_source_file="data/scripts/props/chain_to_ceiling.lua"
|
||||
execute_on_added="1"
|
||||
execute_every_n_frame="5"
|
||||
execute_times="-1"
|
||||
>
|
||||
</LuaComponent>
|
||||
|
||||
<VariableStorageComponent
|
||||
name="chain_1_x"
|
||||
value_int="-8"
|
||||
>
|
||||
</VariableStorageComponent>
|
||||
<VariableStorageComponent
|
||||
name="chain_1_y"
|
||||
value_int="4"
|
||||
>
|
||||
</VariableStorageComponent>
|
||||
|
||||
--]]
|
||||
|
||||
dofile_once("data/scripts/lib/utilities.lua")
|
||||
|
||||
local entity_id = GetUpdatedEntityID()
|
||||
local pos_x, pos_y = EntityGetTransform( entity_id )
|
||||
|
||||
local segment_length = 16
|
||||
local search_dist = 200
|
||||
local break_force_mid = 1.25
|
||||
local break_force_end = 3
|
||||
local break_distance_end = 20
|
||||
local break_distance_mid = 3
|
||||
|
||||
if not DoesWorldExistAt( pos_x, pos_y - search_dist, pos_x, pos_y ) then return end
|
||||
|
||||
local count = 0
|
||||
local function get_random_chain()
|
||||
count = count + 1
|
||||
local n = ProceduralRandomi(pos_x + entity_id, pos_y + count, 0, 2)
|
||||
return "data/props_breakable_gfx/chain_vertical_16_0" .. n .. ".png"
|
||||
end
|
||||
|
||||
-- get offsets from components (if available)
|
||||
local offsets_x = { }
|
||||
local offsets_y = { }
|
||||
for i=0,9 do
|
||||
-- get stored values based on naming convention
|
||||
local s = "chain_" .. i
|
||||
local comp_x = get_variable_storage_component(entity_id, s .. "_x")
|
||||
local comp_y = get_variable_storage_component(entity_id, s .. "_y")
|
||||
if comp_x ~= nil then offsets_x[#offsets_x+1] = ComponentGetValue2(comp_x, "value_int") end
|
||||
if comp_y ~= nil then offsets_y[#offsets_y+1] = ComponentGetValue2(comp_y, "value_int") end
|
||||
end
|
||||
offsets_x[1] = offsets_x[1] or 0
|
||||
offsets_y[1] = offsets_y[1] or 0
|
||||
|
||||
-- modified joint strength (optional)
|
||||
local comp_strength = get_variable_storage_component(entity_id, "chain_strength_multiplier")
|
||||
if comp_strength ~= nil then
|
||||
local mult = ComponentGetValue2(comp_strength, "value_float")
|
||||
break_force_mid = break_force_mid * mult
|
||||
break_force_end = break_force_end * mult
|
||||
end
|
||||
|
||||
|
||||
local mat = CellFactory_GetType( "metal_chain_nohit" )
|
||||
-- create chains
|
||||
for i=1,#offsets_x do
|
||||
local offset_x = offsets_x[i]
|
||||
local offset_y = offsets_y[i]
|
||||
local x = pos_x + offset_x
|
||||
local y = pos_y + offset_y
|
||||
|
||||
local ceiling_found,_,ceiling_y = RaytracePlatforms( x, y, x, y - search_dist )
|
||||
local dist = y - ceiling_y
|
||||
|
||||
if ceiling_found == true and dist > segment_length then
|
||||
-- to local space
|
||||
y = offset_y - segment_length
|
||||
x = offset_x
|
||||
|
||||
local body_id = i * 100 + 200 -- try to generate ids that don't clash
|
||||
|
||||
-- bottom segment. attach to root with id 100
|
||||
EntityAddComponent2( entity_id, "PhysicsImageShapeComponent",
|
||||
{
|
||||
body_id = body_id,
|
||||
offset_x = x,
|
||||
offset_y = y,
|
||||
image_file = get_random_chain(),
|
||||
material = mat
|
||||
})
|
||||
EntityAddComponent2( entity_id, "PhysicsJoint2Component",
|
||||
{
|
||||
type = "REVOLUTE_JOINT",
|
||||
offset_x = x + 1.5, -- center the joint
|
||||
offset_y = y + segment_length, -- joint is on the bottom of the shape
|
||||
body1_id = 100,
|
||||
body2_id = body_id,
|
||||
break_force = break_force_end,
|
||||
break_distance = break_distance_end,
|
||||
})
|
||||
y = y - segment_length
|
||||
|
||||
-- middle segments
|
||||
for i2=0, dist / segment_length - 2 do
|
||||
body_id = body_id + 1
|
||||
EntityAddComponent2( entity_id, "PhysicsImageShapeComponent",
|
||||
{
|
||||
body_id = body_id,
|
||||
offset_x = x,
|
||||
offset_y = y,
|
||||
image_file = get_random_chain(),
|
||||
material = mat
|
||||
})
|
||||
EntityAddComponent2( entity_id, "PhysicsJoint2Component",
|
||||
{
|
||||
type = "REVOLUTE_JOINT",
|
||||
offset_x = x + 1.5,
|
||||
offset_y = y + segment_length,
|
||||
body1_id = body_id - 1,
|
||||
body2_id = body_id,
|
||||
break_force = break_force_mid,
|
||||
break_distance = break_distance_mid,
|
||||
})
|
||||
y = y - segment_length
|
||||
end
|
||||
|
||||
-- attach to ceiling
|
||||
EntityAddComponent2( entity_id, "PhysicsJoint2Component",
|
||||
{
|
||||
type = "REVOLUTE_JOINT_ATTACH_TO_NEARBY_SURFACE",
|
||||
offset_x = x + 1.5,
|
||||
offset_y = y + segment_length,
|
||||
body1_id = body_id,
|
||||
break_force = break_force_end,
|
||||
break_distance = break_distance_end,
|
||||
ray_x = 0,
|
||||
ray_y = -32,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
-- done
|
||||
-- PhysicsBody2InitFromComponents( entity_id )
|
||||
EntitySetComponentIsEnabled( entity_id, GetUpdatedComponentID(), false)
|
|
@ -1,6 +1,5 @@
|
|||
local module = {}
|
||||
|
||||
--TODO fix chained entities spawning repeatably on clients
|
||||
module.phys_sync_allowed = {
|
||||
-- Starting prop
|
||||
["data/entities/props/physics_skateboard.xml"] = true,
|
||||
|
@ -20,19 +19,63 @@ module.phys_sync_allowed = {
|
|||
["data/entities/props/physics_crate.xml"] = true,
|
||||
|
||||
["data/entities/props/physics_barrel_oil.xml"] = true,
|
||||
["data/entities/props/physics_barrel_water.xml"] = true,
|
||||
["data/entities/props/physics_barrel_radioactive.xml"] = true,
|
||||
["data/entities/props/physics_seamine.xml"] = true,
|
||||
-- ["data/entities/props/suspended_tank_radioactive.xml"] = true,
|
||||
-- ["data/entities/props/suspended_tank_acid.xml"] = true,
|
||||
|
||||
["data/entities/props/physics_box_harmless.xml"] = true,
|
||||
["data/entities/props/physics_tubelamp.xml"] = true,
|
||||
|
||||
["data/entities/props/suspended_container.xml"] = true,
|
||||
["data/entities/props/suspended_seamine.xml"] = true,
|
||||
["data/entities/props/suspended_tank_acid.xml"] = true,
|
||||
["data/entities/props/suspended_tank_radioactive.xml"] = true,
|
||||
|
||||
["data/entities/props/physics_wheel_small.xml"] = true,
|
||||
["data/entities/props/physics_wheel_stand_01.xml"] = true,
|
||||
["data/entities/props/physics_wheel_stand_02.xml"] = true,
|
||||
["data/entities/props/physics_wheel_stand_03.xml"] = true,
|
||||
["data/entities/props/physics_wheel_tiny.xml"] = true,
|
||||
["data/entities/props/physics_wheel.xml"] = true,
|
||||
|
||||
["data/entities/props/physics_fungus_acid_big.xml"] = true,
|
||||
["data/entities/props/physics_fungus_acid_hugeish.xml"] = true,
|
||||
["data/entities/props/physics_fungus_acid_huge.xml"] = true,
|
||||
["data/entities/props/physics_fungus_acid_small.xml"] = true,
|
||||
["data/entities/props/physics_fungus_acid.xml"] = true,
|
||||
["data/entities/props/physics_fungus_big.xml"] = true,
|
||||
["data/entities/props/physics_fungus_hugeish.xml"] = true,
|
||||
["data/entities/props/physics_fungus_huge.xml"] = true,
|
||||
["data/entities/props/physics_fungus_small.xml"] = true,
|
||||
["data/entities/props/physics_fungus_trap.xml"] = true,
|
||||
["data/entities/props/physics_fungus.xml"] = true,
|
||||
|
||||
["data/entities/props/physics_torch_stand.xml"] = true,
|
||||
["data/entities/props/vault_apparatus_01.xml"] = true,
|
||||
["data/entities/props/vault_apparatus_02.xml"] = true,
|
||||
["data/entities/props/physics_pressure_tank.xml"] = true,
|
||||
|
||||
["data/entities/props/furniture_bed.xml"] = true,
|
||||
["data/entities/props/furniture_bunk.xml"] = true,
|
||||
["data/entities/props/furniture_castle_chair.xml"] = true,
|
||||
["data/entities/props/furniture_castle_divan.xml"] = true,
|
||||
["data/entities/props/furniture_castle_statue.xml"] = true,
|
||||
["data/entities/props/furniture_castle_table.xml"] = true,
|
||||
["data/entities/props/furniture_castle_wardrobe.xml"] = true,
|
||||
["data/entities/props/furniture_cryopod.xml"] = true,
|
||||
["data/entities/props/furniture_dresser.xml"] = true,
|
||||
["data/entities/props/furniture_footlocker.xml"] = true,
|
||||
["data/entities/props/furniture_locker.xml"] = true,
|
||||
["data/entities/props/furniture_rocking_chair.xml"] = true,
|
||||
["data/entities/props/furniture_stool.xml"] = true,
|
||||
["data/entities/props/furniture_table.xml"] = true,
|
||||
["data/entities/props/furniture_tombstone_01.xml"] = true,
|
||||
["data/entities/props/furniture_tombstone_02.xml"] = true,
|
||||
["data/entities/props/furniture_tombstone_03.xml"] = true,
|
||||
["data/entities/props/furniture_wardrobe.xml"] = true,
|
||||
["data/entities/props/furniture_wood_chair.xml"] = true,
|
||||
["data/entities/props/furniture_wood_table.xml"] = true,
|
||||
|
||||
["data/entities/props/crystal_red.xml"] = true,
|
||||
["data/entities/props/crystal_pink.xml"] = true,
|
||||
["data/entities/props/crystal_green.xml"] = true,
|
||||
|
@ -40,7 +83,6 @@ module.phys_sync_allowed = {
|
|||
["data/entities/props/physics_vase.xml"] = true,
|
||||
["data/entities/props/physics_vase_longleg.xml"] = true,
|
||||
|
||||
|
||||
["data/entities/props/physics_sun_rock.xml"] = true,
|
||||
["data/entities/props/physics_darksun_rock.xml"] = true,
|
||||
|
||||
|
@ -52,11 +94,11 @@ module.phys_sync_allowed = {
|
|||
["data/entities/props/temple_statue_01.xml"] = true,
|
||||
["data/entities/props/temple_statue_01_green.xml"] = true,
|
||||
["data/entities/props/temple_statue_02.xml"] = true,
|
||||
-- ["data/entities/props/physics/temple_lantern.xml"] = true,
|
||||
-- ["data/entities/buildings/physics_worm_deflector_base.xml"] = true,
|
||||
["data/entities/props/physics/temple_lantern.xml"] = true,
|
||||
["data/entities/buildings/physics_worm_deflector_base.xml"] = true,
|
||||
--["data/entities/buildings/physics_worm_deflector_crystal.xml"] = true,
|
||||
--["data/entities/misc/greed_curse/greed_crystal.xml"] = true,
|
||||
-- ["data/entities/props/physics/lantern_small.xml"] = true,
|
||||
["data/entities/props/physics/lantern_small.xml"] = true,
|
||||
|
||||
-- Traps
|
||||
["data/entities/props/physics_trap_circle_acid.xml"] = true,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue