aboutsummaryrefslogtreecommitdiff
path: root/src/bindings/scripts/base
diff options
context:
space:
mode:
authormaximius <none@none>2009-10-17 15:35:07 -0700
committermaximius <none@none>2009-10-17 15:35:07 -0700
commit26b5e033ffde3d161382fc9addbfa99738379641 (patch)
treea344f369ca32945f787a02dee35c3dbe342bed7e /src/bindings/scripts/base
parentf21f47005dcb6b76e1abc9f35fbcd03eed191bff (diff)
*Massive cleanup (\n\n -> \n, *\n -> \n, cleanup for(...) to for (...), and some other cleanups by hand)
*Fix a possible crash in Spell::DoAllEffectOnTarget --HG-- branch : trunk
Diffstat (limited to 'src/bindings/scripts/base')
-rw-r--r--src/bindings/scripts/base/escort_ai.cpp88
-rw-r--r--src/bindings/scripts/base/escort_ai.h29
-rw-r--r--src/bindings/scripts/base/follower_ai.cpp69
-rw-r--r--src/bindings/scripts/base/follower_ai.h21
-rw-r--r--src/bindings/scripts/base/guard_ai.cpp31
-rw-r--r--src/bindings/scripts/base/guard_ai.h13
-rw-r--r--src/bindings/scripts/base/simple_ai.cpp42
-rw-r--r--src/bindings/scripts/base/simple_ai.h17
8 files changed, 5 insertions, 305 deletions
diff --git a/src/bindings/scripts/base/escort_ai.cpp b/src/bindings/scripts/base/escort_ai.cpp
index 4d6083ab470..5c256aceb65 100644
--- a/src/bindings/scripts/base/escort_ai.cpp
+++ b/src/bindings/scripts/base/escort_ai.cpp
@@ -1,23 +1,19 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
-
/* ScriptData
SDName: Npc_EscortAI
SD%Complete: 100
SDComment:
SDCategory: Npc
EndScriptData */
-
#include "precompiled.h"
#include "escort_ai.h"
-
enum ePoints
{
POINT_LAST_POINT = 0xFFFFFF,
POINT_HOME = 0xFFFFFE
};
-
npc_escortAI::npc_escortAI(Creature* pCreature) : ScriptedAI(pCreature),
m_uiPlayerGUID(0),
MaxPlayerDistance(DEFAULT_MAX_PLAYER_DISTANCE),
@@ -34,40 +30,32 @@ npc_escortAI::npc_escortAI(Creature* pCreature) : ScriptedAI(pCreature),
m_bCanReturnToStart(false),
ScriptWP(false)
{}
-
void npc_escortAI::AttackStart(Unit* pWho)
{
if (!pWho)
return;
-
if (m_creature->Attack(pWho, true))
{
if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
m_creature->GetMotionMaster()->MovementExpired();
-
if (IsCombatMovement())
m_creature->GetMotionMaster()->MoveChase(pWho);
}
}
-
//see followerAI
bool npc_escortAI::AssistPlayerInCombat(Unit* pWho)
{
if (!pWho || !pWho->getVictim())
return false;
-
//experimental (unknown) flag not present
if (!(m_creature->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_UNK13))
return false;
-
//not a player
if (!pWho->getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself())
return false;
-
//never attack friendly
if (m_creature->IsFriendlyTo(pWho))
return false;
-
//too far away and no free sight?
if (m_creature->IsWithinDistInMap(pWho, GetMaxPlayerDistance()) && m_creature->IsWithinLOSInMap(pWho))
{
@@ -84,20 +72,16 @@ bool npc_escortAI::AssistPlayerInCombat(Unit* pWho)
return true;
}
}
-
return false;
}
-
void npc_escortAI::MoveInLineOfSight(Unit* pWho)
{
if (!m_creature->hasUnitState(UNIT_STAT_STUNNED) && pWho->isTargetableForAttack() && pWho->isInAccessiblePlaceFor(m_creature))
{
if (HasEscortState(STATE_ESCORT_ESCORTING) && AssistPlayerInCombat(pWho))
return;
-
if (!m_creature->canFly() && m_creature->GetDistanceZ(pWho) > CREATURE_Z_ATTACK_RANGE)
return;
-
if (m_creature->IsHostileTo(pWho))
{
float fAttackRadius = m_creature->GetAttackDistance(pWho);
@@ -117,17 +101,15 @@ void npc_escortAI::MoveInLineOfSight(Unit* pWho)
}
}
}
-
void npc_escortAI::JustDied(Unit* pKiller)
{
if (!HasEscortState(STATE_ESCORT_ESCORTING) || !m_uiPlayerGUID || !m_pQuestForEscort)
return;
-
if (Player* pPlayer = GetPlayerForEscort())
{
if (Group* pGroup = pPlayer->GetGroup())
{
- for(GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
+ for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
{
if (Player* pMember = pRef->getSource())
{
@@ -143,37 +125,29 @@ void npc_escortAI::JustDied(Unit* pKiller)
}
}
}
-
void npc_escortAI::JustRespawned()
{
m_uiEscortState = STATE_ESCORT_NONE;
-
if (!IsCombatMovement())
SetCombatMovement(true);
-
//add a small delay before going to first waypoint, normal in near all cases
m_uiWPWaitTimer = 2500;
-
if (m_creature->getFaction() != m_creature->GetCreatureInfo()->faction_A)
me->RestoreFaction();
-
Reset();
}
-
void npc_escortAI::ReturnToLastPoint()
{
float x, y, z, o;
m_creature->GetHomePosition(x, y, z, o);
m_creature->GetMotionMaster()->MovePoint(POINT_LAST_POINT, x, y, z);
}
-
void npc_escortAI::EnterEvadeMode()
{
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop(true);
m_creature->SetLootRecipient(NULL);
-
if (HasEscortState(STATE_ESCORT_ESCORTING))
{
AddEscortState(STATE_ESCORT_RETURNING);
@@ -182,20 +156,17 @@ void npc_escortAI::EnterEvadeMode()
}
else
m_creature->GetMotionMaster()->MoveTargetedHome();
-
Reset();
}
-
bool npc_escortAI::IsPlayerOrGroupInRange()
{
if (Player* pPlayer = GetPlayerForEscort())
{
if (Group* pGroup = pPlayer->GetGroup())
{
- for(GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
+ for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
{
Player* pMember = pRef->getSource();
-
if (pMember && m_creature->IsWithinDistInMap(pMember, GetMaxPlayerDistance()))
{
return true;
@@ -211,7 +182,6 @@ bool npc_escortAI::IsPlayerOrGroupInRange()
}
return false;
}
-
void npc_escortAI::UpdateAI(const uint32 uiDiff)
{
//Waypoint Updating
@@ -225,20 +195,15 @@ void npc_escortAI::UpdateAI(const uint32 uiDiff)
if (DespawnAtEnd)
{
debug_log("TSCR: EscortAI reached end of waypoints");
-
if (m_bCanReturnToStart)
{
float fRetX, fRetY, fRetZ;
m_creature->GetRespawnCoord(fRetX, fRetY, fRetZ);
-
m_creature->GetMotionMaster()->MovePoint(POINT_HOME, fRetX, fRetY, fRetZ);
-
m_uiWPWaitTimer = 0;
-
debug_log("TSCR: EscortAI are returning home to spawn location: %u, %f, %f, %f", POINT_HOME, fRetX, fRetY, fRetZ);
return;
}
-
if (m_bCanInstantRespawn)
{
m_creature->setDeathState(JUST_DIED);
@@ -246,31 +211,25 @@ void npc_escortAI::UpdateAI(const uint32 uiDiff)
}
else
m_creature->ForcedDespawn();
-
return;
}
else
{
debug_log("TSCR: EscortAI reached end of waypoints with Despawn off");
-
return;
}
}
-
if (!HasEscortState(STATE_ESCORT_PAUSED))
{
m_creature->GetMotionMaster()->MovePoint(CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z);
debug_log("TSCR: EscortAI start waypoint %u (%f, %f, %f).", CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z);
-
WaypointStart(CurrentWP->id);
-
m_uiWPWaitTimer = 0;
}
}
else
m_uiWPWaitTimer -= uiDiff;
}
-
//Check if player or any member of his group is within range
if (HasEscortState(STATE_ESCORT_ESCORTING) && m_uiPlayerGUID && !m_creature->getVictim() && !HasEscortState(STATE_ESCORT_RETURNING))
{
@@ -279,7 +238,6 @@ void npc_escortAI::UpdateAI(const uint32 uiDiff)
if (DespawnAtFar && !IsPlayerOrGroupInRange())
{
debug_log("TSCR: EscortAI failed because player/group was to far away or not found");
-
if (m_bCanInstantRespawn)
{
m_creature->setDeathState(JUST_DIED);
@@ -287,49 +245,39 @@ void npc_escortAI::UpdateAI(const uint32 uiDiff)
}
else
m_creature->ForcedDespawn();
-
return;
}
-
m_uiPlayerCheckTimer = 1000;
}
else
m_uiPlayerCheckTimer -= uiDiff;
}
-
UpdateEscortAI(uiDiff);
}
-
void npc_escortAI::UpdateEscortAI(const uint32 uiDiff)
{
if (CanMelee && UpdateVictim())
DoMeleeAttackIfReady();
}
-
void npc_escortAI::MovementInform(uint32 uiMoveType, uint32 uiPointId)
{
if (uiMoveType != POINT_MOTION_TYPE || !HasEscortState(STATE_ESCORT_ESCORTING))
return;
-
//Combat start position reached, continue waypoint movement
if (uiPointId == POINT_LAST_POINT)
{
debug_log("TSCR: EscortAI has returned to original position before combat");
-
if (m_bIsRunning && m_creature->HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE))
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
else if (!m_bIsRunning && !m_creature->HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE))
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
-
RemoveEscortState(STATE_ESCORT_RETURNING);
-
if (!m_uiWPWaitTimer)
m_uiWPWaitTimer = 1;
}
else if (uiPointId == POINT_HOME)
{
debug_log("TSCR: EscortAI has returned to original home location and will continue from beginning of waypoint list.");
-
CurrentWP = WaypointList.begin();
m_uiWPWaitTimer = 1;
}
@@ -341,18 +289,13 @@ void npc_escortAI::MovementInform(uint32 uiMoveType, uint32 uiPointId)
error_log("TSCR ERROR: EscortAI reached waypoint out of order %u, expected %u", uiPointId, CurrentWP->id);
return;
}
-
debug_log("TSCR: EscortAI Waypoint %u reached", CurrentWP->id);
-
//Call WP function
WaypointReached(CurrentWP->id);
-
m_uiWPWaitTimer = CurrentWP->WaitTimeMs + 1;
-
++CurrentWP;
}
}
-
/*
void npc_escortAI::OnPossess(bool apply)
{
@@ -371,13 +314,10 @@ void npc_escortAI::OnPossess(bool apply)
}
}
*/
-
void npc_escortAI::AddWaypoint(uint32 id, float x, float y, float z, uint32 WaitTimeMs)
{
Escort_Waypoint t(id, x, y, z, WaitTimeMs);
-
WaypointList.push_back(t);
-
// i think SD2 no longer uses this function
ScriptWP = true;
/*PointMovement wp;
@@ -389,23 +329,18 @@ void npc_escortAI::AddWaypoint(uint32 id, float x, float y, float z, uint32 Wait
wp.m_uiWaitTime = WaitTimeMs;
PointMovementMap[wp.m_uiCreatureEntry].push_back(wp);*/
}
-
void npc_escortAI::FillPointMovementListForCreature()
{
std::vector<ScriptPointMove> const &pPointsEntries = pSystemMgr.GetPointMoveList(m_creature->GetEntry());
-
if (pPointsEntries.empty())
return;
-
std::vector<ScriptPointMove>::const_iterator itr;
-
for (itr = pPointsEntries.begin(); itr != pPointsEntries.end(); ++itr)
{
Escort_Waypoint pPoint(itr->uiPointId, itr->fX, itr->fY, itr->fZ, itr->uiWaitTime);
WaypointList.push_back(pPoint);
}
}
-
void npc_escortAI::SetRun(bool bRun)
{
if (bRun)
@@ -424,7 +359,6 @@ void npc_escortAI::SetRun(bool bRun)
}
m_bIsRunning = bRun;
}
-
//TODO: get rid of this many variables passed in function.
void npc_escortAI::Start(bool bIsActiveAttacker, bool bRun, uint64 uiPlayerGUID, const Quest* pQuest, bool bInstantRespawn, bool bCanLoopPath)
{
@@ -433,70 +367,52 @@ void npc_escortAI::Start(bool bIsActiveAttacker, bool bRun, uint64 uiPlayerGUID,
error_log("TSCR ERROR: EscortAI attempt to Start while in combat.");
return;
}
-
if (HasEscortState(STATE_ESCORT_ESCORTING))
{
error_log("TSCR: EscortAI attempt to Start while already escorting.");
return;
}
-
if(!ScriptWP) // sd2 never adds wp in script, but tc does
{
-
if (!WaypointList.empty())
WaypointList.clear();
-
FillPointMovementListForCreature();
-
}
-
if (WaypointList.empty())
{
error_db_log("TSCR: EscortAI Start with 0 waypoints (possible missing entry in script_waypoint).");
return;
}
-
//set variables
m_bIsActiveAttacker = bIsActiveAttacker;
m_bIsRunning = bRun;
-
m_uiPlayerGUID = uiPlayerGUID;
m_pQuestForEscort = pQuest;
-
m_bCanInstantRespawn = bInstantRespawn;
m_bCanReturnToStart = bCanLoopPath;
-
if (m_bCanReturnToStart && m_bCanInstantRespawn)
debug_log("TSCR: EscortAI is set to return home after waypoint end and instant respawn at waypoint end. Creature will never despawn.");
-
if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
{
m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->MoveIdle();
debug_log("TSCR: EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle.");
}
-
//disable npcflags
m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
-
debug_log("TSCR: EscortAI started with %u waypoints. ActiveAttacker = %d, Run = %d, PlayerGUID = %u", WaypointList.size(), m_bIsActiveAttacker, m_bIsRunning, m_uiPlayerGUID);
-
CurrentWP = WaypointList.begin();
-
//Set initial speed
if (m_bIsRunning)
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
else
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
-
AddEscortState(STATE_ESCORT_ESCORTING);
}
-
void npc_escortAI::SetEscortPaused(bool bPaused)
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
return;
-
if (bPaused)
AddEscortState(STATE_ESCORT_PAUSED);
else
diff --git a/src/bindings/scripts/base/escort_ai.h b/src/bindings/scripts/base/escort_ai.h
index d0cb55b100a..89a0fc596e8 100644
--- a/src/bindings/scripts/base/escort_ai.h
+++ b/src/bindings/scripts/base/escort_ai.h
@@ -1,14 +1,10 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
-
#ifndef SC_ESCORTAI_H
#define SC_ESCORTAI_H
-
#include "../system/system.h"
-
#define DEFAULT_MAX_PLAYER_DISTANCE 50
-
struct Escort_Waypoint
{
Escort_Waypoint(uint32 _id, float _x, float _y, float _z, uint32 _w)
@@ -19,14 +15,12 @@ struct Escort_Waypoint
z = _z;
WaitTimeMs = _w;
}
-
uint32 id;
float x;
float y;
float z;
uint32 WaitTimeMs;
};
-
enum eEscortState
{
STATE_ESCORT_NONE = 0x000, //nothing in progress
@@ -34,76 +28,53 @@ enum eEscortState
STATE_ESCORT_RETURNING = 0x002, //escort is returning after being in combat
STATE_ESCORT_PAUSED = 0x004 //will not proceed with waypoints before state is removed
};
-
struct TRINITY_DLL_DECL npc_escortAI : public ScriptedAI
{
public:
explicit npc_escortAI(Creature* pCreature);
~npc_escortAI() {}
-
// CreatureAI functions
void AttackStart(Unit* who);
-
void MoveInLineOfSight(Unit* who);
-
void JustDied(Unit*);
-
void JustRespawned();
-
void ReturnToLastPoint();
-
void EnterEvadeMode();
-
void UpdateAI(const uint32); //the "internal" update, calls UpdateEscortAI()
virtual void UpdateEscortAI(const uint32); //used when it's needed to add code in update (abilities, scripted events, etc)
-
void MovementInform(uint32, uint32);
-
// EscortAI functions
void AddWaypoint(uint32 id, float x, float y, float z, uint32 WaitTimeMs = 0);
-
virtual void WaypointReached(uint32 uiPointId) = 0;
virtual void WaypointStart(uint32 uiPointId) {}
-
void Start(bool bIsActiveAttacker = true, bool bRun = false, uint64 uiPlayerGUID = 0, const Quest* pQuest = NULL, bool bInstantRespawn = false, bool bCanLoopPath = false);
-
void SetRun(bool bRun = true);
void SetEscortPaused(bool uPaused);
-
bool HasEscortState(uint32 uiEscortState) { return (m_uiEscortState & uiEscortState); }
-
void SetMaxPlayerDistance(float newMax) { MaxPlayerDistance = newMax; }
float GetMaxPlayerDistance() { return MaxPlayerDistance; }
-
void SetCanMelee(bool usemelee) { CanMelee = usemelee; }
void SetDespawnAtEnd(bool despawn) { DespawnAtEnd = despawn; }
void SetDespawnAtFar(bool despawn) { DespawnAtFar = despawn; }
bool GetAttack() { return m_bIsActiveAttacker; }//used in EnterEvadeMode override
void SetCanAttack(bool attack) { m_bIsActiveAttacker = attack; }
uint64 GetEventStarterGUID() { return m_uiPlayerGUID; }
-
protected:
Player* GetPlayerForEscort() { return (Player*)Unit::GetUnit(*m_creature, m_uiPlayerGUID); }
-
private:
bool AssistPlayerInCombat(Unit* pWho);
bool IsPlayerOrGroupInRange();
void FillPointMovementListForCreature();
-
void AddEscortState(uint32 uiEscortState) { m_uiEscortState |= uiEscortState; }
void RemoveEscortState(uint32 uiEscortState) { m_uiEscortState &= ~uiEscortState; }
-
uint64 m_uiPlayerGUID;
uint32 m_uiWPWaitTimer;
uint32 m_uiPlayerCheckTimer;
uint32 m_uiEscortState;
float MaxPlayerDistance;
-
const Quest* m_pQuestForEscort; //generally passed in Start() when regular escort script.
-
std::list<Escort_Waypoint> WaypointList;
std::list<Escort_Waypoint>::iterator CurrentWP;
-
bool m_bIsActiveAttacker; //obsolete, determined by faction.
bool m_bIsRunning; //all creatures are walking by default (has flag MOVEMENTFLAG_WALK)
bool m_bCanInstantRespawn; //if creature should respawn instantly after escort over (if not, database respawntime are used)
diff --git a/src/bindings/scripts/base/follower_ai.cpp b/src/bindings/scripts/base/follower_ai.cpp
index 8284af7aec0..67c03c396ce 100644
--- a/src/bindings/scripts/base/follower_ai.cpp
+++ b/src/bindings/scripts/base/follower_ai.cpp
@@ -1,50 +1,40 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
-
/* ScriptData
SDName: FollowerAI
SD%Complete: 50
SDComment: This AI is under development
SDCategory: Npc
EndScriptData */
-
#include "precompiled.h"
#include "follower_ai.h"
-
const float MAX_PLAYER_DISTANCE = 100.0f;
-
enum ePoints
{
POINT_COMBAT_START = 0xFFFFFF
};
-
FollowerAI::FollowerAI(Creature* pCreature) : ScriptedAI(pCreature),
m_uiLeaderGUID(0),
m_pQuestForFollow(NULL),
m_uiUpdateFollowTimer(2500),
m_uiFollowState(STATE_FOLLOW_NONE)
{}
-
void FollowerAI::AttackStart(Unit* pWho)
{
if (!pWho)
return;
-
if (m_creature->Attack(pWho, true))
{
m_creature->AddThreat(pWho, 0.0f);
m_creature->SetInCombatWith(pWho);
pWho->SetInCombatWith(m_creature);
-
if (m_creature->hasUnitState(UNIT_STAT_FOLLOW))
m_creature->clearUnitState(UNIT_STAT_FOLLOW);
-
if (IsCombatMovement())
m_creature->GetMotionMaster()->MoveChase(pWho);
}
}
-
//This part provides assistance to a player that are attacked by pWho, even if out of normal aggro range
//It will cause m_creature to attack pWho that are attacking _any_ player (which has been confirmed may happen also on offi)
//The flag (type_flag) is unconfirmed, but used here for further research and is a good candidate.
@@ -52,19 +42,15 @@ bool FollowerAI::AssistPlayerInCombat(Unit* pWho)
{
if (!pWho || !pWho->getVictim())
return false;
-
//experimental (unknown) flag not present
if (!(m_creature->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_UNK13))
return false;
-
//not a player
if (!pWho->getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself())
return false;
-
//never attack friendly
if (m_creature->IsFriendlyTo(pWho))
return false;
-
//too far away and no free sight?
if (m_creature->IsWithinDistInMap(pWho, MAX_PLAYER_DISTANCE) && m_creature->IsWithinLOSInMap(pWho))
{
@@ -81,20 +67,16 @@ bool FollowerAI::AssistPlayerInCombat(Unit* pWho)
return true;
}
}
-
return false;
}
-
void FollowerAI::MoveInLineOfSight(Unit* pWho)
{
if (!m_creature->hasUnitState(UNIT_STAT_STUNNED) && pWho->isTargetableForAttack() && pWho->isInAccessiblePlaceFor(m_creature))
{
if (HasFollowState(STATE_FOLLOW_INPROGRESS) && AssistPlayerInCombat(pWho))
return;
-
if (!m_creature->canFly() && m_creature->GetDistanceZ(pWho) > CREATURE_Z_ATTACK_RANGE)
return;
-
if (m_creature->IsHostileTo(pWho))
{
float fAttackRadius = m_creature->GetAttackDistance(pWho);
@@ -114,18 +96,16 @@ void FollowerAI::MoveInLineOfSight(Unit* pWho)
}
}
}
-
void FollowerAI::JustDied(Unit* pKiller)
{
if (!HasFollowState(STATE_FOLLOW_INPROGRESS) || !m_uiLeaderGUID || !m_pQuestForFollow)
return;
-
//TODO: need a better check for quests with time limit.
if (Player* pPlayer = GetLeaderForFollower())
{
if (Group* pGroup = pPlayer->GetGroup())
{
- for(GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
+ for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
{
if (Player* pMember = pRef->getSource())
{
@@ -141,31 +121,24 @@ void FollowerAI::JustDied(Unit* pKiller)
}
}
}
-
void FollowerAI::JustRespawned()
{
m_uiFollowState = STATE_FOLLOW_NONE;
-
if (!IsCombatMovement())
SetCombatMovement(true);
-
if (m_creature->getFaction() != m_creature->GetCreatureInfo()->faction_A)
m_creature->setFaction(m_creature->GetCreatureInfo()->faction_A);
-
Reset();
}
-
void FollowerAI::EnterEvadeMode()
{
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop(true);
m_creature->SetLootRecipient(NULL);
-
if (HasFollowState(STATE_FOLLOW_INPROGRESS))
{
debug_log("TSCR: FollowerAI left combat, returning to CombatStartPosition.");
-
if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE)
{
float fPosX, fPosY, fPosZ;
@@ -178,10 +151,8 @@ void FollowerAI::EnterEvadeMode()
if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == TARGETED_MOTION_TYPE)
m_creature->GetMotionMaster()->MoveTargetedHome();
}
-
Reset();
}
-
void FollowerAI::UpdateAI(const uint32 uiDiff)
{
if (HasFollowState(STATE_FOLLOW_INPROGRESS) && !m_creature->getVictim())
@@ -194,26 +165,21 @@ void FollowerAI::UpdateAI(const uint32 uiDiff)
m_creature->ForcedDespawn();
return;
}
-
bool bIsMaxRangeExceeded = true;
-
if (Player* pPlayer = GetLeaderForFollower())
{
if (HasFollowState(STATE_FOLLOW_RETURNING))
{
debug_log("TSCR: FollowerAI is returning to leader.");
-
RemoveFollowState(STATE_FOLLOW_RETURNING);
m_creature->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
return;
}
-
if (Group* pGroup = pPlayer->GetGroup())
{
- for(GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
+ for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
{
Player* pMember = pRef->getSource();
-
if (pMember && m_creature->IsWithinDistInMap(pMember, MAX_PLAYER_DISTANCE))
{
bIsMaxRangeExceeded = false;
@@ -227,36 +193,29 @@ void FollowerAI::UpdateAI(const uint32 uiDiff)
bIsMaxRangeExceeded = false;
}
}
-
if (bIsMaxRangeExceeded)
{
debug_log("TSCR: FollowerAI failed because player/group was to far away or not found");
m_creature->ForcedDespawn();
return;
}
-
m_uiUpdateFollowTimer = 1000;
}
else
m_uiUpdateFollowTimer -= uiDiff;
}
-
UpdateFollowerAI(uiDiff);
}
-
void FollowerAI::UpdateFollowerAI(const uint32 uiDiff)
{
if (!UpdateVictim())
return;
-
DoMeleeAttackIfReady();
}
-
void FollowerAI::MovementInform(uint32 uiMotionType, uint32 uiPointId)
{
if (uiMotionType != POINT_MOTION_TYPE || !HasFollowState(STATE_FOLLOW_INPROGRESS))
return;
-
if (uiPointId == POINT_COMBAT_START)
{
if (GetLeaderForFollower())
@@ -268,7 +227,6 @@ void FollowerAI::MovementInform(uint32 uiMotionType, uint32 uiPointId)
m_creature->ForcedDespawn();
}
}
-
void FollowerAI::StartFollow(Player* pLeader, uint32 uiFactionForFollower, const Quest* pQuest)
{
if (m_creature->getVictim())
@@ -276,37 +234,27 @@ void FollowerAI::StartFollow(Player* pLeader, uint32 uiFactionForFollower, const
debug_log("TSCR: FollowerAI attempt to StartFollow while in combat.");
return;
}
-
if (HasFollowState(STATE_FOLLOW_INPROGRESS))
{
error_log("TSCR: FollowerAI attempt to StartFollow while already following.");
return;
}
-
//set variables
m_uiLeaderGUID = pLeader->GetGUID();
-
if (uiFactionForFollower)
m_creature->setFaction(uiFactionForFollower);
-
m_pQuestForFollow = pQuest;
-
if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
{
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveIdle();
debug_log("TSCR: FollowerAI start with WAYPOINT_MOTION_TYPE, set to MoveIdle.");
}
-
m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
-
AddFollowState(STATE_FOLLOW_INPROGRESS);
-
m_creature->GetMotionMaster()->MoveFollow(pLeader, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
-
debug_log("TSCR: FollowerAI start follow %s (GUID %u)", pLeader->GetName(), m_uiLeaderGUID);
}
-
Player* FollowerAI::GetLeaderForFollower()
{
if (Player* pLeader = Unit::GetPlayer(m_uiLeaderGUID))
@@ -317,10 +265,9 @@ Player* FollowerAI::GetLeaderForFollower()
{
if (Group* pGroup = pLeader->GetGroup())
{
- for(GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
+ for (GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next())
{
Player* pMember = pRef->getSource();
-
if (pMember && pMember->isAlive() && m_creature->IsWithinDistInMap(pMember, MAX_PLAYER_DISTANCE))
{
debug_log("TSCR: FollowerAI GetLeader changed and returned new leader.");
@@ -332,22 +279,18 @@ Player* FollowerAI::GetLeaderForFollower()
}
}
}
-
debug_log("TSCR: FollowerAI GetLeader can not find suitable leader.");
return NULL;
}
-
void FollowerAI::SetFollowComplete(bool bWithEndEvent)
{
if (m_creature->hasUnitState(UNIT_STAT_FOLLOW))
{
m_creature->clearUnitState(UNIT_STAT_FOLLOW);
-
m_creature->StopMoving();
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveIdle();
}
-
if (bWithEndEvent)
AddFollowState(STATE_FOLLOW_POSTEVENT);
else
@@ -355,23 +298,18 @@ void FollowerAI::SetFollowComplete(bool bWithEndEvent)
if (HasFollowState(STATE_FOLLOW_POSTEVENT))
RemoveFollowState(STATE_FOLLOW_POSTEVENT);
}
-
AddFollowState(STATE_FOLLOW_COMPLETE);
}
-
void FollowerAI::SetFollowPaused(bool bPaused)
{
if (!HasFollowState(STATE_FOLLOW_INPROGRESS) || HasFollowState(STATE_FOLLOW_COMPLETE))
return;
-
if (bPaused)
{
AddFollowState(STATE_FOLLOW_PAUSED);
-
if (m_creature->hasUnitState(UNIT_STAT_FOLLOW))
{
m_creature->clearUnitState(UNIT_STAT_FOLLOW);
-
m_creature->StopMoving();
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveIdle();
@@ -380,7 +318,6 @@ void FollowerAI::SetFollowPaused(bool bPaused)
else
{
RemoveFollowState(STATE_FOLLOW_PAUSED);
-
if (Player* pLeader = GetLeaderForFollower())
m_creature->GetMotionMaster()->MoveFollow(pLeader, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
}
diff --git a/src/bindings/scripts/base/follower_ai.h b/src/bindings/scripts/base/follower_ai.h
index 289efd4a6b0..2a7ab778629 100644
--- a/src/bindings/scripts/base/follower_ai.h
+++ b/src/bindings/scripts/base/follower_ai.h
@@ -1,12 +1,9 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
-
#ifndef SC_FOLLOWERAI_H
#define SC_FOLLOWERAI_H
-
#include "../system/system.h"
-
enum eFollowState
{
STATE_FOLLOW_NONE = 0x000,
@@ -17,51 +14,33 @@ enum eFollowState
STATE_FOLLOW_PREEVENT = 0x010, //not implemented (allow pre event to run, before follow is initiated)
STATE_FOLLOW_POSTEVENT = 0x020 //can be set at complete and allow post event to run
};
-
class TRINITY_DLL_DECL FollowerAI : public ScriptedAI
{
public:
explicit FollowerAI(Creature* pCreature);
~FollowerAI() {}
-
//virtual void WaypointReached(uint32 uiPointId) = 0;
-
void MovementInform(uint32 uiMotionType, uint32 uiPointId);
-
void AttackStart(Unit*);
-
void MoveInLineOfSight(Unit*);
-
void EnterEvadeMode();
-
void JustDied(Unit*);
-
void JustRespawned();
-
void UpdateAI(const uint32); //the "internal" update, calls UpdateFollowerAI()
virtual void UpdateFollowerAI(const uint32); //used when it's needed to add code in update (abilities, scripted events, etc)
-
void StartFollow(Player* pPlayer, uint32 uiFactionForFollower = 0, const Quest* pQuest = NULL);
-
void SetFollowPaused(bool bPaused); //if special event require follow mode to hold/resume during the follow
void SetFollowComplete(bool bWithEndEvent = false);
-
bool HasFollowState(uint32 uiFollowState) { return (m_uiFollowState & uiFollowState); }
-
protected:
Player* GetLeaderForFollower();
-
private:
void AddFollowState(uint32 uiFollowState) { m_uiFollowState |= uiFollowState; }
void RemoveFollowState(uint32 uiFollowState) { m_uiFollowState &= ~uiFollowState; }
-
bool AssistPlayerInCombat(Unit* pWho);
-
uint64 m_uiLeaderGUID;
uint32 m_uiUpdateFollowTimer;
uint32 m_uiFollowState;
-
const Quest* m_pQuestForFollow; //normally we have a quest
};
-
#endif
diff --git a/src/bindings/scripts/base/guard_ai.cpp b/src/bindings/scripts/base/guard_ai.cpp
index 1001d3a1170..badd763a78b 100644
--- a/src/bindings/scripts/base/guard_ai.cpp
+++ b/src/bindings/scripts/base/guard_ai.cpp
@@ -13,84 +13,67 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-
/* ScriptData
SDName: Guard_AI
SD%Complete: 90
SDComment:
SDCategory: Guards
EndScriptData */
-
#include "precompiled.h"
#include "guard_ai.h"
-
// **** This script is for use within every single guard to save coding time ****
-
#define GENERIC_CREATURE_COOLDOWN 5000
-
#define SAY_GUARD_SIL_AGGRO1 -1070001
#define SAY_GUARD_SIL_AGGRO2 -1070002
#define SAY_GUARD_SIL_AGGRO3 -1070003
-
guardAI::guardAI(Creature* pCreature) : ScriptedAI(pCreature),
GlobalCooldown(0),
BuffTimer(0)
{}
-
void guardAI::Reset()
{
GlobalCooldown = 0;
BuffTimer = 0; //Rebuff as soon as we can
}
-
void guardAI::EnterCombat(Unit *who)
{
if (m_creature->GetEntry() == 15184)
DoScriptText(RAND(SAY_GUARD_SIL_AGGRO1,SAY_GUARD_SIL_AGGRO2,SAY_GUARD_SIL_AGGRO3), m_creature, who);
-
if (SpellEntry const *spell = m_creature->reachWithSpellAttack(who))
DoCastSpell(who, spell);
}
-
void guardAI::JustDied(Unit *Killer)
{
//Send Zone Under Attack message to the LocalDefense and WorldDefense Channels
if (Player* pKiller = Killer->GetCharmerOrOwnerPlayerOrPlayerItself())
m_creature->SendZoneUnderAttackMessage(pKiller);
}
-
void guardAI::UpdateAI(const uint32 diff)
{
//Always decrease our global cooldown first
if (GlobalCooldown > diff)
GlobalCooldown -= diff;
else GlobalCooldown = 0;
-
//Buff timer (only buff when we are alive and not in combat
if (m_creature->isAlive() && !m_creature->isInCombat())
if (BuffTimer < diff)
{
//Find a spell that targets friendly and applies an aura (these are generally buffs)
SpellEntry const *info = SelectSpell(m_creature, -1, -1, SELECT_TARGET_ANY_FRIEND, 0, 0, 0, 0, SELECT_EFFECT_AURA);
-
if (info && !GlobalCooldown)
{
//Cast the buff spell
DoCastSpell(m_creature, info);
-
//Set our global cooldown
GlobalCooldown = GENERIC_CREATURE_COOLDOWN;
-
//Set our timer to 10 minutes before rebuff
BuffTimer = 600000;
} //Try agian in 30 seconds
else BuffTimer = 30000;
}else BuffTimer -= diff;
-
//Return since we have no target
if (!UpdateVictim())
return;
-
// Make sure our attack is ready and we arn't currently casting
if (m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false))
{
@@ -99,27 +82,22 @@ void guardAI::UpdateAI(const uint32 diff)
{
bool Healing = false;
SpellEntry const *info = NULL;
-
//Select a healing spell if less than 30% hp
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30)
info = SelectSpell(m_creature, -1, -1, SELECT_TARGET_ANY_FRIEND, 0, 0, 0, 0, SELECT_EFFECT_HEALING);
-
//No healing spell available, select a hostile spell
if (info) Healing = true;
else info = SelectSpell(m_creature->getVictim(), -1, -1, SELECT_TARGET_ANY_ENEMY, 0, 0, 0, 0, SELECT_EFFECT_DONTCARE);
-
//20% chance to replace our white hit with a spell
if (info && rand() % 5 == 0 && !GlobalCooldown)
{
//Cast the spell
if (Healing)DoCastSpell(m_creature, info);
else DoCastSpell(m_creature->getVictim(), info);
-
//Set our global cooldown
GlobalCooldown = GENERIC_CREATURE_COOLDOWN;
}
else m_creature->AttackerStateUpdate(m_creature->getVictim());
-
m_creature->resetAttackTimer();
}
}
@@ -130,15 +108,12 @@ void guardAI::UpdateAI(const uint32 diff)
{
bool Healing = false;
SpellEntry const *info = NULL;
-
//Select a healing spell if less than 30% hp ONLY 33% of the time
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30 && rand() % 3 == 0)
info = SelectSpell(m_creature, -1, -1, SELECT_TARGET_ANY_FRIEND, 0, 0, 0, 0, SELECT_EFFECT_HEALING);
-
//No healing spell available, See if we can cast a ranged spell (Range must be greater than ATTACK_DISTANCE)
if (info) Healing = true;
else info = SelectSpell(m_creature->getVictim(), -1, -1, SELECT_TARGET_ANY_ENEMY, 0, 0, NOMINAL_MELEE_RANGE, 0, SELECT_EFFECT_DONTCARE);
-
//Found a spell, check if we arn't on cooldown
if (info && !GlobalCooldown)
{
@@ -148,14 +123,11 @@ void guardAI::UpdateAI(const uint32 diff)
(*m_creature).GetMotionMaster()->Clear(false);
(*m_creature).GetMotionMaster()->MoveIdle();
}
-
//Cast spell
if (Healing) DoCastSpell(m_creature,info);
else DoCastSpell(m_creature->getVictim(),info);
-
//Set our global cooldown
GlobalCooldown = GENERIC_CREATURE_COOLDOWN;
-
} //If no spells available and we arn't moving run to target
else if ((*m_creature).GetMotionMaster()->GetCurrentMovementGeneratorType()!=TARGETED_MOTION_TYPE)
{
@@ -167,7 +139,6 @@ void guardAI::UpdateAI(const uint32 diff)
}
}
}
-
void guardAI::DoReplyToTextEmote(uint32 em)
{
switch(em)
@@ -180,13 +151,11 @@ void guardAI::DoReplyToTextEmote(uint32 em)
case TEXTEMOTE_CHICKEN: m_creature->HandleEmoteCommand(EMOTE_ONESHOT_POINT); break;
}
}
-
void guardAI_orgrimmar::ReceiveEmote(Player* pPlayer, uint32 text_emote)
{
if (pPlayer->GetTeam()==HORDE)
DoReplyToTextEmote(text_emote);
}
-
void guardAI_stormwind::ReceiveEmote(Player* pPlayer, uint32 text_emote)
{
if (pPlayer->GetTeam() == ALLIANCE)
diff --git a/src/bindings/scripts/base/guard_ai.h b/src/bindings/scripts/base/guard_ai.h
index a7fff32e3ab..dd4e414d1ae 100644
--- a/src/bindings/scripts/base/guard_ai.h
+++ b/src/bindings/scripts/base/guard_ai.h
@@ -1,44 +1,31 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
-
#ifndef SC_GUARDAI_H
#define SC_GUARDAI_H
-
#define GENERIC_CREATURE_COOLDOWN 5000
-
struct TRINITY_DLL_DECL guardAI : public ScriptedAI
{
public:
explicit guardAI(Creature* pCreature);
~guardAI() {}
-
uint32 GlobalCooldown; //This variable acts like the global cooldown that players have (1.5 seconds)
uint32 BuffTimer; //This variable keeps track of buffs
-
void Reset();
-
void EnterCombat(Unit *who);
-
void JustDied(Unit *Killer);
-
void UpdateAI(const uint32 diff);
-
//common used for guards in main cities
void DoReplyToTextEmote(uint32 em);
};
-
struct TRINITY_DLL_DECL guardAI_orgrimmar : public guardAI
{
guardAI_orgrimmar(Creature *c) : guardAI(c) {}
-
void ReceiveEmote(Player *player, uint32 text_emote);
};
-
struct TRINITY_DLL_DECL guardAI_stormwind : public guardAI
{
guardAI_stormwind(Creature *c) : guardAI(c) {}
-
void ReceiveEmote(Player *player, uint32 text_emote);
};
#endif
diff --git a/src/bindings/scripts/base/simple_ai.cpp b/src/bindings/scripts/base/simple_ai.cpp
index 60511d163b7..c607885f4d3 100644
--- a/src/bindings/scripts/base/simple_ai.cpp
+++ b/src/bindings/scripts/base/simple_ai.cpp
@@ -13,17 +13,14 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-
/* ScriptData
SDName: SimpleAI
SD%Complete: 100
SDComment: Base Class for SimpleAI creatures
SDCategory: Creatures
EndScriptData */
-
#include "precompiled.h"
#include "simple_ai.h"
-
SimpleAI::SimpleAI(Creature *c) : ScriptedAI(c)
{
//Clear all data
@@ -33,7 +30,6 @@ SimpleAI::SimpleAI(Creature *c) : ScriptedAI(c)
Aggro_Sound[0] = 0;
Aggro_Sound[1] = 0;
Aggro_Sound[2] = 0;
-
Death_TextId[0] = 0;
Death_TextId[1] = 0;
Death_TextId[2] = 0;
@@ -42,7 +38,6 @@ SimpleAI::SimpleAI(Creature *c) : ScriptedAI(c)
Death_Sound[2] = 0;
Death_Spell = 0;
Death_Target_Type = 0;
-
Kill_TextId[0] = 0;
Kill_TextId[1] = 0;
Kill_TextId[2] = 0;
@@ -51,16 +46,12 @@ SimpleAI::SimpleAI(Creature *c) : ScriptedAI(c)
Kill_Sound[2] = 0;
Kill_Spell = 0;
Kill_Target_Type = 0;
-
memset(Spell,0,sizeof(Spell));
-
EnterEvadeMode();
}
-
void SimpleAI::Reset()
{
}
-
void SimpleAI::EnterCombat(Unit *who)
{
//Reset cast timers
@@ -94,35 +85,26 @@ void SimpleAI::EnterCombat(Unit *who)
if (Spell[9].First_Cast >= 0)
Spell_Timer[9] = Spell[9].First_Cast;
else Spell_Timer[9] = 1000;
-
uint8 random_text = urand(0,2);
-
//Random text
if (Aggro_TextId[random_text])
DoScriptText(Aggro_TextId[random_text], m_creature, who);
-
//Random sound
if (Aggro_Sound[random_text])
DoPlaySoundToSet(m_creature, Aggro_Sound[random_text]);
}
-
void SimpleAI::KilledUnit(Unit *victim)
{
uint8 random_text = urand(0,2);
-
//Random yell
if (Kill_TextId[random_text])
DoScriptText(Kill_TextId[random_text], m_creature, victim);
-
//Random sound
if (Kill_Sound[random_text])
DoPlaySoundToSet(m_creature, Kill_Sound[random_text]);
-
if (!Kill_Spell)
return;
-
Unit* target = NULL;
-
switch (Kill_Target_Type)
{
case CAST_SELF:
@@ -144,33 +126,25 @@ void SimpleAI::KilledUnit(Unit *victim)
target = victim;
break;
}
-
//Target is ok, cast a spell on it
if (target)
DoCast(target, Kill_Spell);
}
-
void SimpleAI::DamageTaken(Unit *killer, uint32 &damage)
{
//Return if damage taken won't kill us
if (m_creature->GetHealth() > damage)
return;
-
uint8 random_text = urand(0,2);
-
//Random yell
if (Death_TextId[random_text])
DoScriptText(Death_TextId[random_text], m_creature, killer);
-
//Random sound
if (Death_Sound[random_text])
DoPlaySoundToSet(m_creature, Death_Sound[random_text]);
-
if (!Death_Spell)
return;
-
Unit* target = NULL;
-
switch (Death_Target_Type)
{
case CAST_SELF:
@@ -192,36 +166,30 @@ void SimpleAI::DamageTaken(Unit *killer, uint32 &damage)
target = killer;
break;
}
-
//Target is ok, cast a spell on it
if (target)
DoCast(target, Death_Spell);
}
-
void SimpleAI::UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
-
//Spells
for (uint32 i = 0; i < 10; ++i)
{
//Spell not valid
if (!Spell[i].Enabled || !Spell[i].Spell_Id)
continue;
-
if (Spell_Timer[i] < diff)
{
//Check if this is a percentage based
if (Spell[i].First_Cast < 0 && Spell[i].First_Cast > -100 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > -Spell[i].First_Cast)
continue;
-
//Check Current spell
if (!(Spell[i].InterruptPreviousCast && m_creature->IsNonMeleeSpellCasted(false)))
{
Unit* target = NULL;
-
switch (Spell[i].Cast_Target_Type)
{
case CAST_SELF:
@@ -240,39 +208,29 @@ void SimpleAI::UpdateAI(const uint32 diff)
target = SelectUnit(SELECT_TARGET_RANDOM,0);
break;
}
-
//Target is ok, cast a spell on it and then do our random yell
if (target)
{
if (m_creature->IsNonMeleeSpellCasted(false))
m_creature->InterruptNonMeleeSpells(false);
-
DoCast(target, Spell[i].Spell_Id);
-
//Yell and sound use the same number so that you can make
//the Creature yell with the correct sound effect attached
uint8 random_text = urand(0,2);
-
//Random yell
if (Spell[i].TextId[random_text])
DoScriptText(Spell[i].TextId[random_text], m_creature, target);
-
//Random sound
if (Spell[i].Text_Sound[random_text])
DoPlaySoundToSet(m_creature, Spell[i].Text_Sound[random_text]);
}
-
}
-
//Spell will cast agian when the cooldown is up
if (Spell[i].CooldownRandomAddition)
Spell_Timer[i] = Spell[i].Cooldown + (rand() % Spell[i].CooldownRandomAddition);
else Spell_Timer[i] = Spell[i].Cooldown;
-
}else Spell_Timer[i] -= diff;
-
}
-
DoMeleeAttackIfReady();
}
diff --git a/src/bindings/scripts/base/simple_ai.h b/src/bindings/scripts/base/simple_ai.h
index 3a2e8a9341a..308f5a475ec 100644
--- a/src/bindings/scripts/base/simple_ai.h
+++ b/src/bindings/scripts/base/simple_ai.h
@@ -1,10 +1,8 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
* This program is free software licensed under GPL version 2
* Please see the included DOCS/LICENSE.TXT for more information */
-
#ifndef SC_SIMPLEAI_H
#define SC_SIMPLEAI_H
-
enum CastTarget
{
CAST_SELF = 0, //Self cast
@@ -13,41 +11,29 @@ enum CastTarget
CAST_HOSTILE_LAST_AGGRO, //Dead last on aggro (no idea what this could be used for)
CAST_HOSTILE_RANDOM, //Just any random target on our threat list
CAST_FRIENDLY_RANDOM, //NOT YET IMPLEMENTED
-
//Special cases
CAST_KILLEDUNIT_VICTIM, //Only works within KilledUnit function
CAST_JUSTDIED_KILLER, //Only works within JustDied function
};
-
struct TRINITY_DLL_DECL SimpleAI : public ScriptedAI
{
SimpleAI(Creature *c);// : ScriptedAI(c);
-
void Reset();
-
void EnterCombat(Unit *who);
-
void KilledUnit(Unit *victim);
-
void DamageTaken(Unit *killer, uint32 &damage);
-
void UpdateAI(const uint32 diff);
-
public:
-
int32 Aggro_TextId[3];
uint32 Aggro_Sound[3];
-
int32 Death_TextId[3];
uint32 Death_Sound[3];
uint32 Death_Spell;
uint32 Death_Target_Type;
-
int32 Kill_TextId[3];
uint32 Kill_Sound[3];
uint32 Kill_Spell;
uint32 Kill_Target_Type;
-
struct SimpleAI_Spell
{
uint32 Spell_Id; //Spell ID to cast
@@ -57,15 +43,12 @@ public:
uint32 Cast_Target_Type; //Target type (note that certain spells may ignore this)
bool InterruptPreviousCast; //Interrupt a previous cast if this spell needs to be cast
bool Enabled; //Spell enabled or disabled (default: false)
-
//3 texts to many?
int32 TextId[3];
uint32 Text_Sound[3];
}Spell[10];
-
protected:
uint32 Spell_Timer[10];
};
-
#endif