*Move addcre/go functions from opvp to objmgr.

*Do not save respawn time for internally added cre/go.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-05-31 14:26:57 -05:00
parent 8d1f4f9ea0
commit da871e2fc0
10 changed files with 130 additions and 120 deletions

View File

@@ -1532,6 +1532,9 @@ bool Creature::LoadFromDB(uint32 guid, Map *map)
// checked at creature_template loading
m_defaultMovementType = MovementGeneratorType(data->movementType);
if(!data->dbData)
SetInternallyAdded();
return true;
}
@@ -2079,7 +2082,7 @@ bool Creature::CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction /
void Creature::SaveRespawnTime()
{
if(isPet() || !m_DBTableGuid)
if(isSummon() || !m_DBTableGuid || m_isInternallyAdded)
return;
if(m_respawnTime > time(NULL)) // dead (no corpse)

View File

@@ -289,6 +289,7 @@ struct EquipmentInfo
// from `creature` table
struct CreatureData
{
explicit CreatureData() : dbData(true) {}
uint32 id; // entry in creature_template
uint16 mapid;
uint16 phaseMask;
@@ -306,6 +307,7 @@ struct CreatureData
bool is_dead;
uint8 movementType;
uint8 spawnMask;
bool dbData;
};
struct CreatureDataAddonAura

View File

@@ -628,6 +628,9 @@ bool GameObject::LoadFromDB(uint32 guid, Map *map)
}
}
if(!data->dbData)
SetInternallyAdded();
return true;
}
@@ -707,7 +710,7 @@ Unit* GameObject::GetOwner() const
void GameObject::SaveRespawnTime()
{
if(m_respawnTime > time(NULL) && m_spawnedByDefault)
if(!m_isInternallyAdded && m_respawnTime > time(NULL) && m_spawnedByDefault)
objmgr.SaveGORespawnTime(m_DBTableGuid,GetInstanceId(),m_respawnTime);
}

View File

@@ -417,6 +417,7 @@ enum GOState
// from `gameobject`
struct GameObjectData
{
explicit GameObjectData() : dbData(true) {}
uint32 id; // entry in gamobject_template
uint16 mapid;
uint16 phaseMask;
@@ -432,7 +433,8 @@ struct GameObjectData
uint32 animprogress;
GOState go_state;
uint8 spawnMask;
uint32 ArtKit;
uint8 ArtKit;
bool dbData;
};
// For containers: [GO_NOT_READY]->GO_READY (close)->GO_ACTIVATED (open) ->GO_JUST_DEACTIVATED->GO_READY -> ...

View File

@@ -1077,6 +1077,7 @@ WorldObject::WorldObject()
m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f)
, m_map(NULL), m_zoneScript(NULL)
, m_isActive(false), IsTempWorldObject(false)
, m_isInternallyAdded(false)
, m_name("")
{
}

View File

@@ -550,6 +550,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object
bool isActiveObject() const { return m_isActive; }
void setActive(bool isActiveObject);
void SetInternallyAdded() { m_isInternallyAdded = true; }
void SetWorldObject(bool apply);
template<class NOTIFIER> void VisitNearbyObject(const float &radius, NOTIFIER &notifier) const { GetMap()->VisitAll(GetPositionX(), GetPositionY(), radius, notifier); }
template<class NOTIFIER> void VisitNearbyGridObject(const float &radius, NOTIFIER &notifier) const { GetMap()->VisitGrid(GetPositionX(), GetPositionY(), radius, notifier); }
@@ -568,6 +569,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object
explicit WorldObject();
std::string m_name;
bool m_isActive;
bool m_isInternallyAdded;
ZoneScript *m_zoneScript;
private:

View File

@@ -1229,6 +1229,102 @@ void ObjectMgr::RemoveCreatureFromGrid(uint32 guid, CreatureData const* data)
}
}
uint32 ObjectMgr::AddGameObject(uint32 entry, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay, float rotation0, float rotation1, float rotation2, float rotation3)
{
GameObjectInfo const* goinfo = GetGameObjectInfo(entry);
if (!goinfo)
return 0;
uint32 guid = GenerateLowGuid(HIGHGUID_GAMEOBJECT);
GameObjectData& data = NewGOData(guid);
data.id = entry;
data.mapid = mapId;
data.posX = x;
data.posY = y;
data.posZ = z;
data.orientation = o;
data.rotation0 = rotation0;
data.rotation1 = rotation1;
data.rotation2 = rotation2;
data.rotation3 = rotation3;
data.spawntimesecs = spawntimedelay;
data.animprogress = 100;
data.spawnMask = 1;
data.go_state = GO_STATE_READY;
data.phaseMask = PHASEMASK_NORMAL;
data.dbData = false;
AddGameobjectToGrid(guid, &data);
// Spawn if necessary (loaded grids only)
if(Map* map = const_cast<Map*>(MapManager::Instance().GetBaseMap(mapId)))
{
// We use spawn coords to spawn
if(!map->Instanceable() && !map->IsRemovalGrid(x, y))
{
GameObject *go = new GameObject;
if(!go->LoadFromDB(guid, map))
{
sLog.outError("AddGameObject: cannot add gameobject entry %u to map", entry);
delete go;
return 0;
}
map->Add(go);
}
}
return guid;
}
uint32 ObjectMgr::AddCreature(uint32 entry, uint32 team, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay)
{
CreatureInfo const *cInfo = GetCreatureTemplate(entry);
if(!cInfo)
return 0;
uint32 guid = GenerateLowGuid(HIGHGUID_UNIT);
CreatureData& data = NewOrExistCreatureData(guid);
data.id = entry;
data.mapid = mapId;
data.displayid = 0;
data.equipmentId = cInfo->equipmentId;
data.posX = x;
data.posY = y;
data.posZ = z;
data.orientation = o;
data.spawntimesecs = spawntimedelay;
data.spawndist = 0;
data.currentwaypoint = 0;
data.curhealth = cInfo->maxhealth;
data.curmana = cInfo->maxmana;
data.is_dead = false;
data.movementType = cInfo->MovementType;
data.spawnMask = 1;
data.phaseMask = PHASEMASK_NORMAL;
data.dbData = false;
AddCreatureToGrid(guid, &data);
// Spawn if necessary (loaded grids only)
if(Map* map = const_cast<Map*>(MapManager::Instance().GetBaseMap(mapId)))
{
// We use spawn coords to spawn
if(!map->Instanceable() && !map->IsRemovalGrid(x, y))
{
Creature* creature = new Creature;
if(!creature->LoadFromDB(guid, map))
{
sLog.outError("AddCreature: cannot add creature entry %u to map", entry);
delete creature;
return 0;
}
map->Add(creature);
}
}
return guid;
}
void ObjectMgr::LoadGameobjects()
{
uint32 count = 0;

View File

@@ -708,7 +708,7 @@ class ObjectMgr
}
const char *GetTrinityString(int32 entry, int locale_idx) const;
const char *GetTrinityStringForDBCLocale(int32 entry) const { return GetTrinityString(entry,DBCLocaleIndex); }
int32 GetDBCLocaleIndex() const { return DBCLocaleIndex; }
int32 GetDBCLocaleIndex() const { return DBCLocaleIndex; }
void SetDBCLocaleIndex(uint32 lang) { DBCLocaleIndex = GetIndexForLocale(LocaleConstant(lang)); }
void AddCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_guid, uint32 instance);
@@ -725,6 +725,8 @@ class ObjectMgr
void RemoveCreatureFromGrid(uint32 guid, CreatureData const* data);
void AddGameobjectToGrid(uint32 guid, GameObjectData const* data);
void RemoveGameobjectFromGrid(uint32 guid, GameObjectData const* data);
uint32 AddGameObject(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0, float rotation0 = 0, float rotation1 = 0, float rotation2 = 0, float rotation3 = 0);
uint32 AddCreature(uint32 entry, uint32 team, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0);
// reserved names
void LoadReservedPlayersNames();

View File

@@ -50,114 +50,25 @@ void OPvPCapturePoint::HandlePlayerLeave(Player * plr)
bool OPvPCapturePoint::AddObject(uint32 type, uint32 entry, uint32 map, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3)
{
GameObjectInfo const* goinfo = objmgr.GetGameObjectInfo(entry);
if (!goinfo)
uint32 guid = objmgr.AddGameObject(entry, map, x, y, z, o, 0, rotation0, rotation1, rotation2, rotation3);
if(!guid)
return false;
uint32 guid = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT);
GameObjectData& data = objmgr.NewGOData(guid);
data.id = entry;
data.mapid = map;
data.posX = x;
data.posY = y;
data.posZ = z;
data.orientation = o;
data.rotation0 = rotation0;
data.rotation1 = rotation1;
data.rotation2 = rotation2;
data.rotation3 = rotation3;
data.spawntimesecs = 0;
data.animprogress = 100;
data.spawnMask = 1;
data.go_state = GO_STATE_READY;
data.phaseMask = PHASEMASK_NORMAL;
objmgr.AddGameobjectToGrid(guid, &data);
// 2 way registering
m_Objects[type] = MAKE_NEW_GUID(guid, entry, HIGHGUID_GAMEOBJECT);
m_ObjectTypes[m_Objects[type]]=type;
Map * pMap = MapManager::Instance().FindMap(map);
if(!pMap)
return true;
GameObject * go = new GameObject;
if(!go->Create(guid,entry, pMap,PHASEMASK_NORMAL,x,y,z,o,rotation0,rotation1,rotation2,rotation3,100,GO_STATE_READY))
{
sLog.outError("Gameobject template %u not found in database.", entry);
delete go;
return true;
}
go->SetRespawnTime(0);
objmgr.SaveGORespawnTime(go->GetDBTableGUIDLow(),0,0);
pMap->Add(go);
return true;
}
bool OPvPCapturePoint::AddCreature(uint32 type, uint32 entry, uint32 teamval, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay)
bool OPvPCapturePoint::AddCreature(uint32 type, uint32 entry, uint32 team, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay)
{
CreatureInfo const *cinfo = objmgr.GetCreatureTemplate(entry);
if(!cinfo)
{
uint32 guid = objmgr.AddCreature(entry, team, map, x, y, z, o, spawntimedelay);
if(!guid)
return false;
}
uint32 displayId = objmgr.ChooseDisplayId(teamval, cinfo, NULL);
CreatureModelInfo const *minfo = objmgr.GetCreatureModelRandomGender(displayId);
if (!minfo)
{
return false;
}
else
displayId = minfo->modelid; // it can be different (for another gender)
uint32 guid = objmgr.GenerateLowGuid(HIGHGUID_UNIT);
CreatureData& data = objmgr.NewOrExistCreatureData(guid);
data.id = entry;
data.mapid = map;
data.displayid = displayId;
data.equipmentId = cinfo->equipmentId;
data.posX = x;
data.posY = y;
data.posZ = z;
data.orientation = o;
data.spawntimesecs = spawntimedelay;
data.spawndist = 0;
data.currentwaypoint = 0;
data.curhealth = cinfo->maxhealth;
data.curmana = cinfo->maxmana;
data.is_dead = false;
data.movementType = cinfo->MovementType;
data.spawnMask = 1;
data.phaseMask = PHASEMASK_NORMAL;
objmgr.AddCreatureToGrid(guid, &data);
m_Creatures[type] = MAKE_NEW_GUID(guid, entry, HIGHGUID_UNIT);
m_CreatureTypes[m_Creatures[type]] = type;
Map * pMap = MapManager::Instance().FindMap(map);
if(!pMap)
return true;
Creature* pCreature = new Creature;
if (!pCreature->Create(guid, pMap, PHASEMASK_NORMAL, entry, teamval, x, y, z, o))
{
sLog.outError("Can't create creature entry: %u",entry);
delete pCreature;
return false;
}
if(spawntimedelay)
pCreature->SetRespawnDelay(spawntimedelay);
pMap->Add(pCreature);
return true;
}
@@ -173,33 +84,15 @@ bool OPvPCapturePoint::AddCapturePoint(uint32 entry, uint32 map, float x, float
return false;
}
// create capture point go
m_CapturePointGUID = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT);
m_CapturePointGUID = objmgr.AddGameObject(entry, map, x, y, z, o, 0, rotation0, rotation1, rotation2, rotation3);
if(!m_CapturePointGUID)
return false;
// get the needed values from goinfo
m_ShiftMaxPhase = goinfo->capturePoint.maxTime;
m_ShiftMaxCaptureSpeed = m_ShiftMaxPhase / float(goinfo->capturePoint.minTime);
m_NeutralValue = goinfo->capturePoint.neutralPercent;
GameObjectData& data = objmgr.NewGOData(m_CapturePointGUID);
data.id = entry;
data.mapid = map;
data.posX = x;
data.posY = y;
data.posZ = z;
data.orientation = o;
data.rotation0 = rotation0;
data.rotation1 = rotation1;
data.rotation2 = rotation2;
data.rotation3 = rotation3;
data.spawntimesecs = 1;
data.animprogress = 100;
data.spawnMask = 1;
data.go_state = GO_STATE_READY;
data.phaseMask = PHASEMASK_NORMAL;
objmgr.AddGameobjectToGrid(m_CapturePointGUID, &data);
return true;
}

View File

@@ -37,6 +37,10 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
//m_defender = TEAM_ALLIANCE;
//gameeventmgr.StartInternalEvent(GameEventWintergraspDefender[m_defender]);
//Titan Relic eventid = 19982
objmgr.AddGameObject(192829, 571, 5444.6, 2840.8, 420.43, 0);
return true;
}
@@ -48,6 +52,8 @@ uint32 OPvPWintergrasp::GetCreatureEntry(uint32 guidlow, uint32 entry)
{
case 30739: return 30740;
case 30740: return 30739;
case 30400: return 30499;
case 30499: return 30400;
}
}
return entry;