diff --git a/files.cmake b/files.cmake index c36bc7a53b..c57beaf9c7 100644 --- a/files.cmake +++ b/files.cmake @@ -1478,6 +1478,7 @@ set(DUSK_FILES src/dusk/mods/loader/prepatch.cpp src/dusk/mods/loader/prepatch.hpp src/dusk/mods/item.hpp + src/dusk/mods/item_actor.cpp src/dusk/mods/item_checks.cpp src/dusk/mods/item_gives.cpp src/dusk/mods/log_buffer.cpp diff --git a/src/d/actor/d_a_obj_life_container.cpp b/src/d/actor/d_a_obj_life_container.cpp index 783fd4698d..690575c108 100644 --- a/src/d/actor/d_a_obj_life_container.cpp +++ b/src/d/actor/d_a_obj_life_container.cpp @@ -99,6 +99,15 @@ int daObjLife_c::Create() { mRotateSpeed = 7000; #if TARGET_PC + // Restore speeds that were skipped if created from a boss with create instead of fastCreate + auto bossItemSpeeds = dusk::mods::get_boss_item_actor_speeds(); + if (bossItemSpeeds.f != 0.f || bossItemSpeeds.y != 0.f) { + mOverrideHover = false; + speedF = bossItemSpeeds.f; + speed.y = bossItemSpeeds.y; + dusk::mods::set_boss_item_actor_speeds(0.f, 0.f); + } + if (mOverrideHover) { fopAcM_SetGravity(this, 0.0f); mRotateSpeed = 550; diff --git a/src/dusk/mods/item.hpp b/src/dusk/mods/item.hpp index 5b675ed64c..1b8897ae00 100644 --- a/src/dusk/mods/item.hpp +++ b/src/dusk/mods/item.hpp @@ -58,6 +58,13 @@ uint32_t item_check_message(uint16_t group, uint32_t messageId); bool item_give_queue_dispatching(); uint32_t item_give_queue_take_tag(); +struct BossItemActorSpeeds { + f32 f; + f32 y; +}; +void set_boss_item_actor_speeds(f32 f, f32 y); +BossItemActorSpeeds get_boss_item_actor_speeds(); + namespace detail { struct CommittedCheck { uint8_t vanillaItem = 0; diff --git a/src/dusk/mods/item_actor.cpp b/src/dusk/mods/item_actor.cpp new file mode 100644 index 0000000000..dc0feab472 --- /dev/null +++ b/src/dusk/mods/item_actor.cpp @@ -0,0 +1,15 @@ +#include "item.hpp" + +namespace dusk::mods { + +static BossItemActorSpeeds bossItemActorSpeeds{}; +void set_boss_item_actor_speeds(f32 f, f32 y) { + bossItemActorSpeeds.f = f; + bossItemActorSpeeds.y = y; +} + +BossItemActorSpeeds get_boss_item_actor_speeds() { + return bossItemActorSpeeds; +} + +} diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index 3097b9294f..207a0471b3 100644 --- a/src/f_op/f_op_actor_mng.cpp +++ b/src/f_op/f_op_actor_mng.cpp @@ -1621,6 +1621,7 @@ fpc_ProcID fopAcM_createItemForBoss(const cXyz* i_pos, int i_itemNo, int i_roomN if (i_itemNo != originalItemNo) { const u32 params = 0xFFFF0000 | param_8 << 8 | (i_itemNo & 0xFF); + dusk::mods::set_boss_item_actor_speeds(i_speedF, i_speedY); return fopAcM_create(fpcNm_Obj_LifeContainer_e, params, i_pos, i_roomNo, i_angle, i_scale, -1, giveTag, originalItemNo); }