diff --git a/sql/migrations/20180121232738_world.sql b/sql/migrations/20180121232738_world.sql new file mode 100644 index 000000000..2a7df3cf8 --- /dev/null +++ b/sql/migrations/20180121232738_world.sql @@ -0,0 +1,82 @@ +DROP PROCEDURE IF EXISTS add_migration; +delimiter ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20180121232738'); +IF v=0 THEN +INSERT INTO `migrations` VALUES ('20180121232738'); +-- Add your query below. + + +-- Adjust old Flag Set command. +UPDATE `event_scripts` SET `datalong3`=1 WHERE `command`=4; +UPDATE `creature_movement_scripts` SET `datalong3`=1 WHERE `command`=4; +UPDATE `creature_spells_scripts` SET `datalong3`=1 WHERE `command`=4; +UPDATE `gossip_scripts` SET `datalong3`=1 WHERE `command`=4; +UPDATE `gameobject_scripts` SET `datalong3`=1 WHERE `command`=4; +UPDATE `spell_scripts` SET `datalong3`=1 WHERE `command`=4; +UPDATE `quest_start_scripts` SET `datalong3`=1 WHERE `command`=4; +UPDATE `quest_end_scripts` SET `datalong3`=1 WHERE `command`=4; + +-- Adjust old Flag Remove command. +UPDATE `event_scripts` SET `datalong3`=2, `command`=4 WHERE `command`=5; +UPDATE `creature_movement_scripts` SET `datalong3`=2, `command`=4 WHERE `command`=5; +UPDATE `creature_spells_scripts` SET `datalong3`=2, `command`=4 WHERE `command`=5; +UPDATE `gossip_scripts` SET `datalong3`=2, `command`=4 WHERE `command`=5; +UPDATE `gameobject_scripts` SET `datalong3`=2, `command`=4 WHERE `command`=5; +UPDATE `spell_scripts` SET `datalong3`=2, `command`=4 WHERE `command`=5; +UPDATE `quest_start_scripts` SET `datalong3`=2, `command`=4 WHERE `command`=5; +UPDATE `quest_end_scripts` SET `datalong3`=2, `command`=4 WHERE `command`=5; + +-- Adjust old Go Lock State command. +UPDATE `event_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=1; +UPDATE `event_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=2; +UPDATE `event_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=4; +UPDATE `event_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=8; +UPDATE `creature_movement_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=1; +UPDATE `creature_movement_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=2; +UPDATE `creature_movement_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=4; +UPDATE `creature_movement_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=8; +UPDATE `creature_spells_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=1; +UPDATE `creature_spells_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=2; +UPDATE `creature_spells_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=4; +UPDATE `creature_spells_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=8; +UPDATE `gossip_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=1; +UPDATE `gossip_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=2; +UPDATE `gossip_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=4; +UPDATE `gossip_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=8; +UPDATE `gameobject_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=1; +UPDATE `gameobject_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=2; +UPDATE `gameobject_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=4; +UPDATE `gameobject_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=8; +UPDATE `spell_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=1; +UPDATE `spell_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=2; +UPDATE `spell_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=4; +UPDATE `spell_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=8; +UPDATE `quest_start_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=1; +UPDATE `quest_start_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=2; +UPDATE `quest_start_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=4; +UPDATE `quest_start_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=8; +UPDATE `quest_end_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=1; +UPDATE `quest_end_scripts` SET `datalong`=9, `datalong2`=2, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=2; +UPDATE `quest_end_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=1, `command`=4 WHERE `command`=27 && `datalong`=4; +UPDATE `quest_end_scripts` SET `datalong`=9, `datalong2`=16, `datalong3`=2, `command`=4 WHERE `command`=27 && `datalong`=8; + +-- Adjust old Modify NPC Flags command. +UPDATE `event_scripts` SET `datalong3`=`datalong2`, `datalong2`=`datalong`, `datalong`=147, `command`=4 WHERE `command`=29; +UPDATE `creature_movement_scripts` SET `datalong3`=`datalong2`, `datalong2`=`datalong`, `datalong`=147, `command`=4 WHERE `command`=29; +UPDATE `creature_spells_scripts` SET `datalong3`=`datalong2`, `datalong2`=`datalong`, `datalong`=147, `command`=4 WHERE `command`=29; +UPDATE `gossip_scripts` SET `datalong3`=`datalong2`, `datalong2`=`datalong`, `datalong`=147, `command`=4 WHERE `command`=29; +UPDATE `gameobject_scripts` SET `datalong3`=`datalong2`, `datalong2`=`datalong`, `datalong`=147, `command`=4 WHERE `command`=29; +UPDATE `spell_scripts` SET `datalong3`=`datalong2`, `datalong2`=`datalong`, `datalong`=147, `command`=4 WHERE `command`=29; +UPDATE `quest_start_scripts` SET `datalong3`=`datalong2`, `datalong2`=`datalong`, `datalong`=147, `command`=4 WHERE `command`=29; +UPDATE `quest_end_scripts` SET `datalong3`=`datalong2`, `datalong2`=`datalong`, `datalong`=147, `command`=4 WHERE `command`=29; + + +-- End of migration. +END IF; +END?? +delimiter ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/game/Maps/Map.h b/src/game/Maps/Map.h index da9a0756e..5e8de3440 100644 --- a/src/game/Maps/Map.h +++ b/src/game/Maps/Map.h @@ -632,8 +632,8 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj bool ScriptCommand_Emote(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_FieldSet(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_MoveTo(ScriptAction& step, Object* source, Object* target); - bool ScriptCommand_FlagSet(ScriptAction& step, Object* source, Object* target); - bool ScriptCommand_FlagRemove(ScriptAction& step, Object* source, Object* target); + bool ScriptCommand_ModifyFlags(ScriptAction& step, Object* source, Object* target); + bool ScriptCommand_InterruptCasts(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_TeleportTo(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_QuestExplored(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_KillCredit(ScriptAction& step, Object* source, Object* target); @@ -655,9 +655,9 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj bool ScriptCommand_Mount(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_SetRun(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_AttackStart(ScriptAction& step, Object* source, Object* target); - bool ScriptCommand_SetLockState(ScriptAction& step, Object* source, Object* target); + bool ScriptCommand_UpdateEntry(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_SetStandState(ScriptAction& step, Object* source, Object* target); - bool ScriptCommand_ModifyNpcFlags(ScriptAction& step, Object* source, Object* target); + bool ScriptCommand_ModifyThreat(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_SendTaxiPath(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_TerminateScript(ScriptAction& step, Object* source, Object* target); bool ScriptCommand_TerminateCondition(ScriptAction& step, Object* source, Object* target); @@ -675,8 +675,8 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj &Map::ScriptCommand_Emote, // 1 &Map::ScriptCommand_FieldSet, // 2 &Map::ScriptCommand_MoveTo, // 3 - &Map::ScriptCommand_FlagSet, // 4 - &Map::ScriptCommand_FlagRemove, // 5 + &Map::ScriptCommand_ModifyFlags, // 4 + &Map::ScriptCommand_InterruptCasts, // 5 &Map::ScriptCommand_TeleportTo, // 6 &Map::ScriptCommand_QuestExplored, // 7 &Map::ScriptCommand_KillCredit, // 8 @@ -698,9 +698,9 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj &Map::ScriptCommand_Mount, // 24 &Map::ScriptCommand_SetRun, // 25 &Map::ScriptCommand_AttackStart, // 26 - &Map::ScriptCommand_SetLockState, // 27 + &Map::ScriptCommand_UpdateEntry, // 27 &Map::ScriptCommand_SetStandState, // 28 - &Map::ScriptCommand_ModifyNpcFlags, // 29 + &Map::ScriptCommand_ModifyThreat, // 29 &Map::ScriptCommand_SendTaxiPath, // 30 &Map::ScriptCommand_TerminateScript, // 31 &Map::ScriptCommand_TerminateCondition, // 32 diff --git a/src/game/Maps/ScriptCommands.cpp b/src/game/Maps/ScriptCommands.cpp index cde30c6a5..89c9015c2 100644 --- a/src/game/Maps/ScriptCommands.cpp +++ b/src/game/Maps/ScriptCommands.cpp @@ -184,44 +184,58 @@ bool Map::ScriptCommand_MoveTo(ScriptAction& step, Object* source, Object* targe return false; } -// SCRIPT_COMMAND_FLAG_SET (4) -bool Map::ScriptCommand_FlagSet(ScriptAction& step, Object* source, Object* target) +// SCRIPT_COMMAND_MODIFY_FLAGS (4) +bool Map::ScriptCommand_ModifyFlags(ScriptAction& step, Object* source, Object* target) { if (!source) { - sLog.outError("SCRIPT_COMMAND_FLAG_SET (script id %u) call for a NULL object, skipping.", step.script->id); + sLog.outError("SCRIPT_COMMAND_MODIFY_FLAGS (script id %u) call for a NULL object, skipping.", step.script->id); return ShouldAbortScript(step); } - if (step.script->setFlag.fieldId <= OBJECT_FIELD_ENTRY || step.script->setFlag.fieldId >= source->GetValuesCount()) + if (step.script->modFlags.fieldId <= OBJECT_FIELD_ENTRY || step.script->modFlags.fieldId >= source->GetValuesCount()) { - sLog.outError("SCRIPT_COMMAND_FLAG_SET (script id %u) call for wrong field %u (max count: %u) in object (TypeId: %u).", - step.script->id, step.script->setFlag.fieldId, source->GetValuesCount(), source->GetTypeId()); + sLog.outError("SCRIPT_COMMAND_MODIFY_FLAGS (script id %u) call for wrong field %u (max count: %u) in object (TypeId: %u).", + step.script->id, step.script->modFlags.fieldId, source->GetValuesCount(), source->GetTypeId()); return ShouldAbortScript(step); } - source->SetFlag(step.script->setFlag.fieldId, step.script->setFlag.fieldValue); + // Add Flags + if (step.script->modFlags.mode == SO_MODIFYFLAGS_SET) + source->SetFlag(step.script->modFlags.fieldId, step.script->modFlags.fieldValue); + // Remove Flags + else if (step.script->modFlags.mode == SO_MODIFYFLAGS_REMOVE) + source->RemoveFlag(step.script->modFlags.fieldId, step.script->modFlags.fieldValue); + // Toggle Flags + else + { + if (source->HasFlag(step.script->modFlags.fieldId, step.script->modFlags.fieldValue)) + source->RemoveFlag(step.script->modFlags.fieldId, step.script->modFlags.fieldValue); + else + source->SetFlag(step.script->modFlags.fieldId, step.script->modFlags.fieldValue); + } return false; } -// SCRIPT_COMMAND_FLAG_REMOVE (5) -bool Map::ScriptCommand_FlagRemove(ScriptAction& step, Object* source, Object* target) +// SCRIPT_COMMAND_INTERRUPT_CASTS (5) +bool Map::ScriptCommand_InterruptCasts(ScriptAction& step, Object* source, Object* target) { if (!source) { - sLog.outError("SCRIPT_COMMAND_FLAG_REMOVE (script id %u) call for a NULL object, skipping.", step.script->id); + sLog.outError("SCRIPT_COMMAND_INTERRUPT_CAST (script id %u) call for a NULL object, skipping.", step.script->id); return ShouldAbortScript(step); } - if (step.script->removeFlag.fieldId <= OBJECT_FIELD_ENTRY || step.script->removeFlag.fieldId >= source->GetValuesCount()) + if (!source->isType(TYPEMASK_UNIT)) { - sLog.outError("SCRIPT_COMMAND_FLAG_REMOVE (script id %u) call for wrong field %u (max count: %u) in object (TypeId: %u).", - step.script->id, step.script->removeFlag.fieldId, source->GetValuesCount(), source->GetTypeId()); + sLog.outError("SCRIPT_COMMAND_INTERRUPT_CAST (script id %u) call for a non-unit source (TypeId: %u), skipping.", step.script->id, source->GetTypeId()); return ShouldAbortScript(step); } - source->RemoveFlag(step.script->removeFlag.fieldId, step.script->removeFlag.fieldValue); + Unit* pSource = static_cast(source); + + pSource->InterruptNonMeleeSpells(step.script->interruptCasts.withDelayed, step.script->interruptCasts.spellId); return false; } @@ -797,55 +811,55 @@ bool Map::ScriptCommand_SetMovementType(ScriptAction& step, Object* source, Obje switch (step.script->movement.movementType) { - case IDLE_MOTION_TYPE: - pSource->GetMotionMaster()->MoveIdle(); - break; - case RANDOM_MOTION_TYPE: - pSource->GetMotionMaster()->MoveRandom(); - break; - case WAYPOINT_MOTION_TYPE: - pSource->GetMotionMaster()->MoveWaypoint(step.script->movement.boolParam); - break; - case CONFUSED_MOTION_TYPE: - pSource->GetMotionMaster()->MoveConfused(); - break; - case CHASE_MOTION_TYPE: - if (step.script->movement.boolParam) // chase victim - { - if (Unit* pVictim = pSource->getVictim()) - pSource->GetMotionMaster()->MoveChase(pVictim, step.script->x, step.script->o); + case IDLE_MOTION_TYPE: + pSource->GetMotionMaster()->MoveIdle(); break; - } - else if (pTarget) - pSource->GetMotionMaster()->MoveChase(pTarget, step.script->x, step.script->o); - break; - case HOME_MOTION_TYPE: - pSource->GetMotionMaster()->MoveTargetedHome(); - break; - case FLEEING_MOTION_TYPE: - if (step.script->movement.boolParam) // flee from victim - { - if (Unit* pVictim = pSource->getVictim()) - pSource->GetMotionMaster()->MoveFleeing(pVictim, step.script->movement.intParam); + case RANDOM_MOTION_TYPE: + pSource->GetMotionMaster()->MoveRandom(); break; - } - else if (pTarget) - pSource->GetMotionMaster()->MoveFleeing(pTarget, step.script->movement.intParam); - break; - case DISTRACT_MOTION_TYPE: - pSource->GetMotionMaster()->MoveDistract(step.script->movement.intParam); - break; - case FOLLOW_MOTION_TYPE: - if (pTarget) - pSource->GetMotionMaster()->MoveFollow(pTarget, step.script->x, step.script->o); - break; - case CHARGE_MOTION_TYPE: - if (pTarget) - pSource->GetMotionMaster()->MoveCharge(pTarget, step.script->movement.intParam, step.script->movement.boolParam); - break; - default: - sLog.outError("SCRIPT_COMMAND_MOVEMENT (script id %u) call for an invalid motion type (MotionType: %u), skipping.", step.script->id, step.script->movement.movementType); - return ShouldAbortScript(step); + case WAYPOINT_MOTION_TYPE: + pSource->GetMotionMaster()->MoveWaypoint(step.script->movement.boolParam); + break; + case CONFUSED_MOTION_TYPE: + pSource->GetMotionMaster()->MoveConfused(); + break; + case CHASE_MOTION_TYPE: + if (step.script->movement.boolParam) // chase victim + { + if (Unit* pVictim = pSource->getVictim()) + pSource->GetMotionMaster()->MoveChase(pVictim, step.script->x, step.script->o); + break; + } + else if (pTarget) + pSource->GetMotionMaster()->MoveChase(pTarget, step.script->x, step.script->o); + break; + case HOME_MOTION_TYPE: + pSource->GetMotionMaster()->MoveTargetedHome(); + break; + case FLEEING_MOTION_TYPE: + if (step.script->movement.boolParam) // flee from victim + { + if (Unit* pVictim = pSource->getVictim()) + pSource->GetMotionMaster()->MoveFleeing(pVictim, step.script->movement.intParam); + break; + } + else if (pTarget) + pSource->GetMotionMaster()->MoveFleeing(pTarget, step.script->movement.intParam); + break; + case DISTRACT_MOTION_TYPE: + pSource->GetMotionMaster()->MoveDistract(step.script->movement.intParam); + break; + case FOLLOW_MOTION_TYPE: + if (pTarget) + pSource->GetMotionMaster()->MoveFollow(pTarget, step.script->x, step.script->o); + break; + case CHARGE_MOTION_TYPE: + if (pTarget) + pSource->GetMotionMaster()->MoveCharge(pTarget, step.script->movement.intParam, step.script->movement.boolParam); + break; + default: + sLog.outError("SCRIPT_COMMAND_MOVEMENT (script id %u) call for an invalid motion type (MotionType: %u), skipping.", step.script->id, step.script->movement.movementType); + return ShouldAbortScript(step); } return false; @@ -997,31 +1011,25 @@ bool Map::ScriptCommand_AttackStart(ScriptAction& step, Object* source, Object* return false; } -// SCRIPT_COMMAND_GO_LOCK_STATE (27) -bool Map::ScriptCommand_SetLockState(ScriptAction& step, Object* source, Object* target) +// SCRIPT_COMMAND_UPDATE_ENTRY (27) +bool Map::ScriptCommand_UpdateEntry(ScriptAction& step, Object* source, Object* target) { - GameObject* pGo = nullptr; - - if (source && source->GetTypeId() == TYPEID_GAMEOBJECT) - pGo = static_cast(source); - else if (target && target->GetTypeId() == TYPEID_GAMEOBJECT) - pGo = static_cast(target); - else + if (!source) { - sLog.outError("SCRIPT_COMMAND_GO_LOCK_STATE (script id %u) call for a NULL or non-worldobject source and target, skipping.", step.script->id); + sLog.outError("SCRIPT_COMMAND_UPDATE_ENTRY (script id %u) call for a NULL source, skipping.", step.script->id); return ShouldAbortScript(step); } - // Lock or Unlock - if (step.script->goLockState.lockState & SF_GOLOCKSTATE_LOCK) - pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - else if (step.script->goLockState.lockState & SF_GOLOCKSTATE_UNLOCK) - pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); - // Set Non Interactable or Set Interactable - if (step.script->goLockState.lockState & SF_GOLOCKSTATE_NO_INTERACT) - pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); - else if (step.script->goLockState.lockState & SF_GOLOCKSTATE_INTERACT) - pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); + if (source->GetTypeId() != TYPEID_UNIT) + { + sLog.outError("SCRIPT_COMMAND_UPDATE_ENTRY (script id %u) call for a non-creature source (TypeId: %u), skipping.", step.script->id, source->GetTypeId()); + return ShouldAbortScript(step); + } + + Creature* pSource = static_cast(source); + + if (pSource->GetEntry() != step.script->updateEntry.creatureEntry) + pSource->UpdateEntry(step.script->updateEntry.creatureEntry, step.script->updateEntry.team ? HORDE : ALLIANCE); return false; } @@ -1048,34 +1056,45 @@ bool Map::ScriptCommand_SetStandState(ScriptAction& step, Object* source, Object return false; } -// SCRIPT_COMMAND_MODIFY_NPC_FLAGS (29) -bool Map::ScriptCommand_ModifyNpcFlags(ScriptAction& step, Object* source, Object* target) +// SCRIPT_COMMAND_MODIFY_THREAT (29) +bool Map::ScriptCommand_ModifyThreat(ScriptAction& step, Object* source, Object* target) { - Creature* pSource = nullptr; - - if (source && source->GetTypeId() == TYPEID_UNIT) - pSource = static_cast(source); - else if (target && target->GetTypeId() == TYPEID_UNIT) - pSource = static_cast(target); - else + if (!source) { - sLog.outError("SCRIPT_COMMAND_MODIFY_NPC_FLAGS (script id %u) call for a NULL or non-creature source and target, skipping.", step.script->id); + sLog.outError("SCRIPT_COMMAND_MODIFY_THREAT (script id %u) call for a NULL source, skipping.", step.script->id); return ShouldAbortScript(step); } - // Add Flags - if (step.script->npcFlag.change_flag & SO_NPCFLAG_SET) - pSource->SetFlag(UNIT_NPC_FLAGS, step.script->npcFlag.flag); - // Remove Flags - else if (step.script->npcFlag.change_flag & SO_NPCFLAG_REMOVE) - pSource->RemoveFlag(UNIT_NPC_FLAGS, step.script->npcFlag.flag); - // Toggle Flags - else + if (source->GetTypeId() != TYPEID_UNIT) { - if (pSource->HasFlag(UNIT_NPC_FLAGS, step.script->npcFlag.flag)) - pSource->RemoveFlag(UNIT_NPC_FLAGS, step.script->npcFlag.flag); - else - pSource->SetFlag(UNIT_NPC_FLAGS, step.script->npcFlag.flag); + sLog.outError("SCRIPT_COMMAND_MODIFY_THREAT (script id %u) call for a non-creature source (TypeId: %u), skipping.", step.script->id, source->GetTypeId()); + return ShouldAbortScript(step); + } + + Creature* pSource = static_cast(source); + + switch (step.script->modThreat.target) + { + case SO_MODIFYTHREAT_PROVIDED_TARGET: + { + if (target && target->isType(TYPEMASK_UNIT)) + pSource->getThreatManager().modifyThreatPercent(static_cast(target), step.script->x); + break; + } + case SO_MODIFYTHREAT_CURRENT_VICTIM: + { + if (Unit* pVictim = pSource->getVictim()) + pSource->getThreatManager().modifyThreatPercent(pVictim, step.script->x); + break; + } + case SO_MODIFYTHREAT_ALL_ATTACKERS: + { + ThreatList const& threatList = pSource->getThreatManager().getThreatList(); + for (ThreatList::const_iterator i = threatList.begin(); i != threatList.end(); ++i) + if (Unit* Temp = pSource->GetMap()->GetUnit((*i)->getUnitGuid())) + pSource->getThreatManager().modifyThreatPercent(Temp, step.script->x); + break; + } } return false; diff --git a/src/game/ScriptMgr.cpp b/src/game/ScriptMgr.cpp index c1e016bf5..6a6bcf5e0 100644 --- a/src/game/ScriptMgr.cpp +++ b/src/game/ScriptMgr.cpp @@ -237,6 +237,16 @@ void ScriptMgr::LoadScripts(ScriptMapMap& scripts, const char* tablename) break; } + case SCRIPT_COMMAND_INTERRUPT_CASTS: + { + if (tmp.interruptCasts.spellId && !sSpellMgr.GetSpellEntry(tmp.interruptCasts.spellId)) + { + sLog.outErrorDb("Table `%s` using nonexistent spell (id: %u) in SCRIPT_COMMAND_INTERRUPT_CASTS for script id %u", tablename, tmp.interruptCasts.spellId, tmp.id); + continue; + } + + break; + } case SCRIPT_COMMAND_TELEPORT_TO: { if (!sMapStorage.LookupEntry(tmp.teleportTo.mapId)) @@ -540,20 +550,14 @@ void ScriptMgr::LoadScripts(ScriptMapMap& scripts, const char* tablename) { break; } - case SCRIPT_COMMAND_GO_LOCK_STATE: + case SCRIPT_COMMAND_UPDATE_ENTRY: { - if (// lock(0x01) and unlock(0x02) together - ((tmp.goLockState.lockState & SF_GOLOCKSTATE_LOCK) && (tmp.goLockState.lockState & SF_GOLOCKSTATE_UNLOCK)) || - // non-interact (0x4) and interact (0x08) together - ((tmp.goLockState.lockState & SF_GOLOCKSTATE_NO_INTERACT) && (tmp.goLockState.lockState & SF_GOLOCKSTATE_INTERACT)) || - // no setting - !tmp.goLockState.lockState || - // invalid number - tmp.goLockState.lockState >= SF_GOLOCKSTATE_MAX) + if (!ObjectMgr::GetCreatureTemplate(tmp.updateEntry.creatureEntry)) { - sLog.outErrorDb("Table `%s` has invalid lock state (datalong = %u) in SCRIPT_COMMAND_GO_LOCK_STATE for script id %u.", tablename, tmp.goLockState.lockState, tmp.id); + sLog.outErrorDb("Table `%s` has invalid creature (Entry: %u) in SCRIPT_COMMAND_UPDATE_ENTRY for script id %u", tablename, tmp.updateEntry.creatureEntry, tmp.id); continue; } + break; } case SCRIPT_COMMAND_STAND_STATE: @@ -565,8 +569,13 @@ void ScriptMgr::LoadScripts(ScriptMapMap& scripts, const char* tablename) } break; } - case SCRIPT_COMMAND_MODIFY_NPC_FLAGS: + case SCRIPT_COMMAND_MODIFY_THREAT: { + if (tmp.modThreat.target >= SO_MODIFYTHREAT_MAX_TARGETS) + { + sLog.outErrorDb("Table `%s` has invalid target type (datalong = %u) in SCRIPT_COMMAND_MODIFY_THREAT for script id %u", tablename, tmp.modThreat.target, tmp.id); + continue; + } break; } case SCRIPT_COMMAND_SEND_TAXI_PATH: diff --git a/src/game/ScriptMgr.h b/src/game/ScriptMgr.h index 10c25eccc..d323dee3c 100644 --- a/src/game/ScriptMgr.h +++ b/src/game/ScriptMgr.h @@ -72,12 +72,13 @@ enum eScriptCommand // datalong3 = movement_options (see enum MoveOptions) // datalong4 = eMoveToFlags // x/y/z/o = coordinates - SCRIPT_COMMAND_FLAG_SET = 4, // source = Object - // datalong = field_id - // datalong2 = bitmask - SCRIPT_COMMAND_FLAG_REMOVE = 5, // source = Object + SCRIPT_COMMAND_MODIFY_FLAGS = 4, // source = Object // datalong = field_id // datalong2 = bitmask + // datalong3 = eModifyFlagsOptions + SCRIPT_COMMAND_INTERRUPT_CASTS = 5, // source = Unit + // datalong = (bool) with_delayed + // datalong2 = spell_id (optional) SCRIPT_COMMAND_TELEPORT_TO = 6, // source = Unit // datalong = map_id (only used for players but still required) // datalong2 = teleport_options (see enum TeleportToOptions) @@ -96,9 +97,12 @@ enum eScriptCommand SCRIPT_COMMAND_TEMP_SUMMON_CREATURE = 10, // source = WorldObject (from provided source or buddy) // datalong = creature_entry // datalong2 = despawn_delay + // datalong3 = unique_limit + // datalong4 = unique_distance // data_flags = eSummonCreatureFlags // dataint = (bool) setRun; 0 = off (default), 1 = on // dataint2 = eSummonCreatureFacingOptions + // x/y/z/o = coordinates SCRIPT_COMMAND_OPEN_DOOR = 11, // source = GameObject (from datalong, provided source or target) // If provided target is BUTTON GameObject, command is run on it too. // datalong = db_guid @@ -139,7 +143,7 @@ enum eScriptCommand // datalong = (bool) 0=off, 1=on SCRIPT_COMMAND_SET_FACTION = 22, // source = Creature // datalong = faction_Id, - // datalong2= see enum TemporaryFactionFlags + // datalong2 = see enum TemporaryFactionFlags SCRIPT_COMMAND_MORPH_TO_ENTRY_OR_MODEL = 23, // source = Creature // datalong = creature entry/modelid (depend on datalong2) // datalong2 = (bool) is_display_id @@ -150,13 +154,14 @@ enum eScriptCommand // datalong = (bool) 0 = off, 1 = on SCRIPT_COMMAND_ATTACK_START = 26, // source = Creature // target = Player - SCRIPT_COMMAND_GO_LOCK_STATE = 27, // source = GameObject - // datalong = eGoLockStateFlags + SCRIPT_COMMAND_UPDATE_ENTRY = 27, // source = Creature + // datalong = creature_entry + // datalong2 = team for display_id (0 = alliance, 1 = horde) SCRIPT_COMMAND_STAND_STATE = 28, // source = Unit // datalong = stand_state (enum UnitStandStateType) - SCRIPT_COMMAND_MODIFY_NPC_FLAGS = 29, // source = Creature - // datalong = see enum NPCFlags - // datalong2 = eModifyNpcFlagOptions + SCRIPT_COMMAND_MODIFY_THREAT = 29, // source = Creature + // datalong = eModifyThreatTargets + // x = percent SCRIPT_COMMAND_SEND_TAXI_PATH = 30, // source = Player // datalong = taxi_path_id SCRIPT_COMMAND_TERMINATE_SCRIPT = 31, // source = Any @@ -208,6 +213,14 @@ enum eMoveToCoordinateTypes MOVETO_COORDINATES_MAX }; +// Possible datalong3 values for SCRIPT_COMMAND_MODIFY_FLAGS +enum eModifyFlagsOptions +{ + SO_MODIFYFLAGS_TOGGLE = 0, + SO_MODIFYFLAGS_SET = 1, + SO_MODIFYFLAGS_REMOVE = 2 +}; + // Flags used by SCRIPT_COMMAND_TEMP_SUMMON_CREATURE // Must start from 0x8 because of target selection flags. enum eSummonCreatureFlags @@ -238,23 +251,14 @@ enum ePlaySoundFlags SF_PLAYSOUND_DISTANCE_DEPENDENT = 0x2 }; -// Flags used by SCRIPT_COMMAND_GO_LOCK_STATE -enum eGoLockStateFlags +// Possible datalong values for SCRIPT_COMMAND_MODIFY_THREAT +enum eModifyThreatTargets { - SF_GOLOCKSTATE_LOCK = 0x1, - SF_GOLOCKSTATE_UNLOCK = 0x2, - SF_GOLOCKSTATE_NO_INTERACT = 0x4, - SF_GOLOCKSTATE_INTERACT = 0x8, + SO_MODIFYTHREAT_PROVIDED_TARGET = 0, + SO_MODIFYTHREAT_CURRENT_VICTIM = 1, + SO_MODIFYTHREAT_ALL_ATTACKERS = 2, - SF_GOLOCKSTATE_MAX = 0x10 -}; - -// Possible datalong2 values for SCRIPT_COMMAND_MODIFY_NPC_FLAGS -enum eModifyNpcFlagOptions -{ - SO_NPCFLAG_SET = 1, - SO_NPCFLAG_REMOVE = 2, - SO_NPCFLAG_TOGGLE = 3 + SO_MODIFYTHREAT_MAX_TARGETS }; // Possible datalong3 values for SCRIPT_COMMAND_TERMINATE_SCRIPT @@ -357,22 +361,23 @@ struct ScriptInfo uint32 flags; // datalong4 } moveTo; - struct // SCRIPT_COMMAND_FLAG_SET (4) + struct // SCRIPT_COMMAND_MODIFY_FLAGS (4) { uint32 fieldId; // datalong uint32 fieldValue; // datalong2 - } setFlag; + uint32 mode; // datalong3 + } modFlags; - struct // SCRIPT_COMMAND_FLAG_REMOVE (5) + struct // SCRIPT_COMMAND_INTERRUPT_CASTS (5) { - uint32 fieldId; // datalong - uint32 fieldValue; // datalong2 - } removeFlag; + uint32 withDelayed; // datalong + uint32 spellId; // datalong2 + } interruptCasts; struct // SCRIPT_COMMAND_TELEPORT_TO (6) { uint32 mapId; // datalong - uint32 teleportOptions; // datalong2 + uint32 teleportOptions; // datalong2 } teleportTo; struct // SCRIPT_COMMAND_QUEST_EXPLORED (7) @@ -493,21 +498,21 @@ struct ScriptInfo // SCRIPT_COMMAND_ATTACK_START (26) - struct // SCRIPT_COMMAND_GO_LOCK_STATE (27) + struct // SCRIPT_COMMAND_UPDATE_ENTRY (27) { - uint32 lockState; // datalong - } goLockState; + uint32 creatureEntry; // datalong + uint32 team; // datalong2 + } updateEntry; struct // SCRIPT_COMMAND_STAND_STATE (28) { uint32 stand_state; // datalong } standState; - struct // SCRIPT_COMMAND_MODIFY_NPC_FLAGS (29) + struct // SCRIPT_COMMAND_MODIFY_THREAT (29) { - uint32 flag; // datalong - uint32 change_flag; // datalong2 - } npcFlag; + uint32 target; // datalong + } modThreat; struct // SCRIPT_COMMAND_SEND_TAXI_PATH (30) {