diff options
-rw-r--r-- | src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp | 3 | ||||
-rw-r--r-- | src/game/BattleGround.cpp | 11 | ||||
-rw-r--r-- | src/game/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/game/Creature.cpp | 43 | ||||
-rw-r--r-- | src/game/Creature.h | 2 | ||||
-rw-r--r-- | src/game/Debugcmds.cpp | 16 | ||||
-rw-r--r-- | src/game/GameObject.cpp | 26 | ||||
-rw-r--r-- | src/game/InstanceData.h | 19 | ||||
-rw-r--r-- | src/game/Level2.cpp | 57 | ||||
-rw-r--r-- | src/game/Object.cpp | 49 | ||||
-rw-r--r-- | src/game/Object.h | 4 | ||||
-rw-r--r-- | src/game/ObjectMgr.cpp | 17 | ||||
-rw-r--r-- | src/game/OutdoorPvP.cpp | 21 | ||||
-rw-r--r-- | src/game/OutdoorPvP.h | 10 | ||||
-rw-r--r-- | src/game/OutdoorPvPMgr.cpp | 14 | ||||
-rw-r--r-- | src/game/OutdoorPvPMgr.h | 3 | ||||
-rw-r--r-- | src/game/OutdoorPvPObjectiveAI.cpp | 17 | ||||
-rw-r--r-- | src/game/OutdoorPvPObjectiveAI.h | 17 | ||||
-rw-r--r-- | src/game/Vehicle.cpp | 13 | ||||
-rw-r--r-- | src/game/Vehicle.h | 2 | ||||
-rw-r--r-- | src/game/Wintergrasp.cpp | 60 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 7 | ||||
-rw-r--r-- | src/game/ZoneScript.h | 47 | ||||
-rw-r--r-- | win/VC80/game.vcproj | 12 | ||||
-rw-r--r-- | win/VC90/game.vcproj | 12 |
25 files changed, 223 insertions, 262 deletions
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp index f2ba97d2858..95783562e65 100644 --- a/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp +++ b/src/bindings/scripts/scripts/zone/naxxramas/instance_naxxramas.cpp @@ -41,6 +41,7 @@ const DoorData doorData[] = {181125, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, BOUNDARY_S}, {181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, 0}, {181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM, BOUNDARY_NE}, + {181225, BOSS_SAPPHIRON, DOOR_TYPE_PASSAGE, BOUNDARY_W}, {0, 0, DOOR_TYPE_ROOM, 0}, // EOF }; @@ -115,7 +116,7 @@ struct TRINITY_DLL_DECL instance_naxxramas : public InstanceData AddMinion(creature, add); } - void OnObjectCreate(GameObject* go, bool add) + void OnGameObjectCreate(GameObject* go, bool add) { if(go->GetGOInfo()->displayId == 6785 || go->GetGOInfo()->displayId == 1287) { diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp index acb3f25ae31..a995157786f 100644 --- a/src/game/BattleGround.cpp +++ b/src/game/BattleGround.cpp @@ -1490,22 +1490,13 @@ Creature* BattleGround::AddCreature(uint32 entry, uint32 type, uint32 teamval, f return NULL; Creature* pCreature = new Creature; - if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, PHASEMASK_NORMAL, entry, teamval)) + if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, PHASEMASK_NORMAL, entry, teamval, x, y, z, o)) { sLog.outError("Can't create creature entry: %u",entry); delete pCreature; return NULL; } - pCreature->Relocate(x, y, z, o); - - if (!pCreature->IsPositionValid()) - { - sLog.outError("Creature (guidlow %d, entry %d) not added to battleground. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); - delete pCreature; - return NULL; - } - pCreature->SetHomePosition(x, y, z, o); //pCreature->SetDungeonDifficulty(0); diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 44e692b71ba..09e9918cdbb 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -186,8 +186,6 @@ SET(game_STAT_SRCS OutdoorPvPMgr.h OutdoorPvPNA.cpp OutdoorPvPNA.h - OutdoorPvPObjectiveAI.cpp - OutdoorPvPObjectiveAI.h OutdoorPvPSI.cpp OutdoorPvPSI.h OutdoorPvPTF.cpp @@ -296,6 +294,7 @@ SET(game_STAT_SRCS OutdoorPvPImpl.h Wintergrasp.h Wintergrasp.cpp + ZoneScript.h ) add_library(game STATIC ${game_STAT_SRCS}) diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index fc5b0436867..01a3b057ce9 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -174,6 +174,8 @@ void Creature::AddToWorld() ///- Register the creature for guid lookup if(!IsInWorld()) { + if(m_zoneScript) + m_zoneScript->OnCreatureCreate(this, true); ObjectAccessor::Instance().AddObject(this); Unit::AddToWorld(); SearchFormationAndPath(); @@ -185,9 +187,8 @@ void Creature::RemoveFromWorld() { if(IsInWorld()) { - if(Map *map = FindMap()) - if(map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData()) - ((InstanceMap*)map)->GetInstanceData()->OnCreatureCreate(this, false); + if(m_zoneScript) + m_zoneScript->OnCreatureCreate(this, false); if(m_formation) formation_mgr.RemoveCreatureFromGroup(m_formation, this); Unit::RemoveFromWorld(); @@ -694,8 +695,15 @@ void Creature::Motion_Initialize() i_motionMaster.Initialize(); } -bool Creature::Create (uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 team, const CreatureData *data) +bool Creature::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 team, float x, float y, float z, float ang, const CreatureData *data) { + Relocate(x, y, z, ang); + if(!IsPositionValid()) + { + sLog.outError("Creature (guidlow %d, entry %d) not loaded. Suggested coordinates isn't valid (X: %f Y: %f)",guidlow,Entry,x,y); + return false; + } + SetMapId(map->GetId()); SetInstanceId(map->GetInstanceId()); SetPhaseMask(phaseMask,false); @@ -1440,12 +1448,21 @@ float Creature::GetSpellDamageMod(int32 Rank) bool Creature::CreateFromProto(uint32 guidlow, uint32 Entry, uint32 team, const CreatureData *data) { + SetZoneScript(); + if(m_zoneScript) + { + Entry = m_zoneScript->GetCreatureEntry(guidlow, Entry); + if(!Entry) + return false; + } + CreatureInfo const *cinfo = objmgr.GetCreatureTemplate(Entry); if(!cinfo) { sLog.outErrorDb("Creature entry %u does not exist.", Entry); return false; } + m_originalEntry = Entry; if(isVehicle()) @@ -1456,15 +1473,6 @@ bool Creature::CreateFromProto(uint32 guidlow, uint32 Entry, uint32 team, const if(!UpdateEntry(Entry, team, data)) return false; - //Notify the map's instance data. - //Only works if you create the object in it, not if it is moves to that map. - //Normally non-players do not teleport to other maps. - Map *map = FindMap(); - if(map && map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData()) - { - ((InstanceMap*)map)->GetInstanceData()->OnCreatureCreate(this, true); - } - return true; } @@ -1486,16 +1494,9 @@ bool Creature::LoadFromDB(uint32 guid, Map *map) if (map->GetInstanceId() != 0) guid = objmgr.GenerateLowGuid(HIGHGUID_UNIT); uint16 team = 0; - if(!Create(guid,map,data->phaseMask,data->id,team,data)) + if(!Create(guid,map,data->phaseMask,data->id,team,data->posX,data->posY,data->posZ,data->orientation,data)) return false; - Relocate(data->posX,data->posY,data->posZ,data->orientation); - - if(!IsPositionValid()) - { - sLog.outError("Creature (guidlow %d, entry %d) not loaded. Suggested coordinates isn't valid (X: %f Y: %f)",GetGUIDLow(),GetEntry(),GetPositionX(),GetPositionY()); - return false; - } //We should set first home position, because then AI calls home movement SetHomePosition(data->posX,data->posY,data->posZ,data->orientation); diff --git a/src/game/Creature.h b/src/game/Creature.h index 017b617cb94..31c127f983f 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -478,7 +478,7 @@ class TRINITY_DLL_SPEC Creature : public Unit void AddToWorld(); void RemoveFromWorld(); - bool Create (uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 team, const CreatureData *data = NULL); + bool Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 team, float x, float y, float z, float ang, const CreatureData *data = NULL); bool LoadCreaturesAddon(bool reload = false); void SelectLevel(const CreatureInfo *cinfo); void LoadEquipment(uint32 equip_entry, bool force=false); diff --git a/src/game/Debugcmds.cpp b/src/game/Debugcmds.cpp index fda50f8b9a6..196816fff02 100644 --- a/src/game/Debugcmds.cpp +++ b/src/game/Debugcmds.cpp @@ -782,21 +782,11 @@ bool ChatHandler::HandleDebugSpawnVehicle(const char* args) Vehicle *v = new Vehicle; Map *map = m_session->GetPlayer()->GetMap(); - if(!v->Create(objmgr.GenerateLowGuid(HIGHGUID_VEHICLE), map, m_session->GetPlayer()->GetPhaseMask(), entry, id, m_session->GetPlayer()->GetTeam())) - { - delete v; - return false; - } - - float px, py, pz; - m_session->GetPlayer()->GetClosePoint(px, py, pz, m_session->GetPlayer()->GetObjectSize()); - - v->Relocate(px, py, pz, m_session->GetPlayer()->GetOrientation()); + float x, y, z, o = m_session->GetPlayer()->GetOrientation(); + m_session->GetPlayer()->GetClosePoint(x, y, z, m_session->GetPlayer()->GetObjectSize()); - if(!v->IsPositionValid()) + if(!v->Create(objmgr.GenerateLowGuid(HIGHGUID_VEHICLE), map, m_session->GetPlayer()->GetPhaseMask(), entry, id, m_session->GetPlayer()->GetTeam(), x, y, z, o)) { - sLog.outError("Vehicle (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)", - v->GetGUIDLow(), v->GetEntry(), v->GetPositionX(), v->GetPositionY()); delete v; return false; } diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index bb1103e2262..0cc32ce4f2d 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -83,6 +83,9 @@ void GameObject::AddToWorld() ///- Register the gameobject for guid lookup if(!IsInWorld()) { + if(m_zoneScript) + m_zoneScript->OnGameObjectCreate(this, true); + ObjectAccessor::Instance().AddObject(this); WorldObject::AddToWorld(); } @@ -93,16 +96,8 @@ void GameObject::RemoveFromWorld() ///- Remove the gameobject from the accessor if(IsInWorld()) { - if(Map *map = FindMap()) - if(map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData()) - ((InstanceMap*)map)->GetInstanceData()->OnObjectCreate(this, false); - - switch(m_goInfo->type) - { - case GAMEOBJECT_TYPE_CAPTURE_POINT: - sOutdoorPvPMgr.OnGameObjectCreate(this, false); - break; - } + if(m_zoneScript) + m_zoneScript->OnGameObjectCreate(this, false); // Possible crash at access to deleted GO in Unit::m_gameobj if(uint64 owner_guid = GetOwnerGUID()) @@ -181,18 +176,9 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa case GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING: m_goValue->destructibleBuilding.health = goinfo->destructibleBuilding.damagedHealth; break; - case GAMEOBJECT_TYPE_CAPTURE_POINT: - sOutdoorPvPMgr.OnGameObjectCreate(this, true); - break; } - //Notify the map's instance data. - //Only works if you create the object in it, not if it is moves to that map. - //Normally non-players do not teleport to other maps. - if(map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData()) - { - ((InstanceMap*)map)->GetInstanceData()->OnObjectCreate(this, true); - } + SetZoneScript(); return true; } diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index 133f92ecc60..f3d45cc0cf6 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -21,7 +21,7 @@ #ifndef TRINITY_INSTANCE_DATA_H #define TRINITY_INSTANCE_DATA_H -#include "Common.h" +#include "ZoneScript.h" //#include "GameObject.h" //#include "Map.h" @@ -109,7 +109,7 @@ struct MinionInfo typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap; typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap; -class TRINITY_DLL_SPEC InstanceData +class TRINITY_DLL_SPEC InstanceData : public ZoneScript { public: @@ -129,8 +129,7 @@ class TRINITY_DLL_SPEC InstanceData void SaveToDB(); - //Called every map update - virtual void Update(uint32 /*diff*/) {} + virtual void Update(uint32 diff) {} //Used by the map's CanEnter function. //This is to prevent players from entering during boss encounters. @@ -140,18 +139,10 @@ class TRINITY_DLL_SPEC InstanceData virtual void OnPlayerEnter(Player *) {} //Called when a gameobject is created - virtual void OnObjectCreate(GameObject *go, bool add) { OnObjectCreate(go); } + void OnGameObjectCreate(GameObject *go, bool add) { OnObjectCreate(go); } //called on creature creation - virtual void OnCreatureCreate(Creature *, bool add); - - //All-purpose data storage 64 bit - virtual uint64 GetData64(uint32 /*Data*/) { return 0; } - virtual void SetData64(uint32 /*Data*/, uint64 /*Value*/) { } - - //All-purpose data storage 32 bit - virtual uint32 GetData(uint32) { return 0; } - virtual void SetData(uint32, uint32 data) {} + void OnCreatureCreate(Creature *, bool add); //Handle open / close objects //use HandleGameObject(NULL,boolen,GO); in OnObjectCreate in instance scripts diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index d9516835201..e7eeda7966d 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -1117,21 +1117,12 @@ bool ChatHandler::HandleNpcAddCommand(const char* args) Map *map = chr->GetMap(); Creature* pCreature = new Creature; - if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, (uint32)teamval)) + if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, (uint32)teamval, x, y, z, o)) { delete pCreature; return false; } - pCreature->Relocate(x,y,z,o); - - if(!pCreature->IsPositionValid()) - { - sLog.outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); - delete pCreature; - return false; - } - pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); uint32 db_guid = pCreature->GetDBTableGUIDLow(); @@ -3100,20 +3091,12 @@ bool ChatHandler::HandleWpModifyCommand(const char* args) wpCreature->AddObjectToRemoveList(); // re-create Creature* wpCreature2 = new Creature; - if (!wpCreature2->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0)) + if (!wpCreature2->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) { PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); delete wpCreature2; return false; } - wpCreature2->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation()); - - if(!wpCreature2->IsPositionValid()) - { - sLog.outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",wpCreature2->GetGUIDLow(),wpCreature2->GetEntry(),wpCreature2->GetPositionX(),wpCreature2->GetPositionY()); - delete wpCreature2; - return false; - } wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); @@ -3327,7 +3310,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args) float o = chr->GetOrientation(); Creature* wpCreature = new Creature; - if (!wpCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0)) + if (!wpCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, x, y, z, o)) { PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); delete wpCreature; @@ -3335,16 +3318,6 @@ bool ChatHandler::HandleWpShowCommand(const char* args) return false; } - wpCreature->Relocate(x, y, z, o); - - if(!wpCreature->IsPositionValid()) - { - sLog.outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",wpCreature->GetGUIDLow(),wpCreature->GetEntry(),wpCreature->GetPositionX(),wpCreature->GetPositionY()); - delete wpCreature; - delete result; - return false; - } - sLog.outDebug("DEBUG: UPDATE waypoint_data SET wpguid = '%u"); // set "wpguid" column to the visual waypoint WorldDatabase.PExecuteLog("UPDATE waypoint_data SET wpguid = '%u' WHERE id = '%u' and point = '%u'", wpCreature->GetGUIDLow(), pathid, point); @@ -3391,7 +3364,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args) Map *map = chr->GetMap(); Creature* pCreature = new Creature; - if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT),map, chr->GetPhaseMaskForSpawn(), id, 0)) + if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT),map, chr->GetPhaseMaskForSpawn(), id, 0, x, y, z, o)) { PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); delete pCreature; @@ -3399,16 +3372,6 @@ bool ChatHandler::HandleWpShowCommand(const char* args) return false; } - pCreature->Relocate(x, y, z, o); - - if(!pCreature->IsPositionValid()) - { - sLog.outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); - delete pCreature; - delete result; - return false; - } - pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); pCreature->LoadFromDB(pCreature->GetDBTableGUIDLow(), map); map->Add(pCreature); @@ -3456,7 +3419,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args) Map *map = chr->GetMap(); Creature* pCreature = new Creature; - if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0)) + if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, x, y, z, o)) { PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id); delete pCreature; @@ -3464,16 +3427,6 @@ bool ChatHandler::HandleWpShowCommand(const char* args) return false; } - pCreature->Relocate(x, y, z, o); - - if(!pCreature->IsPositionValid()) - { - sLog.outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); - delete pCreature; - delete result; - return false; - } - pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); pCreature->LoadFromDB(pCreature->GetDBTableGUIDLow(), map); map->Add(pCreature); diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 99f2c0d8417..a4850615d07 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -45,6 +45,7 @@ #include "TemporarySummon.h" #include "Totem.h" +#include "OutdoorPvPMgr.h" uint32 GuidHigh2TypeId(uint32 guid_hi) { @@ -1074,20 +1075,10 @@ bool Object::PrintIndexError(uint32 index, bool set) const WorldObject::WorldObject() : m_mapId(0), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL), 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_name("") { - m_positionX = 0.0f; - m_positionY = 0.0f; - m_positionZ = 0.0f; - m_orientation = 0.0f; - - m_mapId = 0; - m_InstanceId = 0; - m_map = NULL; - - m_name = ""; - - m_isActive = false; - IsTempWorldObject = false; } void WorldObject::SetWorldObject(bool on) @@ -1801,16 +1792,9 @@ TempSummon *Map::SummonCreature(uint32 entry, float x, float y, float z, float a case SUMMON_MASK_MINION: summon = new Minion (properties, summoner); break; default: return NULL; } - if(!summon->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), this, phase, entry, team)) - { - delete summon; - return NULL; - } - summon->Relocate(x, y, z, angle); - if(!summon->IsPositionValid()) + if(!summon->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), this, phase, entry, team, x, y, z, angle)) { - sLog.outError("Creature (guidlow %d, entry %d) not summoned. Suggested coordinates isn't valid (X: %f Y: %f)",summon->GetGUIDLow(),summon->GetEntry(),summon->GetPositionX(),summon->GetPositionY()); delete summon; return NULL; } @@ -1826,6 +1810,17 @@ TempSummon *Map::SummonCreature(uint32 entry, float x, float y, float z, float a return summon; } +void WorldObject::SetZoneScript() +{ + if(Map *map = FindMap()) + { + if(map->IsDungeon()) + m_zoneScript = (ZoneScript*)((InstanceMap*)map)->GetInstanceData(); + else if(!map->IsBattleGroundOrArena()) + m_zoneScript = sOutdoorPvPMgr.GetZoneScript(GetZoneId()); + } +} + TempSummon* WorldObject::SummonCreature(uint32 entry, float x, float y, float z, float ang, TempSummonType spwtype, uint32 duration) { Map *map = FindMap(); @@ -1861,18 +1856,8 @@ Vehicle* WorldObject::SummonVehicle(uint32 entry, float x, float y, float z, flo uint32 team = 0; if (GetTypeId()==TYPEID_PLAYER) team = ((Player*)this)->GetTeam(); - if(!v->Create(objmgr.GenerateLowGuid(HIGHGUID_VEHICLE), map, GetPhaseMask(), entry, id, team)) - { - delete v; - return NULL; - } - - v->Relocate(x, y, z, ang); - - if(!v->IsPositionValid()) + if(!v->Create(objmgr.GenerateLowGuid(HIGHGUID_VEHICLE), map, GetPhaseMask(), entry, id, team, x, y, z, ang)) { - sLog.outError("ERROR: Vehicle (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)", - v->GetGUIDLow(), v->GetEntry(), v->GetPositionX(), v->GetPositionY()); delete v; return NULL; } diff --git a/src/game/Object.h b/src/game/Object.h index e6731db1712..1667d266016 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -107,6 +107,7 @@ class GameObject; class TempSummon; class Vehicle; class CreatureAI; +class ZoneScript; typedef UNORDERED_MAP<Player*, UpdateData> UpdateDataMapType; @@ -537,6 +538,8 @@ class TRINITY_DLL_SPEC WorldObject : public Object Map * FindMap() const { return m_map ? m_map : const_cast<WorldObject*>(this)->_findMap(); } Map const* GetBaseMap() const; + void SetZoneScript(); + TempSummon* SummonCreature(uint32 id, float x, float y, float z, float ang = 0,TempSummonType spwtype = TEMPSUMMON_MANUAL_DESPAWN,uint32 despwtime = 0); Vehicle* SummonVehicle(uint32 entry, float x, float y, float z, float ang = 0); GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime); @@ -565,6 +568,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object explicit WorldObject(); std::string m_name; bool m_isActive; + ZoneScript *m_zoneScript; private: uint32 m_mapId; // object at map with map_id diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 7232da67103..e23d114f0f2 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -894,13 +894,7 @@ uint32 ObjectMgr::ChooseDisplayId(uint32 team, const CreatureInfo *cinfo, const display_id = cinfo->GetRandomValidModelId(); } else - { display_id = data->displayid; // overwritten from creature data - // I do not know why but in db most display id are not zero - if(display_id == cinfo->Modelid_A1 || display_id == cinfo->Modelid_A2 - || display_id == cinfo->Modelid_H1 || display_id == cinfo->Modelid_H2) - display_id = cinfo->GetRandomValidModelId(); - } return display_id; } @@ -1068,7 +1062,7 @@ void ObjectMgr::LoadCreatures() heroicCreatures.insert(cInfo->HeroicEntry); //TODO: remove this - gameeventmgr.mGameEventCreatureGuids.resize(52*2-1); + //gameeventmgr.mGameEventCreatureGuids.resize(52*2-1); barGoLink bar(result->GetRowCount()); @@ -1115,6 +1109,11 @@ void ObjectMgr::LoadCreatures() continue; } + // I do not know why but in db most display id are not zero + if(data.displayid == cInfo->Modelid_A1 || data.displayid == cInfo->Modelid_A2 + || data.displayid == cInfo->Modelid_H1 || data.displayid == cInfo->Modelid_H2) + data.displayid = 0; + if(data.equipmentId > 0) // -1 no equipment, 0 use default { if(!GetEquipmentInfo(data.equipmentId)) @@ -1172,7 +1171,7 @@ void ObjectMgr::LoadCreatures() } //if(entry == 32307 || entry == 32308) - if(entry == 30739 || entry == 30740) + /*if(entry == 30739 || entry == 30740) { gameEvent = 51; uint32 guid2 = objmgr.GenerateLowGuid(HIGHGUID_UNIT); @@ -1183,7 +1182,7 @@ void ObjectMgr::LoadCreatures() data2.displayid = 0; gameeventmgr.mGameEventCreatureGuids[51+51].push_back(guid); gameeventmgr.mGameEventCreatureGuids[51+50].push_back(guid2); - } + }*/ if (gameEvent==0 && PoolId==0) // if not this is to be managed by GameEvent System or Pool system AddCreatureToGrid(guid, &data); diff --git a/src/game/OutdoorPvP.cpp b/src/game/OutdoorPvP.cpp index 97626c8c4e6..483574c45f7 100644 --- a/src/game/OutdoorPvP.cpp +++ b/src/game/OutdoorPvP.cpp @@ -146,22 +146,13 @@ bool OPvPCapturePoint::AddCreature(uint32 type, uint32 entry, uint32 teamval, ui if(!pMap) return true; Creature* pCreature = new Creature; - if (!pCreature->Create(guid, pMap, PHASEMASK_NORMAL, entry, teamval)) + 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; } - pCreature->Relocate(x, y, z, o); - - if(!pCreature->IsPositionValid()) - { - sLog.outError("ERROR: Creature (guidlow %d, entry %d) not added to opvp. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY()); - delete pCreature; - return false; - } - if(spawntimedelay) pCreature->SetRespawnDelay(spawntimedelay); @@ -638,3 +629,13 @@ void OutdoorPvP::TeamApplyBuff(TeamId team, uint32 spellId, uint32 spellId2) TeamCastSpell(team, spellId); TeamCastSpell(OTHER_TEAM(team), spellId2 ? -(int32)spellId2 : -(int32)spellId); } + +void OutdoorPvP::OnGameObjectCreate(GameObject *go, bool add) +{ + if(go->GetGoType() != GAMEOBJECT_TYPE_CAPTURE_POINT) + return; + + for(OutdoorPvP::OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) + if((*itr)->m_CapturePointGUID == go->GetDBTableGUIDLow()) + (*itr)->m_capturePoint = add ? go : NULL; +} diff --git a/src/game/OutdoorPvP.h b/src/game/OutdoorPvP.h index e72461bd234..36073b78b37 100644 --- a/src/game/OutdoorPvP.h +++ b/src/game/OutdoorPvP.h @@ -21,10 +21,7 @@ #include "Util.h" #include "SharedDefines.h" -#include "GameObject.h" - -#include <map> -#include <set> +#include "ZoneScript.h" class GameObject; @@ -151,7 +148,7 @@ protected: }; // base class for specific outdoor pvp handlers -class OutdoorPvP +class OutdoorPvP : public ZoneScript { friend class OutdoorPvPMgr; public: @@ -175,6 +172,9 @@ public: // setup stuff virtual bool SetupOutdoorPvP() {return true;} + void OnGameObjectCreate(GameObject *go, bool add); + void OnCreatureCreate(Creature *, bool add) {} + // send world state update to all players present virtual void SendUpdateWorldState(uint32 field, uint32 value); diff --git a/src/game/OutdoorPvPMgr.cpp b/src/game/OutdoorPvPMgr.cpp index 7d367392764..446f7e2ce95 100644 --- a/src/game/OutdoorPvPMgr.cpp +++ b/src/game/OutdoorPvPMgr.cpp @@ -207,15 +207,13 @@ bool OutdoorPvPMgr::HandleCustomSpell(Player *plr, uint32 spellId, GameObject * return false; } -void OutdoorPvPMgr::OnGameObjectCreate(GameObject *go, bool add) +ZoneScript * OutdoorPvPMgr::GetZoneScript(uint32 zoneId) { - if(go->GetGoType() != GAMEOBJECT_TYPE_CAPTURE_POINT) - return; - - for(OutdoorPvPSet::iterator itr = m_OutdoorPvPSet.begin(); itr != m_OutdoorPvPSet.end(); ++itr) - for(OutdoorPvP::OPvPCapturePointMap::iterator itr2 = (*itr)->m_capturePoints.begin(); itr2 != (*itr)->m_capturePoints.end(); ++itr2) - if((*itr2)->m_CapturePointGUID == go->GetDBTableGUIDLow()) - (*itr2)->m_capturePoint = add ? go : NULL; + OutdoorPvPMap::iterator itr = m_OutdoorPvPMap.find(zoneId); + if(itr != m_OutdoorPvPMap.end()) + return itr->second; + else + return NULL; } bool OutdoorPvPMgr::HandleOpenGo(Player *plr, uint64 guid) diff --git a/src/game/OutdoorPvPMgr.h b/src/game/OutdoorPvPMgr.h index 22083ecd5ee..9490ac87d4b 100644 --- a/src/game/OutdoorPvPMgr.h +++ b/src/game/OutdoorPvPMgr.h @@ -27,6 +27,7 @@ class Player; class GameObject; class Creature; +class ZoneScript; struct GossipOption; // class to handle player enter / leave / areatrigger / GO use events @@ -51,7 +52,7 @@ public: // handle custom go if registered bool HandleOpenGo(Player * plr, uint64 guid); - void OnGameObjectCreate(GameObject *go, bool add); + ZoneScript * GetZoneScript(uint32 zoneId); void AddZone(uint32 zoneid, OutdoorPvP * handle); diff --git a/src/game/OutdoorPvPObjectiveAI.cpp b/src/game/OutdoorPvPObjectiveAI.cpp deleted file mode 100644 index 0fe57fcaa87..00000000000 --- a/src/game/OutdoorPvPObjectiveAI.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ diff --git a/src/game/OutdoorPvPObjectiveAI.h b/src/game/OutdoorPvPObjectiveAI.h deleted file mode 100644 index 0fe57fcaa87..00000000000 --- a/src/game/OutdoorPvPObjectiveAI.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp index 0bcdf088bc2..aaf97b3e413 100644 --- a/src/game/Vehicle.cpp +++ b/src/game/Vehicle.cpp @@ -90,9 +90,9 @@ void Vehicle::Update(uint32 diff) // ModifyPower(POWER_ENERGY, 1); } -bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team, const CreatureData * data) +bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team, float x, float y, float z, float o, const CreatureData * data) { - if(!Creature::Create(guidlow, map, phaseMask, Entry, team, data)) + if(!Creature::Create(guidlow, map, phaseMask, Entry, team, x, y, z, o, data)) return false; SetVehicleId(vehicleId); @@ -338,16 +338,9 @@ bool Vehicle::LoadFromDB(uint32 guid, Map *map) if (map->GetInstanceId() != 0) guid = objmgr.GenerateLowGuid(HIGHGUID_VEHICLE); uint16 team = 0; - if(!Create(guid,map,data->phaseMask,data->id,id,team,data)) + if(!Create(guid,map,data->phaseMask,data->id,id,team,data->posX,data->posY,data->posZ,data->orientation,data)) return false; - Relocate(data->posX,data->posY,data->posZ,data->orientation); - - if(!IsPositionValid()) - { - sLog.outError("Creature (guidlow %d, entry %d) not loaded. Suggested coordinates isn't valid (X: %f Y: %f)",GetGUIDLow(),GetEntry(),GetPositionX(),GetPositionY()); - return false; - } //We should set first home position, because then AI calls home movement SetHomePosition(data->posX,data->posY,data->posZ,data->orientation); diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h index 083033c7574..d1e606caf4a 100644 --- a/src/game/Vehicle.h +++ b/src/game/Vehicle.h @@ -44,7 +44,7 @@ class Vehicle : public Creature void AddToWorld(); void RemoveFromWorld(); - bool Create (uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team, const CreatureData * data = NULL); + bool Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team, float x, float y, float z, float o, const CreatureData * data = NULL); void setDeathState(DeathState s); // overwrite virtual Creature::setDeathState and Unit::setDeathState void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp index a6f84c83b2e..06ef39bd599 100644 --- a/src/game/Wintergrasp.cpp +++ b/src/game/Wintergrasp.cpp @@ -19,7 +19,8 @@ #include "Wintergrasp.h" #include "SpellAuras.h" #include "Vehicle.h" -#include "GameEventMgr.h" +//#include "GameEventMgr.h" +#include "ObjectMgr.h" bool OPvPWintergrasp::SetupOutdoorPvP() { @@ -33,11 +34,66 @@ bool OPvPWintergrasp::SetupOutdoorPvP() } m_defender = TeamId(rand()%2); - gameeventmgr.StartInternalEvent(GameEventWintergraspDefender[m_defender]); + //m_defender = TEAM_ALLIANCE; + //gameeventmgr.StartInternalEvent(GameEventWintergraspDefender[m_defender]); return true; } +uint32 OPvPWintergrasp::GetCreatureEntry(uint32 guidlow, uint32 entry) +{ + if(m_defender == TEAM_ALLIANCE) + { + switch(entry) + { + case 30739: return 30740; + case 30740: return 30739; + } + } + return entry; +} + +/* +uint32 OPvPWintergrasp::GetGameObjectEntry(uint32 guidlow, uint32 entry) +{ + if(m_defender == TEAM_ALLIANCE) + { + GameObjectInfo const* goInfo = objmgr.GetGameObjectInfo(entry); + if(!goInfo) + return 0; + switch(goInfo->displayId) + { + case 5651: return 192289; + case 5652: return 192288; + case 8256: return 192502; + case 8257: return 192501; + } + } + return entry; +} +*/ + +void OPvPWintergrasp::OnGameObjectCreate(GameObject *go, bool add) +{ + OutdoorPvP::OnGameObjectCreate(go, add); + if(m_defender == TEAM_ALLIANCE) + { + switch(go->GetEntry()) + { + case 190763: go->SetUInt32Value(GAMEOBJECT_FACTION, WintergraspFaction[m_defender]); break; + } + + // Note: this is only for test, still need db support + switch(go->GetGOInfo()->displayId) + { + case 5651: go->SetUInt32Value(GAMEOBJECT_DISPLAYID, 5652); break; + case 5652: go->SetUInt32Value(GAMEOBJECT_DISPLAYID, 5651); break; + case 8256: go->SetUInt32Value(GAMEOBJECT_DISPLAYID, 8257); break; + case 8257: go->SetUInt32Value(GAMEOBJECT_DISPLAYID, 8256); break; + } + } +} + void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone) { if(!plr->HasAura(SPELL_RECRUIT) && !plr->HasAura(SPELL_CORPORAL) diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h index 76838068d48..cce9eb55d7e 100644 --- a/src/game/Wintergrasp.h +++ b/src/game/Wintergrasp.h @@ -24,6 +24,7 @@ #define ZONE_WINTERGRASP 4197 const uint16 GameEventWintergraspDefender[2] = {50, 51}; +const uint32 WintergraspFaction[2] = {1732, 1735}; #define POS_X_CENTER 4700 @@ -62,6 +63,12 @@ class OPvPWintergrasp : public OutdoorPvP public: explicit OPvPWintergrasp() : m_tenacityStack(0) {} bool SetupOutdoorPvP(); + + uint32 GetCreatureEntry(uint32 guidlow, uint32 entry); + //uint32 GetGameObjectEntry(uint32 guidlow, uint32 entry); + + void OnGameObjectCreate(GameObject *go, bool add); + void HandlePlayerEnterZone(Player *plr, uint32 zone); void HandlePlayerLeaveZone(Player *plr, uint32 zone); void HandleKill(Player *killer, Unit *victim); diff --git a/src/game/ZoneScript.h b/src/game/ZoneScript.h new file mode 100644 index 00000000000..2725e44c16c --- /dev/null +++ b/src/game/ZoneScript.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef ZONE_SCRIPT_H_ +#define ZONE_SCRIPT_H_ + +#include "Common.h" + +class Creature; +class GameObject; + +class TRINITY_DLL_SPEC ZoneScript +{ + public: + explicit ZoneScript() {} + + virtual uint32 GetCreatureEntry(uint32 guidlow, uint32 entry) { return entry; } + virtual uint32 GetGameObjectEntry(uint32 guidlow, uint32 entry) { return entry; } + + virtual void OnCreatureCreate(Creature *, bool add) {} + virtual void OnGameObjectCreate(GameObject *go, bool add) {} + + //All-purpose data storage 64 bit + virtual uint64 GetData64(uint32 /*Data*/) { return 0; } + virtual void SetData64(uint32 /*Data*/, uint64 /*Value*/) {} + + //All-purpose data storage 32 bit + virtual uint32 GetData(uint32) { return 0; } + virtual void SetData(uint32, uint32 data) {} +}; + +#endif
\ No newline at end of file diff --git a/win/VC80/game.vcproj b/win/VC80/game.vcproj index 9b37bb359d5..379df1ec05b 100644 --- a/win/VC80/game.vcproj +++ b/win/VC80/game.vcproj @@ -1341,6 +1341,10 @@ RelativePath="..\..\src\game\WaypointMovementGenerator.h" > </File> + <File + RelativePath="..\..\src\game\ZoneScript.h" + > + </File> </Filter> <Filter Name="Server" @@ -1586,14 +1590,6 @@ > </File> <File - RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.cpp" - > - </File> - <File - RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.h" - > - </File> - <File RelativePath="..\..\src\game\PetAI.cpp" > </File> diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj index ebe03efaab5..3940a8fb7fb 100644 --- a/win/VC90/game.vcproj +++ b/win/VC90/game.vcproj @@ -1342,6 +1342,10 @@ RelativePath="..\..\src\game\WaypointMovementGenerator.h" > </File> + <File + RelativePath="..\..\src\game\ZoneScript.h" + > + </File> </Filter> <Filter Name="Server" @@ -1587,14 +1591,6 @@ > </File> <File - RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.cpp" - > - </File> - <File - RelativePath="..\..\src\game\OutdoorPvPObjectiveAI.h" - > - </File> - <File RelativePath="..\..\src\game\PetAI.cpp" > </File> |