diff --git a/src/game/Maps/Map.h b/src/game/Maps/Map.h index caa05b766..0e86904dd 100644 --- a/src/game/Maps/Map.h +++ b/src/game/Maps/Map.h @@ -705,6 +705,8 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj bool ScriptCommand_ServerVariable(const ScriptInfo& script, WorldObject* source, WorldObject* target); bool ScriptCommand_CreatureSpells(const ScriptInfo& script, WorldObject* source, WorldObject* target); bool ScriptCommand_RemoveGuardians(const ScriptInfo& script, WorldObject* source, WorldObject* target); + bool ScriptCommand_AddSpellCooldown(const ScriptInfo& script, WorldObject* source, WorldObject* target); + bool ScriptCommand_RemoveSpellCooldown(const ScriptInfo& script, WorldObject* source, WorldObject* target); // Add any new script command functions to the array. const ScriptCommandFunction m_ScriptCommands[SCRIPT_COMMAND_MAX] = @@ -766,6 +768,8 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj &Map::ScriptCommand_ServerVariable, // 54 &Map::ScriptCommand_CreatureSpells, // 55 &Map::ScriptCommand_RemoveGuardians, // 56 + &Map::ScriptCommand_AddSpellCooldown, // 57 + &Map::ScriptCommand_RemoveSpellCooldown, // 58 }; public: diff --git a/src/game/Maps/ScriptCommands.cpp b/src/game/Maps/ScriptCommands.cpp index 49206b7b8..bae5e8ac9 100644 --- a/src/game/Maps/ScriptCommands.cpp +++ b/src/game/Maps/ScriptCommands.cpp @@ -1524,7 +1524,7 @@ bool Map::ScriptCommand_CreatureSpells(const ScriptInfo& script, WorldObject* so return false; } -// SCRIPT_COMMAND_REMOVE_GUARDIANS (56) +// SCRIPT_COMMAND_REMOVE_GUARDIANSS (56) bool Map::ScriptCommand_RemoveGuardians(const ScriptInfo& script, WorldObject* source, WorldObject* target) { Unit* pSource = ToUnit(source); @@ -1534,8 +1534,50 @@ bool Map::ScriptCommand_RemoveGuardians(const ScriptInfo& script, WorldObject* s sLog.outError("SCRIPT_COMMAND_REMOVE_GUARDIANS (script id %u) call for a NULL or non-unit source (TypeId: %u), skipping.", script.id, source ? source->GetTypeId() : 0); return ShouldAbortScript(script); } + + if (script.removeGuardian.creatureId) + { + pSource->RemoveGuardiansWithEntry(script.removeGuardian.creatureId); + } + else + pSource->RemoveGuardians(); - pSource->RemoveGuardians(); + return false; +} + +// SCRIPT_COMMAND_ADD_SPELL_COOLDOWN (57) +bool Map::ScriptCommand_AddSpellCooldown(const ScriptInfo& script, WorldObject* source, WorldObject* target) +{ + Unit* pSource = ToUnit(source); + + if (!pSource) + { + sLog.outError("SCRIPT_COMMAND_ADD_SPELL_COOLDOWN (script id %u) call for a NULL or non-unit source (TypeId: %u), skipping.", script.id, source ? source->GetTypeId() : 0); + return ShouldAbortScript(script); + } + + pSource->AddSpellCooldown(script.addCooldown.spellId, 0, time(nullptr) + script.addCooldown.cooldown); + if (Player* pPlayer = pSource->ToPlayer()) + pPlayer->SendSpellCooldown(script.addCooldown.spellId, script.addCooldown.cooldown * IN_MILLISECONDS, pPlayer->GetObjectGuid()); + + return false; +} + +// SCRIPT_COMMAND_REMOVE_SPELL_COOLDOWN (58) +bool Map::ScriptCommand_RemoveSpellCooldown(const ScriptInfo& script, WorldObject* source, WorldObject* target) +{ + Unit* pSource = ToUnit(source); + + if (!pSource) + { + sLog.outError("SCRIPT_COMMAND_REMOVE_SPELL_COOLDOWN (script id %u) call for a NULL or non-unit source (TypeId: %u), skipping.", script.id, source ? source->GetTypeId() : 0); + return ShouldAbortScript(script); + } + + if (script.removeCooldown.spellId) + pSource->RemoveSpellCooldown(script.removeCooldown.spellId, true); + else + pSource->RemoveAllSpellCooldown(); return false; } \ No newline at end of file diff --git a/src/game/Objects/Unit.cpp b/src/game/Objects/Unit.cpp index 8c27425bc..0254ae6c7 100644 --- a/src/game/Objects/Unit.cpp +++ b/src/game/Objects/Unit.cpp @@ -6194,6 +6194,14 @@ void Unit::RemoveGuardians() } } +void Unit::RemoveGuardiansWithEntry(uint32 entry) +{ + while (Pet* pGuardian = FindGuardianWithEntry(entry)) + { + pGuardian->Unsummon(PET_SAVE_AS_DELETED, this); + } +} + Pet* Unit::FindGuardianWithEntry(uint32 entry) { for (GuardianPetList::const_iterator itr = m_guardianPets.begin(); itr != m_guardianPets.end(); ++itr) diff --git a/src/game/Objects/Unit.h b/src/game/Objects/Unit.h index 8ce08310e..eaf838e99 100644 --- a/src/game/Objects/Unit.h +++ b/src/game/Objects/Unit.h @@ -1417,6 +1417,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void AddGuardian(Pet* pet); void RemoveGuardian(Pet* pet); void RemoveGuardians(); + void RemoveGuardiansWithEntry(uint32 entry); Pet* FindGuardianWithEntry(uint32 entry); uint32 GetGuardianCountWithEntry(uint32 entry); diff --git a/src/game/ScriptMgr.cpp b/src/game/ScriptMgr.cpp index a2c149eaf..b74e97d19 100644 --- a/src/game/ScriptMgr.cpp +++ b/src/game/ScriptMgr.cpp @@ -933,6 +933,45 @@ void ScriptMgr::LoadScripts(ScriptMapMap& scripts, const char* tablename) } case SCRIPT_COMMAND_REMOVE_GUARDIANS: { + if (tmp.removeGuardian.creatureId) + { + if (!ObjectMgr::GetCreatureTemplate(tmp.removeGuardian.creatureId)) + { + if (!sObjectMgr.IsExistingCreatureId(tmp.removeGuardian.creatureId)) + { + sLog.outErrorDb("Table `%s` has invalid creature (Entry: %u) in SCRIPT_COMMAND_REMOVE_GUARDIANS for script id %u", tablename, tmp.removeGuardian.creatureId, tmp.id); + continue; + } + else + DisableScriptAction(tmp); + } + } + break; + } + case SCRIPT_COMMAND_ADD_SPELL_COOLDOWN: + { + if (!sSpellMgr.GetSpellEntry(tmp.addCooldown.spellId)) + { + sLog.outErrorDb("Table `%s` using nonexistent spell (id: %u) in SCRIPT_COMMAND_ADD_SPELL_COOLDOWN for script id %u", tablename, tmp.addCooldown.spellId, tmp.id); + continue; + } + if (tmp.addCooldown.cooldown == 0) + { + sLog.outErrorDb("Table `%s` has datalong2 = %u in SCRIPT_COMMAND_ADD_SPELL_COOLDOWN for script id %u.", tablename, tmp.addCooldown.cooldown, tmp.id); + continue; + } + break; + } + case SCRIPT_COMMAND_REMOVE_SPELL_COOLDOWN: + { + if (tmp.removeCooldown.spellId) + { + if (!sSpellMgr.GetSpellEntry(tmp.removeCooldown.spellId)) + { + sLog.outErrorDb("Table `%s` using nonexistent spell (id: %u) in SCRIPT_COMMAND_REMOVE_SPELL_COOLDOWN for script id %u", tablename, tmp.removeCooldown.spellId, tmp.id); + continue; + } + } break; } } diff --git a/src/game/ScriptMgr.h b/src/game/ScriptMgr.h index b743bf694..95c91f6c3 100644 --- a/src/game/ScriptMgr.h +++ b/src/game/ScriptMgr.h @@ -234,6 +234,12 @@ enum eScriptCommand // datalong1-4 = creature_spells id // dataint1-4 = chance (total cant be above 100) SCRIPT_COMMAND_REMOVE_GUARDIANS = 56, // source = Unit + // datalong = creature_id + SCRIPT_COMMAND_ADD_SPELL_COOLDOWN = 57, // source = Unit + // datalong = spell_id + // datalong2 = cooldown + SCRIPT_COMMAND_REMOVE_SPELL_COOLDOWN = 58, // source = Unit + // datalong = spell_id SCRIPT_COMMAND_MAX, @@ -695,7 +701,21 @@ struct ScriptInfo int32 chance[4]; // dataint to dataint4 } creatureSpells; - // SCRIPT_COMMAND_REMOVE_GUARDIANS (56) + struct // SCRIPT_COMMAND_REMOVE_GUARDIANS (56) + { + uint32 creatureId; // datalong + } removeGuardian; + + struct // SCRIPT_COMMAND_ADD_SPELL_COOLDOWN (57) + { + uint32 spellId; // datalong + uint32 cooldown; // datalong2 + } addCooldown; + + struct // SCRIPT_COMMAND_REMOVE_SPELL_COOLDOWN (58) + { + uint32 spellId; // datalong + } removeCooldown; struct {