BOOL TMonsterSkillElement::ApplyElementMP(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; int iIncDecValue = 0; if ( this->m_iIncAndDecType != MSE_INCDEC_TYPE_NONE ) { if ( this->m_iIncAndDecType < MSE_INCDEC_TYPE_CONSTANTINC ) { iIncDecValue = (int)(lpTargetObj->Mana * this->m_iIncAndDecValue / 100.0f); if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_PERCENTDEC ) iIncDecValue = -iIncDecValue; } if ( this->m_iIncAndDecType >= MSE_INCDEC_TYPE_CONSTANTINC ) { iIncDecValue = this->m_iIncAndDecValue; if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_CONSTANTDEC ) iIncDecValue = -iIncDecValue; } } lpTargetObj->Mana += iIncDecValue; if ( lpTargetObj->Mana < 0 ) { lpTargetObj->Mana = 0; GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpObj->BP); // #error Change lpObj to lpTargetObj return TRUE; } if ( (lpTargetObj->MaxMana + lpTargetObj->AddMana) < lpTargetObj->Mana ) { lpTargetObj->Mana = lpTargetObj->MaxMana + lpTargetObj->AddMana; GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP); return TRUE; } GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP); return FALSE; }
BOOL TMonsterSkillElement::ApplyElementAG(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; int iIncDecValue = 0; if ( this->m_iIncAndDecType != MSE_INCDEC_TYPE_NONE ) { if ( this->m_iIncAndDecType < MSE_INCDEC_TYPE_CONSTANTINC ) { iIncDecValue = lpTargetObj->BP * this->m_iIncAndDecValue / 100; if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_PERCENTDEC ) iIncDecValue = -iIncDecValue; } if ( this->m_iIncAndDecType >= MSE_INCDEC_TYPE_CONSTANTINC ) { iIncDecValue = this->m_iIncAndDecValue; if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_CONSTANTDEC ) iIncDecValue = -iIncDecValue; } } lpTargetObj->BP += iIncDecValue; if ( lpTargetObj->BP < 0 ) { lpTargetObj->BP = 0; GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP); return TRUE; } if ( (lpTargetObj->MaxBP + lpTargetObj->AddBP) < lpTargetObj->Mana ) // #error Change Mana->BP { lpTargetObj->Mana = (float)(lpTargetObj->MaxBP + lpTargetObj->AddBP); // #error Change Mana->BP GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP); return TRUE; } GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP); return FALSE; }
void CSocketItems::ApplyWindOption(LPOBJ lpObj,BYTE btOption,BYTE IncType,WORD IncValue) { int _IncValue = 0; switch( btOption ) { case 21: _IncValue = GetResultValue(lpObj->MaxLife+lpObj->AddLife,IncValue,IncType); lpObj->m_wSocketAddLife += _IncValue; break; case 22: _IncValue = GetResultValue(lpObj->MaxLife+lpObj->AddLife,IncValue,IncType); lpObj->AddLife += _IncValue; GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield); GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield); break; case 23: _IncValue = GetResultValue(lpObj->MaxMana+lpObj->AddMana,IncValue,IncType); lpObj->AddMana += _IncValue; GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP); break; case 24: _IncValue = GetResultValue(lpObj->MaxMana+lpObj->AddMana,IncValue,IncType); lpObj->m_wSocketAddMana += _IncValue; break; case 25: _IncValue = GetResultValue(lpObj->MaxBP+lpObj->AddBP,IncValue,IncType); lpObj->AddBP += _IncValue; GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP); GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP); break; case 26: _IncValue = GetResultValue(lpObj->SetOpIncAGValue,IncValue,IncType); lpObj->SetOpIncAGValue += _IncValue; break; case 27: lpObj->MonsterDieGetMoney += IncValue; break; } }
void cOffExp::UseMana(int aIndex) { LPOBJ lpObj = &gObj[aIndex]; if(lpObj->Mana > 100) return; int pos; pos = gObjGetManaItemPos(aIndex); if(pos == -1) return; if( lpObj->pInventory[pos].m_Type == ITEMGET(14,4) || lpObj->pInventory[pos].m_Type == ITEMGET(14,5) || lpObj->pInventory[pos].m_Type == ITEMGET(14,6) ) { int tMana = (lpObj->pInventory[pos].m_Value*10) - (gObj[aIndex].Level); if ( tMana < 0 ) { tMana=0; } switch ( lpObj->pInventory[pos].m_Type ) { case ITEMGET(14,4): tMana += ((int)(gObj[aIndex].MaxMana + gObj[aIndex].AddMana))*20/100; break; case ITEMGET(14,5): tMana += ((int)(gObj[aIndex].MaxMana + gObj[aIndex].AddMana))*30/100; break; case ITEMGET(14,6): tMana += ((int)(gObj[aIndex].MaxMana + gObj[aIndex].AddMana))*40/100; break; } gObj[aIndex].Mana += tMana; if ( gObj[aIndex].Mana > (gObj[aIndex].MaxMana+gObj[aIndex].AddMana-1.0f) ) { gObj[aIndex].Mana = gObj[aIndex].MaxMana+gObj[aIndex].AddMana; } GCManaSend(aIndex, (int)gObj[aIndex].Mana, 0xFF, 0, (int)gObj[aIndex].BP); if ( !gObjSearchItemMinus(&gObj[aIndex], pos, 1) ) { gObjInventoryItemSet(aIndex, pos, -1); gObj[aIndex].pInventory[pos].Clear(); GCInventoryItemDeleteSend(aIndex, pos, 1); } } }
void CGuardian::GuardianAct(int iIndex) { #if (GS_CASTLE==1) if ( !gObjIsConnected(iIndex)) return; LPOBJ lpObj = &gObj[iIndex]; if ( lpObj->VPCount < 1 ) return; int tObjNum = -1; for (int i=0;i<MAX_VIEWPORT;i++) { tObjNum = lpObj->VpPlayer[i].number; if ( tObjNum >= 0 ) { if ( gObj[tObjNum].Type == OBJ_USER && gObj[tObjNum].Live ) { if ( gObj[tObjNum].m_btCsJoinSide == lpObj->m_btCsJoinSide ) { if ( abs(lpObj->Y - gObj[tObjNum].Y) <= 3 && abs(lpObj->X - gObj[tObjNum].X) <= 3 ) { gObj[tObjNum].Life += 100.0f; gObj[tObjNum].Mana += 100.0f; gObj[tObjNum].BP += 100; if ( gObj[tObjNum].Life > gObj[tObjNum].MaxLife ) gObj[tObjNum].Life = gObj[tObjNum].MaxLife; if ( gObj[tObjNum].Mana > gObj[tObjNum].MaxMana ) gObj[tObjNum].Mana = gObj[tObjNum].MaxMana; if ( gObj[tObjNum].BP > gObj[tObjNum].MaxBP ) gObj[tObjNum].BP = gObj[tObjNum].MaxBP; GCReFillSend(tObjNum, (WORD)gObj[tObjNum].Life, 0xFF, 1, gObj[tObjNum].iShield); GCManaSend(tObjNum, (WORD)gObj[tObjNum].Mana, 0xFF, 0, gObj[tObjNum].BP); } } } } } #endif return; }
BOOL NpcLitleSanta(LPOBJ lpNpc,LPOBJ lpObj,int Buff) { if( !gObjIsConnected(lpObj->m_Index) ) { return true; } switch( Buff ) { case 0: lpObj->Life = lpObj->MaxLife + lpObj->AddLife; GCReFillSend(lpObj->m_Index,(WORD)lpObj->Life,0xFF,0,lpObj->iShield); break; case 1: lpObj->Mana = lpObj->MaxMana + lpObj->MaxMana; GCManaSend(lpObj->m_Index,(WORD)lpObj->Mana,0xFF,0,lpObj->BP); break; case 0x5E: gObjAddBuffEffect(lpObj,BUFF_SANTA_STRENGHTHENER,ADD_OPTION_SANTABUFF,30,0,0,1800); break; case 0x5F: gObjAddBuffEffect(lpObj,BUFF_SANTA_DEFENSE,ADD_OPTION_SANTADEFENSE,100,0,0,1800); break; case 0x5C: gObjAddBuffEffect(lpObj,BUFF_SANTA_HEALING,ADD_OPTION_LIFE,500,0,0,1800); break; case 0x5D: gObjAddBuffEffect(lpObj,BUFF_SANTA_PROTECTION,ADD_OPTION_MANA,500,0,0,1800); break; case 0x60: gObjAddBuffEffect(lpObj,BUFF_SANTA_QUICKNESS,ADD_OPTION_ATTACK_SPEED,15,0,0,1800); break; case 0x61: gObjAddBuffEffect(lpObj,BUFF_SANTA_FORTUNE,ADD_OPTION_SANTABPRECOVERY,10,0,0,1800); break; } return true; }
void gObjSetItemApply(LPOBJ lpObj) { lpObj->m_AttackDamageMinLeft += lpObj->SetOpAddAttackDamage; lpObj->m_AttackDamageMaxLeft += lpObj->SetOpAddAttackDamage; lpObj->m_AttackDamageMinRight += lpObj->SetOpAddAttackDamage; lpObj->m_AttackDamageMaxRight += lpObj->SetOpAddAttackDamage; lpObj->m_AttackDamageMinLeft += lpObj->SetOpAddMinAttackDamage; lpObj->m_AttackDamageMinRight += lpObj->SetOpAddMinAttackDamage; lpObj->m_AttackDamageMaxLeft += lpObj->SetOpAddMaxAttackDamage; lpObj->m_AttackDamageMaxRight += lpObj->SetOpAddMaxAttackDamage; lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * lpObj->SetOpAddMagicPower / 100; lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * lpObj->SetOpAddMagicPower / 100; lpObj->AddLife += INT(lpObj->AddVitality * gCharInfo.sCharInfo[lpObj->Class].VitalityToLife); lpObj->AddMana += INT(lpObj->AddEnergy * gCharInfo.sCharInfo[lpObj->Class].EnergyToMana); lpObj->m_CriticalDamage += lpObj->SetOpAddCriticalDamageSuccessRate; lpObj->m_ExcelentDamage += lpObj->SetOpAddExDamageSuccessRate; if ( lpObj->pInventory[10].IsSetItem() ) { lpObj->pInventory[10].PlusSpecialSetRing((LPBYTE)lpObj->m_AddResistance); } if ( lpObj->pInventory[11].IsSetItem() ) { lpObj->pInventory[11].PlusSpecialSetRing((LPBYTE)lpObj->m_AddResistance); } if ( lpObj->pInventory[9].IsSetItem() ) { lpObj->pInventory[9].PlusSpecialSetRing((LPBYTE)lpObj->m_AddResistance); } if ( lpObj->SetOpTwoHandSwordImproveDamage ) { if ( !lpObj->pInventory[1].IsItem() && !lpObj->pInventory[0].IsItem() ) { lpObj->SetOpTwoHandSwordImproveDamage = 0; } if ( lpObj->pInventory[1].IsItem() && lpObj->pInventory[1].m_TwoHand == FALSE ) { lpObj->SetOpTwoHandSwordImproveDamage = 0; } if ( lpObj->pInventory[0].IsItem() && lpObj->pInventory[0].m_TwoHand == FALSE ) { lpObj->SetOpTwoHandSwordImproveDamage = 0; } } if ( (lpObj->MaxLife + lpObj->AddLife ) < lpObj->Life ) { lpObj->Life = lpObj->MaxLife + lpObj->AddLife; GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield); } gObjSetBP(lpObj->m_Index); if ( (lpObj->MaxMana + lpObj->AddMana ) < lpObj->Mana ) { lpObj->Mana = lpObj->MaxMana + lpObj->AddMana; GCManaSend(lpObj->m_Index, lpObj->Mana, 0xFF, 0, lpObj->BP); } lpObj->m_Defense += lpObj->SetOpAddDefence * 10 / 20; lpObj->m_Defense += lpObj->m_Defense * lpObj->SetOpAddDefenceRate / 100; if ( lpObj->pInventory[1].m_Type >= ITEMGET(6,0) && lpObj->pInventory[1].m_Type < ITEMGET(7,0) ) { lpObj->m_Defense += lpObj->m_Defense * lpObj->SetOpImproveSheldDefence / 100; } }
bool cChat::AddCommands(LPOBJ gObj, char *Msg, int Type) { int aIndex = User.GetPlayerIndex(gObj->Name); switch (Type) { case 0: if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addstr <num>", Msg)) return true; break; case 1: if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addagi <num>", Msg)) return true; break; case 2: if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addvit <num>", Msg)) return true; break; case 3: if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addene <num>", Msg)) return true; break; case 4: if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addcmd <num>", Msg)) return true; if (gObj->Class != 4) { TNotice.SendNotice(aIndex, 1, "[AddStats] You are not Dark Lord!!!"); //MessageLog(1, gObj, "[AddStats] You are not Dark Lord!!!"); return true; } break; } DWORD Points; sscanf(Msg, "%d", &Points); if (Configs.Commands.MaxAddedStats > 0 && Configs.Commands.MaxAddedStats <= Points) { TNotice.SendNotice(aIndex, 1, "[AddStats] You can't add more than %d stats!!!", Configs.Commands.MaxAddedStats); return true; } int MaxPoints = 32767; //if(Configs.Enable65kStats >= 1) // MaxPoints = -536; int Stats = 0; bool bResult = false; switch (Type) { case 0x00: Stats = gObj->Strength; if (gObj->Class == 0) MaxPoints; else if (gObj->Class == 1) MaxPoints; else if (gObj->Class == 2) MaxPoints; else if (gObj->Class == 3) MaxPoints; else if (gObj->Class == 4) MaxPoints; else if (gObj->Class == 5) MaxPoints; break; case 0x01: Stats = gObj->Dexterity; if (gObj->Class == 0) MaxPoints; else if (gObj->Class == 1) MaxPoints; else if (gObj->Class == 2) MaxPoints; else if (gObj->Class == 3) MaxPoints; else if (gObj->Class == 4) MaxPoints; else if (gObj->Class == 5) MaxPoints; break; case 0x02: Stats = gObj->Vitality; if (gObj->Class == 0) MaxPoints; else if (gObj->Class == 1) MaxPoints; else if (gObj->Class == 2) MaxPoints; else if (gObj->Class == 3) MaxPoints; else if (gObj->Class == 4) MaxPoints; else if (gObj->Class == 5) MaxPoints; break; case 0x03: Stats = gObj->Energy; if (gObj->Class == 0) MaxPoints; else if (gObj->Class == 1) MaxPoints; else if (gObj->Class == 2) MaxPoints; else if (gObj->Class == 3) MaxPoints; else if (gObj->Class == 4) MaxPoints; else if (gObj->Class == 5) MaxPoints; break; case 0x04: Stats = gObj->Leadership; if (gObj->Class == 4) MaxPoints; break; } int MaxPointsTemp = MaxPoints; if (MaxPoints > 32767) MaxPoints = -32768 + (MaxPoints - 32767); if (((MaxPoints > 0) && (Stats >= MaxPoints || Stats < 0)) || ((MaxPoints < 0) && (Stats < 0) && (Stats >= MaxPoints))) { TNotice.SendNotice(aIndex, 1, "[AddStats] You have max points for this type!!!"); return true; } int StatsTemp = Stats; Stats += Points; if (gObj->LevelUpPoint < Points) { TNotice.SendNotice(aIndex, 1, "[AddStats] You don't have enough points to add. Need %d more.", Points - gObj->LevelUpPoint); return true; } if (((MaxPoints > 0) && (Stats > MaxPoints || Stats < 0)) || ((MaxPoints < 0) && (Stats < 0) && (Stats > MaxPoints))) { TNotice.SendNotice(aIndex, 1, "[AddStats] You can't add more than %d points for this type!!!", MaxPoints - StatsTemp); return true; } TakeCommand(gObj, Configs.Commands.AddPriceZen, "AddStats"); switch (Type) { case 0x00://str { //PMSG_CHARREGEN pMsg; PMSG_STAT_UPDATE pMsg; PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE)); pMsg.result = 0; pMsg.btFruitType = 3; pMsg.btStatValue = Points; gObj->Strength += Points; gObj->LevelUpPoint -= Points; GCLevelUpMsgSend(gObj->m_Index, 1); gObjCalCharacter(gObj->m_Index); gObjSetBP(gObj->m_Index); DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size); //Utilits.SendEffect(gObj, 5); return true; } case 0x01://agi { PMSG_STAT_UPDATE pMsg; PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE)); pMsg.result = 0; pMsg.btFruitType = 2; pMsg.btStatValue = Points; gObj->Dexterity += Points; gObj->LevelUpPoint -= Points; GCLevelUpMsgSend(gObj->m_Index, 1); gObjCalCharacter(gObj->m_Index); gObjSetBP(gObj->m_Index); DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size); return true; } case 0x02://vit { PMSG_STAT_UPDATE pMsg; PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE)); pMsg.result = 0; pMsg.btStatValue = Points; pMsg.btFruitType = 1; DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size); gObj->Vitality += Points; gObj->MaxLife += gObj->VitalityToLife * Points; gObj->LevelUpPoint -= Points; GCLevelUpMsgSend(gObj->m_Index, 1); gObjCalCharacter(gObj->m_Index); GCReFillSend(gObj->m_Index, gObj->MaxLife + gObj->AddLife, 0xFE, 0, gObj->iMaxShield + gObj->iAddShield); gObjSetBP(gObj->m_Index); //Utilits.SendEffect(gObj, 2); return true; } case 0x03://ene { PMSG_STAT_UPDATE pMsg; PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE)); pMsg.result = 0; pMsg.btFruitType = 0; pMsg.btStatValue = Points; DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size); gObj->Energy += Points; gObj->MaxMana += gObj->EnergyToMana * Points; gObj->LevelUpPoint -= Points; GCLevelUpMsgSend(gObj->m_Index, 1); gObjCalCharacter(gObj->m_Index); GCManaSend(gObj->m_Index, gObj->MaxMana + gObj->AddMana, 0xFE, 0, gObj->MaxBP + gObj->AddBP); gObjSetBP(gObj->m_Index); //Utilits.SendEffect(gObj, 2); return true; } case 0x04://cmd { PMSG_STAT_UPDATE pMsg; PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE)); pMsg.result = 0; pMsg.btFruitType = 4; pMsg.btStatValue = Points; gObj->Leadership += Points; gObj->LevelUpPoint -= Points; DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size); gObjCalCharacter(aIndex); gObjSetBP(aIndex); GCLevelUpMsgSend(gObj->m_Index, 0); //Utilits.SendEffect(gObj, 2); return true; } default: { return true; } } TNotice.SendNotice(aIndex, 1, "[AddStats] Your stats successfully added!"); TNotice.SendNotice(aIndex, 1, "Please Relog!"); return true; }
bool CItemAddOption::_ClearItemEffect(LPOBJ lpObj, int iEffectOption, int iOptionType, int iEffectType, int iEffectValue) { if ( iEffectType <= 0 ) return false; switch ( iEffectType ) { case ADD_OPTION_LIFE: lpObj->AddLife -= iEffectValue; if ( (lpObj->AddLife + lpObj->MaxLife ) < lpObj->Life ) lpObj->Life = lpObj->AddLife + lpObj->MaxLife; GCReFillSend(lpObj->m_Index, (WORD)lpObj->Life, 0xFF, 0, lpObj->iShield); GCReFillSend(lpObj->m_Index, WORD(lpObj->MaxLife + lpObj->AddLife), 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield); break; case ADD_OPTION_MANA: lpObj->AddMana -= iEffectValue; if ( (lpObj->AddMana + lpObj->MaxMana ) < lpObj->Mana ) lpObj->Mana = lpObj->AddMana + lpObj->MaxMana; GCManaSend(lpObj->m_Index, (short)lpObj->Mana, -1, 0, lpObj->BP); GCManaSend(lpObj->m_Index, short(lpObj->AddMana + lpObj->MaxMana), 0xFE, 0, lpObj->MaxBP + lpObj->AddBP); break; case ADD_OPTION_ATTACK_DAMAGE: lpObj->m_AttackDamageMaxLeft -= iEffectValue; lpObj->m_AttackDamageMinLeft -= iEffectValue; lpObj->m_AttackDamageMaxRight -= iEffectValue; lpObj->m_AttackDamageMinRight -= iEffectValue; lpObj->m_MagicDamageMin -= iEffectValue; lpObj->m_MagicDamageMax -= iEffectValue; break; case ADD_OPTION_SPEED: lpObj->m_AttackSpeed -= iEffectValue; lpObj->m_MagicSpeed -= iEffectValue; break; case ADD_OPTION_EXPERIENCE: lpObj->m_wExprienceRate = 100; lpObj->m_btMoveMapBound = 0; break; case ADD_OPTION_DROP_RATE: lpObj->m_wItemDropRate = 100; lpObj->m_btMoveMapBound = 0; break; case 8: lpObj->m_wExprienceRate = 100; lpObj->m_btMoveMapBound = 0; break; case ADD_OPTION_DEFENSE: lpObj->m_Defense -= iEffectValue * 10 / 20; break; case ADD_OPTION_STRENGTH: lpObj->Strength -= iEffectValue; break; case ADD_OPTION_DEXTERITY: lpObj->Dexterity -= iEffectValue; break; case ADD_OPTION_VITALITY: lpObj->Vitality -= iEffectValue; break; case ADD_OPTION_ENERGY: lpObj->Energy -= iEffectValue; break; case ADD_OPTION_LEADERSHIP: lpObj->Leadership -= iEffectValue; break; case ADD_OPTION_FORCE: lpObj->m_AttackDamageMaxLeft -= iEffectValue; lpObj->m_AttackDamageMinLeft -= iEffectValue; lpObj->m_AttackDamageMaxRight -= iEffectValue; lpObj->m_AttackDamageMinRight -= iEffectValue; break; case ADD_OPTION_MAGIC: lpObj->m_MagicDamageMin -= iEffectValue; lpObj->m_MagicDamageMax -= iEffectValue; break; case ADD_OPTION_MOVEABLE: lpObj->m_btMoveMapBound = 0; //Do nothing cuz mapmovebound is removed break; default: return false; } GCUseEffectItem(lpObj, iEffectOption, iOptionType, iEffectType, 0); return true; }
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); } }
bool CItemAddOption::_SetItemEffect(LPOBJ lpObj, int iEffectType, int iEffectValue) { if ( iEffectType <= 0 ) return false; switch ( iEffectType ) { case ADD_OPTION_LIFE: lpObj->AddLife += iEffectValue; GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, -2, 0, lpObj->iMaxShield + lpObj->iAddShield); GCReFillSend(lpObj->m_Index, lpObj->Life, -1, 0, lpObj->iShield); break; case ADD_OPTION_MANA: lpObj->AddMana += iEffectValue; GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, -2, 0, lpObj->MaxBP + lpObj->AddBP); GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP); break; case ADD_OPTION_ATTACK_DAMAGE: lpObj->m_AttackDamageMaxLeft += iEffectValue; lpObj->m_AttackDamageMinLeft += iEffectValue; lpObj->m_AttackDamageMaxRight += iEffectValue; lpObj->m_AttackDamageMinRight += iEffectValue; lpObj->m_MagicDamageMin += iEffectValue; lpObj->m_MagicDamageMax += iEffectValue; break; case ADD_OPTION_SPEED: lpObj->m_AttackSpeed += iEffectValue; lpObj->m_MagicSpeed += iEffectValue; break; case ADD_OPTION_EXPERIENCE: lpObj->m_wExprienceRate = iEffectValue; break; case ADD_OPTION_DROP_RATE: lpObj->m_wItemDropRate = iEffectValue; break; case 8: lpObj->m_wExprienceRate = 0; break; case ADD_OPTION_DEFENSE: lpObj->m_Defense += iEffectValue * 10 / 20; break; case ADD_OPTION_STRENGTH: lpObj->Strength += iEffectValue; break; case ADD_OPTION_DEXTERITY: lpObj->Dexterity += iEffectValue; break; case ADD_OPTION_VITALITY: lpObj->Vitality += iEffectValue; break; case ADD_OPTION_ENERGY: lpObj->Energy += iEffectValue; break; case ADD_OPTION_LEADERSHIP: lpObj->Leadership += iEffectValue; break; case ADD_OPTION_FORCE: lpObj->m_AttackDamageMaxLeft += iEffectValue; lpObj->m_AttackDamageMinLeft += iEffectValue; lpObj->m_AttackDamageMaxRight += iEffectValue; lpObj->m_AttackDamageMinRight += iEffectValue; break; case ADD_OPTION_MAGIC: lpObj->m_MagicDamageMin += iEffectValue; lpObj->m_MagicDamageMax += iEffectValue; break; case ADD_OPTION_MOVEABLE: //Do nothing cuz mapmovebound is removed break; default: return false; } return true; }
//0067c120 void CBuffEffect::SetBuffEffect(LPOBJ lpObj, BYTE EffectType, int EffectValue) { if( lpObj == NULL || EffectType < 0 ) return; if( lpObj->Connected < 3 ) return; switch( EffectType ) { case ADD_OPTION_SPEED: lpObj->m_AttackSpeed += EffectValue; lpObj->m_MagicSpeed += EffectValue; break; case ADD_OPTION_DEFENSE: lpObj->m_Defense += EffectValue; lpObj->m_MagicDefense += EffectValue; break; case ADD_OPTION_LIFE: lpObj->AddLife += EffectValue; GCReFillSend(lpObj->m_Index,(int)(lpObj->AddLife + lpObj->MaxLife),0xFEu,0,lpObj->iAddShield + lpObj->iMaxShield); GCReFillSend(lpObj->m_Index, (int)lpObj->Life, 0xFF, 0, lpObj->iShield); break; case ADD_OPTION_MANA: lpObj->AddMana += EffectValue; GCManaSend(lpObj->m_Index,(int)(lpObj->AddMana + lpObj->MaxMana),0xFEu,0,lpObj->AddBP + lpObj->MaxBP); GCManaSend(lpObj->m_Index, (int)lpObj->Mana, 0xFF, 0, lpObj->BP); break; case ADD_OPTION_STRENGTH: lpObj->AddStrength += EffectValue; break; case ADD_OPTION_DEXTERITY: lpObj->AddDexterity += EffectValue; break; case ADD_OPTION_VITALITY: lpObj->AddVitality += EffectValue; break; case ADD_OPTION_ENERGY: lpObj->AddEnergy += EffectValue; break; case ADD_OPTION_LEADERSHIP: lpObj->AddLeadership += EffectValue; break; case ADD_OPTION_WIZARD_DEFENSE: lpObj->m_nSoulBarrierDefence = EffectValue; break; case ADD_OPTION_MAGIC_DEFENSE: lpObj->m_MagicDefense += EffectValue; break; case ADD_OPTION_REFLECT: lpObj->DamageReflect += EffectValue; break; case ADD_OPTION_ATTACK_RATE: lpObj->m_AttackRating -= EffectValue; break; case ADD_OPTION_WIZARD_DEFENSE_DURATION: lpObj->m_nSoulBarrierManaRate = EffectValue; break; case ADD_OPTION_CRITICAL_DAMAGE: lpObj->m_CriticalDamage += EffectValue; break; case ADD_OPTION_EXCELLENT_DAMAGE: lpObj->m_ExcelentDamage += EffectValue; break; case ADD_OPTION_BERSERKMANA: lpObj->AddMana += (int)(EffectValue * lpObj->MaxMana / 100.0); GCManaSend(lpObj->m_Index,(int)(lpObj->AddMana + lpObj->MaxMana),0xFEu,0,lpObj->AddBP + lpObj->MaxBP); GCManaSend(lpObj->m_Index, (int)lpObj->Mana, 0xFFu, 0, lpObj->BP); break; case ADD_OPTION_BERSERKLIFE: { float fAddLife = 0; float fPer = (((float)(40.0f) - (float)(EffectValue))/100.0f); fPer = (fPer > 0.1f)?fPer:0.1f; fAddLife = fPer * lpObj->MaxLife; lpObj->AddLife -= (int)((float)(fAddLife)); lpObj->Life = ( (float)(lpObj->Life) < ( (float)(lpObj->AddLife) + (float)(lpObj->MaxLife) ) )?( (float)(lpObj->Life) ):( ( (float)(lpObj->AddLife) + (float)(lpObj->MaxLife) ) ); GCReFillSend(lpObj->m_Index,(int)(lpObj->AddLife + lpObj->MaxLife),0xFEu,0,lpObj->iAddShield + lpObj->iMaxShield); GCReFillSend(lpObj->m_Index, (int)lpObj->Life, 0xFFu, 0, lpObj->iShield); } break; case ADD_OPTION_MAGICDAMAGEMIN: lpObj->m_MagicDamageMin += EffectValue; break; case ADD_OPTION_MAGICDAMAGEMAX: lpObj->m_MagicDamageMax += EffectValue; break; case ADD_OPTION_XMASATTACK: lpObj->m_AttackDamageMaxLeft += EffectValue; lpObj->m_AttackDamageMinLeft += EffectValue; lpObj->m_AttackDamageMaxRight += EffectValue; lpObj->m_AttackDamageMinRight += EffectValue; lpObj->m_MagicDamageMin += EffectValue; lpObj->m_MagicDamageMax += EffectValue; lpObj->m_CurseDamgeMin += EffectValue; lpObj->m_CurseDamgeMax += EffectValue; break; case ADD_OPTION_XMASDEFENSE: lpObj->m_Defense += EffectValue; break; case ADD_OPTION_LEVEL_BP: lpObj->AddBP += EffectValue * (lpObj->m_nMasterLevel + lpObj->Level); GCManaSend(lpObj->m_Index,(int)(lpObj->AddMana + lpObj->MaxMana),0xFEu,0,lpObj->AddBP + lpObj->MaxBP); GCManaSend(lpObj->m_Index, (int)lpObj->Mana, 0xFFu, 0, lpObj->BP); break; case ADD_OPTION_LEVEL_SD: lpObj->iAddShield += EffectValue * (lpObj->m_nMasterLevel + lpObj->Level); GCReFillSend(lpObj->m_Index,(int)(lpObj->AddLife + lpObj->MaxLife),0xFEu,0,lpObj->iAddShield + lpObj->iMaxShield); GCReFillSend(lpObj->m_Index, (int)lpObj->Life, 0xFFu, 0, lpObj->iShield); break; case ADD_OPTION_BP: lpObj->AddBP += EffectValue; GCManaSend(lpObj->m_Index,(int)(lpObj->AddMana + lpObj->MaxMana),0xFEu,0,lpObj->AddBP + lpObj->MaxBP); GCManaSend(lpObj->m_Index, (int)lpObj->Mana, 0xFFu, 0, lpObj->BP); break; case ADD_OPTION_SD: lpObj->iAddShield += EffectValue; GCReFillSend(lpObj->m_Index,(int)(lpObj->AddLife + lpObj->MaxLife),0xFEu,0,lpObj->iAddShield + lpObj->iMaxShield); GCReFillSend(lpObj->m_Index, (int)lpObj->Life, 0xFFu, 0, lpObj->iShield); break; case ADD_OPTION_IGNOREDEFENSE: lpObj->SetOpIgnoreDefense += EffectValue; break; case ADD_OPTION_SUCCESSFULBLOCKING: lpObj->m_SuccessfulBlocking += EffectValue; break; case SUB_OPTION_SUCCESSFULBLOCKING: lpObj->m_SuccessfulBlocking -= EffectValue; if ( lpObj->m_SuccessfulBlocking < 0 ) lpObj->m_SuccessfulBlocking = 0; break; default: return; } }
void gObjCalCharacter(int aIndex) { LPOBJ lpObj = &gObj[aIndex]; int Strength = 0; int Dexterity = 0; int Vitality = 0; int Energy = 0; CItem * Right = &lpObj->pInventory[0]; CItem * Left = &lpObj->pInventory[1]; CItem * Gloves = &lpObj->pInventory[5]; CItem * Amulet = &lpObj->pInventory[9]; CItem * Helper = &lpObj->pInventory[8]; lpObj->HaveWeaponInHand = true; if ( Right->IsItem() == FALSE && Left->IsItem() == FALSE ) { lpObj->HaveWeaponInHand = false; } else if ( Left->IsItem() == FALSE && Right->m_Type == ITEMGET(4,15) ) // Arrow { lpObj->HaveWeaponInHand = false; } else if ( Right->IsItem() == FALSE ) { int iType = Left->m_Type / MAX_SUBTYPE_ITEMS; if ( Left->m_Type == ITEMGET(4,7) ) // Bolt { lpObj->HaveWeaponInHand = false; } else if ( iType == 6 ) { lpObj->HaveWeaponInHand = false; } } lpObj->AddLife = 0; lpObj->AddMana = 0; lpObj->MonsterDieGetMoney = 0; lpObj->MonsterDieGetLife = 0; lpObj->MonsterDieGetMana = 0; lpObj->DamageReflect = 0; lpObj->DamageMinus = 0; lpObj->SkillLongSpearChange = false; if ( lpObj->m_iItemEffectValidTime > 0 ) { g_ItemAddOption.PrevSetItemLastEffectForHallowin(lpObj); } int iItemIndex; BOOL bIsChangeItem; // lc34 for ( iItemIndex=0; iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++) { if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE ) { lpObj->pInventory[iItemIndex].m_IsValidItem = true; } } do { lpObj->SetOpAddMaxAttackDamage = 0; lpObj->SetOpAddMinAttackDamage = 0; lpObj->SetOpAddDamage = 0; lpObj->SetOpIncAGValue = 0; lpObj->SetOpAddCriticalDamageSuccessRate = 0; lpObj->SetOpAddCriticalDamage = 0; lpObj->SetOpAddExDamageSuccessRate = 0; lpObj->SetOpAddExDamage = 0; lpObj->SetOpAddSkillAttack = 0; lpObj->AddStrength = 0; lpObj->AddDexterity = 0; lpObj->AddVitality = 0; lpObj->AddEnergy = 0; lpObj->AddBP = 0; lpObj->iAddShield = 0; lpObj->SetOpAddAttackDamage = 0; lpObj->SetOpAddDefence = 0; lpObj->SetOpAddMagicPower = 0; lpObj->SetOpAddDefenceRate = 0; lpObj->SetOpIgnoreDefense = 0; lpObj->SetOpDoubleDamage = 0; lpObj->SetOpTwoHandSwordImproveDamage = 0; lpObj->SetOpImproveSuccessAttackRate = 0; lpObj->SetOpReflectionDamage = 0; lpObj->SetOpImproveSheldDefence = 0; lpObj->SetOpDecreaseAG = 0; lpObj->SetOpImproveItemDropRate = 0; lpObj->IsFullSetItem = false; memset(lpObj->m_AddResistance, 0, sizeof(lpObj->m_AddResistance)); bIsChangeItem = 0; gObjCalcSetItemStat(lpObj); gObjCalcSetItemOption(lpObj); for (iItemIndex=0;iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++) { if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE && lpObj->pInventory[iItemIndex].m_IsValidItem != false ) { if ( gObjValidItem( lpObj, &lpObj->pInventory[iItemIndex], iItemIndex) != FALSE ) { lpObj->pInventory[iItemIndex].m_IsValidItem = true; } else { lpObj->pInventory[iItemIndex].m_IsValidItem = false; bIsChangeItem = TRUE; } } } } while ( bIsChangeItem != FALSE ); Strength = lpObj->Strength + lpObj->AddStrength; Dexterity = lpObj->Dexterity + lpObj->AddDexterity; Vitality = lpObj->Vitality + lpObj->AddVitality; Energy = lpObj->Energy + lpObj->AddEnergy; if ( lpObj->Class == CLASS_ELF ) // Elf { if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) || (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7)) || Right->m_Type == ITEMGET(4,16) || Left->m_Type == ITEMGET(4,20) || Left->m_Type == ITEMGET(4,21) || Right->m_Type == ITEMGET(4,18) || Right->m_Type == ITEMGET(4,19) || Left->m_Type == ITEMGET(4,17) ) { if ( (Right->IsItem() != FALSE && Right->m_IsValidItem == false) || (Left->IsItem() != FALSE && Left->m_IsValidItem == false) ) { lpObj->m_AttackDamageMinRight = (Dexterity + Strength ) / 7; lpObj->m_AttackDamageMaxRight = (Dexterity + Strength ) / 4; lpObj->m_AttackDamageMinLeft = (Dexterity + Strength ) / 7; lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength ) / 4; } else { lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 14); lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 8 ); lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 14); lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 8 ); } } else { lpObj->m_AttackDamageMinRight = (Dexterity + Strength) / 7; lpObj->m_AttackDamageMaxRight = (Dexterity + Strength) / 4; lpObj->m_AttackDamageMinLeft = (Dexterity + Strength) / 7; lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength) / 4; } } else if ( lpObj->Class == CLASS_KNIGHT ) // Dark Knight { lpObj->m_AttackDamageMinRight = Strength / 6; lpObj->m_AttackDamageMaxRight = Strength / 4; lpObj->m_AttackDamageMinLeft = Strength / 6; lpObj->m_AttackDamageMaxLeft = Strength / 4; } else if (lpObj->Class == CLASS_MAGUMSA ) // MAgic Gladiator { lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8); lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8); } else if ( lpObj->Class == CLASS_DARKLORD ) // Dark Lord { lpObj->m_AttackDamageMinRight = (Strength / 7) + (Energy / 14); lpObj->m_AttackDamageMaxRight = (Strength / 5) + (Energy / 10); lpObj->m_AttackDamageMinLeft = (Strength / 7) + (Energy / 14); lpObj->m_AttackDamageMaxLeft = (Strength / 5) + (Energy / 10); } else if( lpObj->Class == CLASS_SUMMONER ) // Summoner { lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 7); lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 4); lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 7); lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 4); } else { lpObj->m_AttackDamageMinRight = (Strength / 8); lpObj->m_AttackDamageMaxRight = (Strength / 4); lpObj->m_AttackDamageMinLeft = (Strength / 8); lpObj->m_AttackDamageMaxLeft = (Strength / 4); } lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMinRight, 80); lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80); lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80); lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80); int AddLeadership = 0; if ( lpObj->pInventory[7].IsItem() != FALSE && lpObj->pInventory[7].m_IsValidItem != false) { AddLeadership += lpObj->pInventory[7].m_Leadership; } if ( Right->m_Type != -1 ) { if ( Right->m_IsValidItem != false ) { if ( Right->m_Type >= ITEMGET(5,0) && Right->m_Type <= ITEMGET(6,0) ) { lpObj->m_AttackDamageMinRight += Right->m_DamageMin / 2; lpObj->m_AttackDamageMaxRight += Right->m_DamageMax / 2; } else { lpObj->m_AttackDamageMinRight += Right->m_DamageMin; lpObj->m_AttackDamageMaxRight += Right->m_DamageMax; } } if ( lpObj->pInventory[0].m_SkillChange != FALSE ) { lpObj->SkillLongSpearChange = true; } lpObj->pInventory[0].PlusSpecial(&lpObj->m_AttackDamageMinRight, 80); lpObj->pInventory[0].PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80); } if ( Left->m_Type != -1 ) { if ( Left->m_IsValidItem != false) { lpObj->m_AttackDamageMinLeft += Left->m_DamageMin; lpObj->m_AttackDamageMaxLeft += Left->m_DamageMax; } lpObj->pInventory[1].PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80); lpObj->pInventory[1].PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80); } lpObj->m_CriticalDamage = 0; lpObj->m_ExcelentDamage = 0; lpObj->pInventory[0].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[1].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[2].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[3].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[4].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[5].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[6].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[7].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->m_MagicDamageMin = Energy / 9; lpObj->m_MagicDamageMax = Energy / 4; lpObj->pInventory[7].PlusSpecial(&lpObj->m_MagicDamageMin, 81); lpObj->pInventory[7].PlusSpecial(&lpObj->m_MagicDamageMax, 81); if ( Right->m_Type != -1 ) { if ( lpObj->pInventory[0].m_Type == ITEMGET(0,31) || lpObj->pInventory[0].m_Type == ITEMGET(0,21) || lpObj->pInventory[0].m_Type == ITEMGET(0,23) || lpObj->pInventory[0].m_Type == ITEMGET(0,25) ) { lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMin, 80); lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMax, 80); } else { lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMin, 81); lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMax, 81); } } lpObj->m_AttackRating = (Strength + Dexterity) / 2; lpObj->m_AttackRating += lpObj->pInventory[5].ItemDefense(); if ( lpObj->Class == 2 ) // Elf { lpObj->m_AttackSpeed = Dexterity / 50; lpObj->m_MagicSpeed = Dexterity / 50; } else if ( lpObj->Class == 1 || lpObj->Class == 3) // Dark Knigh and MG { lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; } else if ( lpObj->Class == 4 ) // DarkLord { lpObj->m_AttackSpeed = Dexterity / 10; lpObj->m_MagicSpeed = Dexterity / 10; } else if ( lpObj->Class == 5 ) // Summoner { lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; } else { lpObj->m_AttackSpeed = Dexterity / 20; lpObj->m_MagicSpeed = Dexterity / 10; } bool bRight = false; bool bLeft = false; if ( Right->m_Type != ITEMGET(4,7) && Right->m_Type != ITEMGET(4,15) && Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(6,0) ) { if ( Right->m_IsValidItem != false ) { bRight = true; } } if ( Left->m_Type != ITEMGET(4,7) && Left->m_Type != ITEMGET(4,15) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(6,0) ) { if ( Left->m_IsValidItem != false ) { bLeft = true; } } if ( bRight != false && bLeft != false ) { lpObj->m_AttackSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2; lpObj->m_MagicSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2; } else if ( bRight!= false ) { lpObj->m_AttackSpeed += Right->m_AttackSpeed; lpObj->m_MagicSpeed += Right->m_AttackSpeed; } else if ( bLeft != false ) { lpObj->m_AttackSpeed += Left->m_AttackSpeed; lpObj->m_MagicSpeed += Left->m_AttackSpeed; } if ( Gloves->m_Type != -1 ) { if ( Gloves->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Gloves->m_AttackSpeed; lpObj->m_MagicSpeed += Gloves->m_AttackSpeed; } } if ( Helper->m_Type != -1 ) { if ( Helper->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Helper->m_AttackSpeed; lpObj->m_MagicSpeed += Helper->m_AttackSpeed; } } if ( Amulet->m_Type != -1 ) { if ( Amulet->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Amulet->m_AttackSpeed; lpObj->m_MagicSpeed += Amulet->m_AttackSpeed; } } // Wizard Ring effect if ( (lpObj->pInventory[10].IsItem() == TRUE && lpObj->pInventory[10].m_Type == ITEMGET(13,20) && lpObj->pInventory[10].m_Level == 0 && lpObj->pInventory[10].m_Durability > 0.0f ) || (lpObj->pInventory[11].IsItem() == TRUE && lpObj->pInventory[11].m_Type == ITEMGET(13,20) && lpObj->pInventory[11].m_Level == 0 && lpObj->pInventory[11].m_Durability > 0.0f ) ) { lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 10 / 100; lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 10 / 100; lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 10 / 100; lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 10 / 100; lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 10 / 100; lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 10 / 100; lpObj->m_AttackSpeed += 10; lpObj->m_MagicSpeed += 10; } if ( lpObj->Class == CLASS_WIZARD ) // Dark Wizard; { lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) ); } else { lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); } if ( lpObj->m_DetectSpeedHackTime < gMinimumAttackSpeedTime ) { lpObj->m_DetectSpeedHackTime = gMinimumAttackSpeedTime; } if ( lpObj->Class == 2 ) // elf { lpObj->m_SuccessfulBlocking = Dexterity / 4; } else if ( lpObj->Class == 4 ) // DL { lpObj->m_SuccessfulBlocking = Dexterity / 7; } else { lpObj->m_SuccessfulBlocking = Dexterity / 3; } if ( Left->m_Type != -1 ) { if ( Left->m_IsValidItem != false ) { lpObj->m_SuccessfulBlocking += Left->m_SuccessfulBlocking; lpObj->pInventory[1].PlusSpecial(&lpObj->m_SuccessfulBlocking, 82); } } bool Success = true; if ( lpObj->Class == CLASS_MAGUMSA ) // MG { for ( int j=3;j<=6;j++) { if ( lpObj->pInventory[j].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[j].m_IsValidItem == false ) { Success = false; break; } } } else { for ( int k=2;k<=6;k++) { if ( lpObj->pInventory[k].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[k].m_IsValidItem == false ) { Success = false; break; } } } int Level11Count = 0; int Level10Count = 0; int Level12Count = 0; int Level13Count = 0; int Level14Count = 0; int Level15Count = 0; if ( Success != false ) { int in; if ( lpObj->Class == CLASS_MAGUMSA ) // MG { in = lpObj->pInventory[3].m_Type % MAX_SUBTYPE_ITEMS; if ( in != ITEMGET(0,15) && in != ITEMGET(0,20) && in != ITEMGET(0,23) && in != ITEMGET(0,33) && in != ITEMGET(0,32) && in != ITEMGET(0,37) ) { Success = false; } else { Level13Count++; for (int m=3;m<=6;m++) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } } else { in = lpObj->pInventory[2].m_Type % MAX_SUBTYPE_ITEMS; for (int m=2;m<=6;m++) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } if ( Success != false ) // #warning unuseful if { lpObj->m_SuccessfulBlocking += lpObj->m_SuccessfulBlocking / 10; } } if ( lpObj->Class == CLASS_ELF ) // Elf { lpObj->m_Defense = Dexterity / 10; } else if ( lpObj->Class == 1 ) // DK { lpObj->m_Defense = Dexterity / 3; } else if ( lpObj->Class == 4 ) // DL { lpObj->m_Defense = Dexterity / 7; } else if ( lpObj->Class == 5 ) // SU { lpObj->m_Defense = Dexterity / 3; } else { lpObj->m_Defense = Dexterity / 4; } lpObj->m_Defense += lpObj->pInventory[2].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[3].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[4].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[5].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[6].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[1].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[7].ItemDefense(); if ( lpObj->pInventory[8].IsItem() != FALSE ) { if ( lpObj->pInventory[8].m_Type == ITEMGET(13,4) && lpObj->pInventory[8].m_Durability > 0.0f ) // Dark Horse { lpObj->m_Defense += INT( Dexterity / 20 + 5 + Helper->m_PetItem_Level * 2 ); } } if ( (Level13Count + Level12Count + Level11Count + Level10Count + Level14Count + Level15Count ) >= 5 ) { if ( Success != false ) { if( Level15Count == 5) { lpObj->m_Defense += lpObj->m_Defense * 30 / 100; } else if( Level14Count == 5) { lpObj->m_Defense += lpObj->m_Defense * 25 / 100; } else if ( Level13Count == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 20 / 100; } else if ( Level12Count == 5 || (Level12Count + Level13Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 15 / 100; } else if ( Level11Count == 5 || (Level11Count + Level12Count + Level13Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 10 / 100; } else if ( Level10Count == 5 || (Level10Count + Level11Count + Level12Count + Level13Count) == 5) { lpObj->m_Defense += lpObj->m_Defense * 5 / 100; } } } lpObj->m_Defense = lpObj->m_Defense * 10 / 20; if ( lpObj->m_Change == 9 ) { } else if ( lpObj->m_Change == 41 ) { lpObj->AddLife = ((int)(lpObj->MaxLife * 20.0f))/100; } else if ( lpObj->m_Change == 372 ) { lpObj->m_Defense += lpObj->m_Defense / 10; lpObj->AddLife += lpObj->Level; } else if ( lpObj->m_Change == 374 ) { lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 20 / 100; lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 20 / 100; lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 20 / 100; lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 20 / 100; lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 20 / 100; lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 20 / 100; } else if ( lpObj->m_Change == 378 ) { lpObj->m_AddResistance[R_ICE] += (char)255; lpObj->m_AddResistance[R_POISON] += (char)255; lpObj->m_AddResistance[R_LIGHTNING] += (char)255; lpObj->m_AddResistance[R_FIRE] += (char)255; lpObj->m_AddResistance[R_EARTH] += (char)255; lpObj->m_AddResistance[R_WIND] += (char)255; lpObj->m_AddResistance[R_WATER] += (char)255; } if ( lpObj->pInventory[8].m_Type == ITEMGET(13,0) ) { lpObj->AddLife += 50; } if ( lpObj->pInventory[8].m_Type == ITEMGET(13,37) && lpObj->pInventory[8].m_NewOption == 4 && lpObj->pInventory[8].m_Durability > 0.0f ) //Golden Fenrir Attribute { lpObj->AddLife += 200; //Life +200 lpObj->AddMana += 200; //Mana +200 /* //Attack Power Already Coded on zzzitem.cpp lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 33 / 100; //Attack Power +33 lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 33 / 100; //Attack Power +33 lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 33 / 100; //Attack Power +33 lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 33 / 100; //Attack Power +33 */ lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 16 / 100; //Wizardry +16 lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 16 / 100; //Wizardry +16 } int addlife = 0; int addmana = 0; if ( lpObj->pInventory[7].m_Type >= ITEMGET(12,0) && lpObj->pInventory[7].m_Type <= ITEMGET(12,6) || lpObj->pInventory[7].m_Type == ITEMGET(13,30) ) //Third Wings Fix Applied { lpObj->pInventory[7].PlusSpecial(&addlife, 100); lpObj->pInventory[7].PlusSpecial(&addmana, 101); lpObj->pInventory[7].PlusSpecial(&AddLeadership, 105); lpObj->AddLeadership = AddLeadership; lpObj->AddLife += addlife; lpObj->AddMana += addmana; } if ( lpObj->pInventory[8].m_Type == ITEMGET(13,3) ) { lpObj->pInventory[8].PlusSpecial(&lpObj->AddBP, 103 ); } if ( lpObj->Type == OBJ_USER ) { gDarkSpirit[lpObj->m_Index].Set(lpObj->m_Index, &lpObj->pInventory[1]); } lpObj->pInventory[9].PlusSpecialPercentEx(&lpObj->AddBP, lpObj->MaxBP, 173); lpObj->pInventory[10].PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172); lpObj->pInventory[11].PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172); CItem * rItem[3]; int comparecount = 0; rItem[0] = &lpObj->pInventory[10]; rItem[1] = &lpObj->pInventory[11]; rItem[2] = &lpObj->pInventory[9]; #define GET_MAX_RESISTANCE(x,y,z) ( ( ( ( (x) > (y) ) ? (x) : (y) ) > (z) ) ? ( ( (x) > (y) ) ? (x) : (y) ) : (z) ) lpObj->m_Resistance[1] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[1], rItem[1]->m_Resistance[1], rItem[2]->m_Resistance[1]); lpObj->m_Resistance[0] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[0], rItem[1]->m_Resistance[0], rItem[2]->m_Resistance[0]); lpObj->m_Resistance[2] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[2], rItem[1]->m_Resistance[2], rItem[2]->m_Resistance[2]); lpObj->m_Resistance[3] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[3], rItem[1]->m_Resistance[3], rItem[2]->m_Resistance[3]); lpObj->m_Resistance[4] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[4], rItem[1]->m_Resistance[4], rItem[2]->m_Resistance[4]); lpObj->m_Resistance[5] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[5], rItem[1]->m_Resistance[5], rItem[2]->m_Resistance[5]); lpObj->m_Resistance[6] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[6], rItem[1]->m_Resistance[6], rItem[2]->m_Resistance[6]); g_kItemSystemFor380.ApplyFor380Option(lpObj); g_kJewelOfHarmonySystem.SetApplyStrengthenItem(lpObj); //BuffEffectC.InitEffect(lpObj); MasterLevelSystem.SetObjEffect(lpObj->m_Index); gItemSocket.ApplyEffect(lpObj->m_Index); GObjExtItemApply(lpObj); gObjSetItemApply(lpObj); gObjNextExpCal(lpObj); if ( (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7) ) || Left->m_Type == ITEMGET(4,17) || Left->m_Type == ITEMGET(4,20) || Left->m_Type == ITEMGET(4,21) || Left->m_Type == ITEMGET(4,22) ) { if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 1 ) { lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.03f + 1.0f); lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.03f + 1.0f); } else if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 2 ) { lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.05f + 1.0f); lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.05f + 1.0f); } } else if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) || (Right->m_Type >= ITEMGET(4,16) && Right->m_Type < ITEMGET(5,0)) ) { if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 1 ) { lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.03f + 1.0f); lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.03f + 1.0f); } else if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 2 ) { lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.05f + 1.0f); lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.05f + 1.0f); } } if ( lpObj->Class == CLASS_KNIGHT || lpObj->Class == CLASS_MAGUMSA || lpObj->Class == CLASS_DARKLORD ) { if ( Right->m_Type != -1 && Left->m_Type != -1 ) { if ( Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(4,0) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(4,0) ) { lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * 55 / 100; lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * 55 / 100; lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * 55 / 100; lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * 55 / 100; } } } if ( lpObj->m_iItemEffectValidTime > 0 ) { g_ItemAddOption.NextSetItemLastEffectForHallowin(lpObj); } if(Helper->m_Type == ITEMGET(13,64)) { lpObj->m_AttackDamageMin += (lpObj->m_AttackDamageMin/100) * 40; lpObj->m_AttackDamageMax += (lpObj->m_AttackDamageMax/100) * 40; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*40) / 100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*40) / 10; lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*40) / 100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*40) / 100; lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*40) / 100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*40) / 100; lpObj->m_AttackSpeed += 10; lpObj->m_MagicSpeed += 10; } else if(Helper->m_Type == ITEMGET(13,65)) { //lpObj->AddLife += 50; lpObj->m_Defense += lpObj->m_Defense * (30 / 100); } else if(Helper->m_Type == ITEMGET(13,106)) { lpObj->m_Defense += 50; } else if(Helper->m_Type == ITEMGET(13,123)) { lpObj->m_AttackDamageMin += (lpObj->m_AttackDamageMin/100) * 40; lpObj->m_AttackDamageMax += (lpObj->m_AttackDamageMax/100) * 40; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight/100) * 40; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight/100) * 40; lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft/100) * 40; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft/100) * 40; lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin/100) * 40; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax/100) * 40; lpObj->m_AttackSpeed += 10; lpObj->m_MagicSpeed += 10; } gObjCalcShieldPoint(lpObj); if ( lpObj->iShield > ( lpObj->iMaxShield + lpObj->iAddShield ) ) { lpObj->iShield = lpObj->iMaxShield + lpObj->iAddShield ; GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield); } /* if(lpObj->m_SkillSwordPowerTime != 0) { lpObj->AddLife = (lpObj->AddLife * lpObj->m_SkillSwordPowerDec)/100; lpObj->m_Defense = (lpObj->m_Defense * lpObj->m_SkillSwordPowerDec)/100; lpObj->AddMana = lpObj->AddMana * lpObj->m_SkillSwordPowerInc; lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * lpObj->m_SkillSwordPowerInc; lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * lpObj->m_SkillSwordPowerInc; lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * lpObj->m_SkillSwordPowerInc; lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * lpObj->m_SkillSwordPowerInc; lpObj->m_MagicDamageMin = lpObj->m_MagicDamageMin * lpObj->m_SkillSwordPowerInc; lpObj->m_MagicDamageMax = lpObj->m_MagicDamageMax * lpObj->m_SkillSwordPowerInc; }*/ GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield); GCManaSend(lpObj->m_Index, lpObj->MaxMana + lpObj->AddMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP); }
// ---------------------------------------------------------------------------------------------- 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 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 CLifeStone::LifeStoneAct(int iIndex) { if ( !gObjIsConnected(iIndex)) return; LPOBJ lpObj = &gObj[iIndex]; lpObj->m_iCreatedActivationTime++; BYTE btCreationState = lpObj->m_btCreationState; if ( lpObj->m_iCreatedActivationTime < 60 ) lpObj->m_btCreationState = lpObj->m_iCreatedActivationTime / 12; else lpObj->m_btCreationState = 5; if ( btCreationState != lpObj->m_btCreationState ) GCSendObjectCreationState(iIndex); if ( lpObj->m_btCreationState < 5 ) return; if ( lpObj->VPCount < 1 ) return; int tObjNum = -1; for (int i=0;i<MAX_VIEWPORT;i++) { tObjNum = lpObj->VpPlayer[i].number; if ( tObjNum >= 0 ) { if ( gObj[tObjNum].Type == OBJ_USER && gObj[tObjNum].Live ) { if ( gObj[tObjNum].m_btCsJoinSide == lpObj->m_btCsJoinSide ) { if ( abs(lpObj->Y - gObj[tObjNum].Y) <= 3 && abs(lpObj->X - gObj[tObjNum].X) <= 3 ) { BOOL bLifeChange = FALSE; BOOL bManaChange = FALSE; BOOL bBpChange = FALSE; /*gObj[tObjNum].Life += 100.0f; gObj[tObjNum].Mana += 100.0f; gObj[tObjNum].BP += 100;*/ if ( gObj[tObjNum].Life < (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)) { gObj[tObjNum].Life += ( gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife ) / 100.0f; if ( gObj[tObjNum].Life > (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)) gObj[tObjNum].Life = gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife; bLifeChange = TRUE; } if ( gObj[tObjNum].Mana < (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana)) { gObj[tObjNum].Mana += ( gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana ) / 100.0f; if ( gObj[tObjNum].Mana > (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana)) gObj[tObjNum].Mana = gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana; bManaChange = TRUE; } if ( gObj[tObjNum].BP < (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP)) { gObj[tObjNum].BP += ( gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP ) / 100; if ( gObj[tObjNum].BP > (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP)) gObj[tObjNum].BP = gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP; bBpChange = TRUE; } if (bLifeChange ) GCReFillSend(tObjNum, (WORD)gObj[tObjNum].Life, 0xFF, 1, gObj[tObjNum].iShield); if (bManaChange ||bBpChange ) GCManaSend(tObjNum, (short)gObj[tObjNum].Mana, 0xFF, 0, gObj[tObjNum].BP); } } } } } }
// ----------------------------------------------------------------------------------------------------------------------- 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 CItemAddOption::_ClearItemEffect(LPOBJ lpObj, int iEffectOption, int iOptionType, int iEffectType, int iEffectValue) { if ( iEffectType <= 0 ) return false; switch ( iEffectType ) { case ADD_OPTION_LIFE: lpObj->AddLife -= iEffectValue; if ( (lpObj->AddLife + lpObj->MaxLife ) < lpObj->Life ) { lpObj->Life = lpObj->AddLife + lpObj->MaxLife; } 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 ADD_OPTION_MANA: lpObj->AddMana -= iEffectValue; if ( (lpObj->AddMana + lpObj->MaxMana ) < lpObj->Mana ) { lpObj->Mana = lpObj->AddMana + lpObj->MaxMana; } GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP); GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP); break; case ADD_OPTION_ATTACK_DAMAGE: lpObj->m_AttackDamageMaxLeft -= iEffectValue; lpObj->m_AttackDamageMinLeft -= iEffectValue; lpObj->m_AttackDamageMaxRight -= iEffectValue; lpObj->m_AttackDamageMinRight -= iEffectValue; lpObj->m_MagicDamageMin -= iEffectValue; lpObj->m_MagicDamageMax -= iEffectValue; break; /*case ADD_OPTION_SPEED: lpObj->m_AttackSpeed -= iEffectValue; lpObj->m_MagicSpeed -= iEffectValue; break;*/ case ADD_OPTION_DEFENSE: lpObj->m_Defense -= iEffectValue * 10 / 20; break; case ADD_OPTION_STRENGTH: lpObj->AddStrength -= iEffectValue; break; case ADD_OPTION_DEXTERITY: lpObj->AddDexterity -= iEffectValue; break; case ADD_OPTION_VITALITY: lpObj->AddVitality -= iEffectValue; break; case ADD_OPTION_ENERGY: lpObj->AddEnergy -= iEffectValue; break; case ADD_OPTION_LEADERSHIP: lpObj->AddLeadership -= iEffectValue; break; case ADD_OPTION_WRATH: lpObj->m_AttackDamageMaxLeft -= iEffectValue; lpObj->m_AttackDamageMinLeft -= iEffectValue; lpObj->m_AttackDamageMaxRight -= iEffectValue; lpObj->m_AttackDamageMinRight -= iEffectValue; break; case ADD_OPTION_WIZARDRY: lpObj->m_MagicDamageMin -= iEffectValue; lpObj->m_MagicDamageMax -= iEffectValue; break; case ADD_OPTION_MOBILITY: break; default: return false; } GCUseEffectItem(lpObj, iEffectOption, iOptionType, iEffectType, 0); return true; }
bool CItemAddOption::_SetItemEffect(LPOBJ lpObj, int iEffectType, int iEffectValue)//55D100 { if ( iEffectType <= 0 ) return false; switch ( iEffectType ) { case ADD_OPTION_LIFE: lpObj->AddLife += iEffectValue; GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, -2, 0, lpObj->iMaxShield + lpObj->iAddShield); GCReFillSend(lpObj->m_Index, lpObj->Life, -1, 0, lpObj->iShield); break; case ADD_OPTION_MANA: lpObj->AddMana += iEffectValue; GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, -2, 0, lpObj->MaxBP + lpObj->AddBP); GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP); break; case ADD_OPTION_ATTACK_DAMAGE: lpObj->m_AttackDamageMaxLeft += iEffectValue; lpObj->m_AttackDamageMinLeft += iEffectValue; lpObj->m_AttackDamageMaxRight += iEffectValue; lpObj->m_AttackDamageMinRight += iEffectValue; lpObj->m_MagicDamageMin += iEffectValue; lpObj->m_MagicDamageMax += iEffectValue; break; /*case ADD_OPTION_SPEED: lpObj->m_AttackSpeed += iEffectValue; lpObj->m_MagicSpeed += iEffectValue; break;*/ case ADD_OPTION_DEFENSE: lpObj->m_Defense += iEffectValue * 10 / 20; break; case ADD_OPTION_STRENGTH: lpObj->AddStrength += iEffectValue; break; case ADD_OPTION_DEXTERITY: lpObj->AddDexterity += iEffectValue; break; case ADD_OPTION_VITALITY: lpObj->AddVitality += iEffectValue; break; case ADD_OPTION_ENERGY: lpObj->AddEnergy += iEffectValue; break; case ADD_OPTION_LEADERSHIP: lpObj->AddLeadership += iEffectValue; break; case ADD_OPTION_WRATH: lpObj->m_AttackDamageMaxLeft += iEffectValue; lpObj->m_AttackDamageMinLeft += iEffectValue; lpObj->m_AttackDamageMaxRight += iEffectValue; lpObj->m_AttackDamageMinRight += iEffectValue; break; case ADD_OPTION_WIZARDRY: lpObj->m_MagicDamageMin += iEffectValue; lpObj->m_MagicDamageMax += iEffectValue; break; case ADD_OPTION_MOBILITY: break; default: return false; } return true; }
void CCalCharacter::gObjCalCharacter(int aIndex) { LPOBJ lpObj = &gObj[aIndex]; int Strength = 0; int Dexterity = 0; int Vitality = 0; int Energy = 0; int Leadership = 0; // ---- CItem * Right = &lpObj->pInventory[0]; CItem * Left = &lpObj->pInventory[1]; CItem * Helm = &lpObj->pInventory[2]; CItem * Armor = &lpObj->pInventory[3]; CItem * Pants = &lpObj->pInventory[4]; CItem * Gloves = &lpObj->pInventory[5]; CItem * Boots = &lpObj->pInventory[6]; CItem * Wings = &lpObj->pInventory[7]; CItem * Helper = &lpObj->pInventory[8]; CItem * Amulet = &lpObj->pInventory[9]; CItem * Ring01 = &lpObj->pInventory[10]; CItem * Ring02 = &lpObj->pInventory[11]; lpObj->HaveWeaponInHand = true; // ------------------------------------------------------- // Check Weapon in hand // ------------------------------------------------------- if ( Right->IsItem() == false && Left->IsItem() == false ) { lpObj->HaveWeaponInHand = false; } else if ( Left->IsItem() == false && Right->m_Type == ITEMGET(4,15) ) // Arrow { lpObj->HaveWeaponInHand = false; } else if ( Right->IsItem() == false ) { int iType = Left->m_Type / MAX_SUBTYPE_ITEMS; if ( Left->m_Type == ITEMGET(4,7) ) // Bolt { lpObj->HaveWeaponInHand = false; } else if ( iType == 6 ) // Shield { lpObj->HaveWeaponInHand = false; } } // ------------------------------------------------------- lpObj->AddLife = 0; lpObj->AddMana = 0; lpObj->MonsterDieGetMoney = 0; lpObj->MonsterDieGetLife = 0; lpObj->MonsterDieGetMana = 0; lpObj->DamageReflect = 0; lpObj->DamageMinus = 0; lpObj->SkillLongSpearChange = false; if ( lpObj->m_iItemEffectValidTime > 0 ) { g_ItemAddOption.PrevSetItemLastEffectForHallowin(lpObj); } int iItemIndex; BOOL bIsChangeItem; // lc34 for ( iItemIndex=0; iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++) { if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE ) { lpObj->pInventory[iItemIndex].m_IsValidItem = true; } } do { lpObj->SetOpAddMaxAttackDamage = 0; lpObj->SetOpAddMinAttackDamage = 0; lpObj->SetOpAddDamage = 0; lpObj->SetOpIncAGValue = 0; lpObj->SetOpAddCriticalDamageSuccessRate = 0; lpObj->SetOpAddCriticalDamage = 0; lpObj->SetOpAddExDamageSuccessRate = 0; lpObj->SetOpAddExDamage = 0; lpObj->SetOpAddSkillAttack = 0; lpObj->AddStrength = 0; lpObj->AddDexterity = 0; lpObj->AddVitality = 0; lpObj->AddEnergy = 0; lpObj->AddBP = 0; lpObj->iAddShield = 0; lpObj->SetOpAddAttackDamage = 0; lpObj->SetOpAddDefence = 0; lpObj->SetOpAddMagicPower = 0; lpObj->SetOpAddDefenceRate = 0; lpObj->SetOpIgnoreDefense = 0; lpObj->SetOpDoubleDamage = 0; lpObj->SetOpTwoHandSwordImproveDamage = 0; lpObj->SetOpImproveSuccessAttackRate = 0; lpObj->SetOpReflectionDamage = 0; lpObj->SetOpImproveSheldDefence = 0; lpObj->SetOpDecreaseAG = 0; lpObj->SetOpImproveItemDropRate = 0; lpObj->IsFullSetItem = false; memset(lpObj->m_AddResistance, 0, sizeof(lpObj->m_AddResistance)); bIsChangeItem = 0; gObjCalcSetItemStat(lpObj); gObjCalcSetItemOption(lpObj); for (iItemIndex=0;iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++) { if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE && lpObj->pInventory[iItemIndex].m_IsValidItem != false ) { if ( gObjValidItem( lpObj, &lpObj->pInventory[iItemIndex], iItemIndex) != FALSE ) { lpObj->pInventory[iItemIndex].m_IsValidItem = true; } else { lpObj->pInventory[iItemIndex].m_IsValidItem = false; bIsChangeItem = TRUE; } } } } while ( bIsChangeItem != FALSE ); Strength = lpObj->Strength + lpObj->AddStrength; Dexterity = lpObj->Dexterity + lpObj->AddDexterity; Vitality = lpObj->Vitality + lpObj->AddVitality; Energy = lpObj->Energy + lpObj->AddEnergy; Leadership = lpObj->Leadership + lpObj->AddLeadership; switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_AttackDamageMinRight = (Strength / 8); lpObj->m_AttackDamageMaxRight = (Strength / 4); lpObj->m_AttackDamageMinLeft = (Strength / 8); lpObj->m_AttackDamageMaxLeft = (Strength / 4); break; case CLASS_KNIGHT: lpObj->m_AttackDamageMinRight = Strength / 6; lpObj->m_AttackDamageMaxRight = Strength / 4; lpObj->m_AttackDamageMinLeft = Strength / 6; lpObj->m_AttackDamageMaxLeft = Strength / 4; break; case CLASS_ELF: if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) || (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7)) || Right->m_Type == ITEMGET(4,16) || Left->m_Type == ITEMGET(4,17) || Right->m_Type == ITEMGET(4,18) || Right->m_Type == ITEMGET(4,19) || Left->m_Type == ITEMGET(4,20) || Left->m_Type == ITEMGET(4,21) || Left->m_Type == ITEMGET(4,22) || Left->m_Type == ITEMGET(4,23) || Left->m_Type == ITEMGET(4,24) ) { if ( (Right->IsItem() != FALSE && Right->m_IsValidItem == false) || (Left->IsItem() != FALSE && Left->m_IsValidItem == false) ) { lpObj->m_AttackDamageMinRight = (Dexterity + Strength ) / 7; lpObj->m_AttackDamageMaxRight = (Dexterity + Strength ) / 4; lpObj->m_AttackDamageMinLeft = (Dexterity + Strength ) / 7; lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength ) / 4; } else { lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 14); lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 8 ); lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 14); lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 8 ); } } else { lpObj->m_AttackDamageMinRight = (Dexterity + Strength) / 7; lpObj->m_AttackDamageMaxRight = (Dexterity + Strength) / 4; lpObj->m_AttackDamageMinLeft = (Dexterity + Strength) / 7; lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength) / 4; } break; case CLASS_MAGUMSA: lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8); lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8); break; case CLASS_DARKLORD: lpObj->m_AttackDamageMinRight = (Strength / 7) + (Energy / 14); lpObj->m_AttackDamageMaxRight = (Strength / 5) + (Energy / 10); lpObj->m_AttackDamageMinLeft = (Strength / 7) + (Energy / 14); lpObj->m_AttackDamageMaxLeft = (Strength / 5) + (Energy / 10); break; case CLASS_SUMMONER: lpObj->m_AttackDamageMinRight = (Strength / 8) + (Energy / 12); lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8); lpObj->m_AttackDamageMinLeft = (Strength / 8) + (Energy / 12); lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8); break; case CLASS_FIGHTER: lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8); lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8); break; } if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false ) { Wings->PlusSpecial(&lpObj->m_AttackDamageMinRight, 80); Wings->PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80); Wings->PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80); Wings->PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80); } int AddLeadership = 0; if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false) { AddLeadership += Wings->m_Leadership; } if ( Right->m_Type != -1 ) { if ( Right->m_IsValidItem != false ) { if ( Right->m_Type >= ITEMGET(5,0) && Right->m_Type <= ITEMGET(6,0) ) // Check this { lpObj->m_AttackDamageMinRight += Right->m_DamageMin / 2; lpObj->m_AttackDamageMaxRight += Right->m_DamageMax / 2; } else { lpObj->m_AttackDamageMinRight += Right->m_DamageMin; lpObj->m_AttackDamageMaxRight += Right->m_DamageMax; } } if ( Right->m_SkillChange != FALSE ) { lpObj->SkillLongSpearChange = true; } Right->PlusSpecial(&lpObj->m_AttackDamageMinRight, 80); Right->PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80); } if ( Left->m_Type != -1 ) { if ( Left->m_IsValidItem != false) { lpObj->m_AttackDamageMinLeft += Left->m_DamageMin; lpObj->m_AttackDamageMaxLeft += Left->m_DamageMax; } Left->PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80); Left->PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80); } lpObj->m_CriticalDamage = 0; lpObj->m_ExcelentDamage = 0; if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false ) { Wings->PlusSpecial(&lpObj->m_MagicDamageMin, 81); Wings->PlusSpecial(&lpObj->m_MagicDamageMax, 81); Wings->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Right->IsItem() != FALSE && Right->m_IsValidItem != false ) { Right->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Left->IsItem() != FALSE && Left->m_IsValidItem != false ) { Left->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Helm->IsItem() != FALSE && Helm->m_IsValidItem != false ) { Helm->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Armor->IsItem() != FALSE && Armor->m_IsValidItem != false ) { Armor->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Pants->IsItem() != FALSE && Pants->m_IsValidItem != false ) { Pants->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Gloves->IsItem() != FALSE && Gloves->m_IsValidItem != false ) { Gloves->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Boots->IsItem() != FALSE && Boots->m_IsValidItem != false ) { Boots->PlusSpecial(&lpObj->m_CriticalDamage, 84); } lpObj->m_MagicDamageMin = Energy / 9; lpObj->m_MagicDamageMax = Energy / 4; if ( Right->m_Type != -1 ) { if ( Right->m_Type == ITEMGET(0,31) || Right->m_Type == ITEMGET(0,21) || Right->m_Type == ITEMGET(0,23) || Right->m_Type == ITEMGET(0,25) || Right->m_Type == ITEMGET(0,28) ) { Right->PlusSpecial(&lpObj->m_MagicDamageMin, 80); Right->PlusSpecial(&lpObj->m_MagicDamageMax, 80); } else { Right->PlusSpecial(&lpObj->m_MagicDamageMin, 81); Right->PlusSpecial(&lpObj->m_MagicDamageMax, 81); } } lpObj->m_AttackRating = (Strength + Dexterity) / 2; if (lpObj->Class != CLASS_FIGHTER) // Rage Fighter - No Gloves { if ( Gloves->IsItem() != FALSE && Gloves->m_IsValidItem != false ) { lpObj->m_AttackRating += Gloves->ItemDefense(); } } // ---------------------------------------- // Attack Speed // ---------------------------------------- switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_AttackSpeed = Dexterity / 20; lpObj->m_MagicSpeed = Dexterity / 10; break; case CLASS_KNIGHT: lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; break; case CLASS_ELF: lpObj->m_AttackSpeed = Dexterity / 50; lpObj->m_MagicSpeed = Dexterity / 50; break; case CLASS_MAGUMSA: lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; break; case CLASS_DARKLORD: lpObj->m_AttackSpeed = Dexterity / 10; lpObj->m_MagicSpeed = Dexterity / 10; break; case CLASS_SUMMONER: lpObj->m_AttackSpeed = Dexterity / 20; lpObj->m_MagicSpeed = Dexterity / 20; break; case CLASS_FIGHTER: lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; break; } bool bRight = false; bool bLeft = false; // ---------------------------------------- // Check if have weapon in Right Hand // ---------------------------------------- if ( Right->m_Type != ITEMGET(4,7) && Right->m_Type != ITEMGET(4,15) && Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(6,0) ) { if ( Right->m_IsValidItem != false ) { bRight = true; } } // ---------------------------------------- // Check if have weapon in Left Hand // ---------------------------------------- if ( Left->m_Type != ITEMGET(4,7) && Left->m_Type != ITEMGET(4,15) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(6,0) ) { if ( Left->m_IsValidItem != false ) { bLeft = true; } } if ( bRight != false && bLeft != false ) { lpObj->m_AttackSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2; lpObj->m_MagicSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2; } else if ( bRight!= false ) { lpObj->m_AttackSpeed += Right->m_AttackSpeed; lpObj->m_MagicSpeed += Right->m_AttackSpeed; } else if ( bLeft != false ) { lpObj->m_AttackSpeed += Left->m_AttackSpeed; lpObj->m_MagicSpeed += Left->m_AttackSpeed; } if ( lpObj->Class != CLASS_FIGHTER ) // Rage Fighter - No Gloves { if ( Gloves->m_Type != -1 ) { if ( Gloves->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Gloves->m_AttackSpeed; lpObj->m_MagicSpeed += Gloves->m_AttackSpeed; } } } if ( Amulet->m_Type != -1 ) // Pendant { if ( Amulet->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Amulet->m_AttackSpeed; lpObj->m_MagicSpeed += Amulet->m_AttackSpeed; } } // ---------------------------------------- // Wizard Ring Effect // ---------------------------------------- if ( (lpObj->pInventory[10].IsItem() == TRUE && lpObj->pInventory[10].m_Type == ITEMGET(13,20) && lpObj->pInventory[10].m_Level == 0 && lpObj->pInventory[10].m_Durability > 0.0f ) || (lpObj->pInventory[11].IsItem() == TRUE && lpObj->pInventory[11].m_Type == ITEMGET(13,20) && lpObj->pInventory[11].m_Level == 0 && lpObj->pInventory[11].m_Durability > 0.0f ) ) { lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 10 / 100; lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 10 / 100; lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 10 / 100; lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 10 / 100; lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 10 / 100; lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 10 / 100; lpObj->m_AttackSpeed += 10; lpObj->m_MagicSpeed += 10; } // ---------------------------------------- // Speed Hack Detect // ---------------------------------------- switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) ); break; case CLASS_KNIGHT: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); break; case CLASS_ELF: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); break; case CLASS_MAGUMSA: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); break; case CLASS_DARKLORD: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); break; case CLASS_SUMMONER: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) ); break; case CLASS_FIGHTER: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) ); break; } if ( lpObj->m_DetectSpeedHackTime < gMinimumAttackSpeedTime ) { lpObj->m_DetectSpeedHackTime = gMinimumAttackSpeedTime; } // ---------------------------------------- // Successful Blocking // ---------------------------------------- switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_SuccessfulBlocking = Dexterity / 3; break; case CLASS_KNIGHT: lpObj->m_SuccessfulBlocking = Dexterity / 3; break; case CLASS_ELF: lpObj->m_SuccessfulBlocking = Dexterity / 4; break; case CLASS_MAGUMSA: lpObj->m_SuccessfulBlocking = Dexterity / 3; break; case CLASS_DARKLORD: lpObj->m_SuccessfulBlocking = Dexterity / 7; break; case CLASS_SUMMONER: lpObj->m_SuccessfulBlocking = Dexterity / 3; break; case CLASS_FIGHTER: lpObj->m_SuccessfulBlocking = Dexterity / 5; break; } if ( Left->m_Type != -1 ) { if ( Left->m_IsValidItem != false ) { lpObj->m_SuccessfulBlocking += Left->m_SuccessfulBlocking; Left->PlusSpecial(&lpObj->m_SuccessfulBlocking, 82); } } // ---------------------------------------- // Character Set & Succesful Blocking // ---------------------------------------- bool Success = true; if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helmet) { for ( int j=3;j<=6;j++) { if ( lpObj->pInventory[j].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[j].m_IsValidItem == false ) { Success = false; break; } } } else if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves) { for ( int l=2;l<6;l++) { if ( l != 5 ) { if ( lpObj->pInventory[l].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[l].m_IsValidItem == false ) { Success = false; break; } } } } else // Dark Wizard, Dark Knight, Dark Lord, Elf, Summoner (All Set) { for ( int k=2;k<=6;k++) { if ( lpObj->pInventory[k].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[k].m_IsValidItem == false ) { Success = false; break; } } } int Level11Count = 0; int Level10Count = 0; int Level12Count = 0; int Level13Count = 0; int Level14Count = 0; int Level15Count = 0; if ( Success != false ) { int in; if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helmet) { in = Armor->m_Type % MAX_SUBTYPE_ITEMS; if ( in != ITEMGET(0,15) && in != ITEMGET(0,20) && in != ITEMGET(0,23) && in != ITEMGET(0,32) && in != ITEMGET(0,37) ) { Success = false; } else { Level15Count++; for (int m=3;m<=6;m++) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14 ) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13 ) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } } if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves) { in = Boots->m_Type % MAX_SUBTYPE_ITEMS; if ( in != ITEMGET(0,59) && in != ITEMGET(0,60) && in != ITEMGET(0,61) ) { Success = false; } else { Level15Count++; for (int m=2;m<=6;m++) { if (m != 5) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14 ) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13 ) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } } } else // Dark Knight, Dark Wizard, Elf, Dark Lord, Summoner (All Set) { in = lpObj->pInventory[2].m_Type % MAX_SUBTYPE_ITEMS; for (int m=2;m<=6;m++) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14 ) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13 ) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } if ( Success != false ) // #warning unuseful if { lpObj->m_SuccessfulBlocking += lpObj->m_SuccessfulBlocking / 10; } } // ---------------------------------------- // Character Defense // ---------------------------------------- switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_Defense = Dexterity / 4; break; case CLASS_KNIGHT: lpObj->m_Defense = Dexterity / 3; break; case CLASS_ELF: lpObj->m_Defense = Dexterity / 10; break; case CLASS_MAGUMSA: lpObj->m_Defense = Dexterity / 4; break; case CLASS_DARKLORD: lpObj->m_Defense = Dexterity / 7; break; case CLASS_SUMMONER: lpObj->m_Defense = Dexterity / 4; break; case CLASS_FIGHTER: lpObj->m_Defense = Dexterity / 4; break; } if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helm) { lpObj->m_Defense += Armor->ItemDefense(); lpObj->m_Defense += Pants->ItemDefense(); lpObj->m_Defense += Gloves->ItemDefense(); lpObj->m_Defense += Boots->ItemDefense(); lpObj->m_Defense += Left->ItemDefense(); lpObj->m_Defense += Wings->ItemDefense(); } else if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves) { lpObj->m_Defense += Helm->ItemDefense(); lpObj->m_Defense += Armor->ItemDefense(); lpObj->m_Defense += Pants->ItemDefense(); lpObj->m_Defense += Boots->ItemDefense(); lpObj->m_Defense += Left->ItemDefense(); lpObj->m_Defense += Wings->ItemDefense(); } else // Dark Wizard, Dark Knight, Elf, Dark Lord, Summoner (All Set) { lpObj->m_Defense += Helm->ItemDefense(); lpObj->m_Defense += Armor->ItemDefense(); lpObj->m_Defense += Pants->ItemDefense(); lpObj->m_Defense += Gloves->ItemDefense(); lpObj->m_Defense += Boots->ItemDefense(); lpObj->m_Defense += Left->ItemDefense(); lpObj->m_Defense += Wings->ItemDefense(); } if ( Helper->IsItem() != FALSE ) { if ( Helper->m_Type == ITEMGET(13,4) && Helper->m_Durability > 0.0f ) // Dark Horse { lpObj->m_Defense += INT( Dexterity / 20 + 5 + Helper->m_PetItem_Level * 2 ); } } if ( (Level15Count + Level14Count + Level13Count + Level12Count + Level11Count + Level10Count) >= 5 ) { if ( Success != false ) { if ( Level15Count == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 30 / 100; } else if ( Level14Count == 5 || (Level14Count + Level15Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 25 / 100; } else if ( Level13Count == 5 || (Level13Count + Level14Count + Level15Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 20 / 100; } else if ( Level12Count == 5 || (Level12Count + Level13Count + Level14Count + Level15Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 15 / 100; } else if ( Level11Count == 5 || (Level11Count + Level12Count + Level13Count + Level14Count + Level15Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 10 / 100; } else if ( Level10Count == 5 || (Level10Count + Level11Count + Level12Count + Level13Count + Level14Count + Level15Count) == 5) { lpObj->m_Defense += lpObj->m_Defense * 5 / 100; } } } lpObj->m_Defense = lpObj->m_Defense * 10 / 20; // ---------------------------------------- // Transformation Rings // ---------------------------------------- if ( lpObj->m_Change == 9 ) // Thunder Lich Change { // Add Magic Power Here } else if ( lpObj->m_Change == 41 ) // Death Cow Change { lpObj->AddLife = ((int)(lpObj->MaxLife * 20.0f))/100; } else if ( lpObj->m_Change == 372 ) // Don't Know { lpObj->m_Defense += lpObj->m_Defense / 10; lpObj->AddLife += lpObj->Level; } // ---------------------------------------- // Pets // ---------------------------------------- if ( Helper->m_Type == ITEMGET(13,0) ) // Guardian Angel { lpObj->AddLife += 50; } else if ( Helper->m_Type == ITEMGET(13,1) ) // Imp { //Add 30% to Attack lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*30)/100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*30)/100; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*30)/100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*30)/100; //Add 30% to Magic Attack lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*30)/100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*30)/100; } else if ( Helper->m_Type == ITEMGET(13,3) ) // Dinorant { //Helper->PlusSpecial(&lpObj->AddBP, 103 ); //Add 15% to Attack lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*15)/100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*15)/100; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*15)/100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*15)/100; //Add 15% to Magic Attack lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*15)/100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*15)/100; } else if ( Helper->m_Type == ITEMGET(13,64) ) // Demon { //Add 40% to Attack lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*40)/100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*40)/100; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*40)/100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*40)/100; //Add +10 to Attack Speed lpObj->m_MagicSpeed += 10; lpObj->m_AttackSpeed += 10; //Add 40% to Magic Attack lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*40)/100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*40)/100; } else if ( Helper->m_Type == ITEMGET(13,65) ) // Spirit Guardian { lpObj->AddLife += 50; } else if ( Helper->m_Type == ITEMGET(13,80) ) // Pet Panda { lpObj->m_Defense += 50; } else if ( Helper->m_Type == ITEMGET(13,123) ) // Skeleton Pet { //Add 20% to Attack lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*20)/100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*20)/100; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*20)/100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*20)/100; //Add +10 to Attack Speed lpObj->m_MagicSpeed += 10; lpObj->m_AttackSpeed += 10; //Add 20% to Magic Attack lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*20)/100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*20)/100; } int addlife = 0; int addmana = 0; Wings->PlusSpecial(&addlife, 100); Wings->PlusSpecial(&addmana, 101); Wings->PlusSpecial(&AddLeadership, 105); lpObj->AddLeadership = AddLeadership; lpObj->AddLife += addlife; lpObj->AddMana += addmana; if ( lpObj->Type == OBJ_USER ) { gDarkSpirit[lpObj->m_Index].Set(lpObj->m_Index, &lpObj->pInventory[1]); } Amulet->PlusSpecialPercentEx(&lpObj->AddBP, lpObj->MaxBP, 173); Ring01->PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172); Ring02->PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172); CItem * rItem[3]; int comparecount = 0; rItem[0] = &lpObj->pInventory[10]; rItem[1] = &lpObj->pInventory[11]; rItem[2] = &lpObj->pInventory[9]; #define GET_MAX_RESISTANCE(x,y,z) ( ( ( ( (x) > (y) ) ? (x) : (y) ) > (z) ) ? ( ( (x) > (y) ) ? (x) : (y) ) : (z) ) lpObj->m_Resistance[1] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[1], rItem[1]->m_Resistance[1], rItem[2]->m_Resistance[1]); lpObj->m_Resistance[0] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[0], rItem[1]->m_Resistance[0], rItem[2]->m_Resistance[0]); lpObj->m_Resistance[2] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[2], rItem[1]->m_Resistance[2], rItem[2]->m_Resistance[2]); lpObj->m_Resistance[3] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[3], rItem[1]->m_Resistance[3], rItem[2]->m_Resistance[3]); lpObj->m_Resistance[4] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[4], rItem[1]->m_Resistance[4], rItem[2]->m_Resistance[4]); lpObj->m_Resistance[5] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[5], rItem[1]->m_Resistance[5], rItem[2]->m_Resistance[5]); lpObj->m_Resistance[6] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[6], rItem[1]->m_Resistance[6], rItem[2]->m_Resistance[6]); g_Item380System.ApplyFor380Option(lpObj); g_kJewelOfHarmonySystem.SetApplyStrengthenItem(lpObj); gItemSocket.ApplyEffect(lpObj); gSkillTree.ApplyEffect(lpObj); GObjExtItemApply(lpObj); gObjSetItemApply(lpObj); gObjNextExpCal(lpObj); if ( (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7) ) || Left->m_Type == ITEMGET(4,17) || Left->m_Type == ITEMGET(4,20) || Left->m_Type == ITEMGET(4,21) || Left->m_Type == ITEMGET(4,22) || Left->m_Type == ITEMGET(4,23) || Left->m_Type == ITEMGET(4,24) ) { if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 1 ) { lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.03f + 1.0f); lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.03f + 1.0f); } else if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 2 ) { lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.05f + 1.0f); lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.05f + 1.0f); } } else if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) || (Right->m_Type >= ITEMGET(4,16) && Right->m_Type < ITEMGET(5,0)) ) { if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 1 ) { lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.03f + 1.0f); lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.03f + 1.0f); } else if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 2 ) { lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.05f + 1.0f); lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.05f + 1.0f); } } if ( lpObj->Class == CLASS_KNIGHT || lpObj->Class == CLASS_MAGUMSA || lpObj->Class == CLASS_DARKLORD || lpObj->Class == CLASS_FIGHTER ) { if ( Right->m_Type != -1 && Left->m_Type != -1 ) { if ( Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(4,0) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(4,0) ) { lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * 55 / 100; lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * 55 / 100; lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * 55 / 100; lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * 55 / 100; } } } if ( lpObj->m_iItemEffectValidTime > 0 ) { g_ItemAddOption.NextSetItemLastEffectForHallowin(lpObj); } gObjCalcShieldPoint(lpObj); 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); GCManaSend(lpObj->m_Index, lpObj->MaxMana + lpObj->AddMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP); }
bool CItemAddOption::_ClearItemEffect(LPOBJ lpObj, int iEffectOption, int iOptionType, int iEffectType, int iEffectValue) //GS-CS Decompiled 100% PS: Only MapMoveBound Removed. Struct preserved. { if ( iEffectType <= 0 ) return false; switch ( iEffectType ) { case ADD_OPTION_LIFE: lpObj->AddLife -= iEffectValue; if ( (lpObj->AddLife + lpObj->MaxLife ) < lpObj->Life ) lpObj->Life = lpObj->AddLife + lpObj->MaxLife; 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 ADD_OPTION_MANA: lpObj->AddMana -= iEffectValue; if ( (lpObj->AddMana + lpObj->MaxMana ) < lpObj->Mana ) lpObj->Mana = lpObj->AddMana + lpObj->MaxMana; GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP); GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP); break; case ADD_OPTION_ATTACK_DAMAGE: lpObj->m_AttackDamageMaxLeft -= iEffectValue; lpObj->m_AttackDamageMinLeft -= iEffectValue; lpObj->m_AttackDamageMaxRight -= iEffectValue; lpObj->m_AttackDamageMinRight -= iEffectValue; lpObj->m_MagicDamageMin -= iEffectValue; lpObj->m_MagicDamageMax -= iEffectValue; break; case ADD_OPTION_SPEED: lpObj->m_AttackSpeed -= iEffectValue; lpObj->m_MagicSpeed -= iEffectValue; break; case ADD_OPTION_EXPERIENCE: lpObj->m_wExprienceRate = 100; lpObj->m_btMoveMapBound = 0; break; case ADD_OPTION_DROP_RATE: lpObj->m_wItemDropRate = 100; lpObj->m_btMoveMapBound = 0; break; case 8: lpObj->m_wExprienceRate = 100; lpObj->m_btMoveMapBound = 0; break; case ADD_OPTION_DEFENSE: lpObj->m_Defense -= iEffectValue * 10 / 20; break; case ADD_OPTION_STRENGTH: lpObj->Strength -= iEffectValue; break; case ADD_OPTION_DEXTERITY: lpObj->Dexterity -= iEffectValue; break; case ADD_OPTION_VITALITY: lpObj->Vitality -= iEffectValue; break; case ADD_OPTION_ENERGY: lpObj->Energy -= iEffectValue; break; case ADD_OPTION_LEADERSHIP: lpObj->Leadership -= iEffectValue; break; case ADD_OPTION_FORCE: lpObj->m_AttackDamageMaxLeft -= iEffectValue; lpObj->m_AttackDamageMinLeft -= iEffectValue; lpObj->m_AttackDamageMaxRight -= iEffectValue; lpObj->m_AttackDamageMinRight -= iEffectValue; break; case ADD_OPTION_MAGIC: lpObj->m_MagicDamageMin -= iEffectValue; lpObj->m_MagicDamageMax -= iEffectValue; break; case ADD_OPTION_MOVEABLE: lpObj->m_btMoveMapBound = 0; //Do nothing cuz mapmovebound is removed break; case ADD_OPTION_MASTEREXPERIENCE: lpObj->m_wMasterExperienceRate = 100; break; case ADD_OPTION_CRITICALDMG: lpObj->m_CriticalDamage -= iEffectValue; break; case ADD_OPTION_EXCDMG: lpObj->m_ExcelentDamage -= iEffectValue; break; default: return false; } LogAddTD("[ItemAddOption] (%s)(%s) Clear Effect: %d Value: %d", lpObj->AccountID, lpObj->Name, iEffectType, iEffectValue); return true; }
//005535a0 -> 100% int CMasterLevelSystem::MasterLevelUp(LPOBJ lpObj, __int64 iAddExp, bool bEventMapReward, int iMonsterType) //OK { if( !this->IsMasterLevelUser(lpObj) ) { return false; } int m_maxMasterLevel = GetPrivateProfileInt("Common", "MaxMasterLevel", 200, gDirPath.GetNewPath("MasterSystem.cfg")); int numCoded = 201; if (m_maxMasterLevel >= numCoded || m_maxMasterLevel <= 0){ int m_maxMasterLevel = 200; } // ---- if (lpObj->m_nMasterLevel >= m_maxMasterLevel) { GCServerMsgStringSend(lMsg.Get(1136), lpObj->m_Index, 1); return false; } // ---- if( bEventMapReward ) //-> New { iAddExp = iAddExp; //??? } else { #ifdef GENS if( gGensSystem.IsMapBattleZone(lpObj->MapNumber) ) //-> Original g_GensSystem maybe { iAddExp = iAddExp * (this->m_fAddExpRate + g_MLBattleZoneAddExp); } else { iAddExp = iAddExp * this->m_fAddExpRate; } #else iAddExp = iAddExp * this->m_fAddExpRate; #endif } // ---- if( lpObj->m_MPSkillOpt.MpsPlusExp > 0 ) { iAddExp += iAddExp * lpObj->m_MPSkillOpt.MpsPlusExp / 100; } // ---- if( iAddExp > 0 ) { gObjSetExpPetItem(lpObj->m_Index, iAddExp); // ---- LogAddTD("ML Experience : Map[%d]-(%d,%d) [%s][%s](%d) %I64d %I64d MonsterIndex : %d", //-> Updated lpObj->MapNumber, lpObj->X, lpObj->Y, lpObj->AccountID,lpObj->Name, lpObj->m_nMasterLevel, lpObj->m_i64MasterLevelExp, iAddExp, iMonsterType); // ---- if( iAddExp + lpObj->m_i64MasterLevelExp >= lpObj->m_i64NextMasterLevelExp ) { iAddExp = 0; // ----- int m_masterPointsPerLvl = GetPrivateProfileInt("Common", "MasterPointsPerLvl", 100, gDirPath.GetNewPath("MasterSystem.cfg")); int numCodeds = 101; if (m_maxMasterLevel >= numCodeds) { int m_masterPointsPerLvl = 1; } // ----- lpObj->m_i64MasterLevelExp = lpObj->m_i64NextMasterLevelExp; lpObj->m_nMasterLevel++; lpObj->m_iMasterLevelPoint += m_masterPointsPerLvl; //-> In future can use it for change ml point per level) // ----- gObjCalCharacter(lpObj->m_Index); // ----- lpObj->MaxLife += DCInfo.DefClass[ lpObj->Class ].LevelLife; lpObj->MaxMana += DCInfo.DefClass[ lpObj->Class ].LevelMana; lpObj->Life = lpObj->AddLife + lpObj->MaxLife; lpObj->Mana = lpObj->AddMana + lpObj->MaxMana; // ----- gObjCalcShieldPoint(lpObj); lpObj->iShield = lpObj->iAddShield + lpObj->iMaxShield; // ----- this->gObjNextMLExpCal(lpObj); // ---- gObjCalcMaxLifePower(lpObj->m_Index); gObjSetBP(lpObj->m_Index); GJSetCharacterInfo(lpObj, lpObj->m_Index, 0, 0); this->GCMasterLevelUpInfo(lpObj); GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield); GCManaSend(lpObj->m_Index, lpObj->Mana, 0xFF, 0, lpObj->BP); //-> Original name ->_BP } else { lpObj->m_i64MasterLevelExp += iAddExp; } // ---- GCSendExp_INT64(lpObj->m_Index, 65535, iAddExp, 0, 0); } // ---- return true; }
//00553d40 -> 100% void CMasterLevelSystem::DGAnsMasterLevelInfo(BYTE * aRecv) //OK { if( !aRecv ) { return; } // ---- MLP_ANS_MASTERLEVEL_INFO * lpRecvMsg = (MLP_ANS_MASTERLEVEL_INFO*)aRecv; // ---- if( !gObjIsConnectedGP(lpRecvMsg->iUserIndex) ) { return; } // ---- int iIndex = lpRecvMsg->iUserIndex; LPOBJ lpObj = &gObj[lpRecvMsg->iUserIndex]; // --- if( lpObj->m_bMasterLevelDBLoad ) { return; } // ---- if( !lpRecvMsg->btResult ) { LogAddTD("[%s][%s] MasterLevel Info Load Fail", lpObj->AccountID, lpObj->Name); //-> New return; } // ---- if( lpRecvMsg->btResult == 1 ) { if( lpObj->m_iMasterLevelPoint + lpRecvMsg->nMLPoint != lpRecvMsg->nMLevel ) //-> New (be good use MASTER_MAX_POINT for check) { LogAddTD("[%s][%s] MasterLevel Info Mismatch!! - Point(%d), Use Point(%d), Level(%d)", lpObj->AccountID, lpObj->Name, lpRecvMsg->nMLPoint, lpObj->m_bMasterLevelDBLoad, lpRecvMsg->nMLevel); } // ---- lpObj->m_bMasterLevelDBLoad = 1; // ---- if( lpRecvMsg->nMLevel == 0 && lpRecvMsg->i64NextMLExp == 0 ) { lpObj->m_nMasterLevel = lpRecvMsg->nMLevel; lpObj->m_i64MasterLevelExp = lpRecvMsg->i64MLExp; lpObj->m_i64NextMasterLevelExp = m_i64MasterLevelExpTlb[1]; lpObj->m_iMasterLevelPoint = lpRecvMsg->nMLPoint; // ---- LogAddTD("[%s][%s] MasterLevel Info First Set [MLevel:%d][MLExp:%I64d][m_i64NextMasterLevelExp:%I64d][MLPoint:%d]", lpObj->AccountID, lpObj->Name, lpObj->m_nMasterLevel, lpObj->m_i64MasterLevelExp, lpObj->m_i64NextMasterLevelExp, lpObj->m_iMasterLevelPoint); // ---- this->GDReqMasterLevelInfoSave(lpObj); } else { lpObj->m_nMasterLevel = lpRecvMsg->nMLevel; lpObj->m_i64MasterLevelExp = lpRecvMsg->i64MLExp; lpObj->m_i64NextMasterLevelExp = lpRecvMsg->i64NextMLExp; lpObj->m_iMasterLevelPoint = lpRecvMsg->nMLPoint; // ---- LogAddTD("[%s][%s] Recv MasterLevel Info [MLevel:%d][MLExp:%I64d][m_i64NextMasterLevelExp:%I64d][MLPoint:%d]", lpObj->AccountID, lpObj->Name, lpObj->m_nMasterLevel, lpObj->m_i64MasterLevelExp, lpObj->m_i64NextMasterLevelExp, lpObj->m_iMasterLevelPoint); // ---- this->GDReqMasterLevelInfoSave(lpObj); } // ---- lpObj->MaxLife = DCInfo.DefClass[lpObj->Class].Life + (lpObj->Level + lpObj->m_nMasterLevel - 1) * DCInfo.DefClass[lpObj->Class].LevelLife + ((lpObj->Vitality - DCInfo.DefClass[lpObj->Class].Vitality ) * DCInfo.DefClass[lpObj->Class].VitalityToLife); // ---- if( lpObj->Life > lpObj->MaxLife + lpObj->AddLife ) { lpObj->Life = lpObj->MaxLife; } // ---- lpObj->MaxMana = DCInfo.DefClass[lpObj->Class].Mana + (lpObj->Level + lpObj->m_nMasterLevel - 1) * DCInfo.DefClass[lpObj->Class].LevelMana + ((lpObj->Energy - DCInfo.DefClass[lpObj->Class].Energy ) * DCInfo.DefClass[lpObj->Class].EnergyToMana); // ---- if( lpObj->Mana > lpObj->MaxMana + lpObj->AddMana ) { lpObj->Mana = lpObj->MaxMana; } // ---- gObjCalcMaxLifePower(lpObj->m_Index); gObjSetBP(lpObj->m_Index); gObjCalcShieldPoint(lpObj); // ---- lpObj->iShield = lpObj->iMaxShield + lpObj->iAddShield; // ---- LogAddTD("[%s][%s] Reset Max Value For MasterLevel [MaxLife:%d][MaxMana:%d][MaxSD:%d]", lpObj->AccountID, lpObj->Name, lpObj->MaxLife, lpObj->MaxMana, lpObj->iShield); // ---- this->GCMasterLevelInfo(lpObj); // ---- GCReFillSend(lpObj->m_Index, lpObj->Life, -1, 0, lpObj->iShield); GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP); } // ---- gObjCalCharacter(lpObj->m_Index); // ----- gObjCalcMLSkillItemOption(lpObj); g_MasterSkillSystem.CGReqGetMasterLevelSkillTree(lpObj->m_Index); }
void CGuardianStatue::GuardianStatueAct(int iIndex) { if ( !gObjIsConnected(iIndex)) return; LPOBJ lpObj = &gObj[iIndex]; if ( lpObj->VPCount < 1 ) return; int tObjNum = -1; for (int i=0;i<MAX_VIEWPORT;i++) { tObjNum = lpObj->VpPlayer[i].number; if ( tObjNum >= 0 ) { if ( gObj[tObjNum].Type == OBJ_USER && gObj[tObjNum].Live ) { if ( gObj[tObjNum].m_btCsJoinSide == 1 ) { if ( abs(lpObj->Y - gObj[tObjNum].Y) <= 3 && abs(lpObj->X - gObj[tObjNum].X) <= 3 ) { BOOL bLifeChange = FALSE; BOOL bManaChange = FALSE; BOOL bBpChange = FALSE; /*gObj[tObjNum].Life += 100.0f; gObj[tObjNum].Mana += 100.0f; gObj[tObjNum].BP += 100;*/ if ( gObj[tObjNum].Life < (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)) { gObj[tObjNum].Life += ( ( gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife ) * (lpObj->m_btCsNpcRgLevel+1) ) / 100.0f; if ( gObj[tObjNum].Life > (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)) gObj[tObjNum].Life = gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife; bLifeChange = TRUE; } if ( gObj[tObjNum].Mana < (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana)) { gObj[tObjNum].Mana += ( ( gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana ) * (lpObj->m_btCsNpcRgLevel+1) ) / 100.0f; if ( gObj[tObjNum].Mana > (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana)) gObj[tObjNum].Mana = gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana; bManaChange = TRUE; } if ( gObj[tObjNum].BP < (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP)) { gObj[tObjNum].BP += ( ( gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP ) * (lpObj->m_btCsNpcRgLevel+1) ) / 100; if ( gObj[tObjNum].BP > (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP)) gObj[tObjNum].BP = gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP; bBpChange = TRUE; } if (bLifeChange ) GCReFillSend(tObjNum, (WORD)gObj[tObjNum].Life, 0xFF, 1, gObj[tObjNum].iShield); if (bManaChange ||bBpChange ) GCManaSend(tObjNum, (short)gObj[tObjNum].Mana, 0xFF, 0, gObj[tObjNum].BP); } } } } } }
void CLifeStone::LifeStoneAct(int iIndex) { if(gObjIsConnected(iIndex) == FALSE) return; LPOBJ lpObj = &gObj[iIndex]; lpObj->m_iCreatedActivationTime++; BYTE btCreationState = lpObj->m_btCreationState; if(lpObj->m_iCreatedActivationTime < 60) { lpObj->m_btCreationState = lpObj->m_iCreatedActivationTime / 12; } else { lpObj->m_btCreationState = 5; } if(btCreationState != lpObj->m_btCreationState) { GCSendObjectCreationState(iIndex); } if(lpObj->m_btCreationState < 5) return; if(lpObj->VPCount < 1) return; int tObjNum = -1; for(int i = 0; i < MAX_VIEWPORT; i++) { tObjNum = lpObj->VpPlayer[i].number; if(tObjNum >= 0 && gObj[tObjNum].Type == OBJ_USER && gObj[tObjNum].Live != FALSE && gObj[tObjNum].m_btCsJoinSide == lpObj->m_btCsJoinSide && abs(lpObj->Y - gObj[tObjNum].Y) <= 3 && abs(lpObj->X - gObj[tObjNum].X) <= 3) { int bLifeChange = FALSE; int bManaChange = FALSE; int bBpChange = FALSE; if(gObj[tObjNum].Life < gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife) { gObj[tObjNum].Life += (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife) / 100.0f;// + gObj[tObjNum].Life; if(gObj[tObjNum].Life > gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife) { gObj[tObjNum].Life = gObj[tObjNum].MaxLife + + gObj[tObjNum].AddLife; } bLifeChange = TRUE; } if(gObj[tObjNum].Mana < gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana) { gObj[tObjNum].Mana += (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana) / 100.0f;// + gObj[tObjNum].Mana; if(gObj[tObjNum].Mana > gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana) { gObj[tObjNum].Mana = gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana; } bManaChange = TRUE; } if(gObj[tObjNum].BP < gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP) { gObj[tObjNum].BP += (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP) / 100;// + gObj[tObjNum].BP; if(gObj[tObjNum].BP > gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP) { gObj[tObjNum].BP = gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP; } bBpChange = TRUE; } if(bLifeChange != FALSE) { GCReFillSend(tObjNum,(WORD)gObj[tObjNum].Life,0xFF,1,gObj[tObjNum].iShield); } if(bManaChange != FALSE || bBpChange != FALSE) { GCManaSend(tObjNum,(WORD)gObj[tObjNum].Mana,0xFF,0,gObj[tObjNum].BP); } } } }
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; } }