📄 trigger.cpp.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 + -