diff --git a/Include/TSE.h b/Include/TSE.h index 381a1c5..2d7979e 100644 --- a/Include/TSE.h +++ b/Include/TSE.h @@ -907,6 +907,7 @@ class CSpaceObject : public CObject int FireOnDamage (SDamageCtx &Ctx, int iDamage); void FireOnDeselected (void); void FireOnDestroy (const SDestroyCtx &Ctx); + void FireOnDestroyObj (const SDestroyCtx &Ctx); bool FireOnDockObjAdj (CSpaceObject **retpObj); void FireOnEnteredGate (CTopologyNode *pDestNode, const CString &sDestEntryPoint, CSpaceObject *pGate); void FireOnEnteredSystem (CSpaceObject *pGate); diff --git a/Include/TSETransLisp.h b/Include/TSETransLisp.h index 3870882..b029a97 100644 --- a/Include/TSETransLisp.h +++ b/Include/TSETransLisp.h @@ -93,6 +93,10 @@ class CCodeChainCtx CCodeChainCtx (void); ~CCodeChainCtx (void); + void DefineContainingType (CDesignType *pType); + void DefineContainingType (const CItem &Item); + void DefineContainingType (const COverlay *pOverlay); + void DefineContainingType (CSpaceObject *pObj); inline ICCItem *CreateNil (void) { return m_CC.CreateNil(); } inline void DefineBool (const CString &sVar, bool bValue) { m_CC.DefineGlobal(sVar, (bValue ? m_CC.CreateTrue() : m_CC.CreateNil())); } void DefineDamageCtx (const SDamageCtx &Ctx, int iDamage = -1); diff --git a/TSE/CCodeChainCtx.cpp b/TSE/CCodeChainCtx.cpp index 6c82ecc..d64fdcc 100644 --- a/TSE/CCodeChainCtx.cpp +++ b/TSE/CCodeChainCtx.cpp @@ -15,6 +15,7 @@ #define STR_G_DATA CONSTLIT("gData") #define STR_G_ITEM CONSTLIT("gItem") #define STR_G_SOURCE CONSTLIT("gSource") +#define STR_G_TYPE CONSTLIT("gType") TArray CCodeChainCtx::g_Invocations; @@ -247,6 +248,46 @@ void CCodeChainCtx::DefineDamageEffects (const CString &sVar, SDamageCtx &Ctx) pItem->Discard(&m_CC); } +void CCodeChainCtx::DefineContainingType (CDesignType *pType) + +// DefineContainingType +// +// Defines an containing type + +{ + DefineInteger(CONSTLIT(STR_G_TYPE), pType->GetUNID()); +} + +void CCodeChainCtx::DefineContainingType (const CItem &Item) + +// DefineContainingType +// +// Defines an containing type + + { + DefineInteger(CONSTLIT(STR_G_TYPE), Item.GetType()->GetUNID()); + } + +void CCodeChainCtx::DefineContainingType (const COverlay *pOverlay) + +// DefineContainingType +// +// Defines an containing type + + { + DefineInteger(CONSTLIT(STR_G_TYPE), pOverlay->GetType()->GetUNID()); + } + +void CCodeChainCtx::DefineContainingType (CSpaceObject *pObj) + +// DefineContainingType +// +// Defines an containing type + + { + DefineContainingType(pObj->GetType()); + } + void CCodeChainCtx::DefineItem (const CString &sVar, CItemCtx &ItemCtx) // DefineItem diff --git a/TSE/CDesignType.cpp b/TSE/CDesignType.cpp index 86d768a..f5590af 100644 --- a/TSE/CDesignType.cpp +++ b/TSE/CDesignType.cpp @@ -774,6 +774,7 @@ void CDesignType::FireCustomEvent (const CString &sEvent, ECodeChainEvents iEven if (FindEventHandler(sEvent, &Event)) { Ctx.SetEvent(iEvent); + Ctx.DefineContainingType(this); Ctx.SaveAndDefineDataVar(pData); ICCItem *pResult = Ctx.Run(Event); @@ -808,7 +809,7 @@ bool CDesignType::FireGetCreatePos (CSpaceObject *pBase, CSpaceObject *pTarget, if (FindEventHandler(GET_CREATE_POS_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.DefineSpaceObject(CONSTLIT("aBaseObj"), pBase); Ctx.DefineSpaceObject(CONSTLIT("aTargetObj"), pTarget); @@ -854,9 +855,9 @@ void CDesignType::FireGetGlobalAchievements (CGameStats &Stats) if (FindEventHandler(GET_GLOBAL_ACHIEVEMENTS_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); // Run code - + ICCItem *pResult = Ctx.Run(Event); if (pResult->IsError()) ReportEventError(GET_GLOBAL_ACHIEVEMENTS_EVENT, pResult); @@ -917,6 +918,7 @@ bool CDesignType::FireGetGlobalDockScreen (const SEventHandlerDesc &Event, CSpac // Set up CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(pObj); // Run @@ -939,7 +941,7 @@ bool CDesignType::FireGetGlobalPlayerPriceAdj (const SEventHandlerDesc &Event, S { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); // Set up Ctx.SetEvent(eventGetGlobalPlayerPriceAdj); @@ -994,7 +996,7 @@ int CDesignType::FireGetGlobalResurrectPotential (void) if (FindEventHandler(GET_GLOBAL_RESURRECT_POTENTIAL_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); // Run code ICCItem *pResult = Ctx.Run(Event); @@ -1022,6 +1024,7 @@ void CDesignType::FireObjCustomEvent (const CString &sEvent, CSpaceObject *pObj, if (FindEventHandler(sEvent, &Event)) { Ctx.SaveAndDefineSourceVar(pObj); + Ctx.DefineContainingType(this); ICCItem *pResult = Ctx.Run(Event); if (pResult->IsError()) @@ -1049,7 +1052,7 @@ ALERROR CDesignType::FireOnGlobalDockPaneInit (const SEventHandlerDesc &Event, v { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); // Set up Ctx.SetScreen(pScreen); @@ -1077,6 +1080,7 @@ void CDesignType::FireOnGlobalIntroCommand(const SEventHandlerDesc &Event, const { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); Ctx.DefineString(CONSTLIT("aCommand"), sCommand); // Run code @@ -1098,6 +1102,7 @@ void CDesignType::FireOnGlobalIntroStarted (const SEventHandlerDesc &Event) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Run code @@ -1118,6 +1123,7 @@ void CDesignType::FireOnGlobalPlayerBoughtItem (const SEventHandlerDesc &Event, { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Set up @@ -1143,6 +1149,7 @@ void CDesignType::FireOnGlobalPlayerSoldItem (const SEventHandlerDesc &Event, CS { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Set up @@ -1204,6 +1211,7 @@ void CDesignType::FireOnGlobalObjDestroyed (const SEventHandlerDesc &Event, SDes { CCodeChainCtx CCCtx; + CCCtx.DefineContainingType(this); CCCtx.DefineSpaceObject(CONSTLIT("aObjDestroyed"), Ctx.pObj); CCCtx.DefineSpaceObject(CONSTLIT("aDestroyer"), Ctx.Attacker.GetObj()); @@ -1232,6 +1240,7 @@ ALERROR CDesignType::FireOnGlobalPlayerChangedShips (CSpaceObject *pOldShip, CSt if (FindEventHandler(ON_GLOBAL_PLAYER_CHANGED_SHIPS_EVENT, &Event)) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); Ctx.DefineSpaceObject(CONSTLIT("aOldPlayerShip"), pOldShip); @@ -1259,6 +1268,7 @@ ALERROR CDesignType::FireOnGlobalPlayerEnteredSystem (CString *retsError) if (FindEventHandler(ON_GLOBAL_PLAYER_ENTERED_SYSTEM_EVENT, &Event)) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Run code @@ -1284,6 +1294,7 @@ ALERROR CDesignType::FireOnGlobalPlayerLeftSystem (CString *retsError) if (FindEventHandler(ON_GLOBAL_PLAYER_LEFT_SYSTEM_EVENT, &Event)) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Run code @@ -1309,6 +1320,7 @@ ALERROR CDesignType::FireOnGlobalResurrect (CString *retsError) if (FindEventHandler(ON_GLOBAL_RESURRECT_EVENT, &Event)) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Run code @@ -1370,6 +1382,7 @@ ALERROR CDesignType::FireOnGlobalSystemCreated (SSystemCreateCtx &SysCreateCtx, if (FindEventHandler(ON_GLOBAL_SYSTEM_CREATED_EVENT, &Event)) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); Ctx.SetSystemCreateCtx(&SysCreateCtx); // Run code @@ -1392,6 +1405,7 @@ void CDesignType::FireOnGlobalSystemStarted (const SEventHandlerDesc &Event, DWO { CCodeChainCtx CCCtx; + CCCtx.DefineContainingType(this); CCCtx.DefineInteger(CONSTLIT("aElapsedTime"), dwElapsedTime); // Run code @@ -1411,6 +1425,7 @@ void CDesignType::FireOnGlobalSystemStopped (const SEventHandlerDesc &Event) { CCodeChainCtx CCCtx; + CCCtx.DefineContainingType(this); // Run code @@ -1433,6 +1448,7 @@ ALERROR CDesignType::FireOnGlobalTopologyCreated (CString *retsError) if (FindEventHandler(ON_GLOBAL_TOPOLOGY_CREATED_EVENT, &Event)) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Run code @@ -1458,6 +1474,7 @@ ALERROR CDesignType::FireOnGlobalTypesInit (SDesignLoadCtx &Ctx) if (FindEventHandler(evtOnGlobalTypesInit, &Event)) { CCodeChainCtx CCCtx; + CCCtx.DefineContainingType(this); CCCtx.SetEvent(eventOnGlobalTypesInit); ICCItem *pResult = CCCtx.Run(Event); @@ -1481,6 +1498,7 @@ ALERROR CDesignType::FireOnGlobalUniverseCreated (const SEventHandlerDesc &Event { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Run code @@ -1502,6 +1520,8 @@ ALERROR CDesignType::FireOnGlobalUniverseLoad (const SEventHandlerDesc &Event) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); + if (g_pUniverse->InResurrectMode()) Ctx.DefineString(CONSTLIT("aReason"), CONSTLIT("resurrect")); else @@ -1527,6 +1547,7 @@ ALERROR CDesignType::FireOnGlobalUniverseSave (const SEventHandlerDesc &Event) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Run code @@ -1548,6 +1569,7 @@ void CDesignType::FireOnGlobalUpdate (const SEventHandlerDesc &Event) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); // Run code @@ -1572,7 +1594,7 @@ void CDesignType::FireOnRandomEncounter (CSpaceObject *pObj) if (FindEventHandler(ON_RANDOM_ENCOUNTER_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(pObj); ICCItem *pResult = Ctx.Run(Event); diff --git a/TSE/COverlay.cpp b/TSE/COverlay.cpp index 715e220..5c446ad 100644 --- a/TSE/COverlay.cpp +++ b/TSE/COverlay.cpp @@ -346,9 +346,10 @@ void COverlay::FireCustomEvent (CSpaceObject *pSource, const CString &sEvent, IC if (m_pType->FindEventHandler(sEvent, &Event)) { CCodeChainCtx Ctx; - + // Setup + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(pSource); Ctx.SaveAndDefineDataVar(pData); Ctx.SaveAndDefineOverlayID(m_dwID); @@ -380,6 +381,7 @@ bool COverlay::FireGetDockScreen (CSpaceObject *pSource, CString *retsScreen, in return false; CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(pSource); Ctx.SaveAndDefineOverlayID(m_dwID); @@ -404,10 +406,11 @@ void COverlay::FireOnCreate (CSpaceObject *pSource) if (m_pType->FindEventHandler(ON_CREATE_EVENT, &Event)) { CCodeChainCtx Ctx; - + // Setup Ctx.SetEvent(eventOverlayEvent); + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(pSource); Ctx.SaveAndDefineOverlayID(m_dwID); @@ -435,10 +438,11 @@ bool COverlay::FireOnDamage (CSpaceObject *pSource, SDamageCtx &Ctx) if (m_pType->FindEventHandler(ON_DAMAGE_EVENT, &Event)) { CCodeChainCtx CCCtx; - + // Setup CCCtx.SetEvent(eventOverlayEvent); + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(pSource); CCCtx.DefineDamageCtx(Ctx); CCCtx.SaveAndDefineOverlayID(m_dwID); @@ -485,6 +489,7 @@ void COverlay::FireOnDestroy (CSpaceObject *pSource) // Setup Ctx.SetEvent(eventOverlayEvent); + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(pSource); Ctx.SaveAndDefineOverlayID(m_dwID); @@ -516,6 +521,7 @@ void COverlay::FireOnObjDestroyed (CSpaceObject *pSource, const SDestroyCtx &Ctx // Setup CCCtx.SetEvent(eventOverlayEvent); + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(pSource); CCCtx.SaveAndDefineOverlayID(m_dwID); CCCtx.DefineSpaceObject(CONSTLIT("aObjDestroyed"), Ctx.pObj); @@ -550,6 +556,7 @@ void COverlay::FireOnObjDocked (CSpaceObject *pSource, CSpaceObject *pShip) cons CCodeChainCtx Ctx; Ctx.SetEvent(eventOverlayEvent); + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(pSource); Ctx.SaveAndDefineOverlayID(m_dwID); Ctx.DefineSpaceObject(CONSTLIT("aObjDocked"), pShip); @@ -577,6 +584,7 @@ void COverlay::FireOnUpdate (CSpaceObject *pSource) // Setup Ctx.SetEvent(eventOverlayEvent); + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(pSource); Ctx.SaveAndDefineOverlayID(m_dwID); diff --git a/TSE/CSpaceObject.cpp b/TSE/CSpaceObject.cpp index 56d6bf1..e14c200 100644 --- a/TSE/CSpaceObject.cpp +++ b/TSE/CSpaceObject.cpp @@ -54,6 +54,7 @@ static CObjectClassg_Class(OBJID_CSPACEOBJECT); #define ON_DATA_TRANSFER_EVENT CONSTLIT("OnDataTransfer") #define ON_DESELECTED_EVENT CONSTLIT("OnDeselected") #define ON_DESTROY_EVENT CONSTLIT("OnDestroy") +#define ON_DESTROY_OBJ_EVENT CONSTLIT("OnDestroyObj") #define ON_DOCK_OBJ_ADJ_EVENT CONSTLIT("OnDockObjAdj") #define ON_ENTERED_GATE_EVENT CONSTLIT("OnEnteredGate") #define ON_ENTERED_SYSTEM_EVENT CONSTLIT("OnEnteredSystem") @@ -1483,6 +1484,9 @@ void CSpaceObject::Destroy (DestructionTypes iCause, const CDamageSource &Attack if (pWeaponDesc) pWeaponDesc->FireOnDestroyObj(Ctx); + if (Attacker.GetObj()) + Attacker.GetObj()->FireOnDestroyObj(Ctx); + // Remove from the object from the universal list (NOTE: We must do this // before we clear out m_pSystem.) @@ -1814,6 +1818,7 @@ bool CSpaceObject::FireCanDockAsPlayer (CSpaceObject *pDockTarget, CString *rets if (FindEventHandler(CAN_DOCK_AS_PLAYER_EVENT, &Event)) { CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aDockTarget"), pDockTarget); @@ -1853,9 +1858,10 @@ bool CSpaceObject::FireCanInstallItem (const CItem &Item, int iSlot, CString *re if (FindEventHandler(CDesignType::evtCanInstallItem, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.SaveAndDefineItemVar(Item); + if (iSlot == -1) { Ctx.DefineNil(CONSTLIT("aArmorSeg")); @@ -1916,7 +1922,7 @@ bool CSpaceObject::FireCanRemoveItem (const CItem &Item, int iSlot, CString *ret if (FindEventHandler(CDesignType::evtCanRemoveItem, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.SaveAndDefineItemVar(Item); if (iSlot != -1) @@ -1962,6 +1968,7 @@ void CSpaceObject::FireCustomEvent (const CString &sEvent, ECodeChainEvents iEve if (FindEventHandler(sEvent, &Event)) { Ctx.SetEvent(iEvent); + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.SaveAndDefineDataVar(pData); @@ -2029,6 +2036,7 @@ void CSpaceObject::FireCustomShipOrderEvent (const CString &sEvent, CSpaceObject SEventHandlerDesc Event; if (FindEventHandler(sEvent, &Event)) { + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.SaveAndDefineDataVar(NULL); Ctx.DefineSpaceObject(CONSTLIT("aShipObj"), pShip); @@ -2064,6 +2072,7 @@ bool CSpaceObject::FireGetDockScreen (CString *retsScreen, int *retiPriority, IC return false; CCodeChainCtx Ctx; + Ctx.DefineContainingType(const_cast(this)); Ctx.SaveAndDefineSourceVar(const_cast(this)); ICCItemPtr pResult = Ctx.RunCode(Event); @@ -2088,7 +2097,7 @@ bool CSpaceObject::FireGetExplosionType (SExplosionType *retExplosion) const if (FindEventHandler(GET_EXPLOSION_TYPE_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(const_cast(this)); Ctx.SaveAndDefineSourceVar(const_cast(this)); ICCItem *pResult = Ctx.Run(Event); @@ -2173,6 +2182,7 @@ bool CSpaceObject::FireGetPlayerPriceAdj (STradeServiceCtx &ServiceCtx, ICCItem // Set up Ctx.SetEvent(eventGetTradePrice); + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); if (ServiceCtx.pItem) { @@ -2286,7 +2296,7 @@ void CSpaceObject::FireOnAttacked (const SDamageCtx &Ctx) if (FindEventHandler(ON_ATTACKED_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineDamageCtx(Ctx); @@ -2314,7 +2324,7 @@ void CSpaceObject::FireOnAttackedByPlayer (void) if (FindEventHandler(ON_ATTACKED_BY_PLAYER_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); ICCItem *pResult = Ctx.Run(Event); @@ -2352,7 +2362,7 @@ void CSpaceObject::FireOnCreate (const SOnCreate &OnCreate) CCodeChainCtx Ctx; Ctx.SetSystemCreateCtx(OnCreate.pCreateCtx); - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.SaveAndDefineDataVar(OnCreate.pData); Ctx.DefineSpaceObject(CONSTLIT("aBaseObj"), OnCreate.pBaseObj); @@ -2393,7 +2403,7 @@ void CSpaceObject::FireOnCreateOrders (CSpaceObject *pBase, CSpaceObject *pTarge if (FindEventHandler(ON_CREATE_ORDERS_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aBaseObj"), pBase); Ctx.DefineSpaceObject(CONSTLIT("aTargetObj"), pTarget); @@ -2417,7 +2427,7 @@ int CSpaceObject::FireOnDamage (SDamageCtx &Ctx, int iDamage) if (FindEventHandler(ON_DAMAGE_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineDamageCtx(Ctx, iDamage); @@ -2446,7 +2456,7 @@ void CSpaceObject::FireOnDeselected (void) if (FindEventHandler(ON_DESELECTED_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineInteger(CONSTLIT("aPlayer"), g_PlayerSovereignUNID); @@ -2473,7 +2483,7 @@ void CSpaceObject::FireOnDestroy (const SDestroyCtx &Ctx) if (FindEventHandler(ON_DESTROY_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineSpaceObject(CONSTLIT("aDestroyer"), Ctx.Attacker.GetObj()); CCCtx.DefineSpaceObject(CONSTLIT("aOrderGiver"), Ctx.GetOrderGiver()); @@ -2491,6 +2501,33 @@ void CSpaceObject::FireOnDestroy (const SDestroyCtx &Ctx) DEBUG_CATCH } +void CSpaceObject::FireOnDestroyObj (const SDestroyCtx &Ctx) + +// FireOnDestroyObj +// +// Fire OnDestroyObj event + + { + SEventHandlerDesc Event; + + if (FindEventHandler(ON_DESTROY_OBJ_EVENT, &Event)) + { + CCodeChainCtx CCCtx; + CCCtx.DefineContainingType(this); + CCCtx.SaveAndDefineSourceVar(this); + CCCtx.DefineSpaceObject(CONSTLIT("aObjDestroyed"), Ctx.pObj); + CCCtx.DefineSpaceObject(CONSTLIT("aDestroyer"), Ctx.Attacker.GetObj()); + CCCtx.DefineSpaceObject(CONSTLIT("aOrderGiver"), Ctx.GetOrderGiver()); + CCCtx.DefineSpaceObject(CONSTLIT("aWreckObj"), Ctx.pWreck); + CCCtx.DefineString(CONSTLIT("aDestroyReason"), GetDestructionName(Ctx.iCause)); + + ICCItem *pResult = CCCtx.Run(Event); + if (pResult->IsError()) + ReportEventError(ON_DESTROY_OBJ_EVENT, pResult); + CCCtx.Discard(pResult); + } + } + bool CSpaceObject::FireOnDockObjAdj (CSpaceObject **retpObj) // FireOnDockObjAdj @@ -2503,7 +2540,7 @@ bool CSpaceObject::FireOnDockObjAdj (CSpaceObject **retpObj) if (FindEventHandler(ON_DOCK_OBJ_ADJ_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); ICCItem *pResult = Ctx.Run(Event); @@ -2547,7 +2584,7 @@ void CSpaceObject::FireOnEnteredGate (CTopologyNode *pDestNode, const CString &s if (FindEventHandler(ON_ENTERED_GATE_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aGateObj"), pGate); Ctx.DefineString(CONSTLIT("aDestNodeID"), (pDestNode ? pDestNode->GetID() : NULL_STR)); @@ -2574,7 +2611,7 @@ void CSpaceObject::FireOnEnteredSystem (CSpaceObject *pGate) if (FindEventHandler(ON_ENTERED_SYSTEM_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aGateObj"), pGate); @@ -2599,7 +2636,7 @@ void CSpaceObject::FireOnLoad (SLoadCtx &Ctx) if (FindEventHandler(ON_LOAD_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineInteger(CONSTLIT("aVersion"), Ctx.dwVersion); @@ -2622,7 +2659,7 @@ void CSpaceObject::FireOnMining (const SDamageCtx &Ctx) if (FindEventHandler(ON_MINING_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineSpaceObject(CONSTLIT("aMiner"), Ctx.Attacker.GetObj()); CCCtx.DefineVector(CONSTLIT("aMinePos"), Ctx.vHitPos); @@ -2651,7 +2688,7 @@ void CSpaceObject::FireOnMissionAccepted (CMission *pMission) if (FindEventHandler(ON_MISSION_ACCEPTED_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineSpaceObject(CONSTLIT("aMissionObj"), pMission); @@ -2674,7 +2711,7 @@ void CSpaceObject::FireOnMissionCompleted (CMission *pMission, const CString &sR if (FindEventHandler(ON_MISSION_COMPLETED_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineSpaceObject(CONSTLIT("aMissionObj"), pMission); CCCtx.DefineString(CONSTLIT("aReason"), sReason); @@ -2698,7 +2735,7 @@ void CSpaceObject::FireOnObjBlacklistedPlayer (CSpaceObject *pObj) if (FindEventHandler(ON_OBJ_BLACKLISTED_PLAYER_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aObj"), pObj); @@ -2721,7 +2758,7 @@ void CSpaceObject::FireOnObjDestroyed (const SDestroyCtx &Ctx) if (FindEventHandler(ON_OBJ_DESTROYED_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineSpaceObject(CONSTLIT("aObjDestroyed"), Ctx.pObj); CCCtx.DefineSpaceObject(CONSTLIT("aDestroyer"), Ctx.Attacker.GetObj()); @@ -2748,7 +2785,7 @@ void CSpaceObject::FireOnObjDocked (CSpaceObject *pObj, CSpaceObject *pDockTarge if (FindEventHandler(ON_OBJ_DOCKED_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aObjDocked"), pObj); Ctx.DefineSpaceObject(CONSTLIT("aDockTarget"), pDockTarget); @@ -2772,7 +2809,7 @@ void CSpaceObject::FireOnObjEnteredGate (CSpaceObject *pObj, CTopologyNode *pDes if (FindEventHandler(ON_OBJ_ENTERED_GATE_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aObj"), pObj); Ctx.DefineSpaceObject(CONSTLIT("aGateObj"), pStargate); @@ -2800,7 +2837,7 @@ bool CSpaceObject::FireOnObjGate (CSpaceObject *pObj) if (FindEventHandler(ON_OBJ_GATE_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aObj"), pObj); @@ -2838,6 +2875,7 @@ bool CSpaceObject::FireOnObjGateCheck (CSpaceObject *pObj, CTopologyNode *pDestN // Run CCodeChainCtx Ctx; + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aObj"), pObj); Ctx.DefineSpaceObject(CONSTLIT("aGateObj"), pStargate); @@ -2870,7 +2908,7 @@ void CSpaceObject::FireOnObjJumped (CSpaceObject *pObj) if (FindEventHandler(ON_OBJ_JUMPED_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aObj"), pObj); @@ -2894,7 +2932,7 @@ bool CSpaceObject::FireOnObjJumpPosAdj (CSpaceObject *pObj, CVector *iovPos) if (FindEventHandler(ON_OBJ_JUMP_POS_ADJ_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aObj"), pObj); Ctx.DefineVector(CONSTLIT("aJumpPos"), *iovPos); @@ -2940,7 +2978,7 @@ void CSpaceObject::FireOnObjReconned (CSpaceObject *pObj) if (FindEventHandler(ON_OBJ_RECONNED_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aObj"), pObj); @@ -2963,7 +3001,7 @@ void CSpaceObject::FireOnOrderChanged (void) if (FindEventHandler(ON_ORDER_CHANGED_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); ICCItem *pResult = Ctx.Run(Event); @@ -2985,7 +3023,7 @@ void CSpaceObject::FireOnOrdersCompleted (void) if (FindEventHandler(ON_ORDERS_COMPLETED_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); ICCItem *pResult = Ctx.Run(Event); @@ -3009,7 +3047,7 @@ void CSpaceObject::FireOnPlayerBlacklisted (void) if (FindEventHandler(ON_PLAYER_BLACKLISTED_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); ICCItem *pResult = Ctx.Run(Event); @@ -3038,7 +3076,7 @@ void CSpaceObject::FireOnPlayerEnteredShip (CSpaceObject *pOldShip) if (FindEventHandler(ON_PLAYER_ENTERED_SHIP_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aOldShip"), pOldShip); @@ -3062,7 +3100,7 @@ CSpaceObject::InterSystemResults CSpaceObject::FireOnPlayerEnteredSystem (CSpace if (FindEventHandler(ON_PLAYER_ENTERED_SYSTEM_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); ICCItem *pResult = Ctx.Run(Event); @@ -3092,7 +3130,7 @@ void CSpaceObject::FireOnPlayerLeftShip (CSpaceObject *pNewShip) if (FindEventHandler(ON_PLAYER_LEFT_SHIP_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aNewShip"), pNewShip); @@ -3116,7 +3154,7 @@ CSpaceObject::InterSystemResults CSpaceObject::FireOnPlayerLeftSystem (CSpaceObj if (FindEventHandler(ON_PLAYER_LEFT_SYSTEM_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aGateObj"), pStargate); Ctx.DefineString(CONSTLIT("aDestNodeID"), (pDestNode ? pDestNode->GetID() : NULL_STR)); @@ -3147,7 +3185,7 @@ void CSpaceObject::FireOnSelected (void) if (FindEventHandler(ON_SELECTED_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineInteger(CONSTLIT("aPlayer"), g_PlayerSovereignUNID); @@ -3174,7 +3212,7 @@ bool CSpaceObject::FireOnSubordinateAttacked (const SDamageCtx &Ctx) if (bHandled = (HasOnSubordinateAttackedEvent() && FindEventHandler(ON_SUBORDINATE_ATTACKED_EVENT, &Event))) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineDamageCtx(Ctx); CCCtx.DefineSpaceObject(CONSTLIT("aObjAttacked"), Ctx.pObj); @@ -3205,7 +3243,7 @@ void CSpaceObject::FireOnSystemExplosion (CSpaceObject *pExplosion, CSpaceObject if (FindEventHandler(ON_SYSTEM_EXPLOSION_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineSpaceObject(CONSTLIT("aExplosionObj"), pSource); Ctx.DefineInteger(CONSTLIT("aExplosionUNID"), dwItemUNID); @@ -3230,7 +3268,7 @@ void CSpaceObject::FireOnSystemObjAttacked (SDamageCtx &Ctx) if (FindEventHandler(CDesignType::evtOnSystemObjAttacked, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineDamageCtx(Ctx); CCCtx.DefineSpaceObject(CONSTLIT("aObjAttacked"), Ctx.pObj); @@ -3257,7 +3295,7 @@ void CSpaceObject::FireOnSystemObjDestroyed (SDestroyCtx &Ctx) if (FindEventHandler(ON_SYSTEM_OBJ_DESTROYED_EVENT, &Event)) { CCodeChainCtx CCCtx; - + CCCtx.DefineContainingType(this); CCCtx.SaveAndDefineSourceVar(this); CCCtx.DefineSpaceObject(CONSTLIT("aObjDestroyed"), Ctx.pObj); CCCtx.DefineSpaceObject(CONSTLIT("aDestroyer"), Ctx.Attacker.GetObj()); @@ -3284,7 +3322,7 @@ void CSpaceObject::FireOnSystemWeaponFire (CSpaceObject *pShot, CSpaceObject *pS if (FindEventHandler(CDesignType::evtOnSystemWeaponFire, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineInteger(CONSTLIT("aFireRepeat"), iRepeatingCount); Ctx.DefineSpaceObject(CONSTLIT("aShotObj"), pShot); @@ -3314,7 +3352,7 @@ bool CSpaceObject::FireOnTranslateMessage (const CString &sMessage, CString *ret if (FindEventHandler(ON_TRANSLATE_MESSAGE_EVENT, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); Ctx.DefineString(CONSTLIT("aMessage"), sMessage); @@ -3345,7 +3383,7 @@ void CSpaceObject::FireOnUpdate (void) if (FindEventHandler(CDesignType::evtOnUpdate, &Event)) { CCodeChainCtx Ctx; - + Ctx.DefineContainingType(this); Ctx.SaveAndDefineSourceVar(this); ICCItem *pResult = Ctx.Run(Event);