diff --git a/cont/LuaUI/callins.lua b/cont/LuaUI/callins.lua index e71f7bd0f7..a7e5bb947b 100644 --- a/cont/LuaUI/callins.lua +++ b/cont/LuaUI/callins.lua @@ -44,6 +44,7 @@ CallInsList = { "UnitFinished", "UnitFromFactory", "UnitReverseBuilt", + "UnitConstructionDecayed", "UnitDestroyed", "RenderUnitDestroyed", "UnitTaken", diff --git a/cont/LuaUI/widgets.lua b/cont/LuaUI/widgets.lua index 510137cd76..d9f9ea6152 100644 --- a/cont/LuaUI/widgets.lua +++ b/cont/LuaUI/widgets.lua @@ -123,6 +123,7 @@ local flexCallIns = { 'UnitFinished', 'UnitFromFactory', 'UnitReverseBuilt', + 'UnitConstructionDecayed', 'UnitDestroyed', 'RenderUnitDestroyed', 'UnitTaken', @@ -1853,6 +1854,14 @@ function widgetHandler:UnitReverseBuilt(unitID, unitDefID, unitTeam) end +function widgetHandler:UnitConstructionDecayed(unitID, unitDefID, unitTeam, part) + for _,w in ipairs(self.UnitConstructionDecayedList) do + w:UnitConstructionDecayed(unitID, unitDefID, unitTeam, part) + end + return +end + + function widgetHandler:UnitDestroyed(unitID, unitDefID, unitTeam) for _,w in ipairs(self.UnitDestroyedList) do w:UnitDestroyed(unitID, unitDefID, unitTeam) diff --git a/cont/base/springcontent/LuaGadgets/callins.lua b/cont/base/springcontent/LuaGadgets/callins.lua index 63061b813f..e820e39f8f 100644 --- a/cont/base/springcontent/LuaGadgets/callins.lua +++ b/cont/base/springcontent/LuaGadgets/callins.lua @@ -49,6 +49,7 @@ CALLIN_LIST = { "UnitFinished", "UnitFromFactory", "UnitReverseBuilt", + "UnitConstructionDecayed", "UnitDestroyed", "RenderUnitDestroyed", "UnitExperience", diff --git a/cont/base/springcontent/LuaGadgets/gadgets.lua b/cont/base/springcontent/LuaGadgets/gadgets.lua index 0f0ccc116c..0ae8ecf66f 100644 --- a/cont/base/springcontent/LuaGadgets/gadgets.lua +++ b/cont/base/springcontent/LuaGadgets/gadgets.lua @@ -1411,6 +1411,13 @@ function gadgetHandler:UnitReverseBuilt(unitID, unitDefID, unitTeam) end +function gadgetHandler:UnitConstructionDecayed(unitID, unitDefID, unitTeam, part) + for _,g in r_ipairs(self.UnitConstructionDecayedList) do + g:UnitConstructionDecayed(unitID, unitDefID, unitTeam, part) + end +end + + function gadgetHandler:UnitDestroyed( unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam diff --git a/rts/Lua/LuaHandle.cpp b/rts/Lua/LuaHandle.cpp index ae66c3f6ff..e1b9a7718d 100644 --- a/rts/Lua/LuaHandle.cpp +++ b/rts/Lua/LuaHandle.cpp @@ -1078,6 +1078,35 @@ void CLuaHandle::UnitReverseBuilt(const CUnit* unit) } +/*** Called when a unit being built starts decaying. + * + * @function UnitConstructionDecayed + * @number unitID + * @number unitDefID + * @number unitTeam + * @number part + */ +void CLuaHandle::UnitConstructionDecayed(const CUnit* unit, float part) +{ + RECOIL_DETAILED_TRACY_ZONE; + LUA_CALL_IN_CHECK(L); + luaL_checkstack(L, 7, __func__); + const LuaUtils::ScopedDebugTraceBack traceBack(L); + + static const LuaHashString cmdStr(__func__); + if (!cmdStr.GetGlobalFunc(L)) + return; + + lua_pushnumber(L, unit->id); + lua_pushnumber(L, unit->unitDef->id); + lua_pushnumber(L, unit->team); + lua_pushnumber(L, part); + + // call the routine + RunCallInTraceback(L, cmdStr, 4, 0, traceBack.GetErrFuncIdx(), false); +} + + /*** Called when a unit is destroyed. * * @function UnitDestroyed diff --git a/rts/Lua/LuaHandle.h b/rts/Lua/LuaHandle.h index c2979880d2..cb0e1b7300 100644 --- a/rts/Lua/LuaHandle.h +++ b/rts/Lua/LuaHandle.h @@ -126,6 +126,7 @@ class CLuaHandle : public CEventClient void UnitFinished(const CUnit* unit) override; void UnitFromFactory(const CUnit* unit, const CUnit* factory, bool userOrders) override; void UnitReverseBuilt(const CUnit* unit) override; + void UnitConstructionDecayed(const CUnit* unit, float part) override; void UnitDestroyed(const CUnit* unit, const CUnit* attacker) override; void UnitTaken(const CUnit* unit, int oldTeam, int newTeam) override; void UnitGiven(const CUnit* unit, int oldTeam, int newTeam) override; diff --git a/rts/Sim/Units/Unit.cpp b/rts/Sim/Units/Unit.cpp index a569cb22fa..1a45b51d28 100644 --- a/rts/Sim/Units/Unit.cpp +++ b/rts/Sim/Units/Unit.cpp @@ -1013,6 +1013,8 @@ void CUnit::SlowUpdate() AddMetal(cost.metal * buildDecay, false); + eventHandler.UnitConstructionDecayed(this, buildDecay); + if (health <= 0.0f || buildProgress <= 0.0f) KillUnit(nullptr, false, true); } diff --git a/rts/System/EventClient.h b/rts/System/EventClient.h index 88a570467d..33f99e5474 100644 --- a/rts/System/EventClient.h +++ b/rts/System/EventClient.h @@ -126,6 +126,7 @@ class CEventClient virtual void UnitCreated(const CUnit* unit, const CUnit* builder) {} virtual void UnitFinished(const CUnit* unit) {} virtual void UnitReverseBuilt(const CUnit* unit) {} + virtual void UnitConstructionDecayed(const CUnit* unit, float part) {} virtual void UnitFromFactory(const CUnit* unit, const CUnit* factory, bool userOrders) {} virtual void UnitDestroyed(const CUnit* unit, const CUnit* attacker) {} virtual void UnitTaken(const CUnit* unit, int oldTeam, int newTeam) {} diff --git a/rts/System/EventHandler.h b/rts/System/EventHandler.h index eb0a924718..f5a2743acf 100644 --- a/rts/System/EventHandler.h +++ b/rts/System/EventHandler.h @@ -65,6 +65,7 @@ class CEventHandler void UnitCreated(const CUnit* unit, const CUnit* builder); void UnitFinished(const CUnit* unit); void UnitReverseBuilt(const CUnit* unit); + void UnitConstructionDecayed(const CUnit* unit, float part); void UnitFromFactory(const CUnit* unit, const CUnit* factory, bool userOrders); void UnitDestroyed(const CUnit* unit, const CUnit* attacker); void UnitTaken(const CUnit* unit, int oldTeam, int newTeam); @@ -463,6 +464,11 @@ UNIT_CALLIN_LOS_PARAM(LeftRadar) UNIT_CALLIN_LOS_PARAM(LeftLos) +inline void CEventHandler::UnitConstructionDecayed(const CUnit* unit, + float part) +{ + ITERATE_UNIT_ALLYTEAM_EVENTCLIENTLIST(UnitConstructionDecayed, unit, part) +} inline void CEventHandler::UnitFromFactory(const CUnit* unit, const CUnit* factory, diff --git a/rts/System/Events.def b/rts/System/Events.def index d4e4361018..0120eab369 100644 --- a/rts/System/Events.def +++ b/rts/System/Events.def @@ -37,13 +37,14 @@ SETUP_EVENT(PlayerAdded, MANAGED_BIT | UNSYNCED_BIT) SETUP_EVENT(PlayerRemoved, MANAGED_BIT | UNSYNCED_BIT) - SETUP_EVENT(UnitCreated, MANAGED_BIT) - SETUP_EVENT(UnitFinished, MANAGED_BIT) - SETUP_EVENT(UnitFromFactory, MANAGED_BIT) - SETUP_EVENT(UnitReverseBuilt, MANAGED_BIT) - SETUP_EVENT(UnitDestroyed, MANAGED_BIT) - SETUP_EVENT(UnitTaken, MANAGED_BIT) - SETUP_EVENT(UnitGiven, MANAGED_BIT) + SETUP_EVENT(UnitCreated, MANAGED_BIT) + SETUP_EVENT(UnitFinished, MANAGED_BIT) + SETUP_EVENT(UnitFromFactory, MANAGED_BIT) + SETUP_EVENT(UnitReverseBuilt, MANAGED_BIT) + SETUP_EVENT(UnitConstructionDecayed, MANAGED_BIT) + SETUP_EVENT(UnitDestroyed, MANAGED_BIT) + SETUP_EVENT(UnitTaken, MANAGED_BIT) + SETUP_EVENT(UnitGiven, MANAGED_BIT) SETUP_EVENT(UnitIdle, MANAGED_BIT) SETUP_EVENT(UnitCommand, MANAGED_BIT)