void CCrywolf::SetCrywolfAllCommonMonsterState(int iMonsterState, int iMode) { for ( int i=0;i<this->m_ObjCommonMonster.m_iObjCount ; i++) { if ( !gObjIsConnected(this->m_ObjCommonMonster.m_iObjIndex[i]) ) break; LPOBJ lpObj = &gObj[this->m_ObjCommonMonster.m_iObjIndex[i]]; if ( iMode == 0 ) { lpObj->m_ViewSkillState &= ~iMonsterState; GCStateInfoSend(lpObj, 0, lpObj->m_ViewSkillState); } else if ( iMode == 1 ) { lpObj->m_ViewSkillState |= iMonsterState; GCStateInfoSend(lpObj, 1, lpObj->m_ViewSkillState); } } }
void CCrywolfAltar::SetAltarViewState(int iClass, int iAltarState) { int iAltarNumber = this->GetAlatarNumber(iClass); CCrywolfAltarInfo * AltarInfo = &this->m_AltarInfo[iAltarNumber]; if ( AltarInfo->m_iAltarIndex == -1 ) return; memset(gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState, 0, sizeof(gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState)); gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState[eVS_POTION_SOUL] = 1; GCStateInfoSend(&gObj[AltarInfo->m_iAltarIndex], 1, eVS_POTION_SOUL); }
BOOL TMonsterAIElement::ApplyElementHealSelf(int iIndex, int iTargetIndex, TMonsterAIState * pAIState) { LPOBJ lpObj = &gObj[iIndex]; UTIL.SendCrywolfChattingMsg(iIndex, "Element-셀프치료"); lpObj->Life += lpObj->Life * 20.0f / 100.0f; UTIL.SendCrywolfChattingMsg(iIndex, "HP : %d", (int)lpObj->Life); lpObj->m_ViewSkillState |= 8; GCStateInfoSend(lpObj, 1, lpObj->m_ViewSkillState); return FALSE; }
BOOL CCrywolfAltar::SetAltarUserIndex(int iAltarObjIndex, int iClass, int iUserIndex) { int iAltarNumber = this->GetAlatarNumber(iClass); CCrywolfAltarInfo * AltarInfo = &this->m_AltarInfo[iAltarNumber]; DWORD dwCurrentTime = GetTickCount(); if ( gObjIsConnected(AltarInfo->m_iUserIndex) != FALSE ) { MsgOutput(iUserIndex, lMsg.Get(MSGGET(12, 253)), iAltarNumber); return FALSE; } if ( (dwCurrentTime-AltarInfo->m_dwLastValidContractTime) < 10000 ) { MsgOutput(iUserIndex, lMsg.Get(MSGGET(12, 254)), iAltarNumber); return FALSE; } if ( AltarInfo->m_iContractCount > MAX_ALTAR_CONTRACTS ) { MsgOutput(iUserIndex, lMsg.Get(MSGGET(12, 255)), iAltarNumber); return FALSE; } if ( abs(gObj[iAltarObjIndex].Y - gObj[iUserIndex].Y) > 0 || abs(gObj[iAltarObjIndex].X - gObj[iUserIndex].X) > 0 ) { MsgOutput(iUserIndex, lMsg.Get(MSGGET(13, 0)), iAltarNumber); return FALSE; } AltarInfo->SetAltarState(2); AltarInfo->m_iUserIndex = iUserIndex; AltarInfo->m_dwAppliedContractTime = dwCurrentTime; AltarInfo->m_dwValidContractTime = dwCurrentTime + 5000; // It Get Active after 5 Seconds AltarInfo->m_dwLastValidContractTime = dwCurrentTime; AltarInfo->m_iContractCount++; memset(gObj[iAltarObjIndex].m_ViewSkillState, 0, sizeof(gObj[iAltarObjIndex].m_ViewSkillState)); gObj[iAltarObjIndex].m_ViewSkillState[eVS_ALTAR_ATTEMP_CONTRACT] = 1; GCStateInfoSend(&gObj[iAltarObjIndex], 1, eVS_ALTAR_VALID_CONTRACT); UTIL.SendCrywolfUserAnyMsg(2, lMsg.Get(MSGGET(13, 1)), gObj[AltarInfo->m_iUserIndex].Name, iAltarNumber); CLog.LogAdd("[ Crywolf ][Altar Op.] [%s][%s] Attempt to contract Altar[%d]", gObj[AltarInfo->m_iUserIndex].AccountID, gObj[AltarInfo->m_iUserIndex].Name, iAltarNumber); MsgOutput(iUserIndex, lMsg.Get(MSGGET(13, 2))); MsgOutput(iUserIndex, lMsg.Get(MSGGET(13, 3))); return TRUE; }
void CCrywolfAltar::ResetAltar(int iClass) { int iAltarNumber = this->GetAlatarNumber(iClass); CCrywolfAltarInfo * AltarInfo = &this->m_AltarInfo[iAltarNumber]; if ( AltarInfo->m_iAltarIndex == -1 ) return; memset(gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState, 0, sizeof(gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState)); GCStateInfoSend(&gObj[AltarInfo->m_iAltarIndex], 0, 0); // CHECAR AltarInfo->Reset(); }
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::ApplyElementImmuneSkill(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; lpTargetObj->m_MonsterSkillElementInfo.m_iSkillElementImmuneNumber = this->m_iNullifiedSkill; lpTargetObj->m_MonsterSkillElementInfo.m_iSkillElementImmuneTime = this->m_iContinuanceTime; lpTargetObj->m_ViewSkillState[eVS_ELEMENT_INMUNE] = 1; GCStateInfoSend(lpTargetObj, 1, eVS_ELEMENT_INMUNE); return FALSE; }
void gObjSendBuffList(LPOBJ lpObj) { if(lpObj == NULL) return; if(lpObj->Type != OBJ_USER) return; if(lpObj->btEffectCount <= 0) return; for(int i = 0; i < MAX_STATE_COUNT; i++) { if(lpObj->pEffectInfo[i].btEffectNum != NULL) GCStateInfoSend(lpObj, 1, lpObj->pEffectInfo[i].btEffectNum); } }
BOOL NpcShadowPhantom(LPOBJ lpNpc, LPOBJ lpObj) { if ( gObjIsConnected(lpObj->m_Index) == FALSE ) { return TRUE; } if ( lpObj->Level > MAX_NPC_PHANTOM_BUFFER ) { GCServerCmd(lpObj->m_Index, 0x0D, 0, 0); return TRUE; } lpObj->m_iSkillNPCHelpTime = GetTickCount(); lpObj->m_iSkillNPCDefense = lpObj->Level / 5 + 50; // FORMULA lpObj->m_iSkillNPCAttack = lpObj->Level / 3 + 45; // FORMULA lpObj->m_ViewSkillState[eVS_NPC_HELP] = 1; GCStateInfoSend(lpObj, 1, eVS_NPC_HELP); return TRUE; }
void CCrywolfAltar::SetAltarValidContract(int iAltarObjIndex, int iClass) { int iAltarNumber = this->GetAlatarNumber(iClass); CCrywolfAltarInfo * AltarInfo = &this->m_AltarInfo[iAltarNumber]; if ( AltarInfo->GetAltarState() != 2 ) return; if ( AltarInfo->m_dwValidContractTime < (int)GetTickCount() ) { MsgOutput(AltarInfo->m_iUserIndex, lMsg.Get(MSGGET(12, 251)), iAltarNumber); UTIL.SendCrywolfUserAnyMsg(2, lMsg.Get(MSGGET(12, 252)), gObj[AltarInfo->m_iUserIndex].Name, iAltarNumber); CLog.LogAdd("[ Crywolf ][Altar Op.] [%s][%s] Set Valid Contract Altar[%d]", gObj[AltarInfo->m_iUserIndex].AccountID, gObj[AltarInfo->m_iUserIndex].Name, iAltarNumber); AltarInfo->SetAltarState(1); memset(gObj[iAltarObjIndex].m_ViewSkillState,0, sizeof(gObj[iAltarObjIndex].m_ViewSkillState)); gObj[iAltarObjIndex].m_ViewSkillState[eVS_ALTAR_VALID_CONTRACT] = 1; GCStateInfoSend(&gObj[iAltarObjIndex], 1, eVS_ALTAR_VALID_CONTRACT); } }
void CSantaEvent::LittleSantaCancelBuffer(LPOBJ lpObj) { if ( lpObj->LittleSantaTime1 > 0 ) { lpObj->LittleSantaTime1 = 0; lpObj->AddLife-=500; if ( lpObj->Life > (lpObj->MaxLife+lpObj->AddLife) ) { lpObj->Life = lpObj->MaxLife+lpObj->AddLife; GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield); } GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield); GCStateInfoSend(lpObj,0,92); } if ( lpObj->LittleSantaTime2 > 0 ) { lpObj->LittleSantaTime2 = 0; lpObj->m_Defense-=100; GCStateInfoSend(lpObj,0,95); } if ( lpObj->LittleSantaTime3 > 0 ) { lpObj->LittleSantaTime3 = 0; lpObj->AddMana-=500; if ( lpObj->Mana > (lpObj->MaxMana+lpObj->AddMana) ) { lpObj->Mana = lpObj->MaxMana+lpObj->AddMana; GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP); } GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); GCStateInfoSend(lpObj,0,93); } if ( lpObj->LittleSantaTime4 > 0 ) { lpObj->LittleSantaTime4 = 0; lpObj->m_AttackSpeed-=15; lpObj->m_MagicSpeed-=15; GCStateInfoSend(lpObj,0,96); } if ( lpObj->LittleSantaTime5 > 0 ) { lpObj->LittleSantaTime5 = 0; lpObj->m_AttackDamageLeft-=30; lpObj->m_AttackDamageRight-=30; lpObj->m_AttackDamageMinLeft-=30; lpObj->m_AttackDamageMaxLeft-=30; lpObj->m_AttackDamageMinRight-=30; lpObj->m_AttackDamageMaxRight-=30; lpObj->m_AttackDamageMax-=30; lpObj->m_AttackDamageMin-=30; lpObj->m_MagicDamageMax-=30; lpObj->m_MagicDamageMin-=30; GCStateInfoSend(lpObj,0,94); } if ( lpObj->LittleSantaTime6 > 0 ) { lpObj->LittleSantaTime6 = 0; GCStateInfoSend(lpObj,0,97); } }
void CSantaEvent::LittleSantaBuffer(LPOBJ lpObj,int Type) { switch ( Type ) { case 0: gSantaEvent.LittleSantaCancelBuffer(lpObj); GCStateInfoSend(lpObj,1,92); lpObj->LittleSantaTime1 = 30*60; lpObj->AddLife+=500; GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield); break; case 1: gSantaEvent.LittleSantaCancelBuffer(lpObj); GCStateInfoSend(lpObj,1,95); lpObj->LittleSantaTime2 = 30*60; lpObj->m_Defense+=100; break; case 2: lpObj->Life = lpObj->MaxLife+lpObj->AddLife; GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield); break; case 3: lpObj->Mana = lpObj->MaxMana+lpObj->AddMana; GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP); break; case 4: gSantaEvent.LittleSantaCancelBuffer(lpObj); GCStateInfoSend(lpObj,1,93); lpObj->LittleSantaTime3 = 30*60; lpObj->AddMana+=500; GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case 5: gSantaEvent.LittleSantaCancelBuffer(lpObj); GCStateInfoSend(lpObj,1,96); lpObj->LittleSantaTime4 = 30*60; lpObj->m_AttackSpeed+=15; lpObj->m_MagicSpeed+=15; break; case 6: gSantaEvent.LittleSantaCancelBuffer(lpObj); GCStateInfoSend(lpObj,1,94); lpObj->LittleSantaTime5 = 30*60; lpObj->m_AttackDamageLeft+=30; lpObj->m_AttackDamageRight+=30; lpObj->m_AttackDamageMinLeft+=30; lpObj->m_AttackDamageMaxLeft+=30; lpObj->m_AttackDamageMinRight+=30; lpObj->m_AttackDamageMaxRight+=30; lpObj->m_AttackDamageMax+=30; lpObj->m_AttackDamageMin+=30; lpObj->m_MagicDamageMax+=30; lpObj->m_MagicDamageMin+=30; break; case 7: gSantaEvent.LittleSantaCancelBuffer(lpObj); GCStateInfoSend(lpObj,1,97); lpObj->LittleSantaTime6 = 30*60; break; } }
// ---------------------------------------------------------------------------------------------- void CSpecialItem::ApplyEffect(LPOBJ lpObj,char Type,int Item) { int CountPos = -1; CountPos = gSpecialItem.SearchItemPos(Item,Type); if ( CountPos == -1 ) { return; } if ( lpObj->SpecialBuff[Type] == 1 ) { gSpecialItem.RemoveEffect(lpObj,Type,Item); } if ( gSpecialItem.EffectType1[Type][CountPos] != -1 ) { switch ( gSpecialItem.EffectType1[Type][CountPos] ) { case INCREASE_MAX_MANA: lpObj->AddMana += gSpecialItem.EffectValue1[Type][CountPos]; GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case INCREASE_MAX_AG: lpObj->AddBP += gSpecialItem.EffectValue1[Type][CountPos]; GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case INCREASE_MAX_LIFE: lpObj->AddLife += gSpecialItem.EffectValue1[Type][CountPos]; GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield); break; case INCREASE_MAX_SD: lpObj->iAddShield += gSpecialItem.EffectValue1[Type][CountPos]; GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield); break; case INCREASE_DROP_RATE: break; case INCREASE_EXE_DMG: lpObj->m_ExcelentDamage += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_CRITICAL_DMG: lpObj->m_CriticalDamage += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_LIFE_AUTORECOVERY: break; case INCREASE_EXP_RATE: break; case INCREASE_ATTACK_DMG: lpObj->m_AttackDamageLeft += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_AttackDamageRight += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_AttackDamageMin += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_AttackDamageMax += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_AttackDamageMinLeft += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_AttackDamageMaxLeft += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_AttackDamageMinRight += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_AttackDamageMaxRight += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_DEFENSE: lpObj->m_Defense += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_MANA_AUTORECOVERY: break; case INCREASE_ATTACK_SPEED: lpObj->m_AttackSpeed += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_MagicSpeed += gSpecialItem.EffectValue1[Type][CountPos]; break; case DISABLE_EXP: break; case ENABLE_MOBILITY: break; case INCREASE_WIZARDY_DMG: lpObj->m_MagicDamageMax += gSpecialItem.EffectValue1[Type][CountPos]; lpObj->m_MagicDamageMin += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_STRENGHT: lpObj->AddStrength += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_AGILITY: lpObj->AddDexterity += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_HEALTH: lpObj->AddVitality += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_ENERGY: lpObj->AddEnergy += gSpecialItem.EffectValue1[Type][CountPos]; break; case INCREASE_LEADERSHIP: lpObj->AddLeadership += gSpecialItem.EffectValue1[Type][CountPos]; break; } } if ( gSpecialItem.EffectType2[Type][CountPos] != -1 ) { switch ( gSpecialItem.EffectType2[Type][CountPos] ) { case INCREASE_MAX_MANA: lpObj->AddMana += gSpecialItem.EffectValue2[Type][CountPos]; GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case INCREASE_MAX_AG: lpObj->AddBP += gSpecialItem.EffectValue2[Type][CountPos]; GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case INCREASE_MAX_LIFE: lpObj->AddLife += gSpecialItem.EffectValue2[Type][CountPos]; GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield); break; case INCREASE_MAX_SD: lpObj->iAddShield += gSpecialItem.EffectValue2[Type][CountPos]; GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield); break; case INCREASE_DROP_RATE: break; case INCREASE_EXE_DMG: lpObj->m_ExcelentDamage += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_CRITICAL_DMG: lpObj->m_CriticalDamage += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_LIFE_AUTORECOVERY: break; case INCREASE_EXP_RATE: break; case INCREASE_ATTACK_DMG: lpObj->m_AttackDamageLeft += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_AttackDamageRight += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_AttackDamageMin += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_AttackDamageMax += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_AttackDamageMinLeft += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_AttackDamageMaxLeft += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_AttackDamageMinRight += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_AttackDamageMaxRight += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_DEFENSE: lpObj->m_Defense += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_MANA_AUTORECOVERY: break; case INCREASE_ATTACK_SPEED: lpObj->m_AttackSpeed += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_MagicSpeed += gSpecialItem.EffectValue2[Type][CountPos]; break; case DISABLE_EXP: break; case ENABLE_MOBILITY: break; case INCREASE_WIZARDY_DMG: lpObj->m_MagicDamageMax += gSpecialItem.EffectValue2[Type][CountPos]; lpObj->m_MagicDamageMin += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_STRENGHT: lpObj->AddStrength += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_AGILITY: lpObj->AddDexterity += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_HEALTH: lpObj->AddVitality += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_ENERGY: lpObj->AddEnergy += gSpecialItem.EffectValue2[Type][CountPos]; break; case INCREASE_LEADERSHIP: lpObj->AddLeadership += gSpecialItem.EffectValue2[Type][CountPos]; break; } } lpObj->SpecialBuff[Type] = 1; lpObj->SpecialBuffEffectType1[Type] = gSpecialItem.EffectType1[Type][CountPos]; lpObj->SpecialBuffEffectValue1[Type] = gSpecialItem.EffectValue1[Type][CountPos]; lpObj->SpecialBuffEffectType2[Type] = gSpecialItem.EffectType2[Type][CountPos]; lpObj->SpecialBuffEffectValue2[Type] = gSpecialItem.EffectValue2[Type][CountPos]; if ( gSpecialItem.BuffTime[Type][CountPos] != 0 ) { lpObj->SpecialBuffEffectTime[Type] = gSpecialItem.BuffTime[Type][CountPos]; } if ( gSpecialItem.BuffNumber[Type][CountPos] != -1 ) { GCStateInfoSend(lpObj,1,gSpecialItem.BuffNumber[Type][CountPos]); } lpObj->SpecialBuffItem[Type] = Item; }
// ----------------------------------------------------------------------------------------------------------------------- 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; } }
bool CObjBaseAttack::ResistanceCheck(LPOBJ lpObj, LPOBJ lpTargetObj, int skill) { bool bResult = true; // ---- switch ( skill ) { // ---- Poison case 1: if ( lpTargetObj->m_PoisonType == 0 ) { if ( retResistance(lpTargetObj, 1) == 0 ) { lpTargetObj->m_PoisonType = 1; lpTargetObj->m_PoisonBeattackCount = 20; lpTargetObj->lpAttackObj = lpObj; lpTargetObj->m_ViewSkillState[eVS_POISON] = 1; } else { bResult = false; } } else { bResult = false; } break; // ---- Lightning case 3: if ( retResistance(lpTargetObj, 2) == 0 ) { gObjAddMsgSendDelay(lpTargetObj, 2, lpObj->m_Index, 150, 0); } else { bResult = false; } break; // ---- Decay case 38: if ( lpTargetObj->m_PoisonType == 0 || lpTargetObj->m_PoisonType == 1 ) { if ( retResistance(lpTargetObj, 1) == 0 ) { lpTargetObj->m_PoisonType = 38; lpTargetObj->m_PoisonBeattackCount = 10; lpTargetObj->lpAttackObj = lpObj; lpTargetObj->m_ViewSkillState[eVS_POISON] = 1; GCStateInfoSend(lpTargetObj, 1, eVS_POISON); } else { bResult = false; } } else { bResult = false; } break; // ---- Earthquake case 62: gObjBackSpring2(lpTargetObj, lpObj, 3); break; // ---- Ice, Ice Storm, Chain Drive case 7: case 39: case 262: if (lpTargetObj->m_ColdBeattackCount == 0 ) { if ( retResistance(lpTargetObj, 0) == 0 ) { lpTargetObj->m_ColdBeattackCount = 10; lpTargetObj->lpAttackObj = lpObj; lpTargetObj->DelayActionTime = 800; lpTargetObj->DelayLevel = 1; lpTargetObj->m_IceType = skill; GCStateInfoSend(lpTargetObj, 1, eVS_ICE); } else { bResult = false; } } else { bResult = false; } break; // ---- Weapon Skills case 19: case 20: case 21: case 22: case 23: case 260: case 261: gObjAddMsgSendDelay(lpTargetObj, 2, lpObj->m_Index, 150, 0); break; // ---- Ice Arrow case 51: bResult = false; break; } // ---- return bResult; }
// ---------------------------------------------------------------------------------------------- void CSpecialItem::RemoveEffect(LPOBJ lpObj, char Type, int Item) { if ( lpObj->SpecialBuff[Type] == 0 ) { return; } int CountPos = -1; CountPos = gSpecialItem.SearchItemPos(lpObj->SpecialBuffItem[Type],Type); if ( CountPos == -1 ) { return; } if ( lpObj->SpecialBuffEffectType1[Type] != -1 ) { switch ( lpObj->SpecialBuffEffectType1[Type] ) { case INCREASE_MAX_MANA: lpObj->AddMana -= lpObj->SpecialBuffEffectValue1[Type]; if ( lpObj->Mana > (lpObj->MaxMana+lpObj->AddMana) ) { lpObj->Mana = lpObj->MaxMana+lpObj->AddMana; GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP); } GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case INCREASE_MAX_AG: lpObj->AddBP -= lpObj->SpecialBuffEffectValue1[Type]; if ( lpObj->BP > (lpObj->MaxBP+lpObj->AddBP) ) { lpObj->BP = lpObj->MaxBP+lpObj->AddBP; GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP); } GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case INCREASE_MAX_LIFE: lpObj->AddLife -= lpObj->SpecialBuffEffectValue1[Type]; if ( lpObj->Life > (lpObj->MaxLife+lpObj->AddLife) ) { lpObj->Life = lpObj->MaxLife+lpObj->AddLife; GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield); } GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield); break; case INCREASE_MAX_SD: lpObj->iAddShield -= lpObj->SpecialBuffEffectValue1[Type]; if ( lpObj->iShield > (lpObj->iMaxShield+lpObj->iAddShield) ) { lpObj->iShield = lpObj->iMaxShield+lpObj->iAddShield; GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield); } GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield); break; case INCREASE_DROP_RATE: break; case INCREASE_EXE_DMG: lpObj->m_ExcelentDamage -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_CRITICAL_DMG: lpObj->m_CriticalDamage -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_LIFE_AUTORECOVERY: break; case INCREASE_EXP_RATE: break; case INCREASE_ATTACK_DMG: lpObj->m_AttackDamageLeft -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_AttackDamageRight -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_AttackDamageMin -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_AttackDamageMax -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_AttackDamageMinLeft -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_AttackDamageMaxLeft -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_AttackDamageMinRight -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_AttackDamageMaxRight -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_DEFENSE: lpObj->m_Defense -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_MANA_AUTORECOVERY: break; case INCREASE_ATTACK_SPEED: lpObj->m_AttackSpeed -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_MagicSpeed -= lpObj->SpecialBuffEffectValue1[Type]; break; case DISABLE_EXP: break; case ENABLE_MOBILITY: break; case INCREASE_WIZARDY_DMG: lpObj->m_MagicDamageMax -= lpObj->SpecialBuffEffectValue1[Type]; lpObj->m_MagicDamageMin -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_STRENGHT: lpObj->AddStrength -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_AGILITY: lpObj->AddDexterity -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_HEALTH: lpObj->AddVitality -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_ENERGY: lpObj->AddEnergy -= lpObj->SpecialBuffEffectValue1[Type]; break; case INCREASE_LEADERSHIP: lpObj->AddLeadership -= lpObj->SpecialBuffEffectValue1[Type]; break; } lpObj->SpecialBuffEffectType2[Type] = -1; } if ( lpObj->SpecialBuffEffectType2[Type] != -1 ) { switch ( lpObj->SpecialBuffEffectType2[Type] ) { case INCREASE_MAX_MANA: lpObj->AddMana -= lpObj->SpecialBuffEffectValue2[Type]; if ( lpObj->Mana > (lpObj->MaxMana+lpObj->AddMana) ) { lpObj->Mana = lpObj->MaxMana+lpObj->AddMana; GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP); } GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case INCREASE_MAX_AG: lpObj->AddBP -= lpObj->SpecialBuffEffectValue2[Type]; if ( lpObj->BP > (lpObj->MaxBP+lpObj->AddBP) ) { lpObj->BP = lpObj->MaxBP+lpObj->AddBP; GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP); } GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); break; case INCREASE_MAX_LIFE: lpObj->AddLife -= lpObj->SpecialBuffEffectValue2[Type]; if ( lpObj->Life > (lpObj->MaxLife+lpObj->AddLife) ) { lpObj->Life = lpObj->MaxLife+lpObj->AddLife; GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield); } GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield); break; case INCREASE_MAX_SD: lpObj->iAddShield -= lpObj->SpecialBuffEffectValue2[Type]; if ( lpObj->iShield > (lpObj->iMaxShield+lpObj->iAddShield) ) { lpObj->iShield = lpObj->iMaxShield+lpObj->iAddShield; GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield); } GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield); break; case INCREASE_DROP_RATE: break; case INCREASE_EXE_DMG: lpObj->m_ExcelentDamage -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_CRITICAL_DMG: lpObj->m_CriticalDamage -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_LIFE_AUTORECOVERY: break; case INCREASE_EXP_RATE: break; case INCREASE_ATTACK_DMG: lpObj->m_AttackDamageLeft -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_AttackDamageRight -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_AttackDamageMin -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_AttackDamageMax -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_AttackDamageMinLeft -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_AttackDamageMaxLeft -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_AttackDamageMinRight -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_AttackDamageMaxRight -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_DEFENSE: lpObj->m_Defense -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_MANA_AUTORECOVERY: break; case INCREASE_ATTACK_SPEED: lpObj->m_AttackSpeed -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_MagicSpeed -= lpObj->SpecialBuffEffectValue2[Type]; break; case DISABLE_EXP: break; case ENABLE_MOBILITY: break; case INCREASE_WIZARDY_DMG: lpObj->m_MagicDamageMax -= lpObj->SpecialBuffEffectValue2[Type]; lpObj->m_MagicDamageMin -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_STRENGHT: lpObj->AddStrength -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_AGILITY: lpObj->AddDexterity -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_HEALTH: lpObj->AddVitality -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_ENERGY: lpObj->AddEnergy -= lpObj->SpecialBuffEffectValue2[Type]; break; case INCREASE_LEADERSHIP: lpObj->AddLeadership -= lpObj->SpecialBuffEffectValue2[Type]; break; } } lpObj->SpecialBuffEffectType1[Type] = -1; lpObj->SpecialBuffEffectValue1[Type] = -1; lpObj->SpecialBuffEffectType2[Type] = -1; lpObj->SpecialBuffEffectValue2[Type] = -1; lpObj->SpecialBuff[Type] = 0; if ( gSpecialItem.BuffNumber[Type][CountPos] != -1 ) { GCStateInfoSend(lpObj,0,gSpecialItem.BuffNumber[Type][CountPos]); } lpObj->SpecialBuffEffectTime[Type] = 0; lpObj->SpecialBuffItem[Type] = -1; }
void TMonsterAI::ProcessStateMsg(LPOBJ lpObj, int iMsgCode, int iIndex, int aMsgSubCode) { switch ( iMsgCode ) { case 1: gObjMonsterDieGiveItem(lpObj, &gObj[iIndex]); break; case 2: if ( gObj[iIndex].Live != FALSE ) { gObjBackSpring(lpObj, &gObj[iIndex]); } break; case 3: if ( lpObj->TargetNumber != -1 ) { lpObj->m_Agro.DelAgro(lpObj->TargetNumber); } lpObj->TargetNumber = -1; lpObj->LastAttackerID = -1; lpObj->m_ActState.Emotion = 0; lpObj->m_ActState.Attack = 0; lpObj->m_ActState.Move = 0; lpObj->NextActionTime = 1000; break; case 4: lpObj->m_ActState.Emotion = 3; lpObj->m_ActState.EmotionCount = 1; break; case 55: gObjAttack(lpObj, &gObj[iIndex], NULL, FALSE, FALSE, 0, FALSE); break; case 56: { LPOBJ lpTargetObj = &gObj[iIndex]; if ( lpTargetObj->m_PoisonType == 0 ) { if ( retResistance(lpTargetObj, 1) == FALSE ) { lpTargetObj->m_PoisonType = 1; lpTargetObj->m_PoisonBeattackCount = aMsgSubCode; lpTargetObj->lpAttackObj = lpObj; lpTargetObj->m_ViewSkillState[eVS_POISON] = 1; GCStateInfoSend(lpTargetObj, 1, eVS_POISON); } } } break; case 57: { LPOBJ lpTargetObj = &gObj[iIndex]; gObjBackSpring2(lpTargetObj, lpObj, aMsgSubCode); } break; } }