diff --git a/res/modules/internal/stdcomp.lua b/res/modules/internal/stdcomp.lua index a62989a9..767bfa35 100644 --- a/res/modules/internal/stdcomp.lua +++ b/res/modules/internal/stdcomp.lua @@ -125,6 +125,23 @@ return { ::continue:: end end, + physics_update = function(tps, parts, part) + for uid, entity in pairs(entities) do + if uid % parts ~= part then + goto continue + end + for _, component in pairs(entity.components) do + local callback = component.on_physics_update + if not component.__disabled and callback then + local result, err = pcall(callback, tps) + if err then + debug.error(err) + end + end + end + ::continue:: + end + end, render = function(delta) for _,entity in pairs(entities) do for _, component in pairs(entity.components) do diff --git a/res/scripts/components/mob.lua b/res/scripts/components/mob.lua index 8cc63dc5..783506a1 100644 --- a/res/scripts/components/mob.lua +++ b/res/scripts/components/mob.lua @@ -18,7 +18,7 @@ end def_prop("jump_force", 0.0) def_prop("air_damping", 1.0) def_prop("ground_damping", 1.0) -def_prop("movement_speed", 4.0) +def_prop("movement_speed", 3.0) def_prop("run_speed_mul", 1.5) def_prop("crouch_speed_mul", 0.35) def_prop("flight_speed_mul", 4.0) @@ -56,7 +56,7 @@ function move_horizontal(speed, dir, vel) body:set_vel(vel) end -function on_update(tps) +function on_physics_update(tps) local delta = (1.0 / tps) local pid = entity:get_player() if pid and hud and not hud.is_inventory_open() and not menu.page ~= "" then diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index bae5aac6..ddc87e8b 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -130,6 +130,7 @@ namespace scripting { void on_entity_fall(const Entity& entity); void on_entity_save(const Entity& entity); void on_entities_update(int tps, int parts, int part); + void on_entities_physics_update(int tps, int parts, int part); void on_entities_render(float delta); void on_sensor_enter(const Entity& entity, size_t index, entityid_t oid); void on_sensor_exit(const Entity& entity, size_t index, entityid_t oid); diff --git a/src/logic/scripting/scripting_entities.cpp b/src/logic/scripting/scripting_entities.cpp index 4deabd4b..2ab63ae3 100644 --- a/src/logic/scripting/scripting_entities.cpp +++ b/src/logic/scripting/scripting_entities.cpp @@ -279,6 +279,16 @@ void scripting::on_entities_update(int tps, int parts, int part) { lua::pop(L); } +void scripting::on_entities_physics_update(int tps, int parts, int part) { + auto L = lua::get_main_state(); + lua::get_from(L, STDCOMP, "physics_update", true); + lua::pushinteger(L, tps); + lua::pushinteger(L, parts); + lua::pushinteger(L, part); + lua::call_nothrow(L, 3, 0); + lua::pop(L); +} + void scripting::on_entities_render(float delta) { auto L = lua::get_main_state(); lua::get_from(L, STDCOMP, "render", true); diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index 2353dc1b..4982c636 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -25,7 +25,10 @@ static debug::Logger logger("entities"); Entities::Entities(Level& level) - : level(level), sensorsTickClock(20, 3), updateTickClock(20, 3) { + : level(level), + sensorsTickClock(20, 3), + updateTickClock(20, 3), + physicsTickClock(60, 1) { } std::optional Entities::get(entityid_t id) { @@ -320,6 +323,13 @@ void Entities::update(float delta) { updateTickClock.getPart() ); } + if (physicsTickClock.update(delta)) { + scripting::on_entities_physics_update( + physicsTickClock.getTickRate(), + physicsTickClock.getParts(), + physicsTickClock.getPart() + ); + } } static void debug_render_skeleton( diff --git a/src/objects/Entities.hpp b/src/objects/Entities.hpp index 03fcec8c..95e3be68 100644 --- a/src/objects/Entities.hpp +++ b/src/objects/Entities.hpp @@ -39,6 +39,7 @@ class Entities { entityid_t nextID = 1; util::Clock sensorsTickClock; util::Clock updateTickClock; + util::Clock physicsTickClock; void updateSensors( Rigidbody& body, const Transform& tsf, std::vector& sensors