From c7e1e9655d1a809ade24399ec21e45b5e46068b1 Mon Sep 17 00:00:00 2001 From: DMD Date: Fri, 6 Apr 2018 18:29:23 +0300 Subject: [PATCH] Wall of Fire --- TemplePlus/anim.cpp | 9 ++++ TemplePlus/anim.h | 2 + TemplePlus/combat.cpp | 43 +++++++++++++-- TemplePlus/combat.h | 1 + TemplePlus/condition.cpp | 39 +++++++++++--- TemplePlus/d20.cpp | 13 +++++ TemplePlus/d20_class.cpp | 2 +- TemplePlus/dispatcher.cpp | 6 +-- TemplePlus/dispatcher.h | 1 + TemplePlus/dungeon_master.cpp | 2 +- TemplePlus/float_line.cpp | 21 ++++++++ TemplePlus/float_line.h | 4 +- TemplePlus/python/python_dispatcher.cpp | 29 ++++++++-- .../python/python_integration_spells.cpp | 2 +- TemplePlus/spell.cpp | 4 ++ TemplePlus/spell_condition.cpp | 49 +++++++++++++---- TemplePlus/turn_based.cpp | 24 +++++++++ TemplePlus/turn_based.h | 2 + Tools/ParticleEditor/MainWindow.xaml.cs | 50 ++++++++++++++++-- tpdata/templeplus/lib/templeplus/pymod.py | 12 ++++- tpdata/tpgamefiles.dat | Bin 3382331 -> 3406843 bytes .../Armor/Chainmail_fineS_Drow_Female.tga | Bin 0 -> 12332 bytes .../Armor/chainmail_fineG_drow_female.mdf | 2 + .../Armor/chainmail_fineG_drow_female.tga | Bin 0 -> 12332 bytes .../Armor/chainmail_fineS_drow_female.mdf | 2 + .../Armor/chainmail_plain_drow_female.mdf | 2 + .../Armor/chainmail_plain_drow_female.tga | Bin 0 -> 12332 bytes tpdatasrc/tpgamefiles/rules/materials_ext.mes | 6 +++ .../tpgamefiles/rules/partsys/tppartsys.tab | 5 ++ .../scr/Spell522 - Wall of Fire.py | 5 +- .../scr/tpModifiers/sp_wall_of_fire.py | 42 +++++++++++++-- .../sound/user_sounds/tpsounds.mes | 11 ++++ 32 files changed, 348 insertions(+), 42 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/art/meshes/Armor/Chainmail_fineS_Drow_Female.tga create mode 100644 tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineG_drow_female.mdf create mode 100644 tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineG_drow_female.tga create mode 100644 tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineS_drow_female.mdf create mode 100644 tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_plain_drow_female.mdf create mode 100644 tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_plain_drow_female.tga create mode 100644 tpdatasrc/tpgamefiles/sound/user_sounds/tpsounds.mes diff --git a/TemplePlus/anim.cpp b/TemplePlus/anim.cpp index e86dbb3e7..eb67c5b61 100644 --- a/TemplePlus/anim.cpp +++ b/TemplePlus/anim.cpp @@ -840,6 +840,15 @@ void AnimationGoals::GoalDestinationAdd(objHndl handle, LocAndOffsets loc){ gdIdx = 0; } +void AnimationGoals::SetRuninfoDeallocCallback(void(* cb)()){ + temple::GetRef(0x10AA4BB4) = cb; +} + +bool AnimationGoals::InterruptAllForTbCombat(){ + static auto interruptAllForTbCombat = temple::GetRef(0x1000C950); + return interruptAllForTbCombat(); +} + BOOL AnimationGoals::GetSlot(AnimSlotId * runId, AnimSlot **runSlotOut){ if (!runId){ logger->error("Null runId in GetSlot()"); diff --git a/TemplePlus/anim.h b/TemplePlus/anim.h index de8eefd9a..bae120fa5 100644 --- a/TemplePlus/anim.h +++ b/TemplePlus/anim.h @@ -198,6 +198,8 @@ friend class AnimSystem; void GoalDestinationRemove(objHndl); void GoalDestinationAdd(objHndl handle, LocAndOffsets loc); + void SetRuninfoDeallocCallback(void(__cdecl* cb)()); + bool InterruptAllForTbCombat(); private: BOOL GetSlot(AnimSlotId* runId, AnimSlot **runSlotOut); }; diff --git a/TemplePlus/combat.cpp b/TemplePlus/combat.cpp index 8908c8935..97a5d220c 100644 --- a/TemplePlus/combat.cpp +++ b/TemplePlus/combat.cpp @@ -29,6 +29,8 @@ #include "condition.h" #include "legacyscriptsystem.h" #include "config/config.h" +#include "d20_obj_registry.h" +#include "anim.h" struct CombatSystemAddresses : temple::AddressTable @@ -131,6 +133,9 @@ class CombatSystemReplacements : public TempleFix orgActionBarResetCallback = replaceFunction(0x10062E60, ActionBarResetCallback); orgTurnStart2 = replaceFunction(0x100638F0, TurnStart2); orgCombatTurnAdvance = replaceFunction(0x100634E0, CombatTurnAdvance); + replaceFunction(0x10062A30, [](){ // Combat End + return combatSys.CombatEnd()?TRUE:FALSE; + }); orgCheckRangedWeaponAmmo = replaceFunction(0x100654E0, CheckRangedWeaponAmmo); @@ -822,8 +827,7 @@ void LegacyCombatSystem::Subturn() if (!actor){ logger->error("Combat Subturn: Coudn't start TB combat Turn due to no Active Critters!"); - static auto combatEnd = temple::GetRef(0x10062A30); - combatEnd(); + CombatEnd(); return; } @@ -979,8 +983,7 @@ void LegacyCombatSystem::CritterExitCombatMode(objHndl handle) { return; } - static auto combatEnd = temple::GetRef(0x10062A30); - if (!combatEnd()) + if (!CombatEnd()) return; static auto uiCombatResetCallback = temple::GetRef(0x10AA83F8); @@ -1001,9 +1004,39 @@ void LegacyCombatSystem::CritterExitCombatMode(objHndl handle) { // temple::GetRef(0x100630F0)(handle); } +bool LegacyCombatSystem::CombatEnd(){ + //static auto combatEnd = temple::GetRef(0x10062A30); + if (!isCombatActive() ) + return true; + + d20ObjRegistrySys.D20ObjRegistrySendSignalAll(DK_SIG_Combat_End, 0, 0); + *combatSys.combatModeActive = 0; + animationGoals.SetRuninfoDeallocCallback(nullptr); + if (!animationGoals.InterruptAllForTbCombat()){ + logger->debug("CombatEnd: Anim goal interrupt FAILED!"); + } + static auto actSeqResetOnCombatEnd = temple::GetRef(0x10097BE0); + actSeqResetOnCombatEnd(); + auto &mResettingCombatSystem = temple::GetRef(0x10AA8448); + if (!mResettingCombatSystem) + tbSys.ExecuteExitCombatScriptForInitiativeList(); + tbSys.TbCombatEnd(); + if (!mResettingCombatSystem){ + auto N = party.GroupListGetLen(); + for (auto i=0; i < N; i++){ + auto partyMember = party.GroupListGetMemberN(i); + temple::GetRef(0x100B70A0)(partyMember); + } + auto combatGiveXp = temple::GetRef(0x100B88C0); + combatGiveXp(); + } + return true; +} + bool LegacyCombatSystem::isCombatActive() { - return *combatSys.combatModeActive != 0; + auto isActive = *combatSys.combatModeActive; + return isActive != 0; } bool LegacyCombatSystem::IsAutoAttack(){ diff --git a/TemplePlus/combat.h b/TemplePlus/combat.h index 65581276c..46d48c0d6 100644 --- a/TemplePlus/combat.h +++ b/TemplePlus/combat.h @@ -54,6 +54,7 @@ struct LegacyCombatSystem : temple::AddressTable { void CombatAdvanceTurn(objHndl obj); BOOL IsBrawlInProgress(); void CritterExitCombatMode(objHndl handle); + bool CombatEnd(); // ends combat mode uint32_t* combatModeActive; diff --git a/TemplePlus/condition.cpp b/TemplePlus/condition.cpp index e802fc582..3c9e664d1 100644 --- a/TemplePlus/condition.cpp +++ b/TemplePlus/condition.cpp @@ -73,7 +73,7 @@ CondStructNew ConditionSystem::mCondHezrouStenchHit; struct ConditionSystemAddresses : temple::AddressTable { - void(__cdecl* SetPermanentModArgsFromDataFields)(Dispatcher* dispatcher, CondStruct* condStruct, int* condArgs); + void(__cdecl*SetPermanentModArgsFromDataFields)(Dispatcher* dispatcher, CondStruct* condStruct, int* condArgs); int(__cdecl*RemoveSpellCondition)(DispatcherCallbackArgs args); int(__cdecl*RemoveSpellMod)(DispatcherCallbackArgs args); ConditionSystemAddresses() @@ -690,8 +690,8 @@ int RemoveSpellConditionAndMod(DispatcherCallbackArgs args) { auto argsCopy = args; argsCopy.dispKey = DK_SIG_Action_Recipient; - addresses.RemoveSpellCondition(argsCopy); - addresses.RemoveSpellMod(argsCopy); + argsCopy.RemoveSpell(); + argsCopy.RemoveSpellMod(); return 0; }; @@ -3413,6 +3413,8 @@ int SpellCallbacks::ConcentratingActionSequenceHandler(DispatcherCallbackArgs ar continue; if (d20a.d20ActType == D20A_CAST_SPELL && d20a.spellId == spellId) break; + if (d20a.d20Caf & D20CAF_FREE_ACTION) // added in Temple+ - free actions won't take up your standard action + continue; DispatcherCallbackArgs dca; dca.dispIO = nullptr; dca.dispType = dispTypeD20Signal; @@ -3918,11 +3920,9 @@ int SpellCallbacks::SpellDismissSignalHandler(DispatcherCallbackArgs args) { if (dispIo->data1 != spellId) return 0; - auto spellRemove = temple::GetRef(0x100D7620); - if (spPkt.spellEnum == 315 || args.GetData1() == 1 || spPkt.targetCount > 0){ floatSys.FloatSpellLine(args.objHndCaller, 20000, FloatLineColor::White); // a spell has expired - spellRemove(args); + args.RemoveSpell(); args.RemoveSpellMod(); } @@ -3942,6 +3942,13 @@ int SpellCallbacks::DismissSignalHandler(DispatcherCallbackArgs args){ if (spPkt.aoeObj && spPkt.aoeObj != args.objHndCaller){ d20Sys.d20SendSignal(spPkt.aoeObj, DK_SIG_Dismiss_Spells, spPkt.spellId, 0); } + // Spell objects. Added in Temple+ for Wall spells + for (auto i = 0u; i < spPkt.numSpellObjs && i < 128; i++) { + auto spellObj = spPkt.spellObjs[i].obj; + if (!spellObj || spellObj == args.objHndCaller) continue; + d20Sys.d20SendSignal(spellObj, DK_SIG_Dismiss_Spells, spPkt.spellId, 0); + } + for (auto i=0u; i < spPkt.targetCount; i++){ auto tgt = spPkt.targetListHandles[i]; if (!tgt || tgt == args.objHndCaller) @@ -3961,16 +3968,24 @@ int SpellCallbacks::DismissSignalHandler(DispatcherCallbackArgs args){ d20Sys.d20SendSignal(spellObj, DK_SIG_Spell_End, spPkt.spellId, 0); } + // adding this speciically for grease because I want to be careful auto SP_GREASE_ENUM = 200; if (spPkt.spellEnum == SP_GREASE_ENUM){ conds.ConditionRemove(args.objHndCaller, args.subDispNode->condNode); } + // By now all effects should have been removed. Cross your fingers! + d20Sys.d20SendSignal(args.objHndCaller, DK_SIG_Spell_End, spPkt.spellId, 0); + } return 0; } +void DispatcherCallbackArgs::RemoveSpellMod() { + spCallbacks.SpellRemoveMod(*this); +} + int SpellCallbacks::SpellRemoveMod(DispatcherCallbackArgs args){ DispIoD20Signal *evtObj = nullptr; @@ -3992,6 +4007,7 @@ int SpellCallbacks::SpellRemoveMod(DispatcherCallbackArgs args){ case DK_SIG_TouchAttackAdded: case DK_SIG_Teleport_Prepare: case DK_SIG_Teleport_Reconnect: + case DK_SIG_Combat_End: break; default: if (evtObj && evtObj->data1 != args.GetCondArg(0)) @@ -4007,10 +4023,21 @@ int SpellCallbacks::SpellRemoveMod(DispatcherCallbackArgs args){ if (spPkt.spellEnum != 0){ floatSys.FloatCombatLine(args.objHndCaller, 5060); // Stop Concentration d20Sys.d20SendSignal(args.objHndCaller, DK_SIG_Concentration_Broken, spellId, 0); + + if (spPkt.caster && spPkt.caster != args.objHndCaller){ + d20Sys.d20SendSignal(spPkt.caster, DK_SIG_Concentration_Broken, spellId, 0); + } + for (auto i=0u; i < spPkt.targetCount; i++){ if (args.objHndCaller != spPkt.targetListHandles[i]) d20Sys.d20SendSignal(spPkt.targetListHandles[i], DK_SIG_Concentration_Broken, spellId, 0); } + // added in Temple+: Concentration_Broken on the spell objects + for (auto i=0; i < spPkt.numSpellObjs && i < 128; i++){ + auto spObj = spPkt.spellObjs[i].obj; + if (!spObj || spObj == args.objHndCaller) continue; + d20Sys.d20SendSignal(spObj, DK_SIG_Concentration_Broken, spellId, 0); + } } } break; diff --git a/TemplePlus/d20.cpp b/TemplePlus/d20.cpp index f82c11391..6006cfd17 100644 --- a/TemplePlus/d20.cpp +++ b/TemplePlus/d20.cpp @@ -48,6 +48,7 @@ static_assert(sizeof(D20ActionDef) == 0x30, "D20ActionDef struct has the wrong s int (__cdecl *OrgD20Init)(GameSystemConf* conf); class D20ActionCallbacks { + // see NewD20ActionsInit public: #define ActionCheck(fname) static ActionErrorCode ActionCheck ## fname ## (D20Actn* d20a, TurnBasedStatus* tbStat) #define AddToSeq(fname) static ActionErrorCode AddToSeq ## fname ## (D20Actn* d20a, ActnSeq* actSeq, TurnBasedStatus* tbStat); @@ -123,6 +124,7 @@ class D20ActionCallbacks { static ActionErrorCode PerformQuiveringPalm(D20Actn* d20a); static ActionErrorCode PerformSneak(D20Actn* d20a); static ActionErrorCode PerformStandardAttack(D20Actn* d20a); + static ActionErrorCode PerformStopConcentration(D20Actn* d20a); static ActionErrorCode PerformTripAttack(D20Actn* d20a); static ActionErrorCode PerformUseItem(D20Actn* d20a); @@ -432,6 +434,8 @@ void LegacyD20System::NewD20ActionsInit() d20Defs[d20Type].actionCheckFunc = d20Callbacks.ActionCheckCastSpell; d20Defs[d20Type].projectileHitFunc = d20Callbacks.ProjectileHitSpell; d20Defs[d20Type].actionCost = d20Callbacks.ActionCostCastSpell; + d20Defs[d20Type].flags = static_cast(d20Defs[d20Type].flags | (D20ADF::D20ADF_Breaks_Concentration)); // casting spells should break concentration since active concentration requires a standard action! + d20Type = D20A_USE_ITEM; d20Defs[d20Type].addToSeqFunc = d20Callbacks.AddToSeqSpellCast; @@ -452,6 +456,8 @@ void LegacyD20System::NewD20ActionsInit() d20Type = D20A_DISMISS_SPELLS; d20Defs[d20Type].performFunc = d20Callbacks.PerformDismissSpell; + d20Type = D20A_STOP_CONCENTRATION; + d20Defs[d20Type].performFunc = d20Callbacks.PerformStopConcentration; d20Type = D20A_BARDIC_MUSIC; d20Defs[d20Type].flags = (D20ADF)( D20ADF_MagicEffectTargeting | D20ADF_Breaks_Concentration ); @@ -1139,6 +1145,11 @@ ActionErrorCode D20ActionCallbacks::PerformStandardAttack(D20Actn* d20a) return AEC_OK; } +ActionErrorCode D20ActionCallbacks::PerformStopConcentration(D20Actn* d20a){ + d20Sys.d20SendSignal(d20a->d20APerformer, DK_SIG_Remove_Concentration, d20a->d20APerformer); + return AEC_OK; +} + ActionErrorCode D20ActionCallbacks::PerformTripAttack(D20Actn* d20a) { if (!d20a->d20ATarget) @@ -2803,6 +2814,8 @@ ActionErrorCode D20ActionCallbacks::PerformCastSpell(D20Actn* d20a){ d20Sys.d20SendSignal(tgt, DK_SIG_Spell_Cast, spellId, 0); } + d20Sys.d20SendSignal(d20a->d20APerformer, DK_SIG_Remove_Concentration, 0, 0); + /*if (party.IsInParty(d20a->d20APerformer)){ auto dummy = 1; } else diff --git a/TemplePlus/d20_class.cpp b/TemplePlus/d20_class.cpp index ac97cb30b..588857034 100644 --- a/TemplePlus/d20_class.cpp +++ b/TemplePlus/d20_class.cpp @@ -394,7 +394,7 @@ int D20ClassSystem::GetClassHitDice(Stat classEnum){ int D20ClassSystem::GetClassEnum(const std::string& s){ for (auto &classSpec:classSpecs){ - if (!strcmpi(tolower(classSpec.second.conditionName).c_str(), tolower(s).c_str())) + if (!_strcmpi(tolower(classSpec.second.conditionName).c_str(), tolower(s).c_str())) return classSpec.first; } return 0; diff --git a/TemplePlus/dispatcher.cpp b/TemplePlus/dispatcher.cpp index df5f0f64a..caf52e80d 100644 --- a/TemplePlus/dispatcher.cpp +++ b/TemplePlus/dispatcher.cpp @@ -1212,9 +1212,9 @@ void DispatcherCallbackArgs::RemoveCondition(){ conds.ConditionRemove(this->objHndCaller, this->subDispNode->condNode); } -void DispatcherCallbackArgs::RemoveSpellMod(){ - auto removeSpellMod = temple::GetRef(0x100CBAB0); - removeSpellMod(*this); +void DispatcherCallbackArgs::RemoveSpell(){ + auto removeSpell = temple::GetRef(0x100D7620); + removeSpell(*this); } DispIoAttackBonus::DispIoAttackBonus(){ diff --git a/TemplePlus/dispatcher.h b/TemplePlus/dispatcher.h index 46bff16db..a974eb703 100644 --- a/TemplePlus/dispatcher.h +++ b/TemplePlus/dispatcher.h @@ -240,6 +240,7 @@ struct DispatcherCallbackArgs { void SetCondArgObjHndl(uint32_t argIdx, const objHndl& handle); void RemoveCondition(); // note: this is the low level function void RemoveSpellMod(); + void RemoveSpell(); // general spell remover }; diff --git a/TemplePlus/dungeon_master.cpp b/TemplePlus/dungeon_master.cpp index 9274a974c..c0926ea7f 100644 --- a/TemplePlus/dungeon_master.cpp +++ b/TemplePlus/dungeon_master.cpp @@ -942,7 +942,7 @@ void DungeonMaster::RenderEditedObj() { static int classCur = 0; static auto classNameGetter = [](void*data, int idx, const char** outTxt)->bool { - if (idx >= classNames.size()) + if ((uint32_t)idx >= classNames.size()) return false; *outTxt = classNames[idx].c_str(); return true; diff --git a/TemplePlus/float_line.cpp b/TemplePlus/float_line.cpp index db53db4fb..af0e1fed8 100644 --- a/TemplePlus/float_line.cpp +++ b/TemplePlus/float_line.cpp @@ -47,6 +47,27 @@ void FloatLineSystem::FloatCombatLineWithExtraString(const objHndl& obj, int com floatMesLine(obj, 1, floatColor, text.c_str()); } +void FloatLineSystem::FloatSpellLine(objHndl target, int lineId, FloatLineColor color, const char* prefix, + const char* suffix){ + char text[1024] = {0,}; + auto line = spellSys.GetSpellMesline(lineId); + if (prefix){ + if (suffix){ + sprintf(text, "%s%s%s", prefix, line, suffix); + } + else{ + sprintf(text, "%s%s", prefix, line); + } + } + else if (suffix){ + sprintf(text, "%s%s", line, suffix); + } + else{ + sprintf(text, "%s", line); + } + floatMesLine(target, 1, color, text); +} + FloatLineSystem::FloatLineSystem() { diff --git a/TemplePlus/float_line.h b/TemplePlus/float_line.h index 7e6678e7b..37522db98 100644 --- a/TemplePlus/float_line.h +++ b/TemplePlus/float_line.h @@ -21,9 +21,7 @@ struct FloatLineSystem : temple::AddressTable /* Float a text line from mes/spells.mes with an optional prefix and suffix text. */ - void FloatSpellLine(objHndl target, int lineId, FloatLineColor color, const char *prefix = 0, const char *suffix = 0) { - _FloatSpellLine(target, lineId, color, prefix, suffix); - } + void FloatSpellLine(objHndl target, int lineId, FloatLineColor color, const char *prefix = 0, const char *suffix = 0); FloatLineSystem(); diff --git a/TemplePlus/python/python_dispatcher.cpp b/TemplePlus/python/python_dispatcher.cpp index 4db935f53..f12aa3541 100644 --- a/TemplePlus/python/python_dispatcher.cpp +++ b/TemplePlus/python/python_dispatcher.cpp @@ -29,6 +29,7 @@ #include "python_integration_spells.h" #include "temple_functions.h" #include "rng.h" +#include "float_line.h" namespace py = pybind11; @@ -209,12 +210,15 @@ PYBIND11_EMBEDDED_MODULE(tpdp, m) { { conds.ConditionRemove(args.objHndCaller, args.subDispNode->condNode); }) - .def("remove_spell_mod", &DispatcherCallbackArgs::RemoveSpellMod); + .def("remove_spell_mod", &DispatcherCallbackArgs::RemoveSpellMod) + .def("remove_spell", &DispatcherCallbackArgs::RemoveSpell) ; #pragma endregion #pragma region useful data types + + #pragma region Location py::class_(m, "LocXY") .def_readwrite("x", &locXY::locx) .def_readwrite("y", &locXY::locy) @@ -234,8 +238,8 @@ PYBIND11_EMBEDDED_MODULE(tpdp, m) { locSys.GetOverallOffset(src, &absX, &absY); auto vectorAngleRad = 5 * M_PI / 4 - angleRad; auto result = src; - result.off_x += rangeFt * INCH_PER_FEET * cos(vectorAngleRad); - result.off_y += rangeFt * INCH_PER_FEET * sin(vectorAngleRad); + result.off_x += (float)(rangeFt * INCH_PER_FEET * cos(vectorAngleRad)); + result.off_y += (float)(rangeFt * INCH_PER_FEET * sin(vectorAngleRad)); locSys.RegularizeLoc(&result); return result; }) @@ -243,6 +247,7 @@ PYBIND11_EMBEDDED_MODULE(tpdp, m) { py::class_(m, "LocFull") .def_readwrite("loc_and_offsets", &LocFull::location) ; + #pragma endregion #pragma region Bonuslist etc py::class_(m, "BonusList") @@ -616,9 +621,27 @@ PYBIND11_EMBEDDED_MODULE(tpdp, m) { pkt.spellObjs[idx].partySysId = partsysId; pkt.numSpellObjs++; }) + .def("add_target",[](SpellPacketBody&pkt, objHndl handle, int partsysId)->bool{ + return pkt.AddTarget(handle, partsysId, false); + }) + .def("end_target_particles", [](SpellPacketBody&pkt, objHndl handle){ + pkt.EndPartsysForTgtObj(handle); + }) + .def("remove_target", [](SpellPacketBody&pkt, objHndl handle){ + pkt.RemoveObjFromTargetList(handle); + }) .def("check_spell_resistance", [](SpellPacketBody&pkt, objHndl tgt){ return pkt.CheckSpellResistance(tgt); }) + .def("trigger_aoe_hit", [](SpellPacketBody&pkt) { + if (!pkt.spellEnum) + return; + pySpellIntegration.SpellTrigger(pkt.spellId, SpellEvent::AreaOfEffectHit); + }) + .def("float_spell_line", [](SpellPacketBody& pkt, objHndl handle, int lineId, int color){ + auto color_ = (FloatLineColor)color; + floatSys.FloatSpellLine(handle, lineId, color_); + }) ; #pragma endregion diff --git a/TemplePlus/python/python_integration_spells.cpp b/TemplePlus/python/python_integration_spells.cpp index 8bf228ee2..11a2a4114 100644 --- a/TemplePlus/python/python_integration_spells.cpp +++ b/TemplePlus/python/python_integration_spells.cpp @@ -271,6 +271,7 @@ uint32_t PythonSpellIntegration::SpellSoundPlay(SpellPacketBody* spellPkt, Spell } } break; + case UiPickerType::Wall: case UiPickerType::Location: sound.PlaySoundAtLoc(spellSoundId, spellPkt->aoeCenter.location.location); return 1; @@ -280,7 +281,6 @@ uint32_t PythonSpellIntegration::SpellSoundPlay(SpellPacketBody* spellPkt, Spell sound.PlaySoundAtObj(spellSoundId, spellPkt->caster); return 1; - default: break; } diff --git a/TemplePlus/spell.cpp b/TemplePlus/spell.cpp index ae17cf92f..21694f02e 100644 --- a/TemplePlus/spell.cpp +++ b/TemplePlus/spell.cpp @@ -97,6 +97,7 @@ class SpellFuncReplacements : public TempleFix { spellSys.SpellBeginRound(handle); }); + // SpellEntriesInit replaceFunction(0x1007B5B0, [](const char* spellRulesFolder)->BOOL { return spellSys.SpellEntriesInit(spellRulesFolder); @@ -138,6 +139,9 @@ class SpellFuncReplacements : public TempleFix { replaceFunction(0x1007AD80, [](uint32_t spellEnum) { return spellSys.GetSpellMesline(spellEnum); }); + replaceFunction(0x10076820, [](objHndl handle, uint32_t lineId, FloatLineColor color, const char* prefix, const char* suffix){ + floatSys.FloatSpellLine(handle, lineId, color, prefix, suffix); + }); // GetSpellDescription replaceFunction(0x10077910, [](uint32_t spellEnum) { return spellSys.GetSpellDescription(spellEnum); diff --git a/TemplePlus/spell_condition.cpp b/TemplePlus/spell_condition.cpp index 6a9c4efff..4c21b4896 100644 --- a/TemplePlus/spell_condition.cpp +++ b/TemplePlus/spell_condition.cpp @@ -117,6 +117,7 @@ class SpellConditionFixes : public TempleFix { case DK_SIG_TouchAttackAdded: case DK_SIG_Teleport_Prepare: case DK_SIG_Teleport_Reconnect: + case DK_SIG_Combat_End: break; default: if (evtObj && evtObj->data1 != args.GetCondArg(0)) @@ -133,9 +134,9 @@ class SpellConditionFixes : public TempleFix { return 0; } - auto spellModRemove = temple::GetRef(0x100CBAB0); - + switch(spPkt.spellEnum){ + //Bless case 37: d20Sys.d20SendSignal(args.objHndCaller, DK_SIG_Spell_End, spellId, 0); spPkt.EndPartsysForTgtObj(args.objHndCaller); @@ -150,7 +151,8 @@ class SpellConditionFixes : public TempleFix { break; } - if (spPkt.spellEnum == 48){ // Calm Emotions + // Calm Emotions + if (spPkt.spellEnum == 48){ if (!ShouldRemoveCalmEmotions(args.objHndCaller, evtObj, args)) return 0; @@ -171,14 +173,44 @@ class SpellConditionFixes : public TempleFix { }*/ // todo: make this a template spellSys.SpellEnd(spellId, 0); - spellModRemove(args); + args.RemoveSpellMod(); return 0; } - if (spPkt.spellEnum == 253){ + // Invisibility + if (spPkt.spellEnum == 253){ if (ShouldRemoveInvisibility(args.objHndCaller, evtObj, args) && spPkt.targetCount && spPkt.targetListHandles[0]) d20Sys.d20SendSignal(spPkt.targetListHandles[0], DK_SIG_Spell_End, spellId, 0); } + + SpellEntry spEntry(spPkt.spellEnum); + if (spEntry.IsBaseModeTarget(UiPickerType::Wall)){ + + if (spPkt.caster && spPkt.caster != args.objHndCaller) { + d20Sys.d20SendSignal(spPkt.caster, DK_SIG_Spell_End, spellId, 0); + } + if (spPkt.aoeObj && spPkt.aoeObj != args.objHndCaller){ + d20Sys.d20SendSignal(spPkt.aoeObj, DK_SIG_Spell_End, spellId, 0); + } + + spPkt.DoForTargetList([&](const objHndl &handle){ + spPkt.EndPartsysForTgtObj(handle); + d20Sys.d20SendSignal(handle, DK_SIG_Spell_End, spellId, 0); + spPkt.RemoveObjFromTargetList(handle); + }); + + for (auto i=1; i < spPkt.numSpellObjs; i++){ + auto spObj = spPkt.spellObjs[i].obj; + if (!spObj)continue; + d20Sys.d20SendSignal(spObj, DK_SIG_Spell_End, spellId, 0); + } + pySpellIntegration.SpellSoundPlay(&spPkt, SpellEvent::EndSpellCast); + + d20Sys.d20SendSignal(args.objHndCaller, DK_SIG_Spell_End, spellId, 0); + if (spPkt.caster && args.dispKey != DK_SIG_Concentration_Broken) + d20Sys.d20SendSignal(spPkt.caster, DK_SIG_Remove_Concentration, spellId, 0); + spellSys.SpellEnd(spellId, 0); + } return orgSpell_remove_spell(args); }); @@ -792,13 +824,10 @@ int SpellConditionFixes::InvisibSphereDismiss(DispatcherCallbackArgs args){ if (dispIo->data1 != spellId) return 0; - auto spellRemove = temple::GetRef(0x100D7620); - auto spellModRemove = temple::GetRef(0x100CBAB0); - if (spPkt.spellEnum == 315 || args.GetData1() == 1 || spPkt.targetCount > 0) { floatSys.FloatSpellLine(args.objHndCaller, 20000, FloatLineColor::White); // a spell has expired - spellRemove(args); - spellModRemove(args); + args.RemoveSpell(); + args.RemoveSpellMod(); } return 0; diff --git a/TemplePlus/turn_based.cpp b/TemplePlus/turn_based.cpp index 3a7bee913..b22579bc9 100644 --- a/TemplePlus/turn_based.cpp +++ b/TemplePlus/turn_based.cpp @@ -16,6 +16,8 @@ #include "rng.h" #include "tutorial.h" #include "legacyscriptsystem.h" +#include "python/python_integration_obj.h" +#include "gamesystems/timeevents.h" class TurnBasedReplacements : public TempleFix { @@ -256,6 +258,28 @@ void TurnBasedSys::CreateInitiativeListWithParty(){ temple::GetRef(0x10BCAD80) = objSystem->GetObject(newTBActor)->GetInt32(obj_f_initiative); } +void TurnBasedSys::ExecuteExitCombatScriptForInitiativeList(){ + auto N = GetInitiativeListLength(); + for (auto i = 0; i < N; i++){ + auto combatant = groupInitiativeList->GroupMembers[i]; + pythonObjIntegration.ExecuteObjectScript(combatant, combatant, ObjScriptEvent::ExitCombat); + } +} + +void TurnBasedSys::TbCombatEnd(){ + groupInitiativeList->Reset(); + auto gameTime = gameSystems->GetTimeEvent().GetTime(); + auto &combatAbsoluteEndTimeInSeconds = temple::GetRef(0x11E61538); + combatAbsoluteEndTimeInSeconds = temple::GetRef(0x1005FD50)(gameTime); + if (tutorial.IsTutorialActive()){ + if (scriptSys.GetGlobalFlag(4)){ + scriptSys.SetGlobalFlag(4, 0); + scriptSys.SetGlobalFlag(2, 1); + tutorial.ShowTopic(18); + } + } +} + void _turnBasedSetCurrentActor(objHndl objHnd) { if (objHnd) diff --git a/TemplePlus/turn_based.h b/TemplePlus/turn_based.h index 53608d771..c1ad6b435 100644 --- a/TemplePlus/turn_based.h +++ b/TemplePlus/turn_based.h @@ -27,6 +27,8 @@ struct TurnBasedSys : temple::AddressTable bool IsInInitiativeList(objHndl handle) const; void CreateInitiativeListWithParty(); // resets initiative list and fills it with the party. + void ExecuteExitCombatScriptForInitiativeList(); + void TbCombatEnd(); }; extern TurnBasedSys tbSys; diff --git a/Tools/ParticleEditor/MainWindow.xaml.cs b/Tools/ParticleEditor/MainWindow.xaml.cs index 79efdaecf..372ffb866 100644 --- a/Tools/ParticleEditor/MainWindow.xaml.cs +++ b/Tools/ParticleEditor/MainWindow.xaml.cs @@ -19,8 +19,36 @@ public partial class MainWindow : Window public MainWindow() { InitializeComponent(); - PreviewControl.DataPath = Settings.Default.TemplePath; - if (PreviewControl.DataPath.Length == 0) +#if _DEBUG + var shit = 1; +#endif + //PreviewControl.DataPath = Settings.Default.TemplePath; + PreviewControl.DataPath = ""; + var isValidPath = false; + if (PreviewControl.DataPath.Length > 0) + { + + try + { + var templeDll = Path.Combine(PreviewControl.DataPath, "temple.dll"); + if (!File.Exists(templeDll)) + { + MessageBox.Show("The chosen ToEE installation directory does not seem to be valid.\n" + + "Couldn't find temple.dll.", + "Invalid ToEE Directory"); + + }else + { + isValidPath = true; + } + + } catch (Exception e) + { + isValidPath = false; + } + } + + if (PreviewControl.DataPath.Length == 0 || !isValidPath) { ChooseDataPath(); } @@ -34,6 +62,18 @@ public EditorViewModel Model set { SetValue(ModelProperty, value); } } + private void NewSystem_OnClick(object sender, RoutedEventArgs e) + { + + var NewSystem = new PartSysSpec(); + var shit = Microsoft.VisualBasic.Interaction.InputBox("Enter system name", "System Name", ""); + NewSystem.Name = shit; + + Model.Systems.Add(NewSystem); + Model.SelectedSystem = NewSystem; + + } + private void SaveVideo_OnClick(object sender, RoutedEventArgs e) { if (Model.SelectedSystem == null) @@ -136,8 +176,11 @@ private void NewEmitter_Click(object sender, RoutedEventArgs e){ var partsysName = Model.SelectedEmitter.ToSpec(Model.SelectedSystem.Name); Model.SelectedSystem.Emitters.Add(EmitterSpec.Parse(partsysName)); + } else + { + var NewEmitter = new EmitterSpec(); + Model.SelectedSystem.Emitters.Add(NewEmitter); } - } private void RenameEmitter_Click(object sender, RoutedEventArgs e){ @@ -147,5 +190,6 @@ private void RenameEmitter_Click(object sender, RoutedEventArgs e){ Model.SelectedEmitter.Name = shit; } } + } } \ No newline at end of file diff --git a/tpdata/templeplus/lib/templeplus/pymod.py b/tpdata/templeplus/lib/templeplus/pymod.py index bf99426ea..46c7b45fd 100644 --- a/tpdata/templeplus/lib/templeplus/pymod.py +++ b/tpdata/templeplus/lib/templeplus/pymod.py @@ -11,8 +11,18 @@ def MapToFeat(self, feat_enum, feat_list_max = -1, feat_cond_arg2 = 0): self.add_to_feat_dict(feat_enum, feat_list_max, feat_cond_arg2) # Spell related standard hooks def AddSpellCountdownStandardHook(self): + # adds an ET_OnBeginRound handler that (normally) does: + # If countdown expired: (<0) + # 1. Float text "Spell Expired" + # 2. RemoveSpell() (has case-by-case handlers for Spell_End; Temple+ adds generic handling for wall spells here) + # 3. RemoveSpellMod() + # Else: + # Decrement count, update spell packet duration self.add_spell_countdown_standard() - def AddAoESpellEndStandardHook(self): + def AddAoESpellEndStandardHook(self): + # adds a EK_S_Spell_End handler that: + # 1. Ends particles for all spell objects + # 2. RemoveSpellMod() self.add_aoe_spell_ender() def AddSpellDismissStandardHook(self): self.add_spell_dismiss_hook() \ No newline at end of file diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index e4660d2e68160922e2b442f29662e91c53429701..bc955d0175d369b428e226c4601ccad1c0eaf1c1 100644 GIT binary patch delta 50136 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 delta 25328 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 literal 0 HcmV?d00001 diff --git a/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineG_drow_female.mdf b/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineG_drow_female.mdf new file mode 100644 index 000000000..865dbac0e --- /dev/null +++ b/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineG_drow_female.mdf @@ -0,0 +1,2 @@ +Textured +Texture "art\meshes\Armor\chainmail_fineG_drow_female.tga" diff --git a/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineG_drow_female.tga b/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineG_drow_female.tga new file mode 100644 index 0000000000000000000000000000000000000000..29c9b343199e44b05ee342632f5e05b465addea9 GIT binary patch literal 12332 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 literal 0 HcmV?d00001 diff --git a/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineS_drow_female.mdf b/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineS_drow_female.mdf new file mode 100644 index 000000000..5e87d5e70 --- /dev/null +++ b/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_fineS_drow_female.mdf @@ -0,0 +1,2 @@ +Textured +Texture "art\meshes\Armor\chainmail_fineS_drow_female.tga" diff --git a/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_plain_drow_female.mdf b/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_plain_drow_female.mdf new file mode 100644 index 000000000..b34d96091 --- /dev/null +++ b/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_plain_drow_female.mdf @@ -0,0 +1,2 @@ +Textured +Texture "art\meshes\Armor\chainmail_plain_drow_female.tga" diff --git a/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_plain_drow_female.tga b/tpdatasrc/tpgamefiles/art/meshes/Armor/chainmail_plain_drow_female.tga new file mode 100644 index 0000000000000000000000000000000000000000..d19961f6285f934d189370355e5f20361a48804f GIT binary patch literal 12332 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 PfBo#;egD|=x0L?^=Y!Li literal 0 HcmV?d00001 diff --git a/tpdatasrc/tpgamefiles/rules/materials_ext.mes b/tpdatasrc/tpgamefiles/rules/materials_ext.mes index 59ae7a06b..8a72d698f 100644 --- a/tpdatasrc/tpgamefiles/rules/materials_ext.mes +++ b/tpdatasrc/tpgamefiles/rules/materials_ext.mes @@ -214,6 +214,12 @@ {16914}{CHEST:art\meshes\armor\breastplate\PC_breastgold__M_Drow.mdf} {16915}{CHEST:art\meshes\armor\breastplate\PC_breastgold__F_Drow.mdf} +{17515}{CHEST:art\meshes\armor\chainmail_plain_drow_female.mdf} + +{18415}{CHEST:art\meshes\armor\chainmail_fineS_drow_female.mdf} + +{18603}{CHEST:art\meshes\armor\chainmail_fineG_drow_female.mdf} + {22114}{CHEST:art\meshes\armor\Elvin_chain\Elfchain_black_M_drow.mdf} {22115}{CHEST:art\meshes\armor\Elvin_chain\Elfchain_black_F_drow.mdf} diff --git a/tpdatasrc/tpgamefiles/rules/partsys/tppartsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/tppartsys.tab index 2a15d7326..d5a6a9a36 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/tppartsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/tppartsys.tab @@ -10,3 +10,8 @@ sp-Wall of Fire2 Fire base 0 Point perm 40 Object YPR Cartesian Cartesian Spri sp-Wall of Fire2 Main Fire 0 Point perm 90 Object YPR Cartesian Cartesian Sprite World Cartesian Cartesian flare-big 80 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?50 0 0 0 0 0 0 0 0 0 0 -10?80 -5?5 0 20?40 0 -20?20 -10?10 0 5?25 0 1 0?360 0 0 50,80,130,130,100,40,20,0 255(2),60(3),60 64(2),64(3),0 132(2),130(3),255 0 -23 -95 25 16 20 sp-Wall of Fire2 start up flame 0 Point 0 30 Object YPR Cartesian Cartesian Sprite World Cartesian Cartesian fire-sprite 40 Blend 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40?60 0 0?10 70?200 10 0?56 0 1 25,35(55) 0 0 0?360 0?360 0 255,0 255,60,60,60,60 128,64,0,0,0 255,255,255,255,255 0 -399 -299 399 299 0 sp-Wall of Fire2 Wicks 0 Point perm 6 Object YPR Cartesian Cartesian Sprite World Cartesian Cartesian flare-big 60 Add 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -200?50 0 100?150 100?150 0?42 0?100 -5?5 9 0 1 0?360 0 0 50,80,80,80,40,40,20,0 255(2),60(3),60 64(2),64(3),0 132(2),130(3),255 0 -23 -95 25 16 20 +sp-Wall of Fire-hit flash hit 0 Point 0 1 World Cartesian Cartesian Sprite World Polar Cartesian flare-big 4 Add 0 0 0 0 0 0 0 0 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100,0 0 0 0?360 0 0 255 200 128 200 0 -399 -299 399 299 +sp-Wall of Fire-hit frosty 1 0 Point 5 500 World Cartesian Cartesian Sprite World Polar Cartesian fire-sprite 15 Add 0 0 0 0 0 0 0 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,20 0 0?360 0?90 10,40 20 0 0 0?360 0 0 255,0 200 128 200 0 -399 -299 399 299 +sp-Wall of Fire-hit frosty 2 0 Point 0 200 World Cartesian Cartesian Sprite World Polar Cartesian flare-1 10 Add 0 0 0 0 0 0 0 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?360 10,60 2?12 0 0 0,360 0 0 255,0 200 128 200 0 -399 -299 399 299 +sp-Wall of Fire-hit bang 0 Point 0 1 World Cartesian Cartesian Disc World Polar Cartesian flare-3 10 Add 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5,130 0 0 0?360 0 0 128,0 200 64 200 0 -399 -299 399 299 +sp-Wall of Fire-hit bone fire 0 Point perm 100 Bones Cartesian Cartesian Sprite World Polar Cartesian fire-sprite 60 Add 0 0 0 0 0 0 0 -15?15 -15?15 -15?15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?60,0,60,-20,200 -40?40, 10,10,10, 10,0,-400 0 0 0 0 0 0 4?10 0 0 0?360 0 0 255,0 200 80 200 0 -399 -299 399 299 diff --git a/tpdatasrc/tpgamefiles/scr/Spell522 - Wall of Fire.py b/tpdatasrc/tpgamefiles/scr/Spell522 - Wall of Fire.py index c59848f85..a544e96b9 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell522 - Wall of Fire.py +++ b/tpdatasrc/tpgamefiles/scr/Spell522 - Wall of Fire.py @@ -64,4 +64,7 @@ def OnBeginRound( spell ): print "Wall of Fire OnBeginRound" def OnEndSpellCast( spell ): - print "Wall of Fire OnEndSpellCast" \ No newline at end of file + print "Wall of Fire OnEndSpellCast" + +def OnAreaOfEffectHit( spell ): + print "Wall of Fire OnAreaOfEffectHit" \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_wall_of_fire.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_wall_of_fire.py index e80047c6c..c0d9f1647 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_wall_of_fire.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_wall_of_fire.py @@ -49,6 +49,8 @@ def WallOfFireOnAdd(attachee, args, evt_obj): spell_packet.add_spell_object( spell_obj, spell_partsys_id) # store the spell obj and the particle sys spell_packet.update_registry() + + spell_packet.caster.condition_add_with_args('sp-Concentrating', spell_id) return 0 @@ -69,22 +71,49 @@ def OnWallAoEEntered(attachee, args, evt_obj): return 0 #print str(tgt) + " hit by wall of fire" + spell_packet.trigger_aoe_hit() if spell_packet.check_spell_resistance(tgt): return 0 # apply sp-Wall of Fire hit condition (applies damage on beginning of round) - tgt.condition_add_with_args('sp-Wall of Fire hit', spell_id, duration, obj_evt_id) - + partsys_id = game.particles( "sp-Wall of Fire-hit", tgt ) + if spell_packet.add_target(tgt, partsys_id): + tgt.condition_add_with_args('sp-Wall of Fire hit', spell_id, duration, obj_evt_id) return 0 +def OnConcentrationBroken(attachee, args, evt_obj): + #print "Concentration broken" + spellId = args.get_arg(0) + spell_packet = tpdp.SpellPacket(spellId) + if spell_packet.spell_enum == 0: + return 0 + args.remove_spell() + #args.remove_spell_mod() + return 0 + +def OnCombatEnd(attachee, args, evt_obj): + #print "Combat End" + spellId = args.get_arg(0) + spell_packet = tpdp.SpellPacket(spellId) + if spell_packet.spell_enum == 0: + return + if spell_packet.caster != OBJ_HANDLE_NULL: + spell_packet.float_spell_line(spell_packet.caster, 20000, tf_white) + args.remove_spell() + args.remove_spell_mod() + return 0 + wallOfFire = PythonModifier("sp-Wall of Fire", 8) wallOfFire.AddHook(ET_OnConditionAdd, EK_NONE, WallOfFireOnAdd, ()) wallOfFire.AddHook(ET_OnObjectEvent, EK_OnEnterAoE, OnWallAoEEntered, ()) +wallOfFire.AddHook(ET_OnD20Signal, EK_S_Concentration_Broken, OnConcentrationBroken, ()) +wallOfFire.AddHook(ET_OnD20Signal, EK_S_Combat_End, OnCombatEnd, ()) wallOfFire.AddSpellCountdownStandardHook() wallOfFire.AddAoESpellEndStandardHook() -wallOfFire.AddSpellDismissStandardHook() + +#wallOfFire.AddSpellDismissStandardHook() # oops, Wall of Fire doesn't have Dismiss (but it does have COncentration...) ################################################## @@ -137,7 +166,11 @@ def OnWallAoEExit(attachee, args, evt_obj): evt_id = args.get_arg(2) if evt_id != evt_obj.evt_id: return 0 - #print "Removing sp-Wall of fire hit on " + str(attachee) + print "Removing sp-Wall of fire hit on " + str(attachee) + spell_id = args.get_arg(0) + spell_packet = tpdp.SpellPacket(spell_id) + spell_packet.end_target_particles(attachee) + spell_packet.remove_target(attachee) args.remove_spell_mod() return 0 @@ -147,4 +180,5 @@ def OnWallAoEExit(attachee, args, evt_obj): wallOfFireHit.AddHook(ET_OnD20Signal, EK_S_Spell_End, EndSpellMod, ()) wallOfFireHit.AddHook(ET_OnD20Signal, EK_S_Killed, EndSpellMod, ()) wallOfFireHit.AddHook(ET_OnObjectEvent, EK_OnLeaveAoE, OnWallAoEExit, ()) +wallOfFireHit.AddHook(ET_OnD20Signal, EK_S_Concentration_Broken, EndSpellMod, ()) wallOfFireHit.AddSpellCountdownStandardHook() \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/sound/user_sounds/tpsounds.mes b/tpdatasrc/tpgamefiles/sound/user_sounds/tpsounds.mes new file mode 100644 index 000000000..a4441b327 --- /dev/null +++ b/tpdatasrc/tpgamefiles/sound/user_sounds/tpsounds.mes @@ -0,0 +1,11 @@ + +// [522] *[Wall of Fire] +{16440}{} // spell begin +{16441}{} // spell end +{16442}{spells\sp_protect_fr_el_fire.WAV} // spell effect +{16443}{} // spell new round +{16444}{} // spell projectile begin +{16445}{} // spell projectile end +{16446}{} // spell projectile in-flight +{16447}{spells\sp_FireTrap_indication.WAV} // spell hit +{16448}{} // spell struck