"fix" chained entities duping, add a bunch more physics objects to be synced

This commit is contained in:
bgkillas 2024-11-16 16:26:07 -05:00
parent d0b21de34c
commit 89ca377f99
2 changed files with 204 additions and 9 deletions

View 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)

View file

@ -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,