#include #include #include #include "EnemyCheck.h" #include "GMMemory.h" using namespace EnemyCheck; using namespace Creature; using namespace Siege; CCheckTable CCheckTable::ms_this; const unsigned char EnemyCheck::CFunctions::ms_AttackableTable[EnemyCheck::CFunctions::MAX_ATTACKABLE_CREATURE][EnemyCheck::CFunctions::MAX_ATTACKABLE_CREATURE] = { // ¾Æ·¡ ¼ýÀÚ´Â EnemyCheck::CFunctions::ReturnACT »ó¼ö Âü°í!! // PC, ¸ó½ºÅÍ, ¼º »ó¡¹°, ¼º¹®, ±æµå ¿ä»õ, °¡µå, ±Ù¹æ, ¿ø¹æ, ±Ù°ø, ¿ø°ø, ¼ö¼Û¼±, NONE { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, // PC { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ¸ó½ºÅÍ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ¼º »ó¡¹° { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ¼º¹® { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ±æµå ¿ä»õ { 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}, // °¡µå { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0}, // ±Ù°Å¸® ¼ö¼º º´±â { 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0}, // ¿ø°Å¸® ¼ö¼º º´±â (ºñ°øÁ¤ÀÌ ¹Ù´Ú¿¡ ÀÖÀ»¶§¸¸ 󸮴 ÀÌÈÄ¿¡ Ãß°¡ÇÑ´Ù.!!) { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, // ±Ù°Å¸® °ø¼º º´±â (ºñ°øÁ¤ÀÌ ¹Ù´Ú¿¡ ÀÖÀ»¶§¸¸ 󸮴 ÀÌÈÄ¿¡ Ãß°¡ÇÑ´Ù.!!) { 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0}, // ¿ø°Å¸® °ø¼º º´±â (ºñ°øÁ¤ÀÌ ¹Ù´Ú¿¡ ÀÖÀ»¶§¸¸ 󸮴 ÀÌÈÄ¿¡ Ãß°¡ÇÑ´Ù.!!) { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ¼ö¼Û¼± { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} // µÞ¹®, NPC, º´±â°ü¸®NPC } ; bool EnemyCheck::IsCamp(unsigned short wObjectType) { switch ( wObjectType ) { case Siege::CAMP: case Siege::CAMP_SHOP: case Siege::MINING_CAMP: case Siege::KARTERANT_WEAPON: case Siege::MERKADIA_WEAPON: return true; } return false; } bool EnemyCheck::IsCastleArms(unsigned short wObjectType) { switch ( wObjectType ) { case Siege::GUARD : case Siege::SHORT_RANGE_CASTLE_ARMS : case Siege::LONG_RANGE_CASTLE_ARMS : case Siege::EMBLEM: case Siege::GATE: return true; } return false; } bool EnemyCheck::IsCastleNPC(unsigned short wObjectType) { if ( Siege::CASTLE_ARMS_NPC == wObjectType ) { return true; } return false; } bool EnemyCheck::IsSiegeArms(unsigned short wObjectType) { switch ( wObjectType ) { case Siege::SHORT_RANGE_SIEGE_ARMS : case Siege::LONG_RANGE_SIEGE_ARMS : case Siege::AIRSHIP : return true; } return false; } bool EnemyCheck::IsEmblem(unsigned short wObjectType) { if(wObjectType==Siege::EMBLEM) { return true; } return false; } bool EnemyCheck::IsGate(unsigned short wObjectType) { if(wObjectType==Siege::GATE) { return true; } return false; } bool EnemyCheck::IsStruct(unsigned short wKind) { if (MonsterInfo::MIN_STATUE_KID <= wKind && MonsterInfo::MAX_STATUE_KID >= wKind) { return true; } return false; } bool EnemyCheck::CCheckTable::Initialize(void) { m_fnIsEnemy[EC_CHECK_ENEMY][RULE_HUNTING] = CFunctions::IsEnemyForHunting; m_fnIsEnemy[EC_CHECK_NEUTRAL_EXCETION][RULE_HUNTING] = CFunctions::IsNeutralExceptionForHunting; m_fnIsEnemy[EC_CHECK_FRIEND][RULE_HUNTING] = CFunctions::IsFriendForHunting; m_fnIsEnemy[EC_CHECK_FRIEND_2ND][RULE_HUNTING] = CFunctions::IsFriend2ndForHunting; m_fnIsEnemy[EC_CHECK_ENEMY][RULE_GUILD_WAR] = CFunctions::IsEnemyForGuildWar; m_fnIsEnemy[EC_CHECK_NEUTRAL_EXCETION][RULE_GUILD_WAR] = CFunctions::IsNeutralExceptionForGuildWar; m_fnIsEnemy[EC_CHECK_FRIEND][RULE_GUILD_WAR] = CFunctions::IsFriendForGuildWar; m_fnIsEnemy[EC_CHECK_FRIEND_2ND][RULE_GUILD_WAR] = CFunctions::IsFriend2ndForGuildWar; m_fnIsEnemy[EC_CHECK_ENEMY][RULE_REALM_WAR] = CFunctions::IsEnemyForRealmWar; m_fnIsEnemy[EC_CHECK_NEUTRAL_EXCETION][RULE_REALM_WAR] = CFunctions::IsNeutralExceptionForRealmWar; m_fnIsEnemy[EC_CHECK_FRIEND][RULE_REALM_WAR] = CFunctions::IsFriendForRealmWar; m_fnIsEnemy[EC_CHECK_FRIEND_2ND][RULE_REALM_WAR] = CFunctions::IsFriend2ndForRealmWar; m_fnIsEnemy[EC_CHECK_ENEMY][RULE_STATUE_WAR] = CFunctions::IsEnemyForStatueWar; m_fnIsEnemy[EC_CHECK_NEUTRAL_EXCETION][RULE_STATUE_WAR] = CFunctions::IsNeutralExceptionForStatueWar; m_fnIsEnemy[EC_CHECK_FRIEND][RULE_STATUE_WAR] = CFunctions::IsFriendForStatueWar; m_fnIsEnemy[EC_CHECK_FRIEND_2ND][RULE_STATUE_WAR] = CFunctions::IsFriend2ndForStatueWar; m_fnIsEnemy[EC_CHECK_ENEMY][RULE_SIEGE_WAR] = CFunctions::IsEnemyForSiegeWar; m_fnIsEnemy[EC_CHECK_NEUTRAL_EXCETION][RULE_SIEGE_WAR] = CFunctions::IsNeutralExceptionForSiegeWar; m_fnIsEnemy[EC_CHECK_FRIEND][RULE_SIEGE_WAR] = CFunctions::IsFriendForSiegeWar; m_fnIsEnemy[EC_CHECK_FRIEND_2ND][RULE_SIEGE_WAR] = CFunctions::IsFriend2ndForSiegeWar; m_fnCheckSkip[EC_CHECK_ENEMY] = CFunctions::IsEnemySkip; m_fnCheckSkip[EC_CHECK_NEUTRAL_EXCETION] = CFunctions::IsNeutralExceptionSkip; m_fnCheckSkip[EC_CHECK_FRIEND] = CFunctions::IsFriendSkip; m_fnCheckSkip[EC_CHECK_FRIEND_2ND] = CFunctions::IsFriend2ndSkip; m_bInit = true; return true; } unsigned long EnemyCheck::CCheckTable::IsEnemyFromStruct(BattleInclination::CharData& ownerInfo, BattleInclination::CharData& targetInfo, BattleInclination::RelationData& relationInfo, unsigned char& cResult) { if (false == m_bInit) { ERRLOG0(g_Log, "ÇǾƽĺ° ÇÔ¼ö Å×À̺íÀÌ ÃʱâÈ­µÇÁö ¾ÊÀº »óÅ¿¡¼­ ÇǾƽĺ°À» ½ÃµµÇÏ¿´½À´Ï´Ù."); return EC_ERROR; } if (MAX_RULE_NUM == m_eRule) { ERRLOG0(g_Log, "ÇǾƽĺ° ·êÀÌ °áÁ¤µÇÁö ¾ÊÀº »óÅ¿¡¼­ ÇǾƽĺ°À» ½ÃµµÇÏ¿´½À´Ï´Ù."); return EC_ERROR; } // ¼øÂ÷ÀûÀ¸·Î Àû¿ëµÈ´Ù. for (unsigned char cIndex = 0; cIndex < MAX_CHECK_TYPE; ++cIndex) { if (NULL != m_fnIsEnemy[cIndex][m_eRule]) { if (NULL != m_fnCheckSkip[cIndex] && true == m_fnCheckSkip[cIndex](ownerInfo, targetInfo, m_eRule)) { continue; } if (true == m_fnIsEnemy[cIndex][m_eRule](ownerInfo, targetInfo, relationInfo, cResult)) { return GetEnemyType(cIndex); } } } // Á߸³ ó¸® return EC_NEUTRAL; } unsigned long EnemyCheck::CCheckTable::GetEnemyType(unsigned char cEnemyCheckType) const { switch (cEnemyCheckType) { case EC_CHECK_ENEMY: return EC_ENEMY; case EC_CHECK_NEUTRAL_EXCETION: return EC_NEUTRAL; case EC_CHECK_FRIEND: return EC_FRIEND; case EC_CHECK_FRIEND_2ND: return EC_FRIEND; default: return EC_NEUTRAL; } return EC_NEUTRAL; } EnemyCheck::CCheckTable::CCheckTable() : m_bInit(false), m_eRule(MAX_RULE_NUM) { } EnemyCheck::CCheckTable::~CCheckTable() { } // Rodin : ±æµåÀü·ê Áß Àӽà ŻÅð¿ø¿¡ ´ëÇÑ Ã³¸® ÇÊ¿ä // ---------------------------------------------------------------------- // °øÅë DEFINE_ENEMY_CKECK(IsEnemyCommon) { if (relationInfo.m_cVSFlag & BattleInclination::VS_CHARACTER) { // ¸í½ÃÀû PvP·Î ¼±¾ðµÈ Àû (µà¾ó) cResult = EN_COMMON_PVP; return true; } if (Creature::STATELESS == targetInfo.m_cNation) { if (CT_MONSTER == targetInfo.m_cCreatureType) { // ¹«±¹Àû(Á¦3±¹) ¸ó½ºÅÍ cResult = EN_COMMON_STATELESS_MONSTER; return true; } } return false; } DEFINE_ENEMY_CKECK(IsNeutralExceptionCommon) { if (ownerInfo.m_dwCID != targetInfo.m_dwCID && true == targetInfo.IsGODMode()) { // »ó´ë°¡ º»ÀÎÀÌ ¾Æ´Ï¸ç G¸ðµåÀÏ °æ¿ì Á߸³ ó¸® cResult = NE_COMMON_GMODE; return true; } if (Creature::STATELESS != targetInfo.m_cNation && ownerInfo.m_cNation != targetInfo.m_cNation && (true == ownerInfo.IsPeaceMode() || true == targetInfo.IsPeaceMode())) { // »ó´ë°¡ º»ÀÎÀÌ ¾Æ´Ï¸ç G¸ðµåÀÏ °æ¿ì Á߸³ ó¸® cResult = NE_COMMON_GMODE; return true; } if (ownerInfo.m_cNation != targetInfo.m_cNation && Creature::STATELESS != targetInfo.m_cNation && CT_NPC == targetInfo.m_cCreatureType) { // »ó´ë ±¹ÀûÀÇ NPC cResult = NE_COMMON_ENEMY_NPC; return true; } return false; } DEFINE_ENEMY_CKECK(IsFriendCommon) { if (0 != ownerInfo.m_dwPID && 0 != targetInfo.m_dwPID) { if (ownerInfo.m_dwPID == targetInfo.m_dwPID) { // ¸í½ÃÀûÀ¸·Î ¼±¾ðµÈ °°Àº ÆÄƼ cResult = FR_COMMON_MYPARTY; return true; } } if (0 != ownerInfo.m_dwGID && 0 != targetInfo.m_dwGID) { if (ownerInfo.m_dwGID == targetInfo.m_dwGID) { // ¸í½ÃÀûÀ¸·Î ¼±¾ðµÈ °°Àº ±æµå cResult = FR_COMMON_MYGUILD; return true; } } if (ownerInfo.m_dwCID == targetInfo.m_dwCID) { // ÀÚ±â ÀڽŠcResult = FR_COMMON_MYSELF; return true; } return false; } DEFINE_ENEMY_CKECK(IsFriend2ndCommon) { if (ownerInfo.m_cNation == targetInfo.m_cNation) { if (CT_PC == targetInfo.m_cCreatureType || CT_NPC == targetInfo.m_cCreatureType) { // ÀÚ±¹ PC, NPC cResult = FR2_COMMON_MYNATION_PC_NPC; return true; } } if (Creature::STATELESS == targetInfo.m_cNation) { if (CT_NPC == targetInfo.m_cCreatureType) { // ¹«±¹Àû NPC cResult = FR2_COMMON_STATELESS_NPC; return true; } } return false; } // ---------------------------------------------------------------------- // ÇåÆÃ·ê DEFINE_ENEMY_CKECK(IsEnemyForHunting) { if (true == USE_ENEMY_CKECK(IsEnemyCommon)) { // °øÅë return true; } if(CT_SIEGE_OBJECT == ownerInfo.m_cCreatureType || CT_SIEGE_OBJECT == targetInfo.m_cCreatureType) return false; if (relationInfo.m_cVSFlag & BattleInclination::VS_PARTY || relationInfo.m_cVSFlag & BattleInclination::VS_GUILD) { // ¸í½ÃÀû ¼±¾ðÀ¸·Î ¼±¾ðµÈ ±×·ì µ¢¾î¸® (ÆÄƼ/±æµå µà¾ó) cResult = EN_HUNTING_VSPARTY_VSGUILD; return true; } if ( !ownerInfo.IsSafetyZone() && !targetInfo.IsSafetyZone()) { // ³»°¡ Àû´ë¸¦ ¼±¾ðÇ߰ųª »ó´ë·ÎºÎÅÍ Àû´ë¸¦ ¼±¾ð ¹ÞÀº °æ¿ì if (true == relationInfo.m_bHostileGuild) { // ÀڽŰú ´ë»óÀÌ ±æµåÀü¿¡ Âü¿©ÁßÀ̸ç Àû´ë °ü°è À϶§ cResult = EN_GUILDWAR_HOSTILITY_GUILD; return true; } } return false; } DEFINE_ENEMY_CKECK(IsNeutralExceptionForHunting) { if (true == USE_ENEMY_CKECK(IsNeutralExceptionCommon)) { // °øÅë return true; } // ÆÀ¹èƲ¿¡ Âü¿©ÁßÀÎ PC if (true == ownerInfo.IsTeamBattle()) { if (false == targetInfo.IsTeamBattle()) { // ÀüÅõ¿¡ Âü¿©ÇÏÁö ¾ÊÀº ¸ðµç Àοø cResult = NE_HUNTING_NON_BATTLER; return true; } if (!(relationInfo.m_cVSFlag & BattleInclination::VS_PARTY || relationInfo.m_cVSFlag & BattleInclination::VS_GUILD)) { // ÀڽŰú ´Ù¸¥ ÆÀ¹èƲ¿¡ Âü¿©ÁßÀÎ ¸ðµç Àοø cResult = NE_HUNTING_OTHER_BATTLER; return true; } } // ÆÀ¹èƲ¿¡ Âü¿©ÁßÀÌÁö ¾ÊÀº PC else { if (true == targetInfo.IsTeamBattle()) { // ÆÀ¹èƲ¿¡ Âü¿©ÁßÀÎ ¸ðµç Àοø cResult = NE_HUNTING_BATTLER; return true; } } return false; } DEFINE_ENEMY_CKECK(IsFriendForHunting) { if (true == USE_ENEMY_CKECK(IsFriendCommon)) { // °øÅë return true; } return false; } DEFINE_ENEMY_CKECK(IsFriend2ndForHunting) { if (true == USE_ENEMY_CKECK(IsFriend2ndCommon)) { // °øÅë return true; } return false; } // ---------------------------------------------------------------------- // ±æµåÀü·ê DEFINE_ENEMY_CKECK(IsEnemyForGuildWar) { if (true == USE_ENEMY_CKECK(IsEnemyCommon)) { // °øÅë return true; } // ±æµåÀüÀ϶§ ±æµå ¿ÀºêÁ§Æ®Àε¥ Á¾Á·ÀÌ ´Ù¸£¸é ¹«Á¶°Ç Àû´ë°ü°èÀÌ´Ù. if(CT_SIEGE_OBJECT == ownerInfo.m_cCreatureType || CT_SIEGE_OBJECT == targetInfo.m_cCreatureType) { // if (ownerInfo.m_cNation != targetInfo.m_cNation && Creature::STATELESS != targetInfo.m_cNation) if(ownerInfo.m_dwGID != targetInfo.m_dwGID) { // »ó´ë ±¹ÀûÀÇ PC, ¸ó½ºÅÍ, NPC cResult = EN_REALMWAR_ENEMY_PC_MONSTER_NPC; return true; } } /* // ÀÚ½ÅÀÌ ±æµåÀü Âü¿©ÀÚ if ( !ownerInfo.IsSafetyZone() && (Creature::WAR_ON == ownerInfo.m_cGuildWarFlag || Creature::WAR_INSTANCE == ownerInfo.m_cGuildWarFlag) ) { // ´ë»óÀÌ ±æµåÀü Âü¿©ÁßÀ϶§ if ( !targetInfo.IsSafetyZone() && (Creature::WAR_ON == targetInfo.m_cGuildWarFlag || Creature::WAR_INSTANCE == targetInfo.m_cGuildWarFlag) ) { // ³»°¡ Àû´ë¸¦ ¼±¾ðÇ߰ųª »ó´ë·ÎºÎÅÍ Àû´ë¸¦ ¼±¾ð ¹ÞÀº °æ¿ì if (true == relationInfo.m_bHostileGuild) { // ÀڽŰú ´ë»óÀÌ ±æµåÀü¿¡ Âü¿©ÁßÀ̸ç Àû´ë °ü°è À϶§ cResult = EN_GUILDWAR_HOSTILITY_GUILD; return true; } } if(!targetInfo.IsSafetyZone()) { // edith 2009.06.13 ±æµåÀü¿¡¼­´Â °°Àº ±æµå¸¦ Á¦¿ÜÇÏ°í ¸ðµÎ Àû if(targetInfo.m_cCreatureType == CT_PC) { if(ownerInfo.m_dwGID == targetInfo.m_dwGID) return USE_ENEMY_CKECK(IsEnemyForRealmWar); // ¿ìÈ£±æµå°¡¾Æ´Ò°æ¿ì ¹«Á¶°Ç Àû cResult = EN_GUILDWAR_HOSTILITY_GUILD; return true; } return USE_ENEMY_CKECK(IsEnemyForRealmWar); } } // ÀÚ½ÅÀÌ ±æµåÀü ¹ÌÂü¿©ÀÚ else if (Creature::WAR_OFF == ownerInfo.m_cGuildWarFlag) { if(!targetInfo.IsSafetyZone()) { // edith 2009.06.13 ±æµåÀü¿¡¼­´Â °°Àº ±æµå¸¦ Á¦¿ÜÇÏ°í ¸ðµÎ Àû if(targetInfo.m_cCreatureType == CT_PC) { if(ownerInfo.m_dwGID == targetInfo.m_dwGID) return USE_ENEMY_CKECK(IsEnemyForRealmWar); // ¿ìÈ£±æµå°¡¾Æ´Ò°æ¿ì ¹«Á¶°Ç Àû cResult = EN_GUILDWAR_HOSTILITY_GUILD; return true; } } // ÇåÆÃ·ê Àû¿ë return USE_ENEMY_CKECK(IsEnemyForRealmWar); } */ // ÀÚ½ÅÀÌ ±æµåÀü Âü¿©ÀÚ if ( !ownerInfo.IsSafetyZone() ) { // ´ë»óÀÌ ±æµåÀü Âü¿©ÁßÀ϶§ if ( !targetInfo.IsSafetyZone() ) { // ³»°¡ Àû´ë¸¦ ¼±¾ðÇ߰ųª »ó´ë·ÎºÎÅÍ Àû´ë¸¦ ¼±¾ð ¹ÞÀº °æ¿ì if (true == relationInfo.m_bHostileGuild) { // ÀڽŰú ´ë»óÀÌ ±æµåÀü¿¡ Âü¿©ÁßÀ̸ç Àû´ë °ü°è À϶§ cResult = EN_GUILDWAR_HOSTILITY_GUILD; return true; } // edith 2009.06.13 ±æµåÀü¿¡¼­´Â °°Àº ±æµå¸¦ Á¦¿ÜÇÏ°í ¸ðµÎ Àû if(targetInfo.m_cCreatureType == CT_PC) { if(ownerInfo.m_dwGID == targetInfo.m_dwGID) return USE_ENEMY_CKECK(IsEnemyForRealmWar); // ¿ìÈ£±æµå°¡¾Æ´Ò°æ¿ì ¹«Á¶°Ç Àû cResult = EN_GUILDWAR_HOSTILITY_GUILD; return true; } return USE_ENEMY_CKECK(IsEnemyForRealmWar); } } return false; } DEFINE_ENEMY_CKECK(IsNeutralExceptionForGuildWar) { if (true == USE_ENEMY_CKECK(IsNeutralExceptionCommon)) { // °øÅë return true; } // ÀÚ½ÅÀÌ ±æµåÀü Âü¿©ÀÚ if (Creature::WAR_ON == ownerInfo.m_cGuildWarFlag || Creature::WAR_INSTANCE == ownerInfo.m_cGuildWarFlag) { if ( ownerInfo.IsSafetyZone() ) { // ³»°¡ Àû´ë¸¦ ¼±¾ðÇ߰ųª »ó´ë·ÎºÎÅÍ Àû´ë¸¦ ¼±¾ð ¹ÞÀº °æ¿ì if (true == relationInfo.m_bHostileGuild) { // ³»°¡ ¼¼ÀÌÇÁƼ Á¸¿¡ ÀÖÀ» °æ¿ì ³ª¿Í Àû´ë °ü°èÀÎ ¸ðµç Àοø cResult = NE_GUILDWAR_IN_SAFETYZONE; return true; } } if (Creature::WAR_OFF == targetInfo.m_cGuildWarFlag) { // ±æµåÀü Âü¿©ÁßÀÌÁö ¾ÊÀº ¸ðµç Àοø cResult = NE_GUILDWAR_NON_BATTLER; return true; } if ( ownerInfo.m_dwGID != targetInfo.m_dwGID && (Creature::WAR_ON == targetInfo.m_cGuildWarFlag || Creature::WAR_INSTANCE == targetInfo.m_cGuildWarFlag) ) { // ÀÚ½ÅÀÇ ±æµå°¡ ¾Æ´Ñ ±æµåÀüÀï Âü¿©ÀÚ cResult = NE_GUILDWAR_OTHER_BATTLER; return true; } } // ÀÚ½ÅÀÌ ±æµåÀü ¹ÌÂü¿©ÀÚ else if (Creature::WAR_OFF == ownerInfo.m_cGuildWarFlag) { if (Creature::WAR_ON == targetInfo.m_cGuildWarFlag || Creature::WAR_INSTANCE == targetInfo.m_cGuildWarFlag) { // ±æµåÀü Âü¿©ÁßÀÎ ¸ðµç Àοø cResult = NE_GUILDWAR_BATTLER; return true; } // ÇåÆÃ·ê Àû¿ë return USE_ENEMY_CKECK(IsNeutralExceptionForRealmWar); } return false; } DEFINE_ENEMY_CKECK(IsFriendForGuildWar) { if (true == USE_ENEMY_CKECK(IsFriendCommon)) { // °øÅë return true; } // ÀÚ½ÅÀÌ ±æµåÀü Âü¿©ÀÚ if (Creature::WAR_ON == ownerInfo.m_cGuildWarFlag || Creature::WAR_INSTANCE == ownerInfo.m_cGuildWarFlag) { if (ownerInfo.m_dwGID == targetInfo.m_dwGID) { // ³»°¡ Âü¿©ÇÑ ±æµå ±×·ì cResult = FR_GUILDWAR_MYGUILD; return true; } } // ÀÚ½ÅÀÌ ±æµåÀü ¹ÌÂü¿©ÀÚ else if (Creature::WAR_OFF == ownerInfo.m_cGuildWarFlag) { // ÇåÆÃ·ê Àû¿ë return USE_ENEMY_CKECK(IsFriendForRealmWar); } return false; } DEFINE_ENEMY_CKECK(IsFriend2ndForGuildWar) { if (true == USE_ENEMY_CKECK(IsFriend2ndCommon)) { // °øÅë return true; } return false; } // ---------------------------------------------------------------------- // ·¼¸§Àü·ê DEFINE_ENEMY_CKECK(IsEnemyForRealmWar) { if (true == USE_ENEMY_CKECK(IsEnemyCommon)) { // °øÅë return true; } if(CT_SIEGE_OBJECT == ownerInfo.m_cCreatureType || CT_SIEGE_OBJECT == targetInfo.m_cCreatureType) return false; /* if (ownerInfo.m_cNation != targetInfo.m_cNation && Creature::STATELESS != targetInfo.m_cNation) { if (CT_PC == targetInfo.m_cCreatureType || CT_MONSTER == targetInfo.m_cCreatureType || CT_NPC == targetInfo.m_cCreatureType) { // »ó´ë ±¹ÀûÀÇ PC, ¸ó½ºÅÍ, NPC cResult = EN_REALMWAR_ENEMY_PC_MONSTER_NPC; return true; } } */ if ( !ownerInfo.IsSafetyZone() && !targetInfo.IsSafetyZone()) { if (ownerInfo.m_cNation != targetInfo.m_cNation && Creature::STATELESS != targetInfo.m_cNation) { if (CT_PC == targetInfo.m_cCreatureType || CT_MONSTER == targetInfo.m_cCreatureType || CT_NPC == targetInfo.m_cCreatureType) { // »ó´ë ±¹ÀûÀÇ PC, ¸ó½ºÅÍ, NPC cResult = EN_REALMWAR_ENEMY_PC_MONSTER_NPC; return true; } } // ³»°¡ Àû´ë¸¦ ¼±¾ðÇ߰ųª »ó´ë·ÎºÎÅÍ Àû´ë¸¦ ¼±¾ð ¹ÞÀº °æ¿ì if (true == relationInfo.m_bHostileGuild) { // ÀڽŰú ´ë»óÀÌ ±æµåÀü¿¡ Âü¿©ÁßÀ̸ç Àû´ë °ü°è À϶§ cResult = EN_GUILDWAR_HOSTILITY_GUILD; return true; } } return false; } DEFINE_ENEMY_CKECK(IsNeutralExceptionForRealmWar) { if (true == USE_ENEMY_CKECK(IsNeutralExceptionCommon)) { // °øÅë return true; } if (ownerInfo.m_cNation != targetInfo.m_cNation) { if (CT_STRUCT == targetInfo.m_cCreatureType) { // ÀڽŰú ´Ù¸¥ ±¹ÀûÀÇ ¼®»ó ½ºÆ®·°ÃÄ cResult = NE_REALMWAR_ENEMY_STRUCT; return true; } if (IsGate(targetInfo.m_wObjectType) || IsEmblem(targetInfo.m_wObjectType) || IsSiegeArms(targetInfo.m_wObjectType)) { // »ó´ë ±¹ÀûÀÇ ¼º³» ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, ¼ÒȯÇÑ °ø¼º º´±â. cResult = NE_REALMWAR_ENEMY_GATE_EMBLEM_SIEGEOBJECT; return true; } } return false; } DEFINE_ENEMY_CKECK(IsFriendForRealmWar) { if (true == USE_ENEMY_CKECK(IsFriendCommon)) { // °øÅë return true; } if (ownerInfo.m_cNation == targetInfo.m_cNation) { if (CT_PC == targetInfo.m_cCreatureType || CT_NPC == targetInfo.m_cCreatureType || CT_MONSTER == targetInfo.m_cCreatureType || CT_STRUCT == targetInfo.m_cCreatureType) { // ÀÚ±¹ ±¹ÀûÀÇ PC, NPC, ¸ó½ºÅÍ, ¼®»ó cResult = FR_REALMWAR_MYNATION_PC_NPC_MONSTER_STRUCT; return true; } if (IsGate(targetInfo.m_wObjectType) || IsEmblem(targetInfo.m_wObjectType) || IsSiegeArms(targetInfo.m_wObjectType)) { // ÀÚ±¹ ±¹ÀûÀÇ ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, °ø¼º º´±â. cResult = FR_REALMWAR_MYNATION_GATE_EMBLEM_SIEGEOBJECT; return true; } } return false; } DEFINE_ENEMY_CKECK(IsFriend2ndForRealmWar) { if (true == USE_ENEMY_CKECK(IsFriend2ndCommon)) { // °øÅë return true; } return false; } // ---------------------------------------------------------------------- // ¼®»óÀü·ê DEFINE_ENEMY_CKECK(IsEnemyForStatueWar) { if (true == USE_ENEMY_CKECK(IsEnemyCommon)) { // °øÅë return true; } if (ownerInfo.m_cNation != targetInfo.m_cNation) { if (Creature::STATELESS != targetInfo.m_cNation) { if (CT_PC == targetInfo.m_cCreatureType || CT_MONSTER == targetInfo.m_cCreatureType || CT_STRUCT == targetInfo.m_cCreatureType) { // »ó´ë ±¹ÀûÀÇ PC, ¸ó½ºÅÍ, ½ºÆ®·°Ã³ cResult = EN_STATUEWAR_ENEMY_PC_MONSTER_STRUCT; return true; } } else { if (CT_STRUCT == targetInfo.m_cCreatureType) { // Á¦ 3±¹Àû ½ºÆ®·°Ã³ cResult = EN_STATUEWAR_STATELESS_STRUCT; return true; } } } return false; } DEFINE_ENEMY_CKECK(IsNeutralExceptionForStatueWar) { if (true == USE_ENEMY_CKECK(IsNeutralExceptionCommon)) { // °øÅë return true; } if (ownerInfo.m_cNation != targetInfo.m_cNation) { if (IsGate(targetInfo.m_wObjectType) || IsEmblem(targetInfo.m_wObjectType) || IsSiegeArms(targetInfo.m_wObjectType)) { // »ó´ë ±¹ÀûÀÇ ¼º³» ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, ¼ÒȯÇÑ °ø¼º º´±â. cResult = NE_STATUEWAR_ENEMY_GATE_EMBLEM_SIEGEOBJECT; return true; } } return false; } DEFINE_ENEMY_CKECK(IsFriendForStatueWar) { if (true == USE_ENEMY_CKECK(IsFriendCommon)) { // °øÅë return true; } if (ownerInfo.m_cNation == targetInfo.m_cNation) { if (CT_PC == targetInfo.m_cCreatureType || CT_NPC == targetInfo.m_cCreatureType || CT_MONSTER == targetInfo.m_cCreatureType || CT_STRUCT == targetInfo.m_cCreatureType) { // ÀÚ±¹ ±¹ÀûÀÇ PC, NPC, ¸ó½ºÅÍ, ¼®»ó cResult = FR_STATUEWAR_MYNATION_PC_NPC_MONSTER_STRUCT; return true; } if (IsGate(targetInfo.m_wObjectType) || IsEmblem(targetInfo.m_wObjectType) || IsSiegeArms(targetInfo.m_wObjectType)) { // ÀÚ±¹ ±¹ÀûÀÇ ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, °ø¼º º´±â. cResult = FR_STATUEWAR_MYNATION_GATE_EMBLEM_SIEGEOBJECT; return true; } } return false; } DEFINE_ENEMY_CKECK(IsFriend2ndForStatueWar) { if (true == USE_ENEMY_CKECK(IsFriend2ndCommon)) { // °øÅë return true; } return false; } // ---------------------------------------------------------------------- // °ø¼ºÀü·ê DEFINE_ENEMY_CKECK(IsEnemyForSiegeWar) { if (true == USE_ENEMY_CKECK(IsEnemyCommon)) { // °øÅë return true; } if (ownerInfo.m_cNation != targetInfo.m_cNation) { if (CT_PC == targetInfo.m_cCreatureType || CT_MONSTER == targetInfo.m_cCreatureType) { // »ó´ë ±¹ÀûÀÇ PC, ¸ó½ºÅÍ. cResult = EN_SIEGE_ENEMY_PC_MONSTER; return true; } if (IsCastleArms(targetInfo.m_wObjectType)) { // »ó´ë ±¹ÀûÀÇ ¼º¹®, ¼º »ó¡¹°, ¼ö¼º º´±â cResult = EN_SIEGE_ENEMY_GATE_EMBLEM_CASTLE_ARMS; return true; } if(IsSiegeArms(targetInfo.m_wObjectType)) { // »ó´ë ±¹ÀûÀÌ ¼ÒȯÇÑ °ø¼º º´±â. cResult = EN_SIEGE_ENEMY_SIEGE_ARMS; return true; } } return false; } DEFINE_ENEMY_CKECK(IsNeutralExceptionForSiegeWar) { if (true == USE_ENEMY_CKECK(IsNeutralExceptionCommon)) { // °øÅë return true; } if (ownerInfo.m_cNation != targetInfo.m_cNation) { if (CT_STRUCT == targetInfo.m_cCreatureType) { // ÀڽŰú ´Ù¸¥ ±¹ÀûÀÇ ¼®»ó ½ºÆ®·°ÃÄ cResult = NE_SIEGE_ENEMY_STRUCT; return true; } } return false; } DEFINE_ENEMY_CKECK(IsFriendForSiegeWar) { if (true == USE_ENEMY_CKECK(IsFriendCommon)) { // °øÅë return true; } if (ownerInfo.m_cNation == targetInfo.m_cNation) { if (CT_PC == targetInfo.m_cCreatureType || CT_NPC == targetInfo.m_cCreatureType || CT_MONSTER == targetInfo.m_cCreatureType || CT_STRUCT == targetInfo.m_cCreatureType) { // ÀÚ±¹ ±¹ÀûÀÇ PC, NPC, ¸ó½ºÅÍ, ¼®»ó cResult = FR_SIEGEWAR_MYNATION_PC_NPC_MONSTER_STRUCT; return true; } if (IsSiegeArms(targetInfo.m_wObjectType) || IsCastleArms(targetInfo.m_wObjectType) || IsCastleNPC(targetInfo.m_wObjectType)) { // ÀÚ±¹ ±¹ÀûÀÇ ¼Òȯ¹°, ¼ºÀÇ ´ë¹®, ¼ö¼º º´±â, °ø¼º º´±â. cResult = FR_SIEGEWAR_MYNATION_SIEGEOBJECT; return true; } } return false; } DEFINE_ENEMY_CKECK(IsFriend2ndForSiegeWar) { if (true == USE_ENEMY_CKECK(IsFriend2ndCommon)) { // °øÅë return true; } return false; } // ---------------------------------------------------------------------- // ÇǾƽĺ° ½ºÅµ üũ DEFINE_SKIP_CHECK(IsEnemySkip) { if (true == targetInfo.IsGODMode()) { // »ó´ë°¡ G¸ðµåÀÎ °æ¿ì Àû½Äº° ½ºÅµ return true; } if (CT_PC == targetInfo.m_cCreatureType && (true == ownerInfo.IsPeaceMode() || true == targetInfo.IsPeaceMode())) { // »ó´ë°¡ ÆòÈ­¸ðµåÀÏ °æ¿ì Àû½Äº° ½ºÅµ return true; } if (false == IsAttackable(ownerInfo, targetInfo)) { // »ó´ë°¡ °ø°ÝÇÒ ¼ö ¾ø´Â Å©¸®ÃĶó¸é Àû½Äº° ½ºÅµ return true; } if (RULE_REALM_WAR == eRule || RULE_STATUE_WAR == eRule) { // ÀÚ½ÅÀÌ °ø¼º¿ë ¿ÀºêÁ§Æ®¿¡ ž½ÂÇÑ °æ¿ì Àû½Äº° ½ºÅµ if (ownerInfo.m_cRide) { if (ownerInfo.IsCastleObject() || IsSiegeArms(ownerInfo.m_wObjectType)) { return true; } } } return false; } DEFINE_SKIP_CHECK(IsNeutralExceptionSkip) { if (ownerInfo.m_cNation == targetInfo.m_cNation && Creature::STATELESS != targetInfo.m_cNation && CT_NPC == targetInfo.m_cCreatureType) { // ÀÚ±¹ NPC ÀÇ °æ¿ì´Â Á߸³ ¿¹¿Üó¸® ½ºÅµ return true; } if (RULE_REALM_WAR == eRule || RULE_STATUE_WAR == eRule) { // ÀÚ½ÅÀÌ °ø¼º¿ë ¿ÀºêÁ§Æ®¿¡ ž½ÂÇÑ °æ¿ì Á߸³ ¿¹¿Üó¸® ½ºÅµ if (ownerInfo.m_cRide) { if (ownerInfo.IsCastleObject() || IsSiegeArms(ownerInfo.m_wObjectType)) { return true; } } } return false; } DEFINE_SKIP_CHECK(IsFriendSkip) { return false; } DEFINE_SKIP_CHECK(IsFriend2ndSkip) { return false; } // ---------------------------------------------------------------------- // ÇǾƽĺ° ½ºÅµ üũ DEFINE_ATTACKABLE_CHECK(IsAttackable) { unsigned char cOwnerType = FindAttackableCreatureType(ownerInfo); unsigned char cTargetType = FindAttackableCreatureType(targetInfo); if (RET_ALLWAYS == ms_AttackableTable[cOwnerType][cTargetType]) { return true; } else if (RET_DEVELOPING == ms_AttackableTable[cOwnerType][cTargetType] && Siege::DEVELOPING == targetInfo.m_cSiegeState) { return true; } return false; } unsigned char EnemyCheck::CFunctions::FindAttackableCreatureType(BattleInclination::CharData& charInfo) { unsigned char cType = ACT_NONE; switch (charInfo.m_cCreatureType) { case CT_PC: cType = ACT_PC; break; case CT_NPC: cType = ACT_NONE; break; case CT_MONSTER: case CT_SUMMON: case CT_STRUCT: cType = ACT_MONSTER; break; case CT_SIEGE_OBJECT: { switch (charInfo.m_wObjectType) { case Siege::EMBLEM: cType = ACT_EMBLEM; break; case Siege::GATE: cType = ACT_GATE; break; case Siege::CAMP: case Siege::MINING_CAMP: case Siege::CAMP_SHOP: case Siege::KARTERANT_WEAPON: case Siege::MERKADIA_WEAPON: cType = ACT_CAMP; break; case Siege::BACKDOOR: case Siege::CASTLE_ARMS_NPC: cType = ACT_NONE; break; case Siege::GUARD: cType = ACT_GUARD; break; case Siege::SHORT_RANGE_CASTLE_ARMS: cType = ACT_SHORT_RANGE_CASTLE_ARMS; break; case Siege::LONG_RANGE_CASTLE_ARMS: cType = ACT_LONG_RANGE_CASTLE_ARMS; break; case Siege::SHORT_RANGE_SIEGE_ARMS: cType = ACT_SHORT_RANGE_SIEGE_ARMS; break; case Siege::LONG_RANGE_SIEGE_ARMS: cType = ACT_LONG_RANGE_SIEGE_ARMS; break; case Siege::AIRSHIP: cType = ACT_AIRSHIP; break; } break; } } return cType; }