📄 actiontriggers.cpp
字号:
#include "StdAfx.h"
#include ".\actiontriggers.h"
#include ".\actionInfo.h"
#include ".\Trigger.h"
#include ".\TriggerManager.h"
#include ".\Player.h"
#include ".\PacketStruct_CG.h"
#include ".\PacketStruct_AG.h"
#include ".\Map.h"
#include ".\ItemInfoParser.h"
#include ".\ItemManager.h"
#include <Global.h>
#include ".\MissionManager.h"
#include ".\GameZone.h"
// 规氢 瘤沥 阁胶磐 府哩 困秦
#include ".\handler_cg_sync.h"
#include <PublicMath.h>
#include <3DEngine/Common/MathAssistant.h>
// 裹困 单固瘤 困秦
#include <MapObject.h>
__IMPL_POOL(ACTION_CHANGE_OBJECTANI)
VOID ACTION_CHANGE_OBJECTANI::OnAction()
{
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_CHANGE_OBJECTANI", getParent()->TriggerID() );
}
__IMPL_POOL(ACTION_CHANGE_PATHTILE)
VOID ACTION_CHANGE_PATHTILE::OnAction()
{
if( CANMOVE == Get()->GetAttribute() )
{
getMGR()->UnsetAttribute( Get()->GetTileID(), PTA_NO_WALK);
}
else if( CANNOTMOVE == Get()->GetAttribute() )
{
getMGR()->SetAttribute( Get()->GetTileID(), PTA_NO_WALK);
}
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_CHANGE_PATHTILE", getParent()->TriggerID() );
}
__IMPL_POOL(ACTION_CHANGE_OBJECTSTATE)
VOID ACTION_CHANGE_OBJECTSTATE::OnAction()
{
MapObject * pMapObject = getMGR()->FindMapObject( Get()->GetObjectID() );
ASSERT(NULL != pMapObject);
DEBUG_CODE( if( !pMapObject ) return ; );
switch( Get()->GetState() )
{
case ACTION_CHANGE_OBJECTSTATE_INFO::APPEAR:
{
// SUNLOG( eFULL_LOG, "备泅救凳!" );
}
break;
case ACTION_CHANGE_OBJECTSTATE_INFO::DISAPPEAR:
{
// SUNLOG( eFULL_LOG, "备泅救凳!" );
}
break;
case ACTION_CHANGE_OBJECTSTATE_INFO::REMOVE:
{
if( !getMGR()->RemoveMapObject( Get()->GetObjectID() ) )
{
SUNLOG( eCRITICAL_LOG, "[ACTION_CHANGE_OBJECTSTATE::OnAction] [ID:%u]:ACTION_CHANGE_OBJECTSTATE is Failed!!!!!!!!!!!", getParent()->TriggerID() );
}
}
break;
}
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_CHANGE_OBJECTSTATE", getParent()->TriggerID() );
}
__IMPL_POOL(ACTION_PLAY_EVENT)
VOID ACTION_PLAY_EVENT::OnAction()
{
// 捞亥飘甫 敲饭捞窍扼绊 舅妨扼!
Player * pPlayer = PlayerManager::Instance()->FindPlayer(getParent()->GetClickedUserKey());
if( NULL == pPlayer )
{
SUNLOG( eFULL_LOG, "[ACTION_PLAY_EVENT::OnAction] [U:%d]Player NULL!!", getParent()->GetClickedUserKey());
return;
}
MSG_CG_TRIGGER_PLAY_EVENT_CMD msg;
msg.m_nEventIndex = Get()->GetEventID();
pPlayer->SendPacket( &msg, sizeof(msg) );
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_PLAY_EVENT", getParent()->TriggerID() );
}
__IMPL_POOL(ACTION_SET_ISATTACK)
VOID ACTION_SET_ISATTACK::OnAction()
{
// SUNLOG( eFULL_LOG, "备泅救凳!" );
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_SET_ISATTACK", getParent()->TriggerID() );
}
class WARP_PLAYER
{
public:
static VOID Warp( Player * pPlayer, CODETYPE EnterFieldCode, WzID AreaID )
{
DEBUG_CODE( if( !pPlayer->GetField() ) return ; );
DEBUG_CODE( if( !pPlayer->GetField()->GetMap() ) return ; );
DEBUG_CODE( if( !pPlayer->GetField()->GetMap()->GetGameZone() ) return ; );
GameZone * pZone = pPlayer->GetField()->GetMap()->GetGameZone();
pZone->Warp( pPlayer, EnterFieldCode, AreaID );
MSG_CG_TRIGGER_PORTAL_ACK msg;
msg.m_MapCode = pZone->GetMap()->GetMapCode();
msg.m_FieldCode = EnterFieldCode;
pPlayer->SendPacket( &msg, sizeof(msg) );
return;
}
};
class BackToTheVillage
{
public:
BackToTheVillage(){}
~BackToTheVillage(){}
VOID operator()( Player * pPlayer )
{
MSG_AG_ZONE_MISSION_LEAVE_CMD msg;
pPlayer->SendPacket( &msg, sizeof(msg) );
}
};
class WarpPlayerForField
{
CODETYPE m_FieldCode;
WzID m_AreaID;
public:
WarpPlayerForField(CODETYPE FieldCode, WzID AreaID ):m_FieldCode(FieldCode),m_AreaID(AreaID){}
~WarpPlayerForField(){}
VOID operator() ( Player * pPlayer ) { WARP_PLAYER::Warp( pPlayer, m_FieldCode, m_AreaID ); }
};
__IMPL_POOL(ACTION_PORTAL_PLAYER)
VOID ACTION_PORTAL_PLAYER::OnAction()
{
CODETYPE EnterFieldCode = Get()->GetMapCode();
if( Get()->GetType() == ACTION_PORTAL_PLAYER_INFO::FIELDCODE )
{
if( Get()->GetIsParty() == PARTY )
{
// 泅犁 鞘靛俊 乐绰 荤恩阑 葛滴 况橇
// 炼扒俊 秦寸窍绰 荤恩阑 舅 鞘夸 绝澜
WarpPlayerForField op(EnterFieldCode,Get()->GetAreaID());
getMGR()->ForeachPlayer( op );
}
else
{
ASSERT( Get()->GetIsParty() == PERSONAL );
if( getParent()->GetClickedUserKey() != 0 )
{
Player * pPlayer = PlayerManager::Instance()->FindPlayer(getParent()->GetClickedUserKey());
if( NULL == pPlayer )
{
SUNLOG( eFULL_LOG, "[ACTION_PORTAL_PLAYER::OnAction] [U:%d]ACTION_REWARD_PLAYER Player NULL!!", getParent()->GetClickedUserKey());
return;
}
WARP_PLAYER::Warp( pPlayer,EnterFieldCode,Get()->GetAreaID() );
}
else
{
/*
WarpPlayerForCondition op(EnterFieldCode,Get()->GetAreaID());
getParent()->FindPlayer( op);
*/
WarpPlayerForField op(EnterFieldCode,Get()->GetAreaID());
getParent()->For_EachSatisfiedPlayer(op);
getParent()->RemoveAllSatisfiedPlayer();
}
}
}
else //if( Get()->GetType() == ACTION_PORTAL_PLAYER_INFO::RELATEDVILLAGE )
{
if( Get()->GetIsParty() == PARTY )
{
// 泅犁 鞘靛俊 乐绰 荤恩阑 葛滴 况橇
// 炼扒俊 秦寸窍绰 荤恩阑 舅 鞘夸 绝澜
BackToTheVillage op;
getMGR()->ForeachPlayer( op );
//WarpPlayerForField op(EnterFieldCode,Get()->GetAreaID());
}
else
{
ASSERT( Get()->GetIsParty() == PERSONAL );
if( getParent()->GetClickedUserKey() != 0 )
{
Player * pPlayer = PlayerManager::Instance()->FindPlayer(getParent()->GetClickedUserKey());
if( NULL == pPlayer )
{
SUNLOG( eFULL_LOG, "[ACTION_PORTAL_PLAYER::OnAction] [U:%d]ACTION_REWARD_PLAYER Player NULL!!", getParent()->GetClickedUserKey());
return;
}
BackToTheVillage op;
op(pPlayer);
// WARP_PLAYER::Warp( pPlayer,EnterFieldCode,Get()->GetAreaID() );
}
else
{
/*
WarpPlayerForCondition op(EnterFieldCode,Get()->GetAreaID());
getParent()->FindPlayer( op);
*/
BackToTheVillage op;
getParent()->For_EachSatisfiedPlayer(op);
getParent()->RemoveAllSatisfiedPlayer();
}
}
}
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_PORTAL_PLAYER", getParent()->TriggerID() );
}
__IMPL_POOL(ACTION_SET_OBJECTTHRUST)
VOID ACTION_SET_OBJECTTHRUST::OnAction()
{
// SUNLOG( eFULL_LOG, "备泅救凳!" );
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_SET_OBJECTTHRUST", getParent()->TriggerID() );
}
__IMPL_POOL(ACTION_APPLY_DAMAGE)
VOID ACTION_APPLY_DAMAGE::OnAction()
{
// SUNLOG( eFULL_LOG, "备泅救凳!" );
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_APPLY_DAMAGE", getParent()->TriggerID() );
}
/*
// 林函何狼 敲饭捞绢父阑 眉农窍绰 巴栏肺 官曹 鞘夸 乐澜
class ReflectDamageHandler
{
int m_dist;
WzVector m_vPos;
public :
ReflectDamageHandler( WzVector * pvPos, int dist ){ m_vPos = *pvPos; m_dist = dist; }
~ReflectDamageHandler(){}
VOID operator () ( Player * pPlayer )
{
WzVector curPos;
pPlayer->GetPos( &curPos );
WzVector wvDist = m_vPos - curPos;
float fDist2 = VectorLength2( &wvDist );
if( fDist2 <= m_dist )
{
pPlayer->DecreaseHP( 15 );
MSG_CG_TRIGGER_REFLECTDAMAGE_BRD msg;
msg.m_byCategory = CG_BATTLE;
msg.m_byProtocol = CG_BATTLE_P2O_ATTACK_BRD;
msg.m_dwObjectKey = pPlayer->GetObjectKey();
msg.m_dwDamage = 15;
msg.m_dwHP = pPlayer->GetHP();
pPlayer->SendPacketAround( (MSG_BASE_FORWARD*)&msg, sizeof(msg) );
}
}
};
*/
__IMPL_POOL(ACTION_REFLECT_DAMAGE)
VOID ACTION_REFLECT_DAMAGE::OnAction()
{
/*
MapObject * pMapObject = getMGR()->FindMapObject( Get()->m_iObjectID );
ASSERT( NULL != pMapObject );
DEBUG_CODE( if( !pMapObject ) return; );
INT ReflectDamage = (INT)(( pMapObject->GetMaxHP() - pMapObject->GetHP() ) * Get()->m_fDamage);
// 老沥 裹困救狼 Object俊霸 单固瘤 馆荤
// TODO: ReflectDamage??
WzVector vPos;
pMapObject->GetPos( &vPos );
Field * pField = getMGR()->GetField();
ReflectDamageHandler handler( &vPos, 10 );
pField->ForeachPlayer( handler );
*/
// SUNLOG( eFULL_LOG, "备泅救凳!" );
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_REFLECT_DAMAGE", getParent()->TriggerID() );
}
__IMPL_POOL(ACTION_CREATE_MONSTER)
VOID ACTION_CREATE_MONSTER::OnAction()
{
m_iRegenCount = 0;
m_RegenTimer.SetTimer(0); //< 贸澜俊绰 馆靛矫 茄锅 角青茄促.
if( Get()->GetIsParty() == PERSONAL )
{
// 酒流 蜡历啊 甘俊 甸绢 坷瘤 臼篮惑炔俊辑 0捞 瞪 荐 乐促.!!!!!@@@@
DWORD num = getMGR()->GetPlayerNum();
m_iMaxCreateCount = Get()->GetCreateCount()*(num==0?1:num);
}
else
m_iMaxCreateCount = Get()->GetCreateCount();
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_CREATE_MONSTER,俺荐(%d)", getParent()->TriggerID(), m_iMaxCreateCount );
}
BOOL ACTION_CREATE_MONSTER::OnActionUpdate()
{
if( m_iRegenCount == Get()->GetLoopCount() )
{
return FALSE;
}
else
{
if( m_RegenTimer.IsExpired() )
{
m_RegenTimer.SetTimer(Get()->GetDelayTime());
WzSpecialArea * pAreaInfo = getMGR()->GetAreaInfo( Get()->GetAreaID() );
ASSERT( pAreaInfo );
if( pAreaInfo->m_wbvRegion.m_eBvType == BVT_PATH_TILE_INDEX )
{
// ASSERT( pAreaInfo->m_wbvRegion.m_eBvType == BVT_PATH_TILE_INDEX );
// DEBUG_CODE( if( pAreaInfo->m_wbvRegion.m_eBvType != BVT_PATH_TILE_INDEX ) return TRUE; );
WzVector vPos = {0,0,0};
for( int i = 0 ; i < m_iMaxCreateCount ; ++ i)
{
DWORD dwSelectedTile = random( 0, pAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_nCount - 1 );
vPos = getMGR()->GetRandomPosInTile( pAreaInfo->m_wbvRegion.m_BvPathTileIndex.m_pdwData[dwSelectedTile] );
getMGR()->CreateNPC( Get()->GetMonsterCode(), 1, &vPos, Get()->GetAreaID(), Get()->GetType() );
}
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_CREATE_MONSTER COUNT(%d), Tick(%u)", getParent()->TriggerID(), m_iRegenCount, GetTickCount() );
// SUNLOG( eFULL_LOG, "[ID:%u]:Monster(CODE:%d)(Area:%d)(GroupID:%d)", getParent()->TriggerID(), Get()->GetMonsterCode(), Get()->GetAreaID(), Get()->GetType() );
++m_iRegenCount;
}
else if( pAreaInfo->m_wbvRegion.m_eBvType == BVT_SPHERE )
{
WzVector vPos = {0,0,0};
vPos = pAreaInfo->m_wbvRegion.m_BvSphere.m_wvCenter;
getMGR()->CreateNPC( Get()->GetMonsterCode(), 1, &vPos, Get()->GetAreaID(), Get()->GetType() );
++m_iRegenCount;
}
// DEBUG_CODE( if( pAreaInfo->m_wbvRegion.m_eBvType != BVT_PATH_TILE_INDEX ) return TRUE; );
}
}
return TRUE;
}
__IMPL_POOL(ACTION_DISPLAY_MSGBOX)
VOID ACTION_DISPLAY_MSGBOX::OnAction()
{
// SUNLOG( eFULL_LOG, "[ID:%u]:ACTION_DISPLAY_MSGBOX", getParent()->TriggerID() );
}
class RemoveItemFromInventoryForCondition
{
SLOTCODE m_ItemCode;
BYTE m_byAllOfItem;
public:
RemoveItemFromInventoryForCondition( SLOTCODE ItemCode, BYTE all ):m_ItemCode(ItemCode), m_byAllOfItem(all){}
~RemoveItemFromInventoryForCondition(){}
BOOL operator()( Trigger::PLAYER_TRIGGER_INFO * pPlayerInfo )
{
//if( pPlayerInfo->m_State )
{
Player * pPlayer = pPlayerInfo->m_pPlayer;
pPlayer->GetItemManager()->Lose( m_ItemCode, m_byAllOfItem );
}
return FALSE;
}
};
__IMPL_POOL(ACTION_REMOVE_ITEM)
VOID ACTION_REMOVE_ITEM::OnAction()
{
/*
if( getParent()->GetClickedUserKey() != 0 )
{
// 努腐茄 蜡历
Player * pPlayer = PlayerManager::Instance()->FindPlayer(getParent()->GetClickedUserKey());
if( NULL == pPlayer )
{
SUNLOG( eFULL_LOG, "[U:%d]ACTION_REMOVE_ITEM Player NULL!!", getParent()->GetClickedUserKey());
return;
}
pPlayer->GetItemManager()->Lose( Get()->GetItemCode(), Get()->GetAllOfItem() );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -