- diff --git a/doc/script_commands.txt b/doc/script_commands.txt
- index b006040..8e8cada 100644
- --- a/doc/script_commands.txt
- +++ b/doc/script_commands.txt
- @@ -296,9 +296,9 @@ Where "A -> B" means that the command is executed from A with B as target.
- * !(data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL): terminate when condition is true
- data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL: terminate when condition is false
- -35 SCRIPT_COMMAND_SEND_AI_EVENT_AROUND * resultingSource = Creature, resultingTarget = Unit
- +35 SCRIPT_COMMAND_SEND_AI_EVENT * resultingSource = Creature, resultingTarget = Unit
- * datalong = AIEventType - limited only to EventAI supported events
- - * datalong2 = radius
- + * datalong2 = radius. If radius isn't provided and the target is a creature, then send AIEvent to target
- 36 SCRIPT_COMMAND_SET_FACING Turn resultingSource towards resultingTarget
- * resultingSource = Creature, resultingTarget WorldObject
- @@ -319,3 +319,11 @@ Where "A -> B" means that the command is executed from A with B as target.
- * datalong = mailTemplateId
- * datalong2: AlternativeSenderEntry. Use as sender-Entry of the sent mail
- * dataint1: Delay (>= 0) in Seconds
- +
- +39 SCRIPT_COMMAND_RESPAWN_SELF * resultingTarget = Creature
- +
- +40 SCRIPT_COMMAND_SET_FLY * resultingSource = Creature
- + * datalong = bool 0=off, 1=on
- + * data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL use SetCanFly() instead of SetLevitate() move flag
- +
- +41 SCRIPT_COMMAND_DESPAWN_GO * resultingTarget = GameObject
- diff --git a/src/game/CreatureAI.h b/src/game/CreatureAI.h
- index 9bbb2df..9bf88ed 100644
- --- a/src/game/CreatureAI.h
- +++ b/src/game/CreatureAI.h
- @@ -70,10 +70,14 @@ enum AIEventType
- AI_EVENT_CUSTOM_EVENTAI_A = 5, // Sender = Npc that throws custom event, Invoker = TARGET_T_ACTION_INVOKER (if exists)
- AI_EVENT_CUSTOM_EVENTAI_B = 6, // Sender = Npc that throws custom event, Invoker = TARGET_T_ACTION_INVOKER (if exists)
- AI_EVENT_GOT_CCED = 7, // Sender = CCed Npc, Invoker = Caster that CCed
- - MAXIMAL_AI_EVENT_EVENTAI = 8,
- + AI_EVENT_CUSTOM_EVENTAI_C = 8, // Sender = Npc that throws custom event, Invoker = TARGET_T_ACTION_INVOKER (if exists)
- + AI_EVENT_CUSTOM_EVENTAI_D = 9, // Sender = Npc that throws custom event, Invoker = TARGET_T_ACTION_INVOKER (if exists)
- + AI_EVENT_CUSTOM_EVENTAI_E = 10, // Sender = Npc that throws custom event, Invoker = TARGET_T_ACTION_INVOKER (if exists)
- + AI_EVENT_CUSTOM_EVENTAI_F = 11, // Sender = Npc that throws custom event, Invoker = TARGET_T_ACTION_INVOKER (if exists)
- + MAXIMAL_AI_EVENT_EVENTAI = 12,
- // Internal Use
- - AI_EVENT_CALL_ASSISTANCE = 10, // Sender = Attacked Npc, Invoker = Enemy
- + AI_EVENT_CALL_ASSISTANCE = 13, // Sender = Attacked Npc, Invoker = Enemy
- // Predefined for SD2
- AI_EVENT_START_ESCORT = 100, // Invoker = Escorting Player
- diff --git a/src/game/ScriptMgr.cpp b/src/game/ScriptMgr.cpp
- index 32cf3e2..c95bbd0 100644
- --- a/src/game/ScriptMgr.cpp
- +++ b/src/game/ScriptMgr.cpp
- @@ -691,7 +691,7 @@ void ScriptMgr::LoadScripts(ScriptMapMapName& scripts, const char* tablename)
- }
- break;
- }
- - case SCRIPT_COMMAND_SEND_AI_EVENT_AROUND: // 35
- + case SCRIPT_COMMAND_SEND_AI_EVENT: // 35
- {
- if (tmp.sendAIEvent.eventType >= MAXIMAL_AI_EVENT_EVENTAI)
- {
- @@ -725,6 +725,10 @@ void ScriptMgr::LoadScripts(ScriptMapMapName& scripts, const char* tablename)
- }
- break;
- }
- + case SCRIPT_COMMAND_RESPAWN_SELF: // 39
- + case SCRIPT_COMMAND_SET_FLY: // 40
- + case SCRIPT_COMMAND_DESPAWN_GO: // 41
- + break;
- default:
- {
- sLog.outErrorDb("Table `%s` unknown command %u, skipping.", tablename, tmp.command);
- @@ -1864,14 +1868,19 @@ bool ScriptAction::HandleScriptStep()
- }
- return terminateResult;
- }
- - case SCRIPT_COMMAND_SEND_AI_EVENT_AROUND: // 35
- + case SCRIPT_COMMAND_SEND_AI_EVENT: // 35
- {
- if (LogIfNotCreature(pSource))
- return false;
- if (LogIfNotUnit(pTarget))
- break;
- - ((Creature*)pSource)->AI()->SendAIEventAround(AIEventType(m_script->sendAIEvent.eventType), (Unit*)pTarget, 0, float(m_script->sendAIEvent.radius));
- + // if radius is provided send AI event around
- + if (m_script->sendAIEvent.radius)
- + ((Creature*)pSource)->AI()->SendAIEventAround(AIEventType(m_script->sendAIEvent.eventType), (Unit*)pTarget, 0, float(m_script->sendAIEvent.radius));
- + // else if no radius and target is creature send AI event to target
- + else if (pTarget->GetTypeId() == TYPEID_UNIT)
- + ((Creature*)pSource)->AI()->SendAIEvent(AIEventType(m_script->sendAIEvent.eventType), NULL, (Creature*)pTarget);
- break;
- }
- case SCRIPT_COMMAND_SET_FACING: // 36
- @@ -1952,6 +1961,43 @@ bool ScriptAction::HandleScriptStep()
- MailDraft(m_script->sendMail.mailTemplateId).SendMailTo(static_cast<Player*>(pTarget), sender, MAIL_CHECK_MASK_HAS_BODY, deliverDelay);
- break;
- }
- + case SCRIPT_COMMAND_RESPAWN_SELF: // 39
- + {
- + // TODO - Remove this check after a while
- + if (pTarget && pTarget->GetTypeId() != TYPEID_UNIT && pSource && pSource->GetTypeId() == TYPEID_UNIT)
- + {
- + sLog.outErrorDb("DB-SCRIPTS: Process table `%s` id %u, command %u target must be creature, but (only) source is, use data_flags to fix", m_table, m_script->id, m_script->command);
- + pTarget = pSource;
- + }
- +
- + if (LogIfNotCreature(pTarget))
- + break;
- +
- + ((Creature*)pTarget)->Respawn();
- +
- + break;
- + }
- + case SCRIPT_COMMAND_SET_FLY: // 40
- + {
- + if (LogIfNotCreature(pSource))
- + break;
- +
- + if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL)
- + ((Creature*)pSource)->SetCanFly(!m_script->fly.fly);
- + else
- + ((Creature*)pSource)->SetLevitate(!m_script->fly.fly);
- +
- + break;
- + }
- + case SCRIPT_COMMAND_DESPAWN_GO: // 41
- + {
- + if (LogIfNotGameObject(pTarget))
- + break;
- +
- + // ToDo: Change this to pGo->ForcedDespawn() when function is implemented!
- + ((GameObject*)pTarget)->SetLootState(GO_JUST_DEACTIVATED);
- + break;
- + }
- default:
- sLog.outErrorDb(" DB-SCRIPTS: Process table `%s` id %u, command %u unknown command used.", m_table, m_script->id, m_script->command);
- break;
- diff --git a/src/game/ScriptMgr.h b/src/game/ScriptMgr.h
- index 9b5069c..a4a4f40 100644
- --- a/src/game/ScriptMgr.h
- +++ b/src/game/ScriptMgr.h
- @@ -101,7 +101,7 @@ enum ScriptCommand // resSource, resTar
- SCRIPT_COMMAND_XP_USER = 33, // source or target with Player, datalong = bool (0=off, 1=on)
- SCRIPT_COMMAND_TERMINATE_COND = 34, // datalong = condition_id, datalong2 = if != 0 then quest_id of quest that will be failed for player's group if the script is terminated
- // data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL terminate when condition is false ELSE terminate when condition is true
- - SCRIPT_COMMAND_SEND_AI_EVENT_AROUND = 35, // resSource = Creature, resTarget = Unit
- + SCRIPT_COMMAND_SEND_AI_EVENT = 35, // resSource = Creature, resTarget = Unit
- // datalong = AIEventType
- // datalong2 = radius
- SCRIPT_COMMAND_SET_FACING = 36, // resSource = Creature, resTarget WorldObject. Turn resSource towards Taget
- @@ -117,6 +117,11 @@ enum ScriptCommand // resSource, resTar
- // datalong: Send mailTemplateId from resSource (if provided) to player resTarget
- // datalong2: AlternativeSenderEntry. Use as sender-Entry
- // dataint1: Delay (>= 0) in Seconds
- + SCRIPT_COMMAND_RESPAWN_SELF = 39, // resSource = Creature
- + SCRIPT_COMMAND_SET_FLY = 40, // resSource = Creature
- + // datalong = bool 0=off, 1=on
- + // data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL use SetCanFly() instead of SetLevitate() move flag
- + SCRIPT_COMMAND_DESPAWN_GO = 41, // resTarget = GameObject
- };
- #define MAX_TEXT_ID 4 // used for SCRIPT_COMMAND_TALK, SCRIPT_COMMAND_EMOTE, SCRIPT_COMMAND_CAST_SPELL, SCRIPT_COMMAND_TERMINATE_SCRIPT
- @@ -364,6 +369,16 @@ struct ScriptInfo
- uint32 altSender; // datalong2;
- } sendMail;
- + // datalong unused // SCRIPT_COMMAND_RESPAWN_SELF (39)
- +
- + struct // SCRIPT_COMMAND_SET_FLY (40)
- + {
- + uint32 fly; // datalong
- + uint32 empty; // datalong2
- + } fly;
- +
- + // datalong unsed // SCRIPT_COMMAND_DESPAWN_GO (41)
- +
- struct
- {
- uint32 data[2];
- @@ -406,6 +421,7 @@ struct ScriptInfo
- case SCRIPT_COMMAND_CLOSE_DOOR:
- case SCRIPT_COMMAND_ACTIVATE_OBJECT:
- case SCRIPT_COMMAND_GO_LOCK_STATE:
- + case SCRIPT_COMMAND_DESPAWN_GO:
- return false;
- default:
- return true;
- @@ -427,6 +443,7 @@ struct ScriptInfo
- case SCRIPT_COMMAND_TERMINATE_COND:
- case SCRIPT_COMMAND_SET_FACING:
- case SCRIPT_COMMAND_MOVE_DYNAMIC:
- + case SCRIPT_COMMAND_SET_FLY:
- return true;
- default:
- return false;