From 3fd4f3d4b342a838b312ecc6bee4837c9a5584dd Mon Sep 17 00:00:00 2001 From: Rat Date: Sat, 4 Apr 2009 18:07:05 +0200 Subject: [PATCH 1/7] *added HandleGameObject function to instance, use this to simply open/close doors from scripts --HG-- branch : trunk --- src/game/InstanceData.cpp | 10 ++++++++++ src/game/InstanceData.h | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp index 28145973bc..ac607bfd7a 100644 --- a/src/game/InstanceData.cpp +++ b/src/game/InstanceData.cpp @@ -30,3 +30,13 @@ void InstanceData::SaveToDB() CharacterDatabase.PExecute("UPDATE instance SET data = '%s' WHERE id = '%d'", data.c_str(), instance->GetInstanceId()); } +void InstanceData::HandleGameObject(uint64 GUID, bool open, GameObject *go) +{ + if(!go) + go = instance->GetGameObjectInMap(GUID); + if(go) + go->SetGoState(open ? 0 : 1); + else + debug_log("SD2: InstanceData: HandleGameObject failed"); +} + diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index cd3a50787e..ec36a79452 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -22,6 +22,8 @@ #define TRINITY_INSTANCE_DATA_H #include "Common.h" +#include "GameObject.h" +#include "Map.h" class Map; class Unit; @@ -68,6 +70,11 @@ class TRINITY_DLL_SPEC InstanceData //All-purpose data storage 32 bit virtual uint32 GetData(uint32) { return 0; } virtual void SetData(uint32, uint32 data) {} + + //Handle open / close objects + //use HandleGameObject(NULL,boolen,GO); in OnObjectCreate in instance scripts + //use HandleGameObject(GUID,boolen,NULL); in any other script + virtual void HandleGameObject(uint64 GUID, bool open, GameObject *go = NULL); }; #endif From 98f3d4d8b3dc91953b56a9599ee0c48ca04cc889 Mon Sep 17 00:00:00 2001 From: Rat Date: Sat, 4 Apr 2009 18:18:08 +0200 Subject: [PATCH 2/7] *remade Black Temple doors with new HandleGameObject --HG-- branch : trunk --- .../black_temple/instance_black_temple.cpp | 62 +++++++------------ 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp index 9232f96e04..80a749faa1 100644 --- a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp +++ b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp @@ -129,20 +129,6 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance return NULL; } - void HandleGameObject(uint64 guid, uint32 state) - { - Player *player = GetPlayerInMap(); - - if (!player || !guid) - { - debug_log("TSCR: Black Temple: HandleGameObject fail"); - return; - } - - if (GameObject *go = GameObject::GetGameObject(*player,guid)) - go->SetGoState(state); - } - void OnCreatureCreate(Creature *creature, uint32 creature_entry) { switch(creature_entry) @@ -167,24 +153,24 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance switch(go->GetEntry()) { case 185483: NajentusGate = go->GetGUID();// Gate past Naj'entus (at the entrance to Supermoose's courtyards) - if(Encounters[0] == DONE) go->SetGoState(0);break; + if(Encounters[0] == DONE)HandleGameObject(NULL,true,go);break; case 185882: MainTempleDoors = go->GetGUID();// Main Temple Doors - right past Supermoose (Supremus) - if(Encounters[1] == DONE)go->SetGoState(0);break; + if(Encounters[1] == DONE)HandleGameObject(NULL,true,go);break; case 185478: ShadeOfAkamaDoor = go->GetGUID();break; case 185480: CommonDoor = go->GetGUID(); - if(Encounters[3] == DONE) go->SetGoState(0);break; + if(Encounters[3] == DONE)HandleGameObject(NULL,true,go);;break; case 186153: TeronDoor = go->GetGUID(); - if(Encounters[3] == DONE)go->SetGoState(0);break; + if(Encounters[3] == DONE)HandleGameObject(NULL,true,go);;break; case 185892: GuurtogDoor = go->GetGUID(); - if(Encounters[4] == DONE)go->SetGoState(0);break; + if(Encounters[4] == DONE)HandleGameObject(NULL,true,go);break; case 185479: TempleDoor = go->GetGUID(); - if(Encounters[5] == DONE)go->SetGoState(0);break; + if(Encounters[5] == DONE)HandleGameObject(NULL,true,go);break; case 185482: MotherDoor = go->GetGUID(); - if(Encounters[6] == DONE)go->SetGoState(0);break; + if(Encounters[6] == DONE)HandleGameObject(NULL,true,go);break; case 185481: CouncilDoor = go->GetGUID(); - if(Encounters[7] == DONE)go->SetGoState(0);break; + if(Encounters[7] == DONE)HandleGameObject(NULL,true,go);break; case 186152: SimpleDoor = go->GetGUID(); - if(Encounters[7] == DONE)go->SetGoState(0);break; + if(Encounters[7] == DONE)HandleGameObject(NULL,true,go);break; case 185905: IllidanGate = go->GetGUID(); break; // Gate leading to Temple Summit case 186261: IllidanDoor[0] = go->GetGUID(); break; // Right door at Temple Summit case 186262: IllidanDoor[1] = go->GetGUID(); break; // Left door at Temple Summit @@ -224,59 +210,59 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance case DATA_HIGHWARLORDNAJENTUSEVENT: if(data == DONE) { - HandleGameObject(NajentusGate, 0); + HandleGameObject(NajentusGate, true); } Encounters[0] = data;break; case DATA_SUPREMUSEVENT: if(data == DONE) { - HandleGameObject(NajentusGate, 0); + HandleGameObject(NajentusGate, true); } Encounters[1] = data; break; case DATA_SHADEOFAKAMAEVENT: if(data == IN_PROGRESS) { - HandleGameObject(ShadeOfAkamaDoor, 1); - }else HandleGameObject(ShadeOfAkamaDoor, 0); + HandleGameObject(ShadeOfAkamaDoor, false); + }else HandleGameObject(ShadeOfAkamaDoor, true); Encounters[2] = data; break; case DATA_TERONGOREFIENDEVENT: if(data == IN_PROGRESS) { - HandleGameObject(TeronDoor, 1); - HandleGameObject(CommonDoor, 1); + HandleGameObject(TeronDoor, false); + HandleGameObject(CommonDoor, false); }else { - HandleGameObject(TeronDoor, 0); - HandleGameObject(CommonDoor, 0); + HandleGameObject(TeronDoor, true); + HandleGameObject(CommonDoor, true); } Encounters[3] = data; break; case DATA_GURTOGGBLOODBOILEVENT: if(data == DONE) { - HandleGameObject(GuurtogDoor, 0); + HandleGameObject(GuurtogDoor, true); } Encounters[4] = data; break; case DATA_RELIQUARYOFSOULSEVENT: if(data == DONE) { - HandleGameObject(TempleDoor, 0); + HandleGameObject(TempleDoor, true); } Encounters[5] = data; break; case DATA_MOTHERSHAHRAZEVENT: if(data == DONE) { - HandleGameObject(MotherDoor, 0); + HandleGameObject(MotherDoor, true); } Encounters[6] = data; break; case DATA_ILLIDARICOUNCILEVENT: if(data == IN_PROGRESS) { - HandleGameObject(CouncilDoor, 1); - HandleGameObject(SimpleDoor, 1); + HandleGameObject(CouncilDoor, false); + HandleGameObject(SimpleDoor, false); }else { - HandleGameObject(CouncilDoor, 0); - HandleGameObject(SimpleDoor, 0); + HandleGameObject(CouncilDoor, true); + HandleGameObject(SimpleDoor, true); } Encounters[7] = data; break; case DATA_ILLIDANSTORMRAGEEVENT: Encounters[8] = data; break; From c0a131a63d8d5f9b5c7d5c3373e588dbc7beb074 Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 4 Apr 2009 13:02:57 -0600 Subject: [PATCH 3/7] *Fix visibility update bug. --HG-- branch : trunk --- src/game/GridNotifiers.cpp | 3 +++ src/game/Map.cpp | 11 +++++------ src/game/Player.cpp | 2 -- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/game/GridNotifiers.cpp b/src/game/GridNotifiers.cpp index f52932df83..e27abeccd0 100644 --- a/src/game/GridNotifiers.cpp +++ b/src/game/GridNotifiers.cpp @@ -99,6 +99,9 @@ PlayerVisibilityNotifier::Notify() for(std::set::const_iterator vItr = i_visibleNow.begin(); vItr != i_visibleNow.end(); ++vItr) if((*vItr)!=&i_player && (*vItr)->isType(TYPEMASK_UNIT)) i_player.SendInitialVisiblePackets((Unit*)(*vItr)); + + if(i_visibleNow.size() >= 30) + i_player.SetToNotify(); } void diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 669baf275f..21e6a26785 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -615,7 +615,6 @@ void Map::RelocationNotify() if(Unit *unit = ObjectAccessor::GetObjectInWorld(*iter, (Unit*)NULL)) { i_unitsToNotify.push_back(unit); - unit->m_Notified = false; } } i_unitsToNotifyBacklog.clear(); @@ -624,11 +623,10 @@ void Map::RelocationNotify() for(std::vector::iterator iter = i_unitsToNotify.begin(); iter != i_unitsToNotify.end(); ++iter) { Unit *unit = *iter; - unit->m_IsInNotifyList = false; - if(!unit->IsInWorld() || unit->GetMapId() != GetId()) continue; + unit->m_IsInNotifyList = false; unit->m_Notified = true; if(unit->GetTypeId() == TYPEID_PLAYER) @@ -643,6 +641,10 @@ void Map::RelocationNotify() VisitAll(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), notifier); } } + for(std::vector::iterator iter = i_unitsToNotify.begin(); iter != i_unitsToNotify.end(); ++iter) + { + (*iter)->m_Notified = false; + } i_unitsToNotify.clear(); } @@ -656,10 +658,7 @@ void Map::AddUnitToNotify(Unit* u) if(i_lock) i_unitsToNotifyBacklog.push_back(u->GetGUID()); else - { i_unitsToNotify.push_back(u); - u->m_Notified = false; - } } void Map::Update(const uint32 &t_diff) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 6f78d95e07..764cb20c88 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -17828,8 +17828,6 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set From caca633c8e14e24d114f328e7f7f0469786c39bd Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 4 Apr 2009 13:04:11 -0600 Subject: [PATCH 4/7] *Fix the bug that creatures do not return to spawn point when players leave instance. --HG-- branch : trunk --- src/game/ObjectGridLoader.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/ObjectGridLoader.cpp b/src/game/ObjectGridLoader.cpp index e0982ccb44..d14389725b 100644 --- a/src/game/ObjectGridLoader.cpp +++ b/src/game/ObjectGridLoader.cpp @@ -283,6 +283,7 @@ ObjectGridStoper::Visit(CreatureMapType &m) iter->getSource()->CombatStop(); iter->getSource()->DeleteThreatList(); iter->getSource()->RemoveAllDynObjects(); + iter->getSource()->AI()->EnterEvadeMode(); } } From f599b603f3b33905ed9bdcc9f228d5e98cd2ef27 Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 4 Apr 2009 13:08:14 -0600 Subject: [PATCH 5/7] *Add a missing part of the visibility patch. --HG-- branch : trunk --- src/game/Map.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 21e6a26785..5feea0db08 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -377,6 +377,7 @@ void Map::AddNotifier(T*) template<> void Map::AddNotifier(Player* obj) { + obj->m_Notified = false; obj->m_IsInNotifyList = false; AddUnitToNotify(obj); } @@ -384,6 +385,7 @@ void Map::AddNotifier(Player* obj) template<> void Map::AddNotifier(Creature* obj) { + obj->m_Notified = false; obj->m_IsInNotifyList = false; AddUnitToNotify(obj); } From eede65e115ebbbcf322054e5e11e2675a188dcfd Mon Sep 17 00:00:00 2001 From: raczman Date: Sat, 4 Apr 2009 23:02:24 +0200 Subject: [PATCH 6/7] Not displaying "Command not found" error for player security level. Thx Machiavelli <3 --HG-- branch : trunk --- src/game/Chat.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index ee8d78383a..edaa568ae8 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -891,8 +891,11 @@ int ChatHandler::ParseCommands(const char* text) ++text; if(!ExecuteCommandInTable(getCommandTable(), text, fullcmd)) - SendSysMessage(LANG_NO_CMD); - + { + if(m_session && m_session->GetSecurity() == SEC_PLAYER) + return 0; + SendSysMessage(LANG_NO_CMD); + } return 1; } From 86bd3bfb422a299d6e0aac0f196ba4fea9affbc4 Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 4 Apr 2009 15:04:24 -0600 Subject: [PATCH 7/7] *Do not check formation for pet and summoned creatures. --HG-- branch : trunk --- src/game/Creature.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 19d2316287..471934f4f8 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -199,9 +199,12 @@ void Creature::RemoveFromWorld() void Creature::SearchFormation() { + if(isPet()) + return; + uint32 lowguid = GetDBTableGUIDLow(); - if(CreatureGroupMap.find(lowguid) != CreatureGroupMap.end()) + if(lowguid && CreatureGroupMap.find(lowguid) != CreatureGroupMap.end()) { m_formationID = CreatureGroupMap[lowguid]->leaderGUID; formation_mgr.UpdateCreatureGroup(m_formationID, this);