Gameobject Teleport [Go Type 27]

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]

2012-04-18_GameobjectTeleport.patch