Hullo!
For quite a while, I’ve been using the custom gameobject_teleport patch that someone had ported over to TC a while back. However, I wanted to improve upon the fact that a database query was made anytime a player used a GO of type 10. This made updating locations on the fly quite easy, but I still wanted to lessen database traffic a bit. Therefore, I fiddled with the code last night and managed to rewrite it using the previous code as a base. I’m not really that experienced with C++, so there may be more efficient ways of implementing this. Furthermore, I wanted to actually use GO type 27 since this was apparently its use for TrinityCore in the past.
Note that changes to areatrigger_teleport can be reloaded in-game, so it’s still easy to change port coordinates for an existing GO while the server is running.
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 91fb872..fa150f9 100755
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -1627,6 +1627,40 @@ void GameObject::Use(Unit* user)
}
break;
}
+
+ case GAMEOBJECT_TYPE_MINI_GAME: //27
+ {
+ if (user->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ GameObjectTemplate const* info = GetGOInfo();
+ if (!info)
+ return;
+
+ Player* player = user->ToPlayer();
+
+ if ((info->miniGame.requiredLevel == 0) || (info->miniGame.requiredLevel <= player->getLevel()))
+ {
+ AreaTrigger const* at = sObjectMgr->GetAreaTrigger(info->miniGame.areaTrigger);
+ if (!at)
+ {
+ sLog->outErrorDb("AreaTrigger for Gameobject (Entry: %u) not found!", GetEntry());
+ return;
+ }
+
+ player->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, at->target_Orientation, TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
+ if (info->miniGame.phase != 0)
+ player->SetPhaseMask(info->miniGame.phase,true);
+ }
+ else if (info->miniGame.requiredLevel != 0)
+ {
+ }
+ return;
+ }
+
case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
{
GameObjectTemplate const* info = GetGOInfo();
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 3d58ebe..c6c0a01 100755
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -307,7 +307,9 @@ struct GameObjectTemplate
//27 GAMEOBJECT_TYPE_MINI_GAME
struct
{
- uint32 gameType; //0
+ uint32 areaTrigger; //0
+ uint32 requiredLevel; //1
+ uint32 phase; //2
} miniGame;
//29 GAMEOBJECT_TYPE_CAPTURE_POINT
struct
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index c8e88da..0cf17fb 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -6002,7 +6002,7 @@ void ObjectMgr::LoadAreaTriggerTeleports()
if (!atEntry)
{
sLog->outErrorDb("Area trigger (ID:%u) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
- continue;
+ //continue;
}
MapEntry const* mapEntry = sMapStore.LookupEntry(at.target_mapId);
--
1.7.6.msysgit.0
The edit I made in ObjectMgr.cpp was to enable custom entries in areatrigger_teleport (without requiring an associated entry in the DBC) to facilitate this. I personally started my custom locations at 7000.
The different options in the GO template are:
data0 → areatrigger_teleport entry
data1 → required level to use the teleport [optional]
data2 → phase to set the player to [optional]