diff --git a/.gitignore b/.gitignore index 44e12b9..ce00885 100644 --- a/.gitignore +++ b/.gitignore @@ -365,6 +365,10 @@ MigrationBackup/ # Fody - auto-generated XML schema FodyWeavers.xsd +# Google Drive File Stream +/.tmp.driveupload +/.tmp.drivedownload + ########### # Allowed # ########### diff --git a/EEex-v2.6.6.0/headers/EEex-v2.6.6.0/EEex.h b/EEex-v2.6.6.0/headers/EEex-v2.6.6.0/EEex.h index 3cbc1ed..52bef62 100644 --- a/EEex-v2.6.6.0/headers/EEex-v2.6.6.0/EEex.h +++ b/EEex-v2.6.6.0/headers/EEex-v2.6.6.0/EEex.h @@ -85,6 +85,9 @@ namespace EEex { // op101 bool Opcode_Hook_Op101_ShouldEffectBypassImmunity(CGameEffect* pEffect); + // op122 / op255 + void Opcode_Hook_CGameEffectCreateItem_BeforePlaceItem(CGameEffect* pEffect, CItem* pItem); + void Opcode_Hook_CGameEffectCreateItem_AfterPlaceItem(CGameEffect* pEffect, CGameSprite* pSprite, CItem* pItem); // op248 void Opcode_Hook_OnOp248AddTail(CGameEffect* pOp248, CGameEffect* pEffect); // op249 diff --git a/EEex-v2.6.6.0/source/EEex-v2.6.6.0/EEex.cpp b/EEex-v2.6.6.0/source/EEex-v2.6.6.0/EEex.cpp index 80ea91b..c5beaef 100644 --- a/EEex-v2.6.6.0/source/EEex-v2.6.6.0/EEex.cpp +++ b/EEex-v2.6.6.0/source/EEex-v2.6.6.0/EEex.cpp @@ -3391,6 +3391,54 @@ bool EEex::Opcode_Hook_Op101_ShouldEffectBypassImmunity(CGameEffect* pEffect) { STUTTER_LOG_END } +//-----------------------------------------// +// op122/255 - CGameEffectCreateItem Hooks // +//-----------------------------------------// + +void EEex::Opcode_Hook_CGameEffectCreateItem_BeforePlaceItem(CGameEffect* pEffect, CItem* pItem) { + + STUTTER_LOG_START(void, "EEex::Opcode_Hook_CGameEffectCreateItem_BeforePlaceItem") + + if (pEffect != nullptr && pItem != nullptr && pEffect->m_dWFlags > 0) { + // The Create Item opcode reuses m_dWFlags as an item-flag override. + pItem->m_flags = pEffect->m_dWFlags; + } + + STUTTER_LOG_END +} + +void EEex::Opcode_Hook_CGameEffectCreateItem_AfterPlaceItem(CGameEffect* pEffect, CGameSprite* pSprite, CItem* pItem) { + + STUTTER_LOG_START(void, "EEex::Opcode_Hook_CGameEffectCreateItem_AfterPlaceItem") + + if (pEffect == nullptr || pSprite == nullptr || pItem == nullptr || (pEffect->m_special & 1) == 0) { + return; + } + + int slot = -1; + for (int i = 0; i < 39; ++i) { + if (pSprite->m_equipment.m_items.data[i] == pItem) { + slot = i; + break; + } + } + + // The opcode stores only a single scalar aux value. Clear the field when the placed + // item didn't end up in the live equipment array so callers never observe a stale slot. + lua_State* const L = luaState(); + getUDAux(L, pSprite); + if (slot >= 0) { + lua_pushinteger(L, static_cast(slot)); + } + else { + lua_pushnil(L); + } + lua_setfield(L, -2, "EEex_CGameEffectCreateItem_Slot"); + lua_pop(L, 1); + + STUTTER_LOG_END +} + //-------// // op248 // //-------// diff --git a/EEex-v2.6.6.0/source/EEex-v2.6.6.0/main.cpp b/EEex-v2.6.6.0/source/EEex-v2.6.6.0/main.cpp index 527751d..a30ab68 100644 --- a/EEex-v2.6.6.0/source/EEex-v2.6.6.0/main.cpp +++ b/EEex-v2.6.6.0/source/EEex-v2.6.6.0/main.cpp @@ -103,6 +103,9 @@ static void exportPatterns() { // op101 exportPattern(TEXT("EEex::Opcode_Hook_Op101_ShouldEffectBypassImmunity"), EEex::Opcode_Hook_Op101_ShouldEffectBypassImmunity); + // op122 / op255 + exportPattern(TEXT("EEex::Opcode_Hook_CGameEffectCreateItem_BeforePlaceItem"), EEex::Opcode_Hook_CGameEffectCreateItem_BeforePlaceItem); + exportPattern(TEXT("EEex::Opcode_Hook_CGameEffectCreateItem_AfterPlaceItem"), EEex::Opcode_Hook_CGameEffectCreateItem_AfterPlaceItem); // op248 exportPattern(TEXT("EEex::Opcode_Hook_OnOp248AddTail"), EEex::Opcode_Hook_OnOp248AddTail); // op249