diff options
author | megamage <none@none> | 2009-08-19 23:05:36 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-08-19 23:05:36 -0500 |
commit | cf9022aa16b917e82b4c5b27066230ced19433b4 (patch) | |
tree | d396a1ec2253f67d6e29731486e0af179cad7150 /src | |
parent | 411902af037451da2e7114f6864d76bb57f79516 (diff) |
*Wintergrasp: only allow a workshop to build 4 vehicles.
*remove all existing vehicles when workshop is destroyed or captured.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/northrend/wintergrasp.cpp | 37 | ||||
-rw-r--r-- | src/game/OutdoorPvP.cpp | 5 | ||||
-rw-r--r-- | src/game/OutdoorPvP.h | 8 | ||||
-rw-r--r-- | src/game/UnitAI.h | 2 | ||||
-rw-r--r-- | src/game/Wintergrasp.cpp | 75 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 28 |
6 files changed, 136 insertions, 19 deletions
diff --git a/src/bindings/scripts/scripts/northrend/wintergrasp.cpp b/src/bindings/scripts/scripts/northrend/wintergrasp.cpp index 275043d91e5..81f45738e4f 100644 --- a/src/bindings/scripts/scripts/northrend/wintergrasp.cpp +++ b/src/bindings/scripts/scripts/northrend/wintergrasp.cpp @@ -17,19 +17,43 @@ #include "precompiled.h" #include "Wintergrasp.h" + +struct TRINITY_DLL_DECL npc_demolisher_engineererAI : public ScriptedAI +{ + npc_demolisher_engineererAI(Creature* pCreature) : ScriptedAI(pCreature) {} + + /* + void JustDied(Unit *killer) + { + if(me->GetZoneScript()) + me->GetZoneScript()->SetData(DATA_ENGINEER_DIE, me->GetDBTableGUIDLow()); + } + */ +}; + +CreatureAI* GetAI_npc_demolisher_engineerer(Creature* pCreature) +{ + return new npc_demolisher_engineererAI (pCreature); +} + bool GossipHello_npc_demolisher_engineerer(Player* pPlayer, Creature* pCreature) { if (pCreature->isQuestGiver()) pPlayer->PrepareQuestMenu(pCreature->GetGUID()); - if (pPlayer->HasAura(SPELL_CORPORAL)) - pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Build catapult.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - else if (pPlayer->HasAura(SPELL_LIEUTENANT)) + if(pPlayer->isGameMaster() || pCreature->GetZoneScript() && pCreature->GetZoneScript()->GetData(pCreature->GetDBTableGUIDLow())) { - pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Build catapult.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Build demolisher.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Build siege engine.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + if (pPlayer->HasAura(SPELL_CORPORAL)) + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Build catapult.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + else if (pPlayer->HasAura(SPELL_LIEUTENANT)) + { + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Build catapult.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Build demolisher.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Build siege engine.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + } } + else + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "I cannot build more!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+9); pPlayer->SEND_GOSSIP_MENU(pCreature->GetNpcTextId(), pCreature->GetGUID()); return true; @@ -54,6 +78,7 @@ void AddSC_wintergrasp() newscript = new Script; newscript->Name = "npc_demolisher_engineerer"; + newscript->GetAI = &GetAI_npc_demolisher_engineerer; newscript->pGossipHello = &GossipHello_npc_demolisher_engineerer; newscript->pGossipSelect = &GossipSelect_npc_demolisher_engineerer; newscript->RegisterSelf(); diff --git a/src/game/OutdoorPvP.cpp b/src/game/OutdoorPvP.cpp index 14da1381624..03263dd27a2 100644 --- a/src/game/OutdoorPvP.cpp +++ b/src/game/OutdoorPvP.cpp @@ -584,7 +584,6 @@ void OutdoorPvP::OnGameObjectCreate(GameObject *go, bool add) if(go->GetGoType() != GAMEOBJECT_TYPE_CAPTURE_POINT) return; - OutdoorPvP::OPvPCapturePointMap::iterator itr = m_capturePoints.find(go->GetDBTableGUIDLow()); - if(itr != m_capturePoints.end()) - itr->second->m_capturePoint = add ? go : NULL; + if(OPvPCapturePoint *cp = GetCapturePoint(go->GetDBTableGUIDLow())) + cp->m_capturePoint = add ? go : NULL; } diff --git a/src/game/OutdoorPvP.h b/src/game/OutdoorPvP.h index cc2c6822eb5..848012675f5 100644 --- a/src/game/OutdoorPvP.h +++ b/src/game/OutdoorPvP.h @@ -226,6 +226,14 @@ protected: m_capturePoints[cp->m_CapturePointGUID] = cp; } + OPvPCapturePoint * GetCapturePoint(uint32 lowguid) const + { + OutdoorPvP::OPvPCapturePointMap::const_iterator itr = m_capturePoints.find(lowguid); + if(itr != m_capturePoints.end()) + return itr->second; + return NULL; + } + void RegisterZone(uint32 zoneid); bool HasPlayer(Player *plr) const; void TeamCastSpell(TeamId team, int32 spellId); diff --git a/src/game/UnitAI.h b/src/game/UnitAI.h index a9afbb61b11..3458eda9b36 100644 --- a/src/game/UnitAI.h +++ b/src/game/UnitAI.h @@ -57,6 +57,8 @@ class TRINITY_DLL_SPEC UnitAI // Pass parameters between AI virtual void DoAction(const int32 param = 0) {} + virtual uint32 GetData(uint32 id = 0) { return 0; } + virtual void SetData(uint32 id, uint32 value) {} virtual void SetGUID(const uint64 &guid, int32 id = 0) {} virtual uint64 GetGUID(int32 id = 0) { return 0; } diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp index 081d9b0093e..486d8ed383e 100644 --- a/src/game/Wintergrasp.cpp +++ b/src/game/Wintergrasp.cpp @@ -74,7 +74,7 @@ typedef std::list<const AreaPOIEntry *> AreaPOIList; SiegeWorkshop::SiegeWorkshop(OPvPWintergrasp *opvp, BuildingState *state) : OPvPCapturePoint(opvp), m_buildingState(state), m_wintergrasp(opvp) -, m_vehNum(0), m_engineer(NULL), m_engGuid(0) +, m_engineer(NULL), m_engGuid(0) { } @@ -133,12 +133,21 @@ void SiegeWorkshop::ChangeState() { m_engineer->SetOriginalEntry(entry); if(entry != m_engineer->GetEntry() || !m_engineer->isAlive()) + { m_engineer->Respawn(true); + DespawnAllVehicles(); + } } sLog.outDebug("Wintergrasp workshop now belongs to %u.", (uint32)m_buildingState->team); } +void SiegeWorkshop::DespawnAllVehicles() +{ + while(!m_vehicles.empty()) + (*m_vehicles.begin())->Dismiss(); +} + bool OPvPWintergrasp::SetupOutdoorPvP() { m_defender = TeamId(rand()%2); @@ -277,11 +286,13 @@ bool OPvPWintergrasp::SetupOutdoorPvP() workshop->m_engEntry = const_cast<uint32*>(&creData->id); const_cast<CreatureData*>(creData)->displayid = 0; - workshop->AddGO(0, guid, goData->id); + workshop->m_workshopGuid = guid; workshop->m_engGuid = engGuid; + //workshop->AddGO(0, guid, goData->id); //workshop->AddCre(0, engGuid, creData->id); //sLog.outDebug("Demolisher Engineerer lowguid %u is linked to workshop lowguid %u.", engGuid, guid); AddCapturePoint(workshop); + m_buildingStates[guid]->type = BUILDING_WORKSHOP; workshop->SetStateByBuildingState(); } }while(result->NextRow()); @@ -322,6 +333,10 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId) else itr->second->damageState = DAMAGE_DESTROYED; BroadcastStateChange(itr->second); + + if(itr->second->type == BUILDING_WORKSHOP) + if(SiegeWorkshop *workshop = GetWorkshop(obj->GetDBTableGUIDLow())) + workshop->DespawnAllVehicles(); } } } @@ -359,6 +374,25 @@ void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add) case 28094: case 28312: case 32627: + if(uint32 engLowguid = GUID_LOPART(creature->GetOwnerGUID())) + { + if(SiegeWorkshop *workshop = GetWorkshopByEngGuid(engLowguid)) + { + if(add) + { + if(workshop->m_vehicles.size() >= MAX_VEHICLE_PER_WORKSHOP) + { + creature->setDeathState(DEAD); + creature->SetRespawnTime(DAY); + return; + } + workshop->m_vehicles.insert((Vehicle*)creature); + } + // TODO: now you have to wait until the corpse of vehicle disappear to build a new one + else if(!workshop->m_vehicles.erase((Vehicle*)creature)) + sLog.outError("OPvPWintergrasp::OnCreatureCreate: a vehicle is removed but it does not have record in workshop!"); + } + } //case 28366: tower if(add) { @@ -723,16 +757,43 @@ void OPvPWintergrasp::EndBattle() } } +void OPvPWintergrasp::SetData(uint32 id, uint32 value) +{ + if(id == DATA_ENGINEER_DIE) + if(SiegeWorkshop *workshop = GetWorkshopByEngGuid(value)) + workshop->DespawnAllVehicles(); +} + uint32 OPvPWintergrasp::GetData(uint32 id) { - for(OutdoorPvP::OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) - if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(itr->second)) - if(workshop->m_engGuid == id) - return itr->first; + // if can build more vehicles + if(SiegeWorkshop *workshop = GetWorkshopByEngGuid(id)) + return workshop->m_vehicles.size() < MAX_VEHICLE_PER_WORKSHOP ? 1 : 0; + return 0; } -void OPvPWintergrasp::SetData(uint32 id, uint32 value) +SiegeWorkshop *OPvPWintergrasp::GetWorkshop(uint32 lowguid) const +{ + if(OPvPCapturePoint *cp = GetCapturePoint(lowguid)) + return dynamic_cast<SiegeWorkshop*>(cp); + return NULL; +} + +SiegeWorkshop *OPvPWintergrasp::GetWorkshopByEngGuid(uint32 lowguid) const { + for(OutdoorPvP::OPvPCapturePointMap::const_iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) + if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(itr->second)) + if(workshop->m_engGuid == lowguid) + return workshop; + return NULL; +} +SiegeWorkshop *OPvPWintergrasp::GetWorkshopByGOGuid(uint32 lowguid) const +{ + for(OutdoorPvP::OPvPCapturePointMap::const_iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) + if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(itr->second)) + if(workshop->m_workshopGuid == lowguid) + return workshop; + return NULL; } diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h index 529fcb50d88..96f51728664 100644 --- a/src/game/Wintergrasp.h +++ b/src/game/Wintergrasp.h @@ -58,6 +58,11 @@ enum OutdoorPvP_WG_Sounds */ }; +enum DataId +{ + DATA_ENGINEER_DIE, +}; + enum OutdoorPvP_WG_KeepStatus { OutdoorPvP_WG_KEEP_TYPE_NEUTRAL = 0, @@ -69,6 +74,13 @@ enum OutdoorPvP_WG_KeepStatus OutdoorPvP_WG_KEEP_STATUS_HORDE_OCCUPIED = 4 }; +enum BuildingType +{ + BUILDING_WALL, + BUILDING_WORKSHOP, + BUILDING_TOWER, +}; + enum DamageState { DAMAGE_INTACT, @@ -83,13 +95,14 @@ struct BuildingState explicit BuildingState(uint32 _worldState, TeamId _team, bool asDefault) : worldState(_worldState), health(0) , defaultTeam(asDefault ? _team : OTHER_TEAM(_team)), team(_team), damageState(DAMAGE_INTACT) - , building(NULL) + , building(NULL), type(BUILDING_WALL) {} uint32 worldState; uint32 health; TeamId team, defaultTeam; DamageState damageState; GameObject *building; + BuildingType type; void SendUpdate(Player *player) { @@ -104,12 +117,15 @@ struct BuildingState typedef std::map<uint32, uint32> TeamPairMap; +class SiegeWorkshop; + +typedef std::set<Vehicle*> VehicleSet; + class OPvPWintergrasp : public OutdoorPvP { protected: typedef std::map<uint32, BuildingState *> BuildingStateMap; typedef std::set<Creature*> CreatureSet; - typedef std::set<Vehicle*> VehicleSet; typedef std::set<GameObject*> GameObjectSet; public: explicit OPvPWintergrasp() : m_tenacityStack(0) {} @@ -148,6 +164,10 @@ class OPvPWintergrasp : public OutdoorPvP bool m_wartime; uint32 m_timer; + SiegeWorkshop *GetWorkshop(uint32 lowguid) const; + SiegeWorkshop *GetWorkshopByEngGuid(uint32 lowguid) const; + SiegeWorkshop *GetWorkshopByGOGuid(uint32 lowguid) const; + void ChangeDefender(); void UpdateTenacityStack(); @@ -171,10 +191,12 @@ class SiegeWorkshop : public OPvPCapturePoint explicit SiegeWorkshop(OPvPWintergrasp *opvp, BuildingState *state); void SetStateByBuildingState(); void ChangeState(); - uint32 m_vehNum; + void DespawnAllVehicles(); uint32 *m_engEntry; uint32 m_engGuid; Creature *m_engineer; + uint32 m_workshopGuid; + VehicleSet m_vehicles; protected: BuildingState *m_buildingState; OPvPWintergrasp *m_wintergrasp; |