#include "StdAfx.h" #include "GameSpaField.h" #include "TriggerManagerEx.h" #include "StatusManager.h" __IMPL_CUSTOMPOOL_PTR(GameSpaField) GameSpaField::GameSpaField() : field_pvp_rule_(PTA_CONFLICT_TILE | PTA_FREE_CONFLICT_TILE), check_filters_(NULL) { // } void GameSpaField::OnCreate() { ban_item_type[0] = eITEMTYPE_PET; check_filters_ = new MatchCheckCodeFilters(); new (&check_filters_->ItemTypeFilter) MatchCheckCodeFilterArray(1, ban_item_type); ChangeHandler( eZONETYPE_SPA_FIELD ); GameZone::OnCreate(); } void GameSpaField::SetZone( Object* pObject, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos ) { pObject->SetGameZone( ePRS_AT_SPA_FIELD, this, FieldCode, AreaID, pwvStartPos ); } void GameSpaField::Ready( Player* pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos ) { DEBUG_CODE( GameZone * pEnterZone = NULL; MAPCODE EnterFieldCode = 0; eZONE_STATE eRoomState = pPlayer->GetGameZone( pEnterZone, EnterFieldCode ); ASSERT( !(eRoomState & ePRS_AT_ZONE) ); ); pPlayer->SetGameZone( ePRS_BEFORE_ENTER_SPA_FIELD, this, FieldCode, AreaID, pwvStartPos ); } BOOL GameSpaField::Join( Player * pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector * pwvStartPos ) { if (FALSE == (ePRS_BEFORE_ENTER_SPA_FIELD & pPlayer->GetGameZoneState())) { SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"] eRoomState[%d] ZoneType[%d]", pPlayer->GetGameZoneState(), GetZoneType() ); return FALSE; } SetZone( pPlayer, FieldCode, AreaID, pwvStartPos ); if (!GameZone::Join(pPlayer, FieldCode, AreaID, pwvStartPos)) { pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0 ); return FALSE; } // Çʵå Á¤Ã¥°ü·Ã ó¸® if (Policyment.FIELD & Policyment.ENABLE_SAVE_LOCATION) { pPlayer->SaveStartLocation(); } if (Policyment.FIELD & Policyment.ENABLE_TRIGGER) { GameField* pField = FindGameField(FieldCode); pField->GetTriggerManager()->MAP_STATE.SendInfo(pPlayer); } //Å»°Í ÇØÁ¦ pPlayer->Rider.Command_SummonRelease(IVehicleEvent::EnterField()); //ÇʵåÇÊÅÍ StatusManager* const status_manager = pPlayer->GetStatusManager(); status_manager->Status.On_FilterControl(FALSE, TRUE, check_filters_); // ÆêÀ» ¼ÒÈ¯ÇØÁ¦ ÇÑ´Ù. CPetManager& pet_manager = pPlayer->m_PetManager; pet_manager.ReturnPet(TRUE); return TRUE; } BOOL GameSpaField::MoveField( Player * pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector * pwvStartPos ) { DEBUG_CODE( eZONE_STATE eRoomState = pPlayer->GetGameZoneState(); ASSERT( (eRoomState & ePRS_BEFORE_ENTER_DOMINATION_FIELD) ); ); SetZone( pPlayer, FieldCode, AreaID, pwvStartPos ); if( !GameZone::Join( pPlayer, FieldCode, AreaID, pwvStartPos ) ) { pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0, NULL ); return FALSE; } if(Policyment.FIELD & Policyment.ENABLE_SAVE_LOCATION) { pPlayer->SaveStartLocation(); } if(Policyment.FIELD & Policyment.ENABLE_TRIGGER) { GameField* pField = FindGameField(FieldCode); pField->GetTriggerManager()->MAP_STATE.SendInfo(pPlayer); } return TRUE; } void GameSpaField::Leave( Player * pPlayer ) { StatusManager* const pStatusManager = pPlayer->GetStatusManager(); pStatusManager->Status.On_FilterControl( FALSE, FALSE, NULL ); if(Policyment.FIELD & Policyment.ENABLE_SAVE_LOCATION) { pPlayer->SaveStartLocation(); } GameZone::Leave(pPlayer); } void GameSpaField::LeaveForWarp( Player* pPlayer ) { //ÇʵåÇÊÅÍ StatusManager* const status_manager = pPlayer->GetStatusManager(); status_manager->Status.On_FilterControl(FALSE, TRUE, check_filters_); //À§Ä¡ÀúÀå if(Policyment.FIELD & Policyment.ENABLE_SAVE_LOCATION) { pPlayer->SaveStartLocation(); } GameZone::Leave(pPlayer); } BOOL GameSpaField::CanPVP( Player* pAttacker, Player* pTarget, OUT RC::eSKILL_RESULT* pErrCode ) { return FALSE; } BOOL GameSpaField::CanPVP( Player* pAttacker, Player* pTarget, OUT RC::eBATTLE_RESULT* pErrCode ) { return FALSE; } GameSpaField::~GameSpaField() { SAFE_DELETE(check_filters_); }