Core/Spawns: merged Dynamic Spawning
This commit is contained in:
1 parent
21795a5ae5
commit
b976bc1187
87 files changed
+3200
-1007
No files matched your search
@@ -41,6 +41,8 @@ EndScriptData */
|
||||
#include "WorldSession.h"
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include <set>
|
||||
|
||||
class debug_commandscript : public CommandScript
|
||||
{
|
||||
@@ -973,7 +975,7 @@ public:
|
||||
Creature* v = new Creature();
|
||||
|
||||
Map* map = handler->GetSession()->GetPlayer()->GetMap();
|
||||
if (!v->Create(map->GenerateLowGuid<HighGuid::Vehicle>(), map, handler->GetSession()->GetPlayer()->GetPhaseMask(), entry, x, y, z, o, nullptr, id))
|
||||
if (!v->Create(map->GenerateLowGuid<HighGuid::Vehicle>(), map, handler->GetSession()->GetPlayer()->GetPhaseMask(), entry, { x, y, z, o }, nullptr, id))
|
||||
{
|
||||
delete v;
|
||||
return false;
|
||||
|
||||
@@ -139,8 +139,6 @@ public:
|
||||
float o = fields[3].GetFloat();
|
||||
uint32 mapId = fields[4].GetUInt16();
|
||||
|
||||
Transport* transport = nullptr;
|
||||
|
||||
if (!MapManager::IsValidMapCoord(mapId, x, y, z, o) || sObjectMgr->IsTransportMap(mapId))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId);
|
||||
@@ -158,11 +156,8 @@ public:
|
||||
else
|
||||
player->SaveRecallPosition();
|
||||
|
||||
if (player->TeleportTo(mapId, x, y, z, o))
|
||||
{
|
||||
if (transport)
|
||||
transport->AddPassenger(player);
|
||||
}
|
||||
player->TeleportTo(mapId, x, y, z, o);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -250,7 +245,7 @@ public:
|
||||
player->SaveRecallPosition();
|
||||
|
||||
Map const* map = sMapMgr->CreateBaseMap(mapId);
|
||||
float z = std::max(map->GetStaticHeight(PhasingHandler::GetEmptyPhaseShift(), x, y, MAX_HEIGHT), map->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), x, y));
|
||||
float z = std::max(map->GetHeight(PhasingHandler::GetEmptyPhaseShift(), x, y, MAX_HEIGHT), map->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), x, y));
|
||||
|
||||
player->TeleportTo(mapId, x, y, z, player->GetOrientation());
|
||||
return true;
|
||||
@@ -273,28 +268,18 @@ public:
|
||||
if (!guidLow)
|
||||
return false;
|
||||
|
||||
float x, y, z, o;
|
||||
uint32 mapId;
|
||||
|
||||
// by DB guid
|
||||
if (GameObjectData const* goData = sObjectMgr->GetGOData(guidLow))
|
||||
{
|
||||
x = goData->posX;
|
||||
y = goData->posY;
|
||||
z = goData->posZ;
|
||||
o = goData->orientation;
|
||||
mapId = goData->mapid;
|
||||
}
|
||||
else
|
||||
GameObjectData const* goData = sObjectMgr->GetGameObjectData(guidLow);
|
||||
if (!goData)
|
||||
{
|
||||
handler->SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!MapManager::IsValidMapCoord(mapId, x, y, z, o) || sObjectMgr->IsTransportMap(mapId))
|
||||
if (!MapManager::IsValidMapCoord(goData->spawnPoint) || sObjectMgr->IsTransportMap(goData->spawnPoint.GetMapId()))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId);
|
||||
handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, goData->spawnPoint.GetPositionX(), goData->spawnPoint.GetPositionY(), goData->spawnPoint.GetMapId());
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
@@ -309,7 +294,7 @@ public:
|
||||
else
|
||||
player->SaveRecallPosition();
|
||||
|
||||
player->TeleportTo(mapId, x, y, z, o);
|
||||
player->TeleportTo(goData->spawnPoint);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -470,7 +455,7 @@ public:
|
||||
else
|
||||
player->SaveRecallPosition();
|
||||
|
||||
float z = std::max(map->GetStaticHeight(PhasingHandler::GetEmptyPhaseShift(), x, y, MAX_HEIGHT), map->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), x, y));
|
||||
float z = std::max(map->GetHeight(PhasingHandler::GetEmptyPhaseShift(), x, y, MAX_HEIGHT), map->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), x, y));
|
||||
|
||||
player->TeleportTo(zoneEntry->mapid, x, y, z, player->GetOrientation());
|
||||
return true;
|
||||
@@ -518,7 +503,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
Map const* map = sMapMgr->CreateBaseMap(mapId);
|
||||
z = std::max(map->GetStaticHeight(PhasingHandler::GetEmptyPhaseShift(), x, y, MAX_HEIGHT), map->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), x, y));
|
||||
z = std::max(map->GetHeight(PhasingHandler::GetEmptyPhaseShift(), x, y, MAX_HEIGHT), map->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), x, y));
|
||||
}
|
||||
|
||||
// stop flight if need
|
||||
|
||||
@@ -39,6 +39,10 @@ EndScriptData */
|
||||
#include "RBAC.h"
|
||||
#include "WorldSession.h"
|
||||
|
||||
// definitions are over in cs_npc.cpp
|
||||
bool HandleNpcSpawnGroup(ChatHandler* handler, char const* args);
|
||||
bool HandleNpcDespawnGroup(ChatHandler* handler, char const* args);
|
||||
|
||||
class gobject_commandscript : public CommandScript
|
||||
{
|
||||
public:
|
||||
@@ -58,15 +62,17 @@ public:
|
||||
};
|
||||
static std::vector<ChatCommand> gobjectCommandTable =
|
||||
{
|
||||
{ "activate", rbac::RBAC_PERM_COMMAND_GOBJECT_ACTIVATE, false, &HandleGameObjectActivateCommand, "" },
|
||||
{ "delete", rbac::RBAC_PERM_COMMAND_GOBJECT_DELETE, false, &HandleGameObjectDeleteCommand, "" },
|
||||
{ "info", rbac::RBAC_PERM_COMMAND_GOBJECT_INFO, false, &HandleGameObjectInfoCommand, "" },
|
||||
{ "move", rbac::RBAC_PERM_COMMAND_GOBJECT_MOVE, false, &HandleGameObjectMoveCommand, "" },
|
||||
{ "near", rbac::RBAC_PERM_COMMAND_GOBJECT_NEAR, false, &HandleGameObjectNearCommand, "" },
|
||||
{ "target", rbac::RBAC_PERM_COMMAND_GOBJECT_TARGET, false, &HandleGameObjectTargetCommand, "" },
|
||||
{ "turn", rbac::RBAC_PERM_COMMAND_GOBJECT_TURN, false, &HandleGameObjectTurnCommand, "" },
|
||||
{ "add", rbac::RBAC_PERM_COMMAND_GOBJECT_ADD, false, nullptr, "", gobjectAddCommandTable },
|
||||
{ "set", rbac::RBAC_PERM_COMMAND_GOBJECT_SET, false, nullptr, "", gobjectSetCommandTable },
|
||||
{ "activate", rbac::RBAC_PERM_COMMAND_GOBJECT_ACTIVATE, false, &HandleGameObjectActivateCommand, "" },
|
||||
{ "delete", rbac::RBAC_PERM_COMMAND_GOBJECT_DELETE, false, &HandleGameObjectDeleteCommand, "" },
|
||||
{ "info", rbac::RBAC_PERM_COMMAND_GOBJECT_INFO, false, &HandleGameObjectInfoCommand, "" },
|
||||
{ "move", rbac::RBAC_PERM_COMMAND_GOBJECT_MOVE, false, &HandleGameObjectMoveCommand, "" },
|
||||
{ "near", rbac::RBAC_PERM_COMMAND_GOBJECT_NEAR, false, &HandleGameObjectNearCommand, "" },
|
||||
{ "target", rbac::RBAC_PERM_COMMAND_GOBJECT_TARGET, false, &HandleGameObjectTargetCommand, "" },
|
||||
{ "turn", rbac::RBAC_PERM_COMMAND_GOBJECT_TURN, false, &HandleGameObjectTurnCommand, "" },
|
||||
{ "spawngroup", rbac::RBAC_PERM_COMMAND_GOBJECT_SPAWNGROUP, false, &HandleNpcSpawnGroup, "" },
|
||||
{ "despawngroup", rbac::RBAC_PERM_COMMAND_GOBJECT_DESPAWNGROUP, false, &HandleNpcDespawnGroup,""},
|
||||
{ "add", rbac::RBAC_PERM_COMMAND_GOBJECT_ADD, false, nullptr, "", gobjectAddCommandTable },
|
||||
{ "set", rbac::RBAC_PERM_COMMAND_GOBJECT_SET, false, nullptr, "", gobjectSetCommandTable },
|
||||
};
|
||||
static std::vector<ChatCommand> commandTable =
|
||||
{
|
||||
@@ -172,14 +178,14 @@ public:
|
||||
|
||||
object = new GameObject();
|
||||
// this will generate a new guid if the object is in an instance
|
||||
if (!object->LoadGameObjectFromDB(guidLow, map))
|
||||
if (!object->LoadFromDB(guidLow, map, true))
|
||||
{
|
||||
delete object;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// @todo is it really necessary to add both the real and DB table guid here ?
|
||||
sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGOData(guidLow));
|
||||
sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGameObjectData(guidLow));
|
||||
|
||||
handler->PSendSysMessage(LANG_GAMEOBJECT_ADD, objectId, objectInfo->name.c_str(), guidLow, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
|
||||
return true;
|
||||
@@ -348,6 +354,9 @@ public:
|
||||
if (!guidLow)
|
||||
return false;
|
||||
|
||||
Player const* const player = handler->GetSession()->GetPlayer();
|
||||
// force respawn to make sure we find something
|
||||
player->GetMap()->ForceRespawn(SPAWN_TYPE_GAMEOBJECT, guidLow);
|
||||
GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
|
||||
if (!object)
|
||||
{
|
||||
@@ -359,7 +368,7 @@ public:
|
||||
ObjectGuid ownerGuid = object->GetOwnerGUID();
|
||||
if (ownerGuid)
|
||||
{
|
||||
Unit* owner = ObjectAccessor::GetUnit(*handler->GetSession()->GetPlayer(), ownerGuid);
|
||||
Unit* owner = ObjectAccessor::GetUnit(*player, ownerGuid);
|
||||
if (!owner || !ownerGuid.IsPlayer())
|
||||
{
|
||||
handler->PSendSysMessage(LANG_COMMAND_DELOBJREFERCREATURE, ownerGuid.GetCounter(), guidLow);
|
||||
@@ -587,7 +596,7 @@ public:
|
||||
if (!cValue)
|
||||
return false;
|
||||
ObjectGuid::LowType guidLow = atoul(cValue);
|
||||
GameObjectData const* data = sObjectMgr->GetGOData(guidLow);
|
||||
GameObjectData const* data = sObjectMgr->GetGameObjectData(guidLow);
|
||||
if (!data)
|
||||
return false;
|
||||
entry = data->id;
|
||||
@@ -599,9 +608,16 @@ public:
|
||||
|
||||
GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(entry);
|
||||
|
||||
GameObject* thisGO = nullptr;
|
||||
|
||||
if (!gameObjectInfo)
|
||||
return false;
|
||||
|
||||
if (*args && handler->GetSession()->GetPlayer())
|
||||
thisGO = handler->GetSession()->GetPlayer()->FindNearestGameObject(entry, 30);
|
||||
else if (handler->getSelectedObject() && handler->getSelectedObject()->GetTypeId() == TYPEID_GAMEOBJECT)
|
||||
thisGO = handler->getSelectedObject()->ToGameObject();
|
||||
|
||||
type = gameObjectInfo->type;
|
||||
displayId = gameObjectInfo->displayId;
|
||||
name = gameObjectInfo->name;
|
||||
@@ -610,10 +626,32 @@ public:
|
||||
else if (type == GAMEOBJECT_TYPE_FISHINGHOLE)
|
||||
lootId = gameObjectInfo->fishinghole.lootId;
|
||||
|
||||
// If we have a real object, send some info about it
|
||||
if (thisGO)
|
||||
{
|
||||
handler->PSendSysMessage(LANG_SPAWNINFO_GUIDINFO, thisGO->GetGUID().ToString().c_str());
|
||||
handler->PSendSysMessage(LANG_SPAWNINFO_SPAWNID_LOCATION, thisGO->GetSpawnId(), thisGO->GetPositionX(), thisGO->GetPositionY(), thisGO->GetPositionZ());
|
||||
if (Player* player = handler->GetSession()->GetPlayer())
|
||||
{
|
||||
Position playerPos = player->GetPosition();
|
||||
float dist = thisGO->GetExactDist(&playerPos);
|
||||
handler->PSendSysMessage(LANG_SPAWNINFO_DISTANCEFROMPLAYER, dist);
|
||||
}
|
||||
}
|
||||
handler->PSendSysMessage(LANG_GOINFO_ENTRY, entry);
|
||||
handler->PSendSysMessage(LANG_GOINFO_TYPE, type);
|
||||
handler->PSendSysMessage(LANG_GOINFO_LOOTID, lootId);
|
||||
handler->PSendSysMessage(LANG_GOINFO_DISPLAYID, displayId);
|
||||
if (WorldObject* object = handler->getSelectedObject())
|
||||
{
|
||||
if (object->ToGameObject() && object->ToGameObject()->GetGameObjectData() && object->ToGameObject()->GetGameObjectData()->spawnGroupData->groupId)
|
||||
{
|
||||
SpawnGroupTemplateData const* groupData = object->ToGameObject()->GetGameObjectData()->spawnGroupData;
|
||||
handler->PSendSysMessage(LANG_SPAWNINFO_GROUP_ID, groupData->name.c_str(), groupData->groupId, groupData->flags, object->GetMap()->IsSpawnGroupActive(groupData->groupId));
|
||||
}
|
||||
if (object->ToGameObject())
|
||||
handler->PSendSysMessage(LANG_SPAWNINFO_COMPATIBILITY_MODE, object->ToGameObject()->GetRespawnCompatibilityMode());
|
||||
}
|
||||
handler->PSendSysMessage(LANG_GOINFO_NAME, name.c_str());
|
||||
handler->PSendSysMessage(LANG_GOINFO_SIZE, gameObjectInfo->size);
|
||||
|
||||
|
||||
@@ -25,9 +25,12 @@ EndScriptData */
|
||||
#include "ScriptMgr.h"
|
||||
#include "CharacterCache.h"
|
||||
#include "Chat.h"
|
||||
#include "Creature.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "DBCStores.h"
|
||||
#include "GameObject.h"
|
||||
#include "Language.h"
|
||||
#include "MapManager.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "Player.h"
|
||||
@@ -45,11 +48,13 @@ public:
|
||||
{
|
||||
static std::vector<ChatCommand> listCommandTable =
|
||||
{
|
||||
{ "creature", rbac::RBAC_PERM_COMMAND_LIST_CREATURE, true, &HandleListCreatureCommand, "" },
|
||||
{ "item", rbac::RBAC_PERM_COMMAND_LIST_ITEM, true, &HandleListItemCommand, "" },
|
||||
{ "object", rbac::RBAC_PERM_COMMAND_LIST_OBJECT, true, &HandleListObjectCommand, "" },
|
||||
{ "auras", rbac::RBAC_PERM_COMMAND_LIST_AURAS, false, &HandleListAurasCommand, "" },
|
||||
{ "mail", rbac::RBAC_PERM_COMMAND_LIST_MAIL, true, &HandleListMailCommand, "" },
|
||||
{ "creature", rbac::RBAC_PERM_COMMAND_LIST_CREATURE, true, &HandleListCreatureCommand, "" },
|
||||
{ "item", rbac::RBAC_PERM_COMMAND_LIST_ITEM, true, &HandleListItemCommand, "" },
|
||||
{ "object", rbac::RBAC_PERM_COMMAND_LIST_OBJECT, true, &HandleListObjectCommand, "" },
|
||||
{ "auras", rbac::RBAC_PERM_COMMAND_LIST_AURAS, false, &HandleListAurasCommand, "" },
|
||||
{ "mail", rbac::RBAC_PERM_COMMAND_LIST_MAIL, true, &HandleListMailCommand, "" },
|
||||
{ "spawnpoints", rbac::RBAC_PERM_COMMAND_LIST_SPAWNPOINTS, false, &HandleListSpawnPointsCommand, "" },
|
||||
{ "respawns", rbac::RBAC_PERM_COMMAND_LIST_MAIL, false, &HandleListRespawnsCommand, "" }
|
||||
};
|
||||
static std::vector<ChatCommand> commandTable =
|
||||
{
|
||||
@@ -117,11 +122,40 @@ public:
|
||||
float y = fields[2].GetFloat();
|
||||
float z = fields[3].GetFloat();
|
||||
uint16 mapId = fields[4].GetUInt16();
|
||||
bool liveFound = false;
|
||||
|
||||
// Get map (only support base map from console)
|
||||
Map* thisMap;
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, cInfo->Name.c_str(), x, y, z, mapId);
|
||||
thisMap = handler->GetSession()->GetPlayer()->GetMap();
|
||||
else
|
||||
handler->PSendSysMessage(LANG_CREATURE_LIST_CONSOLE, guid, cInfo->Name.c_str(), x, y, z, mapId);
|
||||
thisMap = sMapMgr->FindBaseNonInstanceMap(mapId);
|
||||
|
||||
// If map found, try to find active version of this creature
|
||||
if (thisMap)
|
||||
{
|
||||
auto const creBounds = thisMap->GetCreatureBySpawnIdStore().equal_range(guid);
|
||||
if (creBounds.first != creBounds.second)
|
||||
{
|
||||
for (std::unordered_multimap<uint32, Creature*>::const_iterator itr = creBounds.first; itr != creBounds.second;)
|
||||
{
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, cInfo->Name.c_str(), x, y, z, mapId, itr->second->GetGUID().ToString().c_str(), itr->second->IsAlive() ? "*" : " ");
|
||||
else
|
||||
handler->PSendSysMessage(LANG_CREATURE_LIST_CONSOLE, guid, cInfo->Name.c_str(), x, y, z, mapId, itr->second->GetGUID().ToString().c_str(), itr->second->IsAlive() ? "*" : " ");
|
||||
++itr;
|
||||
}
|
||||
liveFound = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!liveFound)
|
||||
{
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, cInfo->Name.c_str(), x, y, z, mapId, "", "");
|
||||
else
|
||||
handler->PSendSysMessage(LANG_CREATURE_LIST_CONSOLE, guid, cInfo->Name.c_str(), x, y, z, mapId, "", "");
|
||||
}
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
@@ -407,11 +441,40 @@ public:
|
||||
float z = fields[3].GetFloat();
|
||||
uint16 mapId = fields[4].GetUInt16();
|
||||
uint32 entry = fields[5].GetUInt32();
|
||||
bool liveFound = false;
|
||||
|
||||
// Get map (only support base map from console)
|
||||
Map* thisMap;
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_GO_LIST_CHAT, guid, entry, guid, gInfo->name.c_str(), x, y, z, mapId);
|
||||
thisMap = handler->GetSession()->GetPlayer()->GetMap();
|
||||
else
|
||||
handler->PSendSysMessage(LANG_GO_LIST_CONSOLE, guid, gInfo->name.c_str(), x, y, z, mapId);
|
||||
thisMap = sMapMgr->FindBaseNonInstanceMap(mapId);
|
||||
|
||||
// If map found, try to find active version of this object
|
||||
if (thisMap)
|
||||
{
|
||||
auto const goBounds = thisMap->GetGameObjectBySpawnIdStore().equal_range(guid);
|
||||
if (goBounds.first != goBounds.second)
|
||||
{
|
||||
for (std::unordered_multimap<uint32, GameObject*>::const_iterator itr = goBounds.first; itr != goBounds.second;)
|
||||
{
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_GO_LIST_CHAT, guid, entry, guid, gInfo->name.c_str(), x, y, z, mapId, itr->second->GetGUID().ToString().c_str(), itr->second->isSpawned() ? "*" : " ");
|
||||
else
|
||||
handler->PSendSysMessage(LANG_GO_LIST_CONSOLE, guid, gInfo->name.c_str(), x, y, z, mapId, itr->second->GetGUID().ToString().c_str(), itr->second->isSpawned() ? "*" : " ");
|
||||
++itr;
|
||||
}
|
||||
liveFound = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!liveFound)
|
||||
{
|
||||
if (handler->GetSession())
|
||||
handler->PSendSysMessage(LANG_GO_LIST_CHAT, guid, entry, guid, gInfo->name.c_str(), x, y, z, mapId, "", "");
|
||||
else
|
||||
handler->PSendSysMessage(LANG_GO_LIST_CONSOLE, guid, gInfo->name.c_str(), x, y, z, mapId, "", "");
|
||||
}
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
@@ -581,6 +644,103 @@ public:
|
||||
handler->PSendSysMessage(LANG_LIST_MAIL_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool HandleListSpawnPointsCommand(ChatHandler* handler, char const* /*args*/)
|
||||
{
|
||||
Player const* player = handler->GetSession()->GetPlayer();
|
||||
Map const* map = player->GetMap();
|
||||
|
||||
uint32 const mapId = map->GetId();
|
||||
bool const showAll = map->IsBattlegroundOrArena() || map->IsDungeon();
|
||||
handler->PSendSysMessage("Listing all spawn points in map %u (%s)%s:", mapId, map->GetMapName(), showAll ? "" : " within 5000yd");
|
||||
for (auto const& pair : sObjectMgr->GetAllCreatureData())
|
||||
{
|
||||
SpawnData const& data = pair.second;
|
||||
if (data.spawnPoint.GetMapId() != mapId)
|
||||
continue;
|
||||
CreatureTemplate const* cTemp = sObjectMgr->GetCreatureTemplate(data.id);
|
||||
if (!cTemp)
|
||||
continue;
|
||||
if (showAll || data.spawnPoint.IsInDist2d(player, 5000.0))
|
||||
handler->PSendSysMessage("Type: %u | SpawnId: %u | Entry: %u (%s) | X: %.3f | Y: %.3f | Z: %.3f", uint32(data.type), data.spawnId, data.id, cTemp->Name.c_str(), data.spawnPoint.GetPositionX(), data.spawnPoint.GetPositionY(), data.spawnPoint.GetPositionZ());
|
||||
}
|
||||
for (auto const& pair : sObjectMgr->GetAllGameObjectData())
|
||||
{
|
||||
SpawnData const& data = pair.second;
|
||||
if (data.spawnPoint.GetMapId() != mapId)
|
||||
continue;
|
||||
GameObjectTemplate const* goTemp = sObjectMgr->GetGameObjectTemplate(data.id);
|
||||
if (!goTemp)
|
||||
continue;
|
||||
if (showAll || data.spawnPoint.IsInDist2d(player, 5000.0))
|
||||
handler->PSendSysMessage("Type: %u | SpawnId: %u | Entry: %u (%s) | X: %.3f | Y: %.3f | Z: %.3f", uint32(data.type), data.spawnId, data.id, goTemp->name.c_str(), data.spawnPoint.GetPositionX(), data.spawnPoint.GetPositionY(), data.spawnPoint.GetPositionZ());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static char const* GetZoneName(uint32 zoneId, LocaleConstant locale)
|
||||
{
|
||||
AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(zoneId);
|
||||
return zoneEntry ? (const char*)zoneEntry->area_name[locale] : "<unknown zone>";
|
||||
}
|
||||
static bool HandleListRespawnsCommand(ChatHandler* handler, char const* args)
|
||||
{
|
||||
Player const* player = handler->GetSession()->GetPlayer();
|
||||
Map const* map = player->GetMap();
|
||||
|
||||
uint32 range = 0;
|
||||
if (*args)
|
||||
range = atoi((char*)args);
|
||||
|
||||
std::vector<RespawnInfo*> respawns;
|
||||
LocaleConstant locale = handler->GetSession()->GetSessionDbcLocale();
|
||||
char const* stringOverdue = sObjectMgr->GetTrinityString(LANG_LIST_RESPAWNS_OVERDUE, locale);
|
||||
char const* stringCreature = sObjectMgr->GetTrinityString(LANG_LIST_RESPAWNS_CREATURES, locale);
|
||||
char const* stringGameobject = sObjectMgr->GetTrinityString(LANG_LIST_RESPAWNS_GAMEOBJECTS, locale);
|
||||
|
||||
uint32 zoneId = player->GetZoneId();
|
||||
if (range)
|
||||
handler->PSendSysMessage(LANG_LIST_RESPAWNS_RANGE, stringCreature, range);
|
||||
else
|
||||
handler->PSendSysMessage(LANG_LIST_RESPAWNS_ZONE, stringCreature, GetZoneName(zoneId, handler->GetSessionDbcLocale()), zoneId);
|
||||
handler->PSendSysMessage(LANG_LIST_RESPAWNS_LISTHEADER);
|
||||
map->GetRespawnInfo(respawns, SPAWN_TYPEMASK_CREATURE, range ? 0 : zoneId);
|
||||
for (RespawnInfo* ri : respawns)
|
||||
{
|
||||
CreatureData const* data = sObjectMgr->GetCreatureData(ri->spawnId);
|
||||
if (!data)
|
||||
continue;
|
||||
if (range && !player->IsInDist(data->spawnPoint, range))
|
||||
continue;
|
||||
uint32 gridY = ri->gridId / MAX_NUMBER_OF_GRIDS;
|
||||
uint32 gridX = ri->gridId % MAX_NUMBER_OF_GRIDS;
|
||||
|
||||
std::string respawnTime = ri->respawnTime > time(nullptr) ? secsToTimeString(uint64(ri->respawnTime - time(nullptr)), true) : stringOverdue;
|
||||
handler->PSendSysMessage("%u | %u | [%02u,%02u] | %s (%u) | %s", ri->spawnId, ri->entry, gridX, gridY, GetZoneName(ri->zoneId, handler->GetSessionDbcLocale()), ri->zoneId, map->IsSpawnGroupActive(data->spawnGroupData->groupId) ? respawnTime.c_str() : "inactive");
|
||||
}
|
||||
|
||||
respawns.clear();
|
||||
if (range)
|
||||
handler->PSendSysMessage(LANG_LIST_RESPAWNS_RANGE, stringGameobject, range);
|
||||
else
|
||||
handler->PSendSysMessage(LANG_LIST_RESPAWNS_ZONE, stringGameobject, GetZoneName(zoneId, handler->GetSessionDbcLocale()), zoneId);
|
||||
handler->PSendSysMessage(LANG_LIST_RESPAWNS_LISTHEADER);
|
||||
map->GetRespawnInfo(respawns, SPAWN_TYPEMASK_GAMEOBJECT, range ? 0 : zoneId);
|
||||
for (RespawnInfo* ri : respawns)
|
||||
{
|
||||
GameObjectData const* data = sObjectMgr->GetGameObjectData(ri->spawnId);
|
||||
if (!data)
|
||||
continue;
|
||||
if (range && !player->IsInDist(data->spawnPoint, range))
|
||||
continue;
|
||||
uint32 gridY = ri->gridId / MAX_NUMBER_OF_GRIDS;
|
||||
uint32 gridX = ri->gridId % MAX_NUMBER_OF_GRIDS;
|
||||
|
||||
std::string respawnTime = ri->respawnTime > time(nullptr) ? secsToTimeString(uint64(ri->respawnTime - time(nullptr)), true) : stringOverdue;
|
||||
handler->PSendSysMessage("%u | %u | [% 02u, % 02u] | %s (%u) | %s", ri->spawnId, ri->entry, gridX, gridY, GetZoneName(ri->zoneId, handler->GetSessionDbcLocale()), ri->zoneId, map->IsSpawnGroupActive(data->spawnGroupData->groupId) ? respawnTime.c_str() : "inactive");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_list_commandscript()
|
||||
|
||||
@@ -1901,10 +1901,22 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
// First handle any creatures that still have a corpse around
|
||||
Trinity::RespawnDo u_do;
|
||||
Trinity::WorldObjectWorker<Trinity::RespawnDo> worker(player, u_do);
|
||||
Cell::VisitGridObjects(player, worker, player->GetGridActivationRange());
|
||||
|
||||
// Now handle any that had despawned, but had respawn time logged.
|
||||
std::vector<RespawnInfo*> data;
|
||||
player->GetMap()->GetRespawnInfo(data, SPAWN_TYPEMASK_ALL, 0);
|
||||
if (!data.empty())
|
||||
{
|
||||
uint32 const gridId = Trinity::ComputeGridCoord(player->GetPositionX(), player->GetPositionY()).GetId();
|
||||
for (RespawnInfo* info : data)
|
||||
if (info->gridId == gridId)
|
||||
player->GetMap()->ForceRespawn(info->type, info->spawnId);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -181,6 +181,86 @@ EnumName<CreatureFlagsExtra> const flagsExtra[] =
|
||||
|
||||
uint32 const FLAGS_EXTRA_COUNT = std::extent<decltype(flagsExtra)>::value;
|
||||
|
||||
bool HandleNpcSpawnGroup(ChatHandler* handler, char const* args)
|
||||
{
|
||||
if (!*args)
|
||||
return false;
|
||||
|
||||
bool ignoreRespawn = false;
|
||||
bool force = false;
|
||||
uint32 groupId = 0;
|
||||
|
||||
// Decode arguments
|
||||
char* arg = strtok((char*)args, " ");
|
||||
while (arg)
|
||||
{
|
||||
std::string thisArg = arg;
|
||||
std::transform(thisArg.begin(), thisArg.end(), thisArg.begin(), ::tolower);
|
||||
if (thisArg == "ignorerespawn")
|
||||
ignoreRespawn = true;
|
||||
else if (thisArg == "force")
|
||||
force = true;
|
||||
else if (thisArg.empty() || !(std::count_if(thisArg.begin(), thisArg.end(), ::isdigit) == (int)thisArg.size()))
|
||||
return false;
|
||||
else
|
||||
groupId = atoi(thisArg.c_str());
|
||||
|
||||
arg = strtok(NULL, " ");
|
||||
}
|
||||
|
||||
Player* player = handler->GetSession()->GetPlayer();
|
||||
|
||||
std::vector <WorldObject*> creatureList;
|
||||
if (!player->GetMap()->SpawnGroupSpawn(groupId, ignoreRespawn, force, &creatureList))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_SPAWNGROUP_BADGROUP, groupId);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
handler->PSendSysMessage(LANG_SPAWNGROUP_SPAWNCOUNT, creatureList.size());
|
||||
for (WorldObject* obj : creatureList)
|
||||
handler->PSendSysMessage("%s (%s)", obj->GetName(), obj->GetGUID().ToString().c_str());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HandleNpcDespawnGroup(ChatHandler* handler, char const* args)
|
||||
{
|
||||
if (!*args)
|
||||
return false;
|
||||
|
||||
bool deleteRespawnTimes = false;
|
||||
uint32 groupId = 0;
|
||||
|
||||
// Decode arguments
|
||||
char* arg = strtok((char*)args, " ");
|
||||
while (arg)
|
||||
{
|
||||
std::string thisArg = arg;
|
||||
std::transform(thisArg.begin(), thisArg.end(), thisArg.begin(), ::tolower);
|
||||
if (thisArg == "removerespawntime")
|
||||
deleteRespawnTimes = true;
|
||||
else if (thisArg.empty() || !(std::count_if(thisArg.begin(), thisArg.end(), ::isdigit) == (int)thisArg.size()))
|
||||
return false;
|
||||
else
|
||||
groupId = atoi(thisArg.c_str());
|
||||
|
||||
arg = strtok(nullptr, " ");
|
||||
}
|
||||
|
||||
Player* player = handler->GetSession()->GetPlayer();
|
||||
|
||||
if (!player->GetMap()->SpawnGroupDespawn(groupId, deleteRespawnTimes))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_SPAWNGROUP_BADGROUP, groupId);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
class npc_commandscript : public CommandScript
|
||||
{
|
||||
public:
|
||||
@@ -225,21 +305,23 @@ public:
|
||||
};
|
||||
static std::vector<ChatCommand> npcCommandTable =
|
||||
{
|
||||
{ "info", rbac::RBAC_PERM_COMMAND_NPC_INFO, false, &HandleNpcInfoCommand, "" },
|
||||
{ "near", rbac::RBAC_PERM_COMMAND_NPC_NEAR, false, &HandleNpcNearCommand, "" },
|
||||
{ "move", rbac::RBAC_PERM_COMMAND_NPC_MOVE, false, &HandleNpcMoveCommand, "" },
|
||||
{ "playemote", rbac::RBAC_PERM_COMMAND_NPC_PLAYEMOTE, false, &HandleNpcPlayEmoteCommand, "" },
|
||||
{ "say", rbac::RBAC_PERM_COMMAND_NPC_SAY, false, &HandleNpcSayCommand, "" },
|
||||
{ "textemote", rbac::RBAC_PERM_COMMAND_NPC_TEXTEMOTE, false, &HandleNpcTextEmoteCommand, "" },
|
||||
{ "whisper", rbac::RBAC_PERM_COMMAND_NPC_WHISPER, false, &HandleNpcWhisperCommand, "" },
|
||||
{ "yell", rbac::RBAC_PERM_COMMAND_NPC_YELL, false, &HandleNpcYellCommand, "" },
|
||||
{ "tame", rbac::RBAC_PERM_COMMAND_NPC_TAME, false, &HandleNpcTameCommand, "" },
|
||||
{ "add", rbac::RBAC_PERM_COMMAND_NPC_ADD, false, nullptr, "", npcAddCommandTable },
|
||||
{ "delete", rbac::RBAC_PERM_COMMAND_NPC_DELETE, false, nullptr, "", npcDeleteCommandTable },
|
||||
{ "follow", rbac::RBAC_PERM_COMMAND_NPC_FOLLOW, false, nullptr, "", npcFollowCommandTable },
|
||||
{ "set", rbac::RBAC_PERM_COMMAND_NPC_SET, false, nullptr, "", npcSetCommandTable },
|
||||
{ "evade", rbac::RBAC_PERM_COMMAND_NPC_EVADE, false, &HandleNpcEvadeCommand, "" },
|
||||
{ "showloot", rbac::RBAC_PERM_COMMAND_NPC_SHOWLOOT, false, &HandleNpcShowLootCommand, "" },
|
||||
{ "info", rbac::RBAC_PERM_COMMAND_NPC_INFO, false, &HandleNpcInfoCommand, "" },
|
||||
{ "near", rbac::RBAC_PERM_COMMAND_NPC_NEAR, false, &HandleNpcNearCommand, "" },
|
||||
{ "move", rbac::RBAC_PERM_COMMAND_NPC_MOVE, false, &HandleNpcMoveCommand, "" },
|
||||
{ "playemote", rbac::RBAC_PERM_COMMAND_NPC_PLAYEMOTE, false, &HandleNpcPlayEmoteCommand, "" },
|
||||
{ "say", rbac::RBAC_PERM_COMMAND_NPC_SAY, false, &HandleNpcSayCommand, "" },
|
||||
{ "textemote", rbac::RBAC_PERM_COMMAND_NPC_TEXTEMOTE, false, &HandleNpcTextEmoteCommand, "" },
|
||||
{ "whisper", rbac::RBAC_PERM_COMMAND_NPC_WHISPER, false, &HandleNpcWhisperCommand, "" },
|
||||
{ "yell", rbac::RBAC_PERM_COMMAND_NPC_YELL, false, &HandleNpcYellCommand, "" },
|
||||
{ "tame", rbac::RBAC_PERM_COMMAND_NPC_TAME, false, &HandleNpcTameCommand, "" },
|
||||
{ "spawngroup", rbac::RBAC_PERM_COMMAND_NPC_SPAWNGROUP, false, &HandleNpcSpawnGroup, "" },
|
||||
{ "despawngroup", rbac::RBAC_PERM_COMMAND_NPC_DESPAWNGROUP, false, &HandleNpcDespawnGroup, "" },
|
||||
{ "add", rbac::RBAC_PERM_COMMAND_NPC_ADD, false, nullptr, "", npcAddCommandTable },
|
||||
{ "delete", rbac::RBAC_PERM_COMMAND_NPC_DELETE, false, nullptr, "", npcDeleteCommandTable },
|
||||
{ "follow", rbac::RBAC_PERM_COMMAND_NPC_FOLLOW, false, nullptr, "", npcFollowCommandTable },
|
||||
{ "set", rbac::RBAC_PERM_COMMAND_NPC_SET, false, nullptr, "", npcSetCommandTable },
|
||||
{ "evade", rbac::RBAC_PERM_COMMAND_NPC_EVADE, false, &HandleNpcEvadeCommand, "" },
|
||||
{ "showloot", rbac::RBAC_PERM_COMMAND_NPC_SHOWLOOT, false, &HandleNpcShowLootCommand, "" },
|
||||
};
|
||||
static std::vector<ChatCommand> commandTable =
|
||||
{
|
||||
@@ -263,22 +345,16 @@ public:
|
||||
return false;
|
||||
|
||||
Player* chr = handler->GetSession()->GetPlayer();
|
||||
float x = chr->GetPositionX();
|
||||
float y = chr->GetPositionY();
|
||||
float z = chr->GetPositionZ();
|
||||
float o = chr->GetOrientation();
|
||||
Map* map = chr->GetMap();
|
||||
|
||||
if (Transport* trans = chr->GetTransport())
|
||||
{
|
||||
ObjectGuid::LowType guid = map->GenerateLowGuid<HighGuid::Unit>();
|
||||
CreatureData& data = sObjectMgr->NewOrExistCreatureData(guid);
|
||||
data.spawnId = guid;
|
||||
data.id = id;
|
||||
data.phaseMask = chr->GetPhaseMask();
|
||||
data.posX = chr->GetTransOffsetX();
|
||||
data.posY = chr->GetTransOffsetY();
|
||||
data.posZ = chr->GetTransOffsetZ();
|
||||
data.orientation = chr->GetTransOffsetO();
|
||||
data.spawnPoint.Relocate(chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
|
||||
|
||||
Creature* creature = trans->CreateNPCPassenger(guid, &data);
|
||||
|
||||
@@ -291,7 +367,7 @@ public:
|
||||
}
|
||||
|
||||
Creature* creature = new Creature();
|
||||
if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), id, x, y, z, o))
|
||||
if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), id, *chr))
|
||||
{
|
||||
delete creature;
|
||||
return false;
|
||||
@@ -307,7 +383,7 @@ public:
|
||||
creature->CleanupsBeforeDelete();
|
||||
delete creature;
|
||||
creature = new Creature();
|
||||
if (!creature->LoadCreatureFromDB(db_guid, map))
|
||||
if (!creature->LoadFromDB(db_guid, map, true, true))
|
||||
{
|
||||
delete creature;
|
||||
return false;
|
||||
@@ -484,7 +560,7 @@ public:
|
||||
|
||||
static bool HandleNpcDeleteCommand(ChatHandler* handler, char const* args)
|
||||
{
|
||||
Creature* unit = nullptr;
|
||||
Creature* creature = nullptr;
|
||||
|
||||
if (*args)
|
||||
{
|
||||
@@ -496,22 +572,30 @@ public:
|
||||
ObjectGuid::LowType lowguid = atoul(cId);
|
||||
if (!lowguid)
|
||||
return false;
|
||||
unit = handler->GetCreatureFromPlayerMapByDbGuid(lowguid);
|
||||
// force respawn to make sure we find something
|
||||
handler->GetSession()->GetPlayer()->GetMap()->ForceRespawn(SPAWN_TYPE_CREATURE, lowguid);
|
||||
// then try to find it
|
||||
creature = handler->GetCreatureFromPlayerMapByDbGuid(lowguid);
|
||||
}
|
||||
else
|
||||
unit = handler->getSelectedCreature();
|
||||
creature = handler->getSelectedCreature();
|
||||
|
||||
if (!unit || unit->IsPet() || unit->IsTotem())
|
||||
if (!creature || creature->IsPet() || creature->IsTotem())
|
||||
{
|
||||
handler->SendSysMessage(LANG_SELECT_CREATURE);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Delete the creature
|
||||
unit->CombatStop();
|
||||
unit->DeleteFromDB();
|
||||
unit->AddObjectToRemoveList();
|
||||
if (TempSummon* summon = creature->ToTempSummon())
|
||||
summon->UnSummon();
|
||||
else
|
||||
{
|
||||
// Delete the creature
|
||||
creature->CombatStop();
|
||||
creature->DeleteFromDB();
|
||||
creature->AddObjectToRemoveList();
|
||||
}
|
||||
|
||||
handler->SendSysMessage(LANG_COMMAND_DELCREATMESSAGE);
|
||||
|
||||
@@ -701,15 +785,22 @@ public:
|
||||
uint32 mechanicImmuneMask = cInfo->MechanicImmuneMask;
|
||||
uint32 displayid = target->GetDisplayId();
|
||||
uint32 nativeid = target->GetNativeDisplayId();
|
||||
uint32 Entry = target->GetEntry();
|
||||
uint32 entry = target->GetEntry();
|
||||
|
||||
int64 curRespawnDelay = target->GetRespawnCompatibilityMode() ? target->GetRespawnTimeEx() - time(nullptr) : target->GetMap()->GetCreatureRespawnTime(target->GetSpawnId()) - time(nullptr);
|
||||
|
||||
int64 curRespawnDelay = target->GetRespawnTimeEx()-time(nullptr);
|
||||
if (curRespawnDelay < 0)
|
||||
curRespawnDelay = 0;
|
||||
std::string curRespawnDelayStr = secsToTimeString(uint64(curRespawnDelay), true);
|
||||
std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), true);
|
||||
|
||||
handler->PSendSysMessage(LANG_NPCINFO_CHAR, target->GetSpawnId(), target->GetGUID().GetCounter(), faction, npcflags, Entry, displayid, nativeid);
|
||||
handler->PSendSysMessage(LANG_NPCINFO_CHAR, target->GetName().c_str(), target->GetSpawnId(), target->GetGUID().GetCounter(), entry, faction, npcflags, displayid, nativeid);
|
||||
if (target->GetCreatureData() && target->GetCreatureData()->spawnGroupData->groupId)
|
||||
{
|
||||
SpawnGroupTemplateData const* const groupData = target->GetCreatureData()->spawnGroupData;
|
||||
handler->PSendSysMessage(LANG_SPAWNINFO_GROUP_ID, groupData->name.c_str(), groupData->groupId, groupData->flags, target->GetMap()->IsSpawnGroupActive(groupData->groupId));
|
||||
}
|
||||
handler->PSendSysMessage(LANG_SPAWNINFO_COMPATIBILITY_MODE, target->GetRespawnCompatibilityMode());
|
||||
handler->PSendSysMessage(LANG_NPCINFO_LEVEL, target->getLevel());
|
||||
handler->PSendSysMessage(LANG_NPCINFO_EQUIPMENT, target->GetCurrentEquipmentId(), target->GetOriginalEquipmentId());
|
||||
handler->PSendSysMessage(LANG_NPCINFO_HEALTH, target->GetCreateHealth(), target->GetMaxHealth(), target->GetHealth());
|
||||
@@ -785,7 +876,7 @@ public:
|
||||
if (!creatureTemplate)
|
||||
continue;
|
||||
|
||||
handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, creatureTemplate->Name.c_str(), x, y, z, mapId);
|
||||
handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, creatureTemplate->Name.c_str(), x, y, z, mapId, "", "");
|
||||
|
||||
++count;
|
||||
}
|
||||
@@ -803,8 +894,13 @@ public:
|
||||
ObjectGuid::LowType lowguid = 0;
|
||||
|
||||
Creature* creature = handler->getSelectedCreature();
|
||||
Player const* player = handler->GetSession()->GetPlayer();
|
||||
if (!player)
|
||||
return false;
|
||||
|
||||
if (!creature)
|
||||
if (creature)
|
||||
lowguid = creature->GetSpawnId();
|
||||
else
|
||||
{
|
||||
// number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r
|
||||
char* cId = handler->extractKeyFromLink((char*)args, "Hcreature");
|
||||
@@ -812,63 +908,46 @@ public:
|
||||
return false;
|
||||
|
||||
lowguid = atoul(cId);
|
||||
|
||||
// Attempting creature load from DB data
|
||||
CreatureData const* data = sObjectMgr->GetCreatureData(lowguid);
|
||||
if (!data)
|
||||
{
|
||||
handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32 map_id = data->mapid;
|
||||
|
||||
if (handler->GetSession()->GetPlayer()->GetMapId() != map_id)
|
||||
{
|
||||
handler->PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
// Attempting creature load from DB data
|
||||
CreatureData const* data = sObjectMgr->GetCreatureData(lowguid);
|
||||
if (!data)
|
||||
{
|
||||
lowguid = creature->GetSpawnId();
|
||||
handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
float x = handler->GetSession()->GetPlayer()->GetPositionX();
|
||||
float y = handler->GetSession()->GetPlayer()->GetPositionY();
|
||||
float z = handler->GetSession()->GetPlayer()->GetPositionZ();
|
||||
float o = handler->GetSession()->GetPlayer()->GetOrientation();
|
||||
|
||||
if (creature)
|
||||
if (player->GetMapId() != data->spawnPoint.GetMapId())
|
||||
{
|
||||
if (CreatureData const* data = sObjectMgr->GetCreatureData(creature->GetSpawnId()))
|
||||
{
|
||||
const_cast<CreatureData*>(data)->posX = x;
|
||||
const_cast<CreatureData*>(data)->posY = y;
|
||||
const_cast<CreatureData*>(data)->posZ = z;
|
||||
const_cast<CreatureData*>(data)->orientation = o;
|
||||
}
|
||||
creature->SetPosition(x, y, z, o);
|
||||
creature->GetMotionMaster()->Initialize();
|
||||
if (creature->IsAlive()) // dead creature will reset movement generator at respawn
|
||||
{
|
||||
creature->setDeathState(JUST_DIED);
|
||||
creature->Respawn();
|
||||
}
|
||||
handler->PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
// update position in memory
|
||||
const_cast<CreatureData*>(data)->spawnPoint.Relocate(*player);
|
||||
|
||||
PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_POSITION);
|
||||
|
||||
stmt->setFloat(0, x);
|
||||
stmt->setFloat(1, y);
|
||||
stmt->setFloat(2, z);
|
||||
stmt->setFloat(3, o);
|
||||
stmt->setFloat(0, player->GetPositionX());
|
||||
stmt->setFloat(1, player->GetPositionY());
|
||||
stmt->setFloat(2, player->GetPositionZ());
|
||||
stmt->setFloat(3, player->GetOrientation());
|
||||
stmt->setUInt32(4, lowguid);
|
||||
|
||||
WorldDatabase.Execute(stmt);
|
||||
|
||||
// respawn selected creature at the new location
|
||||
if (creature)
|
||||
{
|
||||
if (creature->IsAlive())
|
||||
creature->setDeathState(JUST_DIED);
|
||||
creature->Respawn(true);
|
||||
if (!creature->GetRespawnCompatibilityMode())
|
||||
creature->AddObjectToRemoveList();
|
||||
}
|
||||
|
||||
handler->PSendSysMessage(LANG_COMMAND_CREATUREMOVED);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -667,7 +667,7 @@ public:
|
||||
|
||||
// re-create
|
||||
Creature* wpCreature = new Creature();
|
||||
if (!wpCreature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), VISUAL_WAYPOINT, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation()))
|
||||
if (!wpCreature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), VISUAL_WAYPOINT, *chr))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT);
|
||||
delete wpCreature;
|
||||
@@ -678,8 +678,7 @@ public:
|
||||
|
||||
wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());
|
||||
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
|
||||
/// @todo Should we first use "Create" then use "LoadFromDB"?
|
||||
if (!wpCreature->LoadCreatureFromDB(wpCreature->GetSpawnId(), map))
|
||||
if (!wpCreature->LoadFromDB(wpCreature->GetSpawnId(), map, true, true))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT);
|
||||
delete wpCreature;
|
||||
@@ -881,7 +880,7 @@ public:
|
||||
float o = chr->GetOrientation();
|
||||
|
||||
Creature* wpCreature = new Creature();
|
||||
if (!wpCreature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), id, x, y, z, o))
|
||||
if (!wpCreature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), id, { x, y, z, o }))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
|
||||
delete wpCreature;
|
||||
@@ -899,7 +898,7 @@ public:
|
||||
|
||||
wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());
|
||||
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
|
||||
if (!wpCreature->LoadCreatureFromDB(wpCreature->GetSpawnId(), map))
|
||||
if (!wpCreature->LoadFromDB(wpCreature->GetSpawnId(), map, true, true))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
|
||||
delete wpCreature;
|
||||
@@ -945,7 +944,7 @@ public:
|
||||
Map* map = chr->GetMap();
|
||||
|
||||
Creature* creature = new Creature();
|
||||
if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), id, x, y, z, o))
|
||||
if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), id, { x, y, z, o }))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
|
||||
delete creature;
|
||||
@@ -955,7 +954,7 @@ public:
|
||||
PhasingHandler::InheritPhaseShift(creature, chr);
|
||||
|
||||
creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());
|
||||
if (!creature->LoadCreatureFromDB(creature->GetSpawnId(), map))
|
||||
if (!creature->LoadFromDB(creature->GetSpawnId(), map, true, true))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);
|
||||
delete creature;
|
||||
@@ -996,7 +995,7 @@ public:
|
||||
Map* map = chr->GetMap();
|
||||
|
||||
Creature* creature = new Creature();
|
||||
if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), id, x, y, z, o))
|
||||
if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMask(), id, { x, y, z, o }))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id);
|
||||
delete creature;
|
||||
@@ -1006,7 +1005,7 @@ public:
|
||||
PhasingHandler::InheritPhaseShift(creature, chr);
|
||||
|
||||
creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask());
|
||||
if (!creature->LoadCreatureFromDB(creature->GetSpawnId(), map))
|
||||
if (!creature->LoadFromDB(creature->GetSpawnId(), map, true, true))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id);
|
||||
delete creature;
|
||||
|
||||
@@ -107,7 +107,7 @@ class npc_av_marshal_or_warmaster : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_CHECK_RESET, 5000);
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ public:
|
||||
events.ScheduleEvent(EVENT_RANDOM_YELL, urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS)); //20 to 30 seconds
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
Reset();
|
||||
Talk(SAY_RESPAWN);
|
||||
|
||||
@@ -186,7 +186,7 @@ public:
|
||||
Talk(YELL_KILL);
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
Talk(YELL_BIRTH);
|
||||
}
|
||||
|
||||
@@ -278,31 +278,24 @@ public:
|
||||
_anubar.push_back(guid);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
void InitializeAI() override
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 9.0f);
|
||||
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 9.0f);
|
||||
_enteredCombat = false;
|
||||
_doorsWebbed = false;
|
||||
_lastPlayerCombatState = false;
|
||||
SetStep(0);
|
||||
}
|
||||
|
||||
void JustAppeared() override
|
||||
{
|
||||
BossAI::JustAppeared();
|
||||
SetCombatMovement(true);
|
||||
SummonCrusherPack(SUMMON_GROUP_CRUSHER_1);
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
if (me->IsAlive())
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
{
|
||||
BossAI::JustRespawned();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
|
||||
+2
-8
@@ -157,15 +157,9 @@ class boss_krik_thir : public CreatureScript
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
SummonAdds();
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
{
|
||||
BossAI::JustRespawned();
|
||||
BossAI::JustAppeared();
|
||||
SummonAdds();
|
||||
}
|
||||
|
||||
|
||||
@@ -569,7 +569,7 @@ class npc_halion_controller : public CreatureScript
|
||||
_twilightDamageTaken = 0;
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
if (_instance->GetGuidData(DATA_HALION) || _instance->GetBossState(DATA_GENERAL_ZARITHRIAN) != DONE)
|
||||
return;
|
||||
|
||||
@@ -442,7 +442,7 @@ struct BloodPrincesBossAI : public BossAI
|
||||
{
|
||||
_spawnHealth = 1;
|
||||
if (!me->isDead())
|
||||
JustRespawned();
|
||||
JustAppeared();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
@@ -490,7 +490,7 @@ struct BloodPrincesBossAI : public BossAI
|
||||
}
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BLOOD_PRINCES_CONTROL)))
|
||||
if (controller->AI()->GetData(DATA_INTRO) != DATA_INTRO_DONE)
|
||||
|
||||
@@ -687,9 +687,9 @@ class npc_spinestalker : public CreatureScript
|
||||
}
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
ScriptedAI::JustRespawned();
|
||||
ScriptedAI::JustAppeared();
|
||||
_instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetSpawnId()); // this cannot be in Reset because reset also happens on evade
|
||||
}
|
||||
|
||||
@@ -826,9 +826,9 @@ class npc_rimefang : public CreatureScript
|
||||
}
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
ScriptedAI::JustRespawned();
|
||||
ScriptedAI::JustAppeared();
|
||||
_instance->SetData(DATA_SINDRAGOSA_FROSTWYRMS, me->GetSpawnId()); // this cannot be in Reset because reset also happens on evade
|
||||
}
|
||||
|
||||
@@ -994,9 +994,9 @@ class npc_sindragosa_trash : public CreatureScript
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
ScriptedAI::JustRespawned();
|
||||
ScriptedAI::JustAppeared();
|
||||
|
||||
// Increase add count
|
||||
if (me->GetEntry() == NPC_FROSTWING_WHELP)
|
||||
|
||||
@@ -261,7 +261,7 @@ class ValithriaDespawner : public BasicEvent
|
||||
creature->SetRespawnDelay(10);
|
||||
|
||||
if (CreatureData const* data = creature->GetCreatureData())
|
||||
creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation);
|
||||
creature->UpdatePosition(data->spawnPoint);
|
||||
creature->DespawnOrUnsummon();
|
||||
|
||||
creature->SetCorpseDelay(corpseDelay);
|
||||
|
||||
@@ -354,7 +354,7 @@ class FrostwingGauntletRespawner
|
||||
creature->SetRespawnDelay(2);
|
||||
|
||||
if (CreatureData const* data = creature->GetCreatureData())
|
||||
creature->SetPosition(data->posX, data->posY, data->posZ, data->orientation);
|
||||
creature->UpdatePosition(data->spawnPoint);
|
||||
creature->DespawnOrUnsummon();
|
||||
|
||||
creature->SetCorpseDelay(corpseDelay);
|
||||
|
||||
@@ -395,13 +395,13 @@ class instance_icecrown_citadel : public InstanceMapScript
|
||||
break;
|
||||
case NPC_ZAFOD_BOOMBOX:
|
||||
if (GameObjectTemplate const* go = sObjectMgr->GetGameObjectTemplate(GO_THE_SKYBREAKER_A))
|
||||
if ((TeamInInstance == ALLIANCE && data->mapid == go->moTransport.mapID) ||
|
||||
(TeamInInstance == HORDE && data->mapid != go->moTransport.mapID))
|
||||
if ((TeamInInstance == ALLIANCE && data->spawnPoint.GetMapId() == go->moTransport.mapID) ||
|
||||
(TeamInInstance == HORDE && data->spawnPoint.GetMapId() != go->moTransport.mapID))
|
||||
return entry;
|
||||
return 0;
|
||||
case NPC_IGB_MURADIN_BRONZEBEARD:
|
||||
if ((TeamInInstance == ALLIANCE && data->posX > 10.0f) ||
|
||||
(TeamInInstance == HORDE && data->posX < 10.0f))
|
||||
if ((TeamInInstance == ALLIANCE && data->spawnPoint.GetPositionX() > 10.0f) ||
|
||||
(TeamInInstance == HORDE && data->spawnPoint.GetPositionX() < 10.0f))
|
||||
return entry;
|
||||
return 0;
|
||||
default:
|
||||
|
||||
@@ -91,7 +91,7 @@ public:
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
if (!me->isDead())
|
||||
if (!me->isDead() && instance->GetBossState(BOSS_ANUBREKHAN) != DONE)
|
||||
{
|
||||
Reset();
|
||||
SummonGuards();
|
||||
|
||||
@@ -84,7 +84,7 @@ class boss_faerlina : public CreatureScript
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
if (!me->isDead())
|
||||
if (!me->isDead() && instance->GetBossState(BOSS_FAERLINA) != DONE)
|
||||
{
|
||||
Reset();
|
||||
SummonAdds();
|
||||
|
||||
@@ -270,14 +270,9 @@ struct boss_four_horsemen_baseAI : public BossAI
|
||||
for (Horseman boss : horsemen)
|
||||
{
|
||||
if (Creature* cBoss = getHorsemanHandle(boss))
|
||||
{
|
||||
cBoss->DespawnOrUnsummon(0);
|
||||
cBoss->SetRespawnTime(15);
|
||||
}
|
||||
cBoss->DespawnOrUnsummon(0, Seconds(15));
|
||||
else
|
||||
{
|
||||
TC_LOG_WARN("scripts", "FourHorsemenAI: Encounter resetting but horseman with id %u is not present", uint32(boss));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ public:
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
if (!me->isDead())
|
||||
if (!me->isDead() && instance->GetBossState(BOSS_RAZUVIOUS) != DONE)
|
||||
{
|
||||
Reset();
|
||||
SummonAdds();
|
||||
|
||||
@@ -31,15 +31,12 @@ enum Phases
|
||||
PHASE_NOT_ENGAGED = 1,
|
||||
PHASE_PETS,
|
||||
PHASE_TRANSITION,
|
||||
PHASE_THADDIUS,
|
||||
PHASE_RESETTING
|
||||
PHASE_THADDIUS
|
||||
};
|
||||
|
||||
enum AIActions
|
||||
{
|
||||
ACTION_RESET_ENCOUNTER_TIMER = -1, // sent from instance AI
|
||||
ACTION_BEGIN_RESET_ENCOUNTER = 0, // sent from thaddius to pets to trigger despawn and encounter reset
|
||||
ACTION_RESET_ENCOUNTER, // sent from thaddius to pets to trigger respawn and full reset
|
||||
ACTION_FEUGEN_DIED, // sent from respective pet to thaddius to indicate death
|
||||
ACTION_STALAGG_DIED, // ^
|
||||
ACTION_FEUGEN_RESET, // pet to thaddius
|
||||
@@ -176,9 +173,6 @@ public:
|
||||
{
|
||||
events.SetPhase(PHASE_NOT_ENGAGED);
|
||||
SetCombatMovement(false);
|
||||
|
||||
// initialize everything properly, and ensure that the coils are loaded by the time we initialize
|
||||
BeginResetEncounter(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,9 +203,9 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
if (events.IsInPhase(PHASE_RESETTING))
|
||||
if (instance->GetBossState(BOSS_THADDIUS) != DONE)
|
||||
ResetEncounter();
|
||||
}
|
||||
|
||||
@@ -237,22 +231,13 @@ public:
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_RESET_ENCOUNTER_TIMER:
|
||||
if (events.IsInPhase(PHASE_RESETTING))
|
||||
ResetEncounter();
|
||||
break;
|
||||
case ACTION_FEUGEN_RESET:
|
||||
case ACTION_STALAGG_RESET:
|
||||
if (!events.IsInPhase(PHASE_NOT_ENGAGED) && !events.IsInPhase(PHASE_RESETTING))
|
||||
if (!events.IsInPhase(PHASE_NOT_ENGAGED))
|
||||
BeginResetEncounter();
|
||||
break;
|
||||
case ACTION_FEUGEN_AGGRO:
|
||||
case ACTION_STALAGG_AGGRO:
|
||||
if (events.IsInPhase(PHASE_RESETTING))
|
||||
{
|
||||
BeginResetEncounter();
|
||||
return;
|
||||
}
|
||||
if (!events.IsInPhase(PHASE_NOT_ENGAGED))
|
||||
return;
|
||||
events.SetPhase(PHASE_PETS);
|
||||
@@ -325,28 +310,24 @@ public:
|
||||
events.ScheduleEvent(EVENT_TRANSITION_3, Seconds(14), 0, PHASE_TRANSITION);
|
||||
}
|
||||
|
||||
void BeginResetEncounter(bool initial = false)
|
||||
void BeginResetEncounter()
|
||||
{
|
||||
if (instance->GetBossState(BOSS_THADDIUS) == DONE)
|
||||
return;
|
||||
if (events.IsInPhase(PHASE_RESETTING))
|
||||
return;
|
||||
|
||||
// remove polarity shift debuffs on reset
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_APPLY);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_APPLY);
|
||||
|
||||
me->DespawnOrUnsummon();
|
||||
me->SetRespawnTime(initial ? 5 : 30);
|
||||
me->DespawnOrUnsummon(0, Seconds(30));
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
|
||||
events.SetPhase(PHASE_RESETTING);
|
||||
me->setActive(false);
|
||||
if (Creature* feugen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FEUGEN)))
|
||||
feugen->AI()->DoAction(ACTION_BEGIN_RESET_ENCOUNTER);
|
||||
if (Creature* stalagg = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_STALAGG)))
|
||||
stalagg->AI()->DoAction(ACTION_BEGIN_RESET_ENCOUNTER);
|
||||
|
||||
me->setActive(false);
|
||||
me->SetFarVisible(false);
|
||||
}
|
||||
|
||||
@@ -359,10 +340,9 @@ public:
|
||||
events.SetPhase(PHASE_NOT_ENGAGED);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
|
||||
if (Creature* feugen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FEUGEN)))
|
||||
feugen->AI()->DoAction(ACTION_RESET_ENCOUNTER);
|
||||
if (Creature* stalagg = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_STALAGG)))
|
||||
stalagg->AI()->DoAction(ACTION_RESET_ENCOUNTER);
|
||||
// @todo these guys should really be moved to a summon group - this is merely a hack to make them work in dynamic_spawning
|
||||
instance->instance->RemoveRespawnTime(SPAWN_TYPE_CREATURE, 130958, true); // Stalagg
|
||||
instance->instance->RemoveRespawnTime(SPAWN_TYPE_CREATURE, 130959, true); // Feugen
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -535,7 +515,7 @@ public:
|
||||
{
|
||||
if (GameObject* coil = myCoilGO())
|
||||
coil->SetGoState(GO_STATE_READY);
|
||||
me->DespawnOrUnsummon();
|
||||
me->DespawnOrUnsummon(0, Hours(24 * 7)); // will be force respawned by thaddius
|
||||
me->setActive(false);
|
||||
me->SetFarVisible(false);
|
||||
}
|
||||
@@ -553,9 +533,6 @@ public:
|
||||
case ACTION_BEGIN_RESET_ENCOUNTER:
|
||||
BeginResetEncounter();
|
||||
break;
|
||||
case ACTION_RESET_ENCOUNTER:
|
||||
ResetEncounter();
|
||||
break;
|
||||
case ACTION_STALAGG_REVIVING_FX:
|
||||
break;
|
||||
case ACTION_STALAGG_REVIVED:
|
||||
@@ -580,7 +557,7 @@ public:
|
||||
break;
|
||||
case ACTION_TRANSITION:
|
||||
me->KillSelf(); // true death
|
||||
me->DespawnOrUnsummon();
|
||||
me->DespawnOrUnsummon(0, Hours(24 * 7));
|
||||
|
||||
if (Creature* coil = myCoil())
|
||||
{
|
||||
@@ -804,17 +781,11 @@ public:
|
||||
{
|
||||
if (GameObject* coil = myCoilGO())
|
||||
coil->SetGoState(GO_STATE_READY);
|
||||
me->DespawnOrUnsummon();
|
||||
me->DespawnOrUnsummon(0, Hours(24 * 7)); // will be force respawned by thaddius
|
||||
me->setActive(false);
|
||||
me->SetFarVisible(false);
|
||||
}
|
||||
|
||||
void ResetEncounter()
|
||||
{
|
||||
me->Respawn(true);
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
switch (action)
|
||||
@@ -822,9 +793,6 @@ public:
|
||||
case ACTION_BEGIN_RESET_ENCOUNTER:
|
||||
BeginResetEncounter();
|
||||
break;
|
||||
case ACTION_RESET_ENCOUNTER:
|
||||
ResetEncounter();
|
||||
break;
|
||||
case ACTION_FEUGEN_REVIVING_FX:
|
||||
break;
|
||||
case ACTION_FEUGEN_REVIVED:
|
||||
@@ -851,7 +819,7 @@ public:
|
||||
break;
|
||||
case ACTION_TRANSITION:
|
||||
me->KillSelf(); // true death this time around
|
||||
me->DespawnOrUnsummon();
|
||||
me->DespawnOrUnsummon(0, Hours(24 * 7));
|
||||
|
||||
if (Creature* coil = myCoil())
|
||||
{
|
||||
|
||||
@@ -210,7 +210,7 @@ public:
|
||||
me->CastSpell(me, SPELL_ICE_PRISON, true);
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
@@ -926,7 +926,7 @@ public:
|
||||
me->CastSpell(me, STORM_VISUAL, true);
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
+1
-1
@@ -733,7 +733,7 @@ public:
|
||||
instance->SetGuidData(DATA_LEOTHERAS_EVENT_STARTER, who->GetGUID());
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
AddedBanish = false;
|
||||
Reset();
|
||||
|
||||
@@ -83,7 +83,7 @@ class boss_doomlord_kazzak : public CreatureScript
|
||||
_events.ScheduleEvent(EVENT_BERSERK, 180000);
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user