//0051dcd0 -> BOOL CObjBaseAttack::PkCheck(LPOBJ lpObj, LPOBJ lpTargetObj) { if ( gLanguage == 0 || gLanguage == 2 || gLanguage == 4) { if ( lpObj->Type == OBJ_USER ) { BOOL bPlayerKiller = FALSE; //Season 2.5 add-on if(lpObj->PartyNumber >= 0) //Season 2.5 add-on { if(gParty.GetPKPartyPenalty(lpObj->PartyNumber) >= 6) { bPlayerKiller = TRUE; } } else if(lpObj->m_PK_Level >= 6) { bPlayerKiller = TRUE; } if(bPlayerKiller == TRUE) //Season 2.5 add-on { if (lpObj->PartyNumber >= 0 ) { if ( gPkLimitFree == FALSE ) { return FALSE; } } else if ( lpObj->m_PK_Count >= 3 ) { if ( gPkLimitFree == FALSE ) { return FALSE; } } } } } if ( lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_USER) { if ( lpTargetObj->Level <= 5 || lpObj->Level <= 5 ) { return FALSE; } if ( gObjGetRelationShip(lpObj, lpTargetObj) == 2 ) // Rivals { if ( gNonPK == FALSE ) { return TRUE; } } if ( lpObj->lpGuild != NULL && lpTargetObj->lpGuild != NULL ) { if ( lpObj->lpGuild->WarState == 1 && lpTargetObj->lpGuild->WarState == 1 ) { if ( lpObj->lpGuild->Number == lpTargetObj->lpGuild->Number ) { return FALSE; } } } if ( gObjTargetGuildWarCheck(lpObj, lpTargetObj) == FALSE && lpTargetObj->lpGuild != NULL && lpTargetObj->lpGuild->WarState != 0) { if ( lpTargetObj->lpGuild->WarType == 1 ) { if ( lpTargetObj->MapNumber != 6 ) { if ( !gNonPK ) { return TRUE; } } } if ( CC_MAP_RANGE(lpTargetObj->MapNumber) == FALSE ) { return FALSE; } } if ( IT_MAP_RANGE(lpObj->MapNumber) != FALSE ) //season2.5 add-on { // } else if ( CC_MAP_RANGE(lpObj->MapNumber) != FALSE ) { if ( g_ChaosCastle.GetCurrentState(g_ChaosCastle.GetChaosCastleIndex(lpObj->MapNumber)) != 2 ) { return FALSE; } } else if ( gNonPK != FALSE ) { return FALSE; } if ( DS_MAP_RANGE(lpObj->MapNumber) ) // DEvil { return FALSE; } if ( BC_MAP_RANGE(lpObj->MapNumber) ) { return FALSE; } if ( gObjDuelCheck(lpObj, lpTargetObj) == FALSE ) { if ( gObjDuelCheck(lpTargetObj) ) { return FALSE; } } if ( gLanguage == 0 || gLanguage == 2 ) { BOOL bPlayerKiller = FALSE; //Season 2.5 add-on if(lpObj->PartyNumber >= 0) //Season 2.5 add-on { if(gParty.GetPKPartyPenalty(lpObj->PartyNumber) >= 6) { bPlayerKiller = TRUE; } } else if(lpObj->m_PK_Level >= 6) { bPlayerKiller = TRUE; } if(bPlayerKiller == TRUE) //Season 2.5 add-on { if (lpObj->PartyNumber >= 0 ) { if ( gPkLimitFree == FALSE ) { return FALSE; } } else if ( lpObj->m_PK_Count >= 3 ) { if ( gPkLimitFree == FALSE ) { return FALSE; } } } bPlayerKiller = FALSE; //Season 2.5 add-on if(lpTargetObj->PartyNumber >= 0) //Season 2.5 add-on { if(gParty.GetPKPartyPenalty(lpTargetObj->PartyNumber) >= 6) { bPlayerKiller = TRUE; } } else if(lpTargetObj->m_PK_Level >= 6) { bPlayerKiller = TRUE; } if(bPlayerKiller == 1) //Season 2.5 add-on { if (lpTargetObj->PartyNumber >= 0 ) { if ( gPkLimitFree == FALSE ) { if(g_CastleSiege.GetCastleState() != CASTLESIEGE_STATE_STARTSIEGE) { return FALSE; } } } else if ( lpTargetObj->m_PK_Count >= 3 ) { if ( gPkLimitFree == FALSE ) { if(g_CastleSiege.GetCastleState() != CASTLESIEGE_STATE_STARTSIEGE) { return FALSE; } } } } } } return TRUE; }
BOOL CDarkSpirit::Attack(LPOBJ lpObj, LPOBJ lpTargetObj, CMagicInf * lpMagic, int criticaldamage, int iActionType) { int skillSuccess = 0; LPOBJ lpCallObj; LPOBJ lpCallTargetObj; int MsgDamage = 0; int ManaChange = 0; int iTempShieldDamage = 0; int iTotalShieldDamage = 0; if ( (lpTargetObj->Authority&2) == 2 ) return FALSE; if ( lpObj->MapNumber != lpTargetObj->MapNumber ) return FALSE; #if (__GENS_SYSTEM__ == 1) if (gGensSystem.GetFriendlyFire() && gGensSystem.GensMap(lpObj->MapNumber)) { if (lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_USER && lpObj->m_GensInfo.btFamily == lpTargetObj->m_GensInfo.btFamily) { return false; } } #endif if ( IF_MAP_RANGE(lpObj->MapNumber) && !g_ImperialGuardian.IsAttackAbleMonster(lpTargetObj->m_Index) ) return FALSE; if ( lpObj->MapNumber == MAP_INDEX_PKFIELD && lpObj->m_iDuelUser == -1) return FALSE; #if (GS_CASTLE == 1) if(g_Crywolf.GetCrywolfState() == CRYWOLF_STATE_READY || g_Crywolf.GetCrywolfState() == CRYWOLF_STATE_END) { if( ((lpTargetObj->MapNumber == MAP_INDEX_CRYWOLF_FIRSTZONE) ? TRUE : FALSE) && lpTargetObj->Type == OBJ_MONSTER) { return FALSE; } } #endif int skill = 0; if ( lpMagic ) skill = lpMagic->m_Skill; skillSuccess = TRUE; if ( lpObj->GuildNumber > 0 ) { if ( lpObj->lpGuild ) { if ( lpObj->lpGuild->WarState ) { if ( lpObj->lpGuild->WarType == 1 ) { if ( !GetBattleSoccerGoalMove(0) ) { return TRUE; } } } } } if ( lpTargetObj->Type == OBJ_MONSTER ) { if ( lpTargetObj->Class == 200 ) { if ( skill ) { gObjMonsterStateProc(lpTargetObj, 7, lpObj->m_Index, 0); } else { gObjMonsterStateProc(lpTargetObj, 6, lpObj->m_Index, 0); } return TRUE; } } if ( lpObj->Type == OBJ_USER ) { if ( !gObjIsConnected(lpObj)) { return FALSE; } } if ( lpTargetObj->Type == OBJ_USER ) { if ( !gObjIsConnected(lpTargetObj)) { return FALSE; } } if ( lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_MONSTER ) // PLAYER VS MONSTER { if ( lpObj->m_RecallMon >= 0 ) { if ( lpObj->m_RecallMon == lpTargetObj->m_Index ) { return FALSE; } } } if ( !gObjAttackQ(lpTargetObj)) return FALSE; #if (ENABLETEST_ARCA == 1) if ( g_ArcaBattle.IsArcaBattleServer() && !g_AcheronGuardianEvent.IsPlayStart() && !g_ArcaBattle.IsEnableAttackObelisk(*lpObj, lpTargetObj->Class)) return 0; #endif #if (GS_CASTLE == 1) if ( g_CastleSiege.GetCastleState() == CASTLESIEGE_STATE_STARTSIEGE && lpObj->m_btCsJoinSide > 0 && lpObj->m_btCsJoinSide == lpTargetObj->m_btCsJoinSide) { return FALSE; } #endif if ( this->CheckAttackArea(lpObj, lpTargetObj) == FALSE ) return FALSE; lpCallObj = lpObj; lpCallTargetObj = lpTargetObj; if ( lpTargetObj->Type == OBJ_MONSTER ) { if ( lpTargetObj->m_RecallMon >= 0 ) { lpCallTargetObj = &gObj[lpTargetObj->m_RecallMon]; } } if ( this->PkCheck(lpCallObj, lpTargetObj) == FALSE ) return FALSE; int Strength = lpObj->Strength + lpObj->AddStrength; int Dexterity = lpObj->Dexterity + lpObj->AddDexterity; int Vitality = lpObj->Vitality + lpObj->AddVitality; int Energy = lpObj->Energy + lpObj->AddEnergy; BOOL bIsOnDuel = gObjDuelCheck(lpObj, lpTargetObj); #if (CUSTOM_OLYMP!=1) if ( bIsOnDuel ) { lpObj->m_iDuelTickCount = GetTickCount(); lpTargetObj->m_iDuelTickCount = GetTickCount(); } #endif int MSBFlag = 0; if ( criticaldamage == 1 ) { MsgDamage = 3; } else if( criticaldamage == 2 ) { MsgDamage = 2; } else { MsgDamage = 0; } BOOL bAllMiss = FALSE; int AttackDamage = 0; if ( g_ShieldSystemOn == TRUE ) { if ( lpObj->Type == OBJ_USER && lpTargetObj->Type == OBJ_USER ) { if ( !this->MissCheckPvP(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) ) { return FALSE; } } else if ( !this->MissCheck(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) ) { return FALSE; } } else if ( !this->MissCheck(lpObj, lpTargetObj, skill, skillSuccess, bAllMiss) ) { return FALSE; } int targetdefense = this->GetTargetDefense(lpObj, lpTargetObj, MsgDamage); if( targetdefense > 0 ) { float fpercent = rand()%100; if( fpercent < lpObj->m_MPSkillOpt.MpsDarkSpiritStr6 ) { targetdefense = 0; MsgDamage = 1; } } AttackDamage = this->GetAttackDamage(lpObj, targetdefense, bIsOnDuel, criticaldamage,(criticaldamage==2) ? TRUE : FALSE); if ( criticaldamage == 0 && iActionType == 0 ) { AttackDamage = (int)(AttackDamage/1.5f); } if ( bAllMiss ) { AttackDamage = ( AttackDamage * 30 ) / 100; } if ( lpTargetObj->DamageMinus ) { int beforeDamage = AttackDamage; AttackDamage -= ( ( AttackDamage * (int)lpTargetObj->DamageMinus) / 100 ); } int tlevel = lpObj->Level / 10; if ( AttackDamage < tlevel ) { if ( tlevel < 1 ) { tlevel = 1; } AttackDamage = tlevel; } if ( lpTargetObj->m_SkillNumber == 18 ) { if ( AttackDamage > 1 ) { AttackDamage >>= 1; } }