#include "StdAfx.h" #include ".\GameHuntingField.h" #include "Player.h" #include "Map.h" #include #include "UnitRegenInfoManager.h" #include "ResrcManager.h" __IMPL_CUSTOMPOOL_PTR(GameHuntingField) GameHuntingField::GameHuntingField(void) : FieldPvPRule(PTA_PK_TILE | PTA_CONFLICT_TILE | PTA_FREE_CONFLICT_TILE | PTA_SAFETY_ZONE) //_NA001415_091123_CHANGE_MOB_AI_IN_SAFETY_AREA_ { } GameHuntingField::~GameHuntingField(void) { } void GameHuntingField::OnCreate() { ChangeHandler( eZONETYPE_FIELD ); GameZone::OnCreate(); } void GameHuntingField::OnDestroy() { } VOID GameHuntingField::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_FIELD, this, FieldCode, AreaID, pwvStartPos ); } void GameHuntingField::SetZone( Object *pObject, MAPCODE FieldCode, WzID AreaID, WzVector * pwvStartPos ) { pObject->SetGameZone( ePRS_AT_FIELD, this, FieldCode, AreaID, pwvStartPos ); } BOOL GameHuntingField::Join( Player * pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector * pwvStartPos ) { if( !( pPlayer->GetGameZoneState() & ePRS_BEFORE_ENTER_FIELD ) ) { SUNLOG( eCRITICAL_LOG, "[SusunLove] GameHuntingField::Join 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; } pPlayer->SaveStartLocation(); return TRUE; } BOOL GameHuntingField::MoveField( Player * pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector * pwvStartPos ) { DEBUG_CODE( eZONE_STATE eRoomState = pPlayer->GetGameZoneState(); ASSERT( (eRoomState & ePRS_BEFORE_ENTER_FIELD) ); ); SetZone( pPlayer, FieldCode, AreaID, pwvStartPos ); if( !GameZone::Join( pPlayer, FieldCode, AreaID, pwvStartPos ) ) { pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0, NULL ); return FALSE; } pPlayer->SaveStartLocation(); return TRUE; } VOID GameHuntingField::Leave( Player * pPlayer ) { pPlayer->SaveStartLocation(); GameZone::Leave( pPlayer ); } VOID GameHuntingField::GetArea( GameField* pField, Player* pPlayer, MAPCODE FieldCode, WzID& AreaID, WzVector& rwvStartPos ) { const sMAPINFO* pMAPINFO = MapInfoParser::Instance()->FindMapInfo( FieldCode ); eZONETYPE ztZONE = (eZONETYPE)pMAPINFO->byMKind; if( eZONETYPE_TUTORIAL_FIELD == ztZONE ) { // AreaID : WzID --> ÀÌ °ªÀ» °íÁ¤¼³Á¤ÇÏÀÚ. ÇØ´ç ¸Ê Á¤º¸¸¦ Àоîµé¿©¼­ // GetFixedStartArea... eCHAR_TYPE eCharType = pPlayer->GetCharType(); switch( eCharType ) { case eCHAR_BERSERKER: AreaID = CharToWzID( 'S', 'T', 'R', '0' ); break; case eCHAR_DRAGON: AreaID = CharToWzID( 'S', 'T', 'R', '1' ); break; case eCHAR_SHADOW: AreaID = CharToWzID( 'S', 'T', 'R', '2' ); break; case eCHAR_VALKYRIE: AreaID = CharToWzID( 'S', 'T', 'R', '3' ); break; case eCHAR_ELEMENTALIST: //eCHAR_MAGICIAN AreaID = CharToWzID( 'S', 'T', 'R', '4' ); break; case eCHAR_MYSTIC: // _NA_004965_20120613_NEW_CHARACTER_MYSTIC AreaID = CharToWzID('S', 'T', 'R', '5'); break; case eCHAR_HELLROID: //_NA_000000_20130812_NEW_CHARACTER_HELLROID AreaID = CharToWzID('S', 'T', 'R', '6'); break; #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE case eCHAR_WITCHBLADE: //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE AreaID = CharToWzID('S', 'T', 'R', '7'); break; #endif //_NA_007514_20140828_NEW_CHARACTER_WITCHBLADE //case eCHAR_BERSERKER: // AreaID = CharToWzID( 'E', 'N', 'T', '1' ); // break; //case eCHAR_DRAGON: // AreaID = CharToWzID( 'E', 'N', 'T', '1' ); // break; //case eCHAR_SHADOW: // AreaID = CharToWzID( 'E', 'N', 'T', '2' ); // break; //case eCHAR_VALKYRIE: // AreaID = CharToWzID( 'E', 'N', 'T', '3' ); // break; //case eCHAR_ELEMENTALIST: //eCHAR_MAGICIAN // AreaID = CharToWzID( 'E', 'N', 'T', '4' ); // break; } //pZone->GetFixedStartingVector( (BYTE)eCharType ); } pField->GetAreaRandomStartingVector(AreaID, rwvStartPos); } struct AREA_DESTPOS { float m_fDistance; WzVector m_vDestPos; }; bool AreaSortComp( const AREA_DESTPOS & AreaPos1, const AREA_DESTPOS & AreaPos2 ) { // °Å¸®°¡ °¡±î¿î ÂÊÀÌ ¼øÀ§°¡ ³ô´Ù. if( AreaPos1.m_fDistance < AreaPos2.m_fDistance ) return true; else return false; } RC::eSTATUS_RESULT GameHuntingField::ResurrectionAtSafezone( Player *pPlayer ) { //Á×Àº»óŰ¡ ¾Æ´Ï¸é ¸®ÅÏÇÑ´Ù. if( pPlayer->IsAlive() ) return RC::RC_STATUS_CHAR_IS_ALIVE; GameField *pField = pPlayer->GetField(); if( !pField ) return RC::RC_STATUS_FIELD_IS_NULL; DWORD dwAreaID = 0; WzVector vCurPos, vDestPos; pPlayer->GetPos( &vCurPos ); static STLX_LIST m_listSortArea; m_listSortArea.clear(); TCHAR tszWzID[MAX_AREA_ID_LENGTH+1]; for( int i = 0; i < m_pMAPINFO->byENTCount; i++ ) { _sntprintf( tszWzID, MAX_AREA_ID_LENGTH, "ENT%d", i+1 ); tszWzID[MAX_AREA_ID_LENGTH] = '\0'; if( pField->GetAreaRandomStartingVector( StrToWzID( tszWzID ), vDestPos ) ) { AREA_DESTPOS AreaDestPos; AreaDestPos.m_vDestPos = vDestPos; AreaDestPos.m_fDistance = VectorLength( &(vDestPos - vCurPos) ); m_listSortArea.push_back( AreaDestPos ); } } m_listSortArea.sort( AreaSortComp ); vDestPos = m_listSortArea.begin()->m_vDestPos; // ½ÃÀÛÀ§Ä¡·Î ÅÚ·¹Æ÷Æ® ½ÃŲÈÄ if( !pField->TeleportObject( pPlayer, &vDestPos ) ) return RC::RC_STATUS_TELEPORT_FAIL; if( !pPlayer->OnResurrection( 0, 0.15f, 0.15f ) ) { return RC::RC_STATUS_RESURRECTION_FAIL; } return RC::RC_STATUS_SUCCESS; } BOOL GameHuntingField::CanPVP( Player* pAttacker, Player* pTarget, OUT RC::eSKILL_RESULT* pErrCode ) { return FieldPvPRule.CanPVP(pAttacker,pTarget,pErrCode); } BOOL GameHuntingField::CanPVP( Player* pAttacker, Player* pTarget, OUT RC::eBATTLE_RESULT* pErrCode ) { return FieldPvPRule.CanPVP(pAttacker,pTarget,pErrCode); } eUSER_RELATION_TYPE GameHuntingField::IsFriendPVP( Player* pAttacker,Player* pTarget ) { return FieldPvPRule.IsFriendPVP(pAttacker,pTarget); } //_NA_008706_20160229_TEXTLOG_PK VOID GameHuntingField::KillPlayer( Player* pAttacker, Player* pDeadPlayer, BOOL bSummoned, DAMAGETYPE damage_value /*= 0*/ ) { FieldPvPRule.KillPlayer(pAttacker,pDeadPlayer,bSummoned, damage_value); } BOOL GameHuntingField::IsPvPAtt( Player* pPlayer, WORD PTATroubld) { return FieldPvPRule.IsPvPAtt(pPlayer, PTATroubld); }