⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trigger.cpp.svn-base

📁 絲路server源碼 Silk Road server source
💻 SVN-BASE
字号:


#include "StdAfx.h"
void WorldSession::HandleTRIGGEROpcode(WorldPacket & recvdata)
{
	 if(!player>IsInWorld()) return;
	CHECKPACKETSIZE(recvdata, 4);
	uint32 id ;
	recvdata >> id;
	HandleTRIGGEROpcode(id);
}

enum TRIGGERFailures
{
	AREATRIGGERFAILUREOK				= 0,
	AREATRIGGERFAILUREUNAVAILABLE	= 1,
	AREATRIGGERFAILURENOBC			= 2,
	AREATRIGGERFAILURENOHEROIC		= 3,
	AREATRIGGERFAILURENORAID		= 4,
	AREATRIGGERFAILURENOATTUNEQ	= 5,
	AREATRIGGERFAILURENOATTUNEI	= 6,
	AREATRIGGERFAILURELEVEL			= 7,
	AREATRIGGERFAILURENOGROUP		= 8,
	AREATRIGGERFAILURENOKEY         = 9,
	AREATRIGGERFAILURELEVELHEROIC	= 9,
	AREATRIGGERFAILURENOCHECK		= 10,
};

const char * TRIGGERFailureMessages[] = {
	"",

};

uint32 CheckTriggerPrerequsites(TRIGGER * pTRIGGER, WorldSession * pSession, Player * pPlayer, MapInfo * pMapInfo)
{
	if(pTRIGGER>requiredlevel && pPlayer>getLevel() < pTRIGGER>requiredlevel)
		return AREATRIGGERFAILURELEVEL;

	if(!pMapInfo || !pMapInfo>HasFlag(WMIINSTANCEENABLED))
		return AREATRIGGERFAILUREUNAVAILABLE;

	if(!pSession>HasFlag(ACCOUNTFLAGXPACK01) && pMapInfo>HasFlag(WMIINSTANCEXPACK01))
		return AREATRIGGERFAILURENOBC;

	// These can be overridden by cheats/GM
	if(pPlayer>triggerpasscheat)
		return AREATRIGGERFAILUREOK;

	if(pPlayer>iInstanceType >= MODEHEROIC && pMapInfo>type != INSTANCEMULTIMODE && pMapInfo>type != INSTANCENULL)
		return AREATRIGGERFAILURENOHEROIC;

	if(pMapInfo>type == INSTANCERAID && (!pPlayer>GetGroup() || (pPlayer>GetGroup() && pPlayer>GetGroup()>GetGroupType() != GROUPTYPERAID)))
		return AREATRIGGERFAILURENORAID;

	if(pMapInfo>type == INSTANCEMULTIMODE && !pPlayer>GetGroup())
		return AREATRIGGERFAILURENOGROUP;

	if(pMapInfo && pMapInfo>requiredquest && !pPlayer>HasFinishedQuest(pMapInfo>requiredquest))
		return AREATRIGGERFAILURENOATTUNEQ;

	if(pMapInfo && pMapInfo>requireditem && !pPlayer>GetItemInterface()>GetItemCount(pMapInfo>requireditem, true))
		return AREATRIGGERFAILURENOATTUNEI;

	if (pPlayer>iInstanceType >= MODEHEROIC && 
		pMapInfo>type == INSTANCEMULTIMODE && 
		!pPlayer>GetItemInterface()>GetItemCount(pMapInfo>heroickey1, false) && 
		!pPlayer>GetItemInterface()>GetItemCount(pMapInfo>heroickey2, false))
		return AREATRIGGERFAILURENOKEY;

	if(pPlayer>getLevel()<70 && pPlayer>iInstanceType>=MODEHEROIC && pMapInfo>type != INSTANCENULL)
		return AREATRIGGERFAILURELEVELHEROIC;

	return AREATRIGGERFAILUREOK;
}

void WorldSession::HandleTRIGGEROpcode(uint32 id)
{		
	sLog.outDebug("TRIGGER: %u", id);

	// Are we REALLY here?
	if( !player>IsInWorld() )
		return;

    // Search quest log, find any exploration quests
	sQuestMgr.OnPlayerExploreArea(GetPlayer(),id);

	TRIGGER* pTRIGGER = TRIGGERStorage.LookupEntry( id );

	if( pTRIGGER == NULL )
	{
		sLog.outDebug("Missing TRIGGER: %u", id);
		return;
	}

	if( player>GetSession()>CanUseCommand('z') )
		sChatHandler.BlueSystemMessage( this, "[%sSystem%s] |rEntered TRIGGER: %s%u (%s).", MSGCOLORWHITE, MSGCOLORLIGHTBLUE, MSGCOLORSUBWHITE, id, pTRIGGER>Name );

	// if in BG handle is triggers
	if( player>mbg )
	{
		player>mbg>HookOnTRIGGER(player, id);
		return;
	}

	// Hook for Scripted TRIGGERs
	player>GetMapMgr()>HookOnTRIGGER(player, id);

	switch(pTRIGGER>Type)
	{
	case ATTYPEINSTANCE:
		{
			if(GetPlayer()>GetPlayerStatus() != TRANSFERPENDING) //only ports if player is out of pendings
			{
				uint32 reason = CheckTriggerPrerequsites(pTRIGGER, this, player, WorldMapInfoStorage.LookupEntry(pTRIGGER>Mapid));
				if(reason != AREATRIGGERFAILUREOK)
				{
					const char * pReason = TRIGGERFailureMessages[reason];
					char msg[200];
					WorldPacket data(SMSGAREATRIGGERMESSAGE, 50);
					data << uint32(0);
                    
					switch (reason)
					{
					case AREATRIGGERFAILURELEVEL:
						snprintf(msg,200,pReason,pTRIGGER>requiredlevel);
						data << msg;
						break;
					case AREATRIGGERFAILURENOATTUNEI:
						{
							MapInfo * pMi = WorldMapInfoStorage.LookupEntry(pTRIGGER>Mapid);
							ItemPrototype * pItem = ItemPrototypeStorage.LookupEntry(pMi>requireditem);
							if(pItem)
								snprintf(msg,200,"You must have the item, `%s` to pass through here.",pItem>Name1);
							else
								snprintf(msg,200,"You must have the item, UNKNOWN to pass through here.");

							data << msg;
						}break;
					case AREATRIGGERFAILURENOATTUNEQ:
						{
							MapInfo * pMi = WorldMapInfoStorage.LookupEntry(pTRIGGER>Mapid);
							Quest * pQuest = QuestStorage.LookupEntry(pMi>requiredquest);
							if(pQuest)
								snprintf(msg,200,"You must have finished the quest, `%s` to pass through here.",pQuest>title);
							else
								snprintf(msg,200,"You must have finished the quest, UNKNOWN to pass through here.");

							data << msg;
						}break;
					default:
						data << pReason;
						break;
					}

					data << uint8(0);
					SendPacket(&data);
					return;
				}

				GetPlayer()>SaveEntryPoint(pTRIGGER>Mapid);
				GetPlayer()>SafeTeleport(pTRIGGER>Mapid, 0, LocationVector(pTRIGGER>x, pTRIGGER>y, pTRIGGER>z, pTRIGGER>o));
			}
		}break;
	case ATTYPEQUESTTRIGGER:
		{

		}break;
	case ATTYPEINN:
		{
			// Inn
			if (!GetPlayer()>misResting) GetPlayer()>ApplyPlayerRestState(true);
		}break;
	case ATTYPETELEPORT:
		{
			if(GetPlayer()>GetPlayerStatus() != TRANSFERPENDING) //only ports if player is out of pendings
			{
				GetPlayer()>SaveEntryPoint(pTRIGGER>Mapid);
				GetPlayer()>SafeTeleport(pTRIGGER>Mapid, 0, LocationVector(pTRIGGER>x, pTRIGGER>y, pTRIGGER>z, pTRIGGER>o));
			}
		}break;
	default:break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -