BOOL TMonsterSkillElement::ApplyElementStun(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; lpTargetObj->m_iSkillStunTime = this->m_iContinuanceTime; lpTargetObj->m_ViewSkillState[eVS_STUN] = 1; GCStateInfoSend(lpTargetObj, 1, eVS_STUN); gObjSetPosition(iTargetIndex, lpTargetObj->X, lpTargetObj->Y); return FALSE; }
BOOL TMonsterSkillElement::ApplyElementStun(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; int StunTime = 0; if( m_iContinuanceTime == -1 ) { StunTime = -10; } else { StunTime = m_iContinuanceTime; } gObjAddBuffEffect(lpTargetObj,BUFF_STUN,0,0,0,0,StunTime); gObjSetPosition(iTargetIndex, lpTargetObj->X, lpTargetObj->Y); return FALSE; }
BOOL CObjBaseAttack::ResistanceCheck(LPOBJ lpObj, LPOBJ lpTargetObj, int skill) { //missing objects? maybe from _CS side or deleted in 1.01.00 if( lpTargetObj->Type != OBJ_USER) { if(lpTargetObj->Class == 277 || lpTargetObj->Class == 283 || lpTargetObj->Class == 288 || lpTargetObj->Class == 278 || lpTargetObj->Class == 215 || lpTargetObj->Class == 216 || lpTargetObj->Class == 217 || lpTargetObj->Class == 218 || lpTargetObj->Class == 219) { return FALSE; } } if( lpTargetObj->Type != OBJ_USER) { if( CRYWOLF_ALTAR_CLASS_RANGE(lpTargetObj->Class) != FALSE || CRYWOLF_STATUE_CHECK(lpTargetObj->Class) != FALSE ) //HermeX Fix @28/01/2010 { return FALSE; } } if ( skill == 62 ) { gObjBackSpring2(lpTargetObj, lpObj, 3); } if(g_MasterSkillSystem.GetBaseMasterLevelSkill(skill) == 512) //Earth Quake Master { gObjBackSpring2(lpTargetObj, lpObj, 3); } if( skill == 516) { gObjBackSpring2(lpTargetObj, lpObj, 3); } if ( skill == 19 || skill == 20 || skill == 21 || skill == 22 || skill == 23 || skill == 260 || skill == 261 || skill == 262 || skill == 270 || skill == 326 || skill == 327 || skill == 328 || skill == 329 || skill == 479 ) { gObjAddMsgSendDelay(lpTargetObj, 2, lpObj->m_Index, 150, 0); } else if ( skill == 3 || skill == 379 || skill == 480 ) // Poison { if ( retResistance(lpTargetObj, 2) == 0 ) { gObjAddMsgSendDelay(lpTargetObj, 2, lpObj->m_Index, 150, 0); return TRUE; } return FALSE; } else if ( skill == 1 || skill == 384 ) { if(gObjCheckUsedBuffEffect(lpObj, AT_POISON) == 0) { if ( retResistance(lpTargetObj, 1) == 0 ) { lpTargetObj->lpAttackObj = lpObj; gObjAddBuffEffect(lpTargetObj, AT_POISON, 19, 3, 0, 0, 20); return TRUE; } else { return FALSE; } } else { return FALSE; } } else if ( skill == 38 || skill == 387 ) // Death Poison { if(gObjCheckUsedBuffEffect(lpTargetObj, AT_POISON) == 0) { if ( retResistance(lpTargetObj, 1) == 0 ) { lpTargetObj->lpAttackObj = lpObj; gObjAddBuffEffect(lpTargetObj, AT_POISON, 19, 3, 0, 0, 10); return TRUE; } else { return FALSE; } } else { return FALSE; } return TRUE; } else if ( skill == 7 || skill == 39 || g_MasterSkillSystem.GetBaseMasterLevelSkill(skill) == 450 || skill == 389 || skill == 489 ) //Season4 add-on { if(gObjCheckUsedBuffEffect(lpTargetObj, AT_ICE) == 0) { if ( retResistance(lpTargetObj, 0) == 0 ) { lpTargetObj->lpAttackObj = lpObj; lpTargetObj->DelayActionTime = 800; lpTargetObj->DelayLevel = 1; gObjAddBuffEffect(lpTargetObj, AT_ICE, 20, 0, 0, 0, 10); } else { return FALSE; } } else { return FALSE; } } else if ( skill == 51 || skill == 424 ) // Ice Arrow { if(gObjCheckUsedBuffEffect(lpTargetObj, AT_ICE_ARROW) == 0) { if ( retResistance(lpTargetObj, 0) == 0 ) { gObjAddBuffEffect(lpTargetObj, AT_ICE_ARROW, 0, 0, 0, 0, 7); lpTargetObj->PathCount = 0; lpTargetObj->PathStartEnd = 0; //Season3 add-on gObjSetPosition(lpTargetObj->m_Index, lpTargetObj->X, lpTargetObj->Y); } else { return FALSE; } } else { return FALSE; } } return TRUE; }
// -------------------------------------------------------------------------------------------------------------------------------------------------- void PMoveProc(PMSG_MOVE* lpMove, int aIndex) { LPOBJ lpObj = &gObj[aIndex]; // ----- PMSG_RECVMOVE pMove; // ----- unsigned char ax; unsigned char ay; unsigned char sx; unsigned char sy; unsigned char pathtable; // ----- if( !OBJMAX_RANGE(aIndex) ) { CLog.LogAddC(TColor.Red(), "Error: Protocol Index wrong!", lpObj->AccountID, lpObj->Name); return; } // ----- if( lpObj->RegenOk > NULL ) return; // ----- if( lpObj->SkillRecallParty_Time > NULL ) { lpObj->SkillRecallParty_Time = 0; SendMsg.MessageOut(aIndex, 0x01, "Summoning cancelled."); } // ----- if( (GetTickCount()-lpObj->m_LastMoveTime) < 100 ) return; // ----- if( lpObj->Teleport ) return; // ----- if( lpObj->m_SkillHarden ) { gObjSetPosition(lpObj->m_Index, lpObj->X, lpObj->Y); return; } // ----- if ( lpObj->m_iSkillStunTime > 0 ) { gObjSetPosition(lpObj->m_Index, lpObj->X, lpObj->Y); return; } // ----- lpObj->m_LastMoveTime = GetTickCount(); lpObj->m_Rest = 0; lpObj->PathCur = 0; lpObj->Dir = lpMove->Path[0] >> 4; lpObj->PathCount = lpMove->Path[0] & 0x0F; // ----- if ( lpObj->PathCount > 15 ) { CLog.LogAddC(TColor.Red(), "Error: [%s][%s] Path Count (%d)", lpObj->AccountID, lpObj->Name, lpObj->PathCount); return; } // ----- for( int n=0; n<15; n++) { lpObj->PathX[n] = 0; lpObj->PathY[n] = 0; lpObj->PathOri[n] = 0; } // ----- sx = lpMove->X; sy = lpMove->Y; // ----- if( gObjCheckXYMapTile(lpObj, 1) == TRUE ) { lpObj->PathCount = 0; lpObj->PathCur = 0; lpObj->PathStartEnd = 0; // ----- gObjSetPosition(lpObj->m_Index, lpObj->X, lpObj->Y); return; } // ----- lpObj->PathX[0] = lpMove->X; ax = lpObj->PathX[0]; lpObj->PathY[0] = lpMove->Y; ay = lpObj->PathY[0]; lpObj->PathDir[0] = lpObj->Dir; lpObj->PathStartEnd = 1; // ----- if( lpObj->PathCount > 0 ) { lpObj->PathCur = 1; lpObj->PathCount++; } // ----- for(int n=1; n<lpObj->PathCount; n++) { if( (n%2) == 1 ) { pathtable = lpMove->Path[(n+1) / 2] >> 4; } else {
// ----------------------------------------------------------------------------------------------------------------------- void CIllusionTemple::UseSkillProc(OBJECTSTRUCT* lpObj, PMSG_ILLUSION_USESKILL* pMsg) { LPOBJ lpTargetObj = &gObj[pMsg->m_TargetIndex]; int TargePosx = lpTargetObj->X; int TargePosy = lpTargetObj->Y; int iangle = gObjUseSkill.GetAngle(lpObj->X,lpObj->Y,TargePosx,TargePosy); if(!(IT_FLOOR_RANGE(lpObj->m_IllusionIndex) && IT_MAP_RANGE(lpObj->MapNumber))) { GCMagicAttackNumberSend(lpObj, (BYTE)pMsg->m_SkillIndex, lpObj->m_Index, 1); return; } int SkillPoint = MagicDamageC.CheckKillCount(pMsg->m_SkillIndex, lpObj->m_IllusionKillCount); if(SkillPoint < 0) { GCMagicAttackNumberSend(lpObj, (BYTE)pMsg->m_SkillIndex, lpObj->m_Index, 1); CLog.LogAddC(2, "[IllusionTemple][%s] Use skill without enough points (%d)(%d)", lpObj->Name, lpObj->m_IllusionKillCount, pMsg->m_SkillIndex); return; } switch(pMsg->m_SkillIndex) { case IT_SKILL_SHIELD: { if(lpObj->m_IllusionShieldSkillTime > 0) { GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 0); return; } if(lpObj->Mana < MagicDamageC.SkillGetMana(IT_SKILL_SHIELD)) { GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 0); return; } lpObj->Mana -= MagicDamageC.SkillGetMana(IT_SKILL_SHIELD); GCManaSend(lpObj->m_Index, (short)lpObj->Mana, 0xFF, 0, lpObj->BP); lpObj->m_IllusionShieldSkillTime = MagicDamageC.GetDelayTime(IT_SKILL_SHIELD); GCStateInfoSend(lpObj, 1, eVS_ILLUSION_PROTECTION); gObjSetIllusionKillCount(lpObj->m_Index, KILLCOUNT_DECREASE, MagicDamageC.GetKillCount(IT_SKILL_SHIELD)); GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 1); }break; case IT_SKILL_RESIST: { if(lpObj->Type != OBJ_USER ) { CLog.LogAddC(2, "[IllusionTemple][%s] can't use Skill (%d) in normal state,only in PVP", lpObj->Name, pMsg->m_SkillIndex ); return; } if(gObjCalDistance(lpObj,lpTargetObj) <= 4) { if(SkillElectricSparkHitBox.HitCheck(iangle,lpObj->X,lpObj->Y,lpObj->X,lpObj->Y)) { lpTargetObj->m_btSkillRestraintOrder = TRUE; lpTargetObj->m_btSkillRestraintOrderTime = 15; //this->GCEffectSkillSend(aIndex,lpTargetObj->m_Index,lpMagic->m_Skill,btType); gObjSetPosition(lpObj->m_Index,lpObj->X,lpObj->Y); } } }break; case IT_SKILL_TRACK: { if(lpObj->m_Index != this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner) { if(OBJMAX_RANGE(this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner)) { gObjSetIllusionKillCount(lpObj->m_Index, KILLCOUNT_DECREASE, MagicDamageC.GetKillCount(IT_SKILL_TRACK)); gObjTeleport(lpObj->m_Index, gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].MapNumber, gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].X, gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].Y); } } }break; case IT_SKILL_FREEZE: { if(lpObj->Type != OBJ_USER ) { CLog.LogAddC(2, "[IllusionTemple][%s] can't use Skill (%d) in normal state,only in PVP", lpObj->Name, pMsg->m_SkillIndex ); return; } lpObj->iShield -= (lpObj->iMaxShield / 2); if( lpObj->iShield < 0 ) { lpObj->iShield = 0; } GCReFillSend(lpObj->m_Index,(WORD)lpObj->Life,0xFF,0,lpObj->iShield); GCSendEffectInfo(lpTargetObj->m_Index, 17); }break; } }