void Player::AddHP(int x) { hp += x; if (hp > GetMaxHP()) { hp = GetMaxHP(); } }
bool Player::LevelUp() { if (GetXP() < GetXPToLevelUp(level + 1)) return false; level++; unsigned int statIncreases[3] = { 0, 0, 0 }; float statMultipliers[3] = { 0, 0, 0 }; statMultipliers[0] = 13.0f; statMultipliers[1] = className == "Fighter" ? 8.0f : 6.0f; statMultipliers[2] = className == "Rogue" ? 8.0f : 6.0f; for (int i = 0; i < 3; i++) { float base = std::tanh(level / 30.0) * ((level % 2) + 1); statIncreases[i] += static_cast<int>(1 + statMultipliers[i] * base); } SetHP(GetHP() + statIncreases[0]); SetMaxHP(GetMaxHP() + statIncreases[0]); SetStrength(GetStrength() + statIncreases[1]); SetAgility(GetAgility() + statIncreases[2]); std::cout << GetName() << " grew to level " << level << "!\n"; std::cout << "Health +" << statIncreases[0] << " -> " << GetMaxHP() << std::endl; std::cout << "Strength +" << statIncreases[1] << " -> " << GetStrength() << std::endl; std::cout << "Agility +" << statIncreases[2] << " -> " << GetAgility() << std::endl; std::cout << "----------------\n"; return true; }
bool GameInterface::CheckEnoughSize() { int sumShipTile = m_NumShip[0] * GetMaxHP(AIRCRAFT) + m_NumShip[1] * GetMaxHP(BATTLESHIP) + m_NumShip[2] * GetMaxHP(CRUISER) + m_NumShip[3] * GetMaxHP(DESTROYER); if (sumShipTile < m_MapSize * m_MapSize - 10) return true; else return false; }
VOID Obj_Monster::SendCharBaseDirectForHP() { __ENTER_FUNCTION GCCharBaseAttrib msgPublicAttr; GCCharBaseAttrib msgProtectedAttr; BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0); msgPublicAttr.setObjID( GetID() ); msgPublicAttr.setHPPercent( yHPPercent ); msgProtectedAttr.setObjID( GetID() ); msgProtectedAttr.setHPPercent( yHPPercent ); m_AttrBackUp.m_HP = GetHP(); if (GetHP() <= 0) // add by gh 2010/04/09 { BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0); msgPublicAttr.setMPPercent( yMPPercent ); m_AttrBackUp.m_MP = GetMP(); } // end of add HUMANLIST listHuman; getScene()->ScanHuman( getZoneID(), MAX_REFESH_OBJ_ZONE_RADIUS, &(listHuman) ); BYTE i; for ( i = 0; i < listHuman.m_Count; i++ ) { Obj_Human *pTargetHuman = listHuman.m_aHuman[i]; if ( IsCanViewMe( pTargetHuman ) ) { ENUM_REFESH_ATTR_TYPE eType = CalcRefeshAttrType( this, pTargetHuman ); switch( eType ) { case REFESH_ATTR_TYPE_NONE: break; case REFESH_ATTR_TYPE_PUBLIC: case REFESH_ATTR_TYPE_PUBLIC_AND_LEVEL: { pTargetHuman->GetPlayer()->SendPacket( &msgPublicAttr ); } break; case REFESH_ATTR_TYPE_PROTECTED: { pTargetHuman->GetPlayer()->SendPacket( &msgProtectedAttr ); } break; default: break; } } } __LEAVE_FUNCTION }
// set monster stats values bool CMonster::SetStats( ) { if(thisnpc==NULL) return false; Stats->Level = thisnpc->level; Stats->Attack_Power = GetAttackPower( ); Stats->Defense = GetDefense( ); Stats->Attack_Speed = GetAttackSpeed( ); Stats->Move_Speed = GetMoveSpeed( ); Stats->Dodge = GetDodge( ); Stats->Accury = GetAccury( ); Stats->Critical = GetCritical( ); Stats->Magic_Defense = GetMagicDefense( ); Stats->Attack_Distance = GetAttackDistance( ); Stats->MaxHP = GetMaxHP( ); Stats->MaxMP = GetMaxMP( ); //Stats->HP = Stats->MaxHP; //Stats->MP = Stats->MaxMP; for(int i=0; i<20; i++) { AIVar[i] = 0; } return true; }
void CClient::AddHP(long hp) { int maxHP = GetMaxHP(); m_iHP += hp; if (m_iHP > maxHP) m_iHP = maxHP; g_gameCopy->SendNotifyMsg(NULL, m_handle, NOTIFY_HP, NULL, NULL, NULL, NULL); }
int32 CBattleEntity::addHP(int32 hp) { if (status == STATUS_NORMAL) status = STATUS_UPDATE; if (health.hp == 0 && hp < 0){ return 0; //if the entity is already dead, skip the rest to prevent killing it again } int32 cap = dsp_cap(health.hp + hp, 0, GetMaxHP()); hp = health.hp - cap; health.hp = cap; // если количество жизней достигает нуля, то сущность умирает if(hp > 0) { battleutils::MakeEntityStandUp(this); } if (health.hp == 0) { if (animation == ANIMATION_CHOCOBO) { StatusEffectContainer->DelStatusEffectSilent(EFFECT_CHOCOBO); } PBattleAI->SetCurrentAction(ACTION_FALL); } return abs(hp); }
bool CArmorClass::GetReferenceDamageAdj (const CItem *pItem, CSpaceObject *pInstalled, int *retiHP, int *retArray) // GetReferenceDamageAdj // // Returns armor HP after adjustment for damage type { int i; CItemCtx ItemCtx(pItem, pInstalled); int iHP = GetMaxHP(ItemCtx); if (retiHP) *retiHP = iHP; for (i = 0; i < damageCount; i++) { DamageDesc Damage((DamageTypes)i, DiceRange(0, 0, 0)); int iAdj = GetDamageAdj(ItemCtx.GetMods(), Damage); if (retArray) retArray[i] = CalcHPDamageAdj(iHP, iAdj); } return true; }
VOID Obj_Monster::InitBackupAttr() { __ENTER_FUNCTION m_AttrBackUp.m_bNameModified = FALSE; m_AttrBackUp.m_bTitleModified = FALSE; m_AttrBackUp.m_HP = GetHP(); m_AttrBackUp.m_MP = GetMP(); // add by gh 2010/03/25 const _CAMP_DATA *pCampData = GetCampData(); if ( pCampData != NULL ) m_AttrBackUp.m_CampData = *pCampData; m_AttrBackUp.m_MaxHp = GetMaxHP(); m_AttrBackUp.m_MaxMp = GetMaxMP(); // add by gh 2010/03/25 m_AttrBackUp.m_MoveSpeed = GetMoveSpeed(); m_AttrBackUp.m_nDataID = GetDataID(); m_AttrBackUp.m_nModelID = GetModelID(); m_AttrBackUp.m_nMountID = GetMountID(); m_AttrBackUp.m_nAIType = GetAIType(); m_AttrBackUp.m_OwnerID = GetOwnerID(); m_AttrBackUp.m_OccupantGUID = GetOccupantGUID(); m_AttrBackUp.m_nStealthLevel = GetStealthLevel(); m_AttrBackUp.m_nMoodState = GetMoodState(); m_AttrBackUp.m_iHorseID = GetHorseID(); m_AttrBackUp.m_iWeaponID = GetWeaponID(); __LEAVE_FUNCTION }
// check if player can level up bool CPlayer::CheckPlayerLevelUP( ) { if (CharInfo->Exp >= GetLevelEXP()) { CharInfo->Exp -= GetLevelEXP(); Stats->Level++; Stats->HP = GetMaxHP( ); Stats->MP = GetMaxMP( ); CharInfo->StatPoints += int((Stats->Level * 0.8) + 10); //if(Stats->Level>=10) CharInfo->SkillPoints += ((Stats->Level + 2) / 2); BEGINPACKET( pak, 0x79e ); ADDWORD( pak, clientid ); ADDWORD( pak, Stats->Level ); ADDDWORD( pak, CharInfo->Exp ); ADDWORD( pak, CharInfo->StatPoints ); ADDWORD( pak, CharInfo->SkillPoints ); client->SendPacket( &pak ); RESETPACKET( pak, 0x79e ); ADDWORD( pak, clientid ); GServer->SendToVisible( &pak, this ); SetStats( ); //SendLevelUPtoChar(this); return true; } return false; }
void CClient::SetStr(int str, bool check) { _str = str; if(check) { if(m_iHP > GetMaxHP()) { m_iHP = GetMaxHP(); g_gameCopy->SendNotifyMsg(NULL, m_handle, NOTIFY_HP, NULL, NULL, NULL, NULL); } if(m_iSP > GetMaxSP()) { m_iSP = GetMaxSP(); g_gameCopy->SendNotifyMsg(NULL, m_handle, NOTIFY_SP, NULL, NULL, NULL, NULL); } } }
void CShieldClass::GetStatus (CInstalledDevice *pDevice, CSpaceObject *pSource, int *retiStatus, int *retiMaxStatus) // GetStatus // // Returns the status of the shields { *retiStatus = GetHPLeft(pDevice, pSource); *retiMaxStatus = GetMaxHP(pDevice, pSource); }
ICCItem *CArmorClass::GetItemProperty (CItemCtx &Ctx, const CString &sName) // GetItemProperty // // Returns armor property { CCodeChain &CC = g_pUniverse->GetCC(); if (strEquals(sName, PROPERTY_BLINDING_IMMUNE)) return CC.CreateBool(IsBlindingDamageImmune(Ctx)); else if (strEquals(sName, PROPERTY_COMPLETE_HP)) return CC.CreateInteger(GetMaxHP(Ctx, true)); else if (strEquals(sName, PROPERTY_DEVICE_DAMAGE_IMMUNE)) return CC.CreateBool(IsDeviceDamageImmune(Ctx)); else if (strEquals(sName, PROPERTY_DEVICE_DISRUPT_IMMUNE)) return CC.CreateBool(IsDeviceDamageImmune(Ctx)); else if (strEquals(sName, PROPERTY_DISINTEGRATION_IMMUNE)) return CC.CreateBool(IsDisintegrationImmune(Ctx)); else if (strEquals(sName, PROPERTY_EMP_IMMUNE)) return CC.CreateBool(IsEMPDamageImmune(Ctx)); else if (strEquals(sName, PROPERTY_HP)) return CC.CreateInteger(GetMaxHP(Ctx)); else if (strEquals(sName, PROPERTY_RADIATION_IMMUNE)) return CC.CreateBool(IsRadiationImmune(Ctx)); else if (strEquals(sName, PROPERTY_SHATTER_IMMUNE)) return CC.CreateBool(IsShatterImmune(Ctx)); else if (m_pItemType) return CreateResultFromDataField(CC, m_pItemType->GetDataField(sName)); else return CC.CreateNil(); }
bool Hero::AddStats(int type) { switch (type) { case ADD_ATK: atk++; if (atk > 15) { atk = 15; return false; } if (atk % 5 == 0) { SetKnockBack(GetKnockBack() + 5); SetExtraDMG(GetExtraDMG() + GetDMG()*0.2); BulletsAdjust(GetBullets() + 1); } SetBulletSpeed(GetBulletSpeed() - atk * 3); SetDMG(GetDMG() + atk * 3); SetMaxHP(GetMaxHP() + atk * 10); break; case ADD_DEX: dex++; if (dex > 15) { dex = 15; return false; } if (dex % 5 == 0) { SetCritDMG(GetCritDMG() + 0.5); ShootCD -= 3; } SetBulletSpeed(GetBulletSpeed() + dex * 3); SetCrit(GetCrit() + 3+dex/5); SetDodge(GetDodge() + 2+dex/5); break; case ADD_INT: magic++; if (magic > 15) { magic = 15; return false; } if (magic % 5 == 0) { SetSpeed(GetSpeed() + 100); recoverMP = 175 - 10 * magic; } SetMaxMP(GetMaxMP() + 2 * magic); break; } return true; }
void CShieldClass::Recharge (CInstalledDevice *pDevice, CShip *pShip, int iStatus) // Recharge // // Recharges hitpoints (this is a manual recharge, so we ignore whether we are // depleted or not). { int iMaxHP = GetMaxHP(pDevice, pShip); int iHPLeft = GetHPLeft(pDevice, pShip); SetHPLeft(pDevice, min(iMaxHP, iHPLeft + iStatus)); pShip->OnComponentChanged(comShields); }
void CClient::SetAngelStr(int str) { _angelStr = str; if(m_iHP > GetMaxHP()) { m_iHP = GetMaxHP(); g_gameCopy->SendNotifyMsg(NULL, m_handle, NOTIFY_HP, NULL, NULL, NULL, NULL); } if(m_iSP > GetMaxSP()) { m_iSP = GetMaxSP(); g_gameCopy->SendNotifyMsg(NULL, m_handle, NOTIFY_SP, NULL, NULL, NULL, NULL); } /* Done client-side. for (short sItemIndex = 0; sItemIndex < MAXITEMS; sItemIndex++) if ((m_pItemList[sItemIndex] != NULL) && (m_bIsItemEquipped[sItemIndex] == TRUE)) { if(m_pItemList[sItemIndex]->m_wWeight/100 > GetStr()) g_gameCopy->ReleaseItemHandler(m_handle, sItemIndex, TRUE); }*/ }
Position GameManager::ConvertPosionForNET(ShipType shipType, Position position) { Position convertedPos; switch (position.m_direction) { case DOWN: convertedPos = position; break; case UP: convertedPos.m_X = position.m_X; convertedPos.m_Y = position.m_Y - (GetMaxHP(shipType) - 1); convertedPos.m_direction = DOWN; break; case RIGHT: convertedPos = position; break; case LEFT: convertedPos.m_X = position.m_X - (GetMaxHP(shipType) - 1); convertedPos.m_Y = position.m_Y; convertedPos.m_direction = RIGHT; break; } return convertedPos; }
void CShieldClass::OnInstall (CInstalledDevice *pDevice, CSpaceObject *pSource, CItemListManipulator &ItemList) // OnInstall // // Called when the device is installed { // Set shields to max HP SetHPLeft(pDevice, GetMaxHP(pDevice, pSource)); // Identified if (pSource->IsPlayer()) GetItemType()->SetKnown(); }
// check if player can level up bool CPlayer::CheckPlayerLevelUP( ) { if (CharInfo->Exp >= GetLevelEXP()) { CharInfo->Exp -= GetLevelEXP(); Stats->Level++; Stats->HP = GetMaxHP( ); Stats->MP = GetMaxMP( ); CharInfo->StatPoints += int((Stats->Level*0.8)+10); // Proper skill point distribution for Pre-Evo switch (Stats->Level) { case 10: case 14: CharInfo->SkillPoints += 2; break; case 18: CharInfo->SkillPoints += 3; break; case 22: CharInfo->SkillPoints += 4; break; } // 5 skill points every 4 levels from 22 if (Stats->Level > 22 && Stats->Level < 99 && ((Stats->Level - 22) % 4) == 0) CharInfo->SkillPoints += 5; // 5 skill points every 2 levels from 98 if (Stats->Level > 98 && (Stats->Level % 2) == 0) CharInfo->SkillPoints += 5; BEGINPACKET( pak, 0x79e ); ADDWORD( pak, clientid ); ADDWORD( pak, Stats->Level ); ADDDWORD( pak, CharInfo->Exp ); ADDWORD( pak, CharInfo->StatPoints ); ADDWORD( pak, CharInfo->SkillPoints ); client->SendPacket( &pak ); RESETPACKET( pak, 0x79e ); ADDWORD( pak, clientid ); GServer->SendToVisible( &pak, this ); SetStats( ); //SendLevelUPtoChar(this); return true; } return false; }
bool CArmorClass::IsReflective (CItemCtx &ItemCtx, const DamageDesc &Damage) // IsReflective // // Returns TRUE if the armor reflects this damage { const CItemEnhancement &Mods = ItemCtx.GetMods(); int iReflectChance = 0; // Base armor chance if (m_Reflective.InSet(Damage.GetDamageType())) iReflectChance = MAX_REFLECTION_CHANCE; // Mods int iModReflect; if (Mods.IsNotEmpty() && Mods.IsReflective(Damage, &iModReflect)) iReflectChance = Max(iReflectChance, iModReflect); // Done if (iReflectChance) { CInstalledArmor *pSect = ItemCtx.GetArmor(); int iMaxHP = GetMaxHP(ItemCtx); int iHP = (pSect ? pSect->GetHitPoints() : iMaxHP); // Adjust based on how damaged the armor is iReflectChance = (iMaxHP > 0 ? iHP * iReflectChance / iMaxHP : iReflectChance); return (mathRandom(1, 100) <= iReflectChance); } else return false; }
bool CShieldClass::AbsorbDamage (CInstalledDevice *pDevice, CSpaceObject *pShip, SDamageCtx &Ctx) // AbsorbDamage // // Absorbs damage. // NOTE: We always set Ctx.iAbsorb properly, regardless of the return value. { DEBUG_TRY // If we're depleted then we cannot absorb anything Ctx.iHPLeft = GetHPLeft(pDevice, pShip); if (Ctx.iHPLeft == 0) { Ctx.iAbsorb = 0; return false; } // Calculate how much we will absorb int iAbsorbAdj = (Ctx.Damage.GetDamageType() == damageGeneric ? 100 : m_iAbsorbAdj[Ctx.Damage.GetDamageType()]); Ctx.iAbsorb = (Ctx.iDamage * iAbsorbAdj) / 100; if (pDevice->GetMods().IsNotEmpty()) Ctx.iAbsorb = Ctx.iAbsorb * pDevice->GetMods().GetAbsorbAdj(Ctx.Damage) / 100; // Compute how much damage we take (based on the type of damage) int iAdj = GetDamageAdj(pDevice->GetMods(), Ctx.Damage); Ctx.iShieldDamage = (Ctx.iAbsorb * iAdj) / 100; // If shield generator is damaged then sometimes we take extra damage if (pDevice->IsDamaged() || pDevice->IsDisrupted()) { int iRoll = mathRandom(1, 100); if (iRoll <= 10) Ctx.iAbsorb = 75 * Ctx.iAbsorb / 100; else if (iRoll <= 25) Ctx.iShieldDamage *= 2; } // If the amount of shield damage is greater than HP left, then scale // the amount of HP that we aborb if (Ctx.iShieldDamage > Ctx.iHPLeft) { // ASSERT: We know that iShieldDamage is > 0 because iHPLeft is > 0. Ctx.iAbsorb = Ctx.iHPLeft * Ctx.iAbsorb / Ctx.iShieldDamage; Ctx.iShieldDamage = Ctx.iHPLeft; } // See if we're reflective int iReflectChance; if (!pDevice->GetMods().IsReflective(Ctx.Damage, &iReflectChance)) iReflectChance = 0; if (m_Reflective.InSet(Ctx.Damage.GetDamageType())) iReflectChance = Max(iReflectChance, MAX_REFLECTION_CHANCE); if (iReflectChance && Ctx.pCause && Ctx.Damage.GetShieldDamageLevel() == 0) { // Compute the chance that we will reflect (based on the strength of // our shields) int iMaxHP = GetMaxHP(pDevice, pShip); int iEfficiency = (iMaxHP == 0 ? 100 : 50 + (Ctx.iHPLeft * 50 / iMaxHP)); int iChance = iEfficiency * iReflectChance / 100; // See if we reflect if (Ctx.bReflect = (mathRandom(1, 100) <= iChance)) { Ctx.iOriginalAbsorb = Ctx.iAbsorb; Ctx.iOriginalShieldDamage = Ctx.iShieldDamage; Ctx.iAbsorb = Ctx.iDamage; Ctx.iShieldDamage = 0; } } else Ctx.bReflect = false; // Give custom damage a chance to react. These events can modify the // following variables: // // Ctx.bReflect // Ctx.iAbsorb // Ctx.iShieldDamage // // OR // // Ctx.iDamage (if we skip further processing) if (Ctx.pDesc->FireOnDamageShields(Ctx, pDevice->GetDeviceSlot())) return (Ctx.iDamage == 0); FireOnShieldDamage(CItemCtx(pShip, pDevice), Ctx); // If we reflect, then create the reflection if (Ctx.bReflect) Ctx.pCause->CreateReflection(Ctx.vHitPos, (Ctx.iDirection + 120 + mathRandom(0, 120)) % 360); // Create shield effect if (Ctx.iAbsorb || Ctx.bReflect) { if (m_pHitEffect) m_pHitEffect->CreateEffect(pShip->GetSystem(), NULL, Ctx.vHitPos, pShip->GetVel(), Ctx.iDirection); } // Shield takes damage if (Ctx.iShieldDamage > 0) { if (Ctx.iShieldDamage >= Ctx.iHPLeft) SetDepleted(pDevice, pShip); else SetHPLeft(pDevice, Ctx.iHPLeft - Ctx.iShieldDamage); pShip->OnComponentChanged(comShields); } // Set the remaining damage Ctx.iDamage -= Ctx.iAbsorb; return (Ctx.iDamage == 0); DEBUG_CATCH }
// Heal Player when use Food/Pots bool CPlayer::PlayerHeal() { clock_t transtime = clock() - UsedItem->lastRegTime; if( UsedItem->usevalue!=0 && transtime >= 0.3*CLOCKS_PER_SEC ) { if( UsedItem->used < UsedItem->usevalue && Stats->HP > 0 ) { int value = UsedItem->userate; if((UsedItem->usevalue - UsedItem->used) < value) { value = UsedItem->usevalue - UsedItem->used; } switch( UsedItem->usetype ) { case 16: // HP Stats->HP += value; if(Stats->HP > GetMaxHP()) Stats->HP = GetMaxHP(); break; case 17: // MP Stats->MP += value; if(Stats->MP > GetMaxMP()) Stats->MP = GetMaxMP(); break; case 37: // Skill points CharInfo->SkillPoints += value; break; case 76: //Stamina CharInfo->stamina += value; if(CharInfo->stamina > 5000) CharInfo->stamina = 5000; break; } UsedItem->used += value; UsedItem->lastRegTime = clock(); } else { BEGINPACKET( pak,0x7b7 ); ADDWORD ( pak, clientid ); ADDDWORD ( pak, GServer->BuildBuffs( this ) ); switch( UsedItem->usetype ) { case 16: // HP ADDWORD( pak, Stats->HP ); break; case 17: // MP ADDWORD( pak, Stats->MP ); break; case 37: //Skill Points ADDWORD( pak, CharInfo->SkillPoints ); break; case 76: //Stamina ADDWORD( pak, CharInfo->stamina ); break; } GServer->SendToVisible( &pak, this ); UsedItem->used = 0; UsedItem->usevalue = 0; UsedItem->userate = 0; UsedItem->usetype = 0; } } return true; }
void CCharacter::RefreshBuff( ) { bool bflag = false; for( UINT i=0;i<32;i++) { if(MagicStatus[i].Buff == 0) continue; clock_t etime = clock() - MagicStatus[i].BuffTime; if( etime >= MagicStatus[i].Duration * CLOCKS_PER_SEC ) { Log(MSG_INFO,"Magic Status %i, vanish after: %i", MagicStatus[i].Status, MagicStatus[i].Duration); switch(MagicStatus[i].Status) { case STATUS_HP_8: case STATUS_HP_18: case STATUS_HP_30: case STATUS_HP_43: case STATUS_HP_58: case STATUS_HP_75: case STATUS_SUMMON_HP: case STATUS_HP_92: case STATUS_HP_111: case STATUS_HP_131: case STATUS_HP_152: case STATUS_HP_174: case STATUS_HP_197: case STATUS_HP_221: case STATUS_HP_246: case STATUS_HP_272: case STATUS_HP_299: case STATUS_HP_326: case STATUS_HP_354: case STATUS_HP_383: case STATUS_HP_413: case STATUS_HP_443: case STATUS_HP_475: case STATUS_HP_539: case STATUS_HP_572: case STATUS_HP_5_PC: case 115: { Status->HPHeal = 0xff; } break; case STATUS_MP_6: case STATUS_MP_10: case STATUS_MP_14: case STATUS_MP_18: case STATUS_MP_21: case STATUS_MP_25: case STATUS_MP_29: case STATUS_MP_33: case STATUS_MP_36: case STATUS_MP_40: case STATUS_MP_44: case STATUS_MP_48: case STATUS_MP_51: case STATUS_MP_55: case STATUS_MP_59: case STATUS_MP_63: case STATUS_MP_66: case STATUS_MP_70: case STATUS_MP_74: case STATUS_MP_78: case STATUS_MP_81: case STATUS_MP_85: case STATUS_MP_89: case STATUS_MP_93: case STATUS_MP_96: case 116: { Status->MPHeal = 0xff; } break; case 18: // attack power up case 19: // attack power down case 48: // attack power up { if(i == BUFF_ATTACK_UP_POS) { Status->Attack_up = 0xff; } else { Status->Attack_down = 0xff; } Stats->Attack_Power = GetAttackPower( ); } break; case 20: // def up case 21: // def down case 49: // def up { if(i==BUFF_DEFENSE_UP_POS) { Status->Defense_up= 0xff; } else { Status->Defense_down = 0xff; } Stats->Defense = GetDefense( ); } break; case 24: //Accuracy up case 25: //Accuracy down case 51: //attack Accuracy up. { if(i==BUFF_HITRATE_UP_POS) { Status->Accuracy_up= 0xff; } else { Status->Accuracy_down = 0xff; } Stats->Accuracy = GetAccuracy( ); } break; case 22: // macic resistance up case 23: // magic resistance down case 50: // magic resistance up { if(i==BUFF_MDEFENSE_UP_POS) { Status->Magic_Defense_up = 0xff; } else { Status->Magic_Defense_down = 0xff; } Stats->Magic_Defense = GetMagicDefense( ); } break; case 28: //dodge up case 29: //dodge down case 53: //dodge rate up { if(i==BUFF_DODGE_UP_POS) { Status->Dodge_up = 0xff; } else { Status->Dodge_down = 0xff; } Stats->Dodge = GetDodge( ); } break; case 14: //dash case 15: //slow case 46: //movement speed increased { if(i==BUFF_DASH_UP_POS) { Status->Dash_up = 0xff; } else { Status->Dash_down = 0xff; } Stats->Move_Speed = GetMoveSpeed( ); } break; case 16: // haste attack case 17: // slow attack case 47: // attack speed up { if(i==BUFF_HASTE_UP_POS) { Status->Haste_up = 0xff; } else { Status->Haste_down = 0xff; } //Stats->Attack_Speed_Percent = GetAttackSpeedPercent( ); } break; case 26: // crit up case 27: // crit down case 52: // crit up { if(i==BUFF_CRITICAL_UP_POS) { Status->Critical_up = 0xff; } else { Status->Critical_down = 0xff; } Stats->Critical = GetCritical( ); } break; case 12: // max HP up case 44: // max HP up { if(i==BUFF_MAX_HP_POS) { Status->HP_up = 0xff; } else { Status->HP_down = 0xff; } Stats->MaxHP = GetMaxHP( ); if(Stats->HP > Stats->MaxHP) { Stats->HP = Stats->MaxHP; } } break; case 13: // max MP up case 45: // max MP up { if(i==BUFF_MAX_MP_POS) { Status->MP_up = 0xff; } else { Status->MP_down = 0xff; } Stats->MaxMP = GetMaxMP( ); if(Stats->MP > Stats->MaxMP) { Stats->MP = Stats->MaxMP; } } break; case 32: // faint { Status->Faint = 0xff; Status->CanMove = true; Status->CanCastSkill = true; Status->CanAttack = true; //printf("removing stun\n"); } break; case 7: case 8: case 9: case 10: case 11: case 89: //poisoned { Status->Poisoned = 0xff; //printf("removing poison\n"); } break; case 30: // muted { Status->Muted = 0xff; Status->CanCastSkill = true; } break; case 31: // sleep May need to be fixed later to accomodate multiple status effects. { Status->Sleep = 0xff; Status->CanMove = true; Status->CanCastSkill = true; Status->CanAttack = true; } break; case 36: //A_Extra_Damage: case 54: //A_GMExtra_Damage: case 83: //Valkyrie Charm: { if(i==BUFF_DUMMY_DAMAGE_POS) { Status->ExtraDamage_up = 0xff; Stats->ExtraDamage_add = 0;//We put extardamage add value to 0 if we lost the adddmg buff } else { Status->ExtraDamage_down = 0xff; Stats->ExtraDamage_add = 0;//We put extardamage add value to 0 if we lost the adddmg buff } } break; case 56: //Taunt { Status->Taunt = 0xff; //printf("removing Taunt\n"); } break; case 58: case 61: case 74: case 77: case 78: case 79: case 80: //flame { Status->Flamed = 0xff; } break; case 33://Stealth,Camoflauge { if(IsAttacking( )) { MagicStatus[i].Duration = 0; } Status->Stealth = 0xff; //printf("removing Stealth\n"); } break; case 86://Stealth,Weary { Status->Weary = 0xff; Status->CanCastSkill = true; //printf("removing Weary\n"); } break; case 34://Cloaking { Status->Cloaking = 0xff; //printf("removing Cloaking\n"); } break; case 35: //ShieldDamage: { if(i==BUFF_SHIELD_DAMAGE_POS) { Status->ShieldDamage_up = 0xff; //Stats->ShieldDamage = 0xff; } else { Status->ShieldDamage_down = 0xff; //Stats->ShieldDamage = 0xff; } } break; case 55://Detect { Status->Detect = 0xff; Status->Cloaking = 0xff; Status->Stealth = 0xff; //printf("Detect Done\n"); } break; case 38://Purify { //Buff_Down Status->Attack_down = 0xff; Status->Defense_down = 0xff; Status->Accuracy_down = 0xff; Status->Magic_Defense_down = 0xff; Status->Dodge_down = 0xff; Status->Dash_down = 0xff; Status->Haste_down = 0xff; Status->Critical_down = 0xff; Status->HP_down = 0xff; Status->MP_down = 0xff; Status->ExtraDamage_down = 0xff; Status->ShieldDamage_down = 0xff; Status->ALL_down = 0xff; //Bad Status //Status->Stun = 0xff; Status->Poisoned = 0xff; Status->Muted = 0xff; Status->Sleep = 0xff; Status->Flamed = 0xff; Status->Faint = 0xff; //Stats Stats->Attack_Power = GetAttackPower( ); Stats->Defense = GetDefense( ); Stats->Accuracy = GetAccuracy( ); Stats->Magic_Defense = GetMagicDefense( ); Stats->Dodge = GetDodge( ); Stats->Move_Speed = GetMoveSpeed( ); Stats->Attack_Speed = GetAttackSpeed( ); //Stats->Attack_Speed_Percent = GetAttackSpeedPercent(); Stats->Critical = GetCritical( ); Stats->MaxHP = GetMaxHP( ); Stats->MaxMP = GetMaxMP( ); //printf("Purify Done\n"); } break; case 39:// Dispell { //Buff_Down Status->Attack_down = 0xff; Status->Defense_down = 0xff; Status->Accuracy_down = 0xff; Status->Magic_Defense_down = 0xff; Status->Dodge_down = 0xff; Status->Dash_down = 0xff; Status->Haste_down = 0xff; Status->Critical_down = 0xff; Status->HP_down = 0xff; Status->MP_down = 0xff; Status->ExtraDamage_down = 0xff; Status->ShieldDamage_down = 0xff; Status->ALL_down = 0xff; //Buff_Up Status->Attack_up = 0xff; Status->Defense_up = 0xff; Status->Accuracy_up = 0xff; Status->Magic_Defense_up = 0xff; Status->Dodge_up = 0xff; Status->Dash_up = 0xff; Status->Haste_up = 0xff; Status->Critical_up = 0xff; Status->HP_up = 0xff; Status->MP_up = 0xff; Status->ExtraDamage_up = 0xff; Status->ShieldDamage_up = 0xff; Status->ALL_up = 0xff; //Bad Status //Status->Stun = 0xff; Status->Poisoned = 0xff; Status->Muted = 0xff; Status->Sleep = 0xff; Status->Flamed = 0xff; Status->Faint = 0xff; //Stats Stats->Attack_Power = GetAttackPower( ); Stats->Defense = GetDefense( ); Stats->Accuracy = GetAccuracy( ); Stats->Magic_Defense = GetMagicDefense( ); Stats->Dodge = GetDodge( ); Stats->Move_Speed = GetMoveSpeed( ); Stats->Attack_Speed = GetAttackSpeed( ); Stats->Critical = GetCritical( ); Stats->MaxHP = GetMaxHP( ); Stats->MaxMP = GetMaxMP( ); //printf("Dispell Done\n"); } break; default: { Log(MSG_WARNING,"Unknow skill status in charfunctions %u.",MagicStatus[i].Status); } } BEGINPACKET( pak,0x7b7 ); ADDWORD ( pak, clientid ); ADDDWORD ( pak, GServer->BuildBuffs( this ) ); GServer->SendToVisible( &pak, this ); MagicStatus[i].Status = 0; MagicStatus[i].Buff = 0; MagicStatus[i].BuffTime = 0; MagicStatus[i].Duration = 0; MagicStatus[i].Value = 0; bflag = true; } else if ( ((MagicStatus[i].Status >= 7 && MagicStatus[i].Status <= 11) || MagicStatus[i].Status == 89) && etime > 1*CLOCKS_PER_SEC) //Do poison dmg every 1.5 seconds { Stats->HP -= MagicStatus[i].Status; //Actually take 7, 8, 9, 10 or 11 from the health. Based on the Status itself, LMA: can be 89 noc too. MagicStatus[i].BuffTime += 1*CLOCKS_PER_SEC; MagicStatus[i].Duration -= 1; //printf("did %i poison dmg to the player, still %i seconds and %i HP remain \n", MagicStatus[i].Status, MagicStatus[i].Duration, Stats->HP); //Log(MSG_WARNING,"did %i poison dmg to the player / monster, still %i seconds and %I64i HP remain", MagicStatus[i].Status, MagicStatus[i].Duration, Stats->HP); //LMA: If dead, let's the client resynch if(IsDead()) { BEGINPACKET( pak, 0x79f ); ADDWORD ( pak, clientid ); ADDDWORD ( pak, 1); GServer->SendToVisible( &pak, this ); Log(MSG_INFO,"death poison for %i, amount: %i",clientid,MagicStatus[i].Status); } //A bunch of messy code to send dmg packet BEGINPACKET( pak, 0x7b6 ); ADDWORD ( pak, clientid ); ADDWORD ( pak, 0 ); ADDDWORD ( pak, 0x000007f8 ); ADDBYTE ( pak, 0x00 ); ADDDWORD ( pak, MagicStatus[i].Status ); //If Enemy is killed if( IsDead()) { //printf("char died\n"); CDrop* thisdrop = NULL; ADDDWORD ( pak, 16 ); if( !IsSummon( ) && !IsPlayer( )) { //LMA: No drop if already dead and drop done. if(drop_dead) { Log(MSG_WARNING,"Trying to make a monster (CID %u, type %u) drop again but already did.",clientid,char_montype); } else { thisdrop = GetDrop( ); if( thisdrop!=NULL) { CMap* map = GServer->MapList.Index[thisdrop->posMap]; map->AddDrop( thisdrop ); } } } //GServer->SendToVisible( &pak, this, thisdrop ); GServer->SendToVisible( &pak, this); } else { //If enemy is still alive ADDDWORD ( pak, 4 ); GServer->SendToVisible( &pak, this ); } } else if ( MagicStatus[i].Status == 58 || MagicStatus[i].Status == 61 || MagicStatus[i].Status == 71 || MagicStatus[i].Status >= 77 && MagicStatus[i].Status <= 80 || MagicStatus[i].Status == 88 && etime > 1*CLOCKS_PER_SEC) //Do flame dmg every 1.5 seconds { Stats->HP -= MagicStatus[i].Status; MagicStatus[i].BuffTime += 1*CLOCKS_PER_SEC; MagicStatus[i].Duration -= 1; printf("did %i flame dmg to the player, still %i seconds and %i HP remain \n", MagicStatus[i].Status, MagicStatus[i].Duration, Stats->HP); //LMA: If dead, let's the client resynch if(IsDead()) { BEGINPACKET( pak, 0x79f ); ADDWORD ( pak, clientid ); ADDDWORD ( pak, 1); GServer->SendToVisible( &pak, this ); Log(MSG_INFO,"death flame for %i, amount: %i",clientid,MagicStatus[i].Status); } //A bunch of messy code to send dmg packet BEGINPACKET( pak, 0x7b6 ); ADDWORD ( pak, clientid ); ADDWORD ( pak, 0 ); ADDDWORD ( pak, 0x000007f8 ); ADDBYTE ( pak, 0x00 ); ADDDWORD ( pak, MagicStatus[i].Status ); //If Enemy is killed if( IsDead()) { //printf("char died\n"); CDrop* thisdrop = NULL; ADDDWORD ( pak, 16 ); if( !IsSummon( ) && !IsPlayer( )) { //LMA: No drop if already dead and drop done. if(drop_dead) { Log(MSG_WARNING,"Trying to make a monster (CID %u, type %u) drop again but already did.",clientid,char_montype); } else { thisdrop = GetDrop( ); if( thisdrop!=NULL) { CMap* map = GServer->MapList.Index[thisdrop->posMap]; map->AddDrop( thisdrop ); } } } //GServer->SendToVisible( &pak, this, thisdrop ); GServer->SendToVisible( &pak, this); } else { //If enemy is still alive ADDDWORD ( pak, 4 ); GServer->SendToVisible( &pak, this ); } } } for( UINT i=0;i<32;i++) { if(MagicStatus2[i].Buff == 0) continue; clock_t etime = clock() - MagicStatus2[i].BuffTime; if( etime >= MagicStatus2[i].Duration * CLOCKS_PER_SEC ) { CPlayer* thisplayer = GServer->GetClientByID(clientid); Log(MSG_INFO,"Magic Status %i, vanish after: %i", MagicStatus2[i].Status, MagicStatus2[i].Duration); switch(MagicStatus2[i].Status) { case 126: // ALLbuff up { if(i == BUFF_ATTACK_UP_POS) { Status->Attack_up = 0xff; thisplayer->Attr->ALLbuff = 0; } else { Status->Attack_down = 0xff; thisplayer->Attr->ALLbuff = 0; } } default: { Log(MSG_WARNING,"Unknow skill status in charfunctions %u.",MagicStatus[i].Status); } } BEGINPACKET( pak,0x7b7 ); ADDWORD ( pak, clientid ); ADDDWORD ( pak, GServer->BuildBuffs( this ) ); GServer->SendToVisible( &pak, this ); MagicStatus2[i].Status = 0; MagicStatus2[i].Buff = 0; MagicStatus2[i].BuffTime = 0; MagicStatus2[i].Duration = 0; MagicStatus2[i].Value = 0; } } // if(bflag) // { // BEGINPACKET( pak,0x7b7 ); // ADDWORD ( pak, clientid ); // ADDDWORD ( pak, GServer->BuildBuffs( this ) ); // GServer->SendToVisible( &pak, this ); // } }
void Player::OnLevelUp() { hp = GetMaxHP(); en = GetMaxEN(); st = GetMaxST(); }
// Spawn Another User on the Screen bool CPlayer::SpawnToPlayer( CPlayer* player, CPlayer* otherclient ) { BEGINPACKET( pak, 0x793 ); ADDWORD( pak, clientid); // USER ID ANYONE? ADDFLOAT( pak, Position->current.x*100 ); // POS X ADDFLOAT( pak, Position->current.y*100 ); // POS Y ADDFLOAT( pak, Position->destiny.x*100 ); // GOING TO X ADDFLOAT( pak, Position->destiny.y*100 ); // GOINT TO Y if(Status->Stance == 0x01) { ADDWORD( pak, 0x000a ); ADDWORD( pak, 0x0000 ); } else if(Stats->HP <= 0) { ADDWORD( pak, 0x0003 ); ADDWORD( pak, 0x0000 ); } else if(Position->destiny.x != Position->current.y || Position->destiny.y != Position->current.y) { ADDWORD( pak, 0x0001 ); ADDWORD( pak, Battle->atktarget ); } else if(Battle->atktarget!=0) { ADDWORD( pak, 0x0002 ); ADDWORD( pak, Battle->atktarget ); } else { ADDWORD( pak, 0x0001 ); ADDWORD( pak, 0x0000 ); } switch (Status->Stance) { case WALKING: ADDBYTE( pak, 0x00 ); break; case RUNNING: ADDBYTE( pak, 0x01 ); break; case DRIVING: ADDBYTE( pak, 0x02 ); break; default: ADDBYTE( pak, 0x0b ); } ADDWORD( pak, 0x0000 ); ADDWORD( pak, 0x0000 ); if(otherclient->Party->party==NULL || otherclient->Party->party != player->Party->party || otherclient->Party->party == player->Party->party) { CMap* map = GServer->MapList.Index[player->Position->Map]; if(map->allowpvp==1){ADDDWORD(pak, 0x00000051 );} // pvp all vs all else if(map->allowpvp==2) // pvp group vs group { if((player->Clan->clanid != otherclient->Clan->clanid) && ((map->id>0) && (map->id<121))) { ADDDWORD(pak, 0x00000051 ); }//Clan War map (pedion) else if((player->Clan->clanid == otherclient->Clan->clanid) && ((map->id>0) && (map->id<=100))) { ADDDWORD(pak, 0x00000051 ); }//other pvp group vs group map else { ADDDWORD(pak, 0x00000000 ); } } else { ADDDWORD(pak, 0x00000000 ); } } else {ADDDWORD(pak, 0x00000000 );} ADDDWORD( pak, GServer->BuildBuffs( this ) );//BUFFS ADDBYTE( pak, CharInfo->Sex ); // GENDER ADDWORD( pak, Stats->Move_Speed ); // WALK SPEED MAYBE? ADDWORD( pak, 0 ); // ?? ADDBYTE( pak, 0x01 ); // ?? ADDDWORD( pak, CharInfo->Face ); // FACE TYPE ADDDWORD( pak, CharInfo->Hair ); // HAIR TYPE ADDWORD( pak, items[2].itemnum ); // CAP ADDWORD( pak, GServer->BuildItemRefine( items[2] ) ); // CAP REFINE ADDWORD( pak, items[3].itemnum ); // BODY ADDWORD( pak, GServer->BuildItemRefine( items[3] ) ); // BODY REFINE ADDWORD( pak, items[5].itemnum ); // GLOVES ADDWORD( pak, GServer->BuildItemRefine( items[5] ) ); // GLOVES REFINE ADDWORD( pak, items[6].itemnum ); // BOOTS ADDWORD( pak, GServer->BuildItemRefine( items[6] ) ); // BOOTS REFINE ADDWORD( pak, items[1].itemnum ); // FACE ADDWORD( pak, GServer->BuildItemRefine( items[1] ) ); // FACE REFINE ADDWORD( pak, items[4].itemnum ); // BACK ADDWORD( pak, GServer->BuildItemRefine( items[4] ) ); // BACK REFINE ADDWORD( pak, items[7].itemnum ); // WEAPON ADDWORD( pak, GServer->BuildItemRefine( items[7] ) ); // WEAPON REFINE ADDWORD( pak, items[8].itemnum ); // SUBWEAPON ADDWORD( pak, GServer->BuildItemRefine( items[8] ) ); // SUBWEAPON REFINE /* ADDWORD( pak, ((items[132].itemnum << 5) & 0x3ff) );//arrows ADDWORD( pak, ((items[133].itemnum << 5) & 0x3ff) );//bullets ADDWORD( pak, ((items[134].itemnum << 5) & 0x3ff) );//cannons */ //Fix from maximz ADDWORD( pak, ((items[132].itemnum << 5) ));//arrows ADDWORD( pak, ((items[133].itemnum << 5) ));//bullets ADDWORD( pak, ((items[134].itemnum << 5) ));//cannons ADDWORD( pak, CharInfo->Job ); ADDBYTE( pak, Stats->Level ); ADDWORD( pak, items[135].itemnum); // CART FRAME ADDWORD( pak, GServer->BuildItemRefine( items[135] ) ); ADDWORD( pak, items[136].itemnum ); // CART ENGINE ADDWORD( pak, GServer->BuildItemRefine( items[136] ) ); ADDWORD( pak, items[137].itemnum ); // CART WHEELS ADDWORD( pak, GServer->BuildItemRefine( items[137] ) ); ADDWORD( pak, items[138].itemnum ); // CART WEAPON ADDWORD( pak, GServer->BuildItemRefine( items[138] ) ); ADDWORD( pak, items[139].itemnum ); // CART ABILITY ADDWORD( pak, GServer->BuildItemRefine( items[139] ) ); ADDWORD( pak, (Stats->HP<=0)?0x0:0xea7b ); if(Shop->open) { ADDBYTE( pak, 0x02 ); } else { ADDBYTE( pak, 0x00 ); } ADDBYTE( pak, 0x00); ADDBYTE( pak, 0x00); if( Fairy ) { ADDBYTE( pak, 0x61); } else { ADDBYTE( pak, 0x00); } ADDSTRING( pak, CharInfo->charname ); ADDBYTE( pak, 0x00); if(Shop->open) { ADDBYTE( pak, Shop->ShopType); ADDBYTE( pak, 0x00); ADDSTRING(pak, Shop->name); ADDBYTE( pak, 0x00); //LMA 139+ } if(Clan->clanid!=0) { ADDDWORD( pak, Clan->clanid ); ADDWORD( pak, Clan->back); ADDWORD( pak, Clan->logo); ADDBYTE( pak, Clan->grade); ADDBYTE( pak, 0x00); ADDSTRING( pak, Clan->clanname); Log(MSG_INFO,"[WS] Clan info in player packet 0x793"); } ADDWORD( pak, 0x0000 ); player->client->SendPacket(&pak); if( Party->party!=NULL && Party->party == player->Party->party) { BEGINPACKET( pak, 0x7d5 ); ADDDWORD ( pak, CharInfo->charid ); ADDWORD ( pak, clientid ); ADDWORD ( pak, GetMaxHP( ) ); ADDWORD ( pak, Stats->HP ); ADDDWORD ( pak, 0x01000000 ); ADDDWORD ( pak, 0x0000000f ); ADDWORD ( pak, 0x1388 ); player->client->SendPacket( &pak ); } if( Ride->Ride ) { CPlayer* rideclient = GServer->GetClientByCID( Ride->charid, Position->Map ); if(rideclient==NULL) { Ride->Ride = false; Ride->Drive= false; Ride->charid = 0; return true; } if( GServer->IsVisible( player, rideclient ) || player->CharInfo->charid == rideclient->CharInfo->charid ) { BEGINPACKET( pak, 0x796 ); if( Ride->Drive ) { ADDWORD ( pak, rideclient->clientid ); ADDFLOAT ( pak, rideclient->Position->current.x*100 ); ADDFLOAT ( pak, rideclient->Position->current.y*100 ); } else { ADDWORD ( pak, clientid ); ADDFLOAT ( pak, Position->current.x*100 ); ADDFLOAT ( pak, Position->current.y*100 ); } ADDWORD ( pak, 0x0000 ); player->client->SendPacket( &pak ); RESETPACKET( pak, 0x7dd ); ADDBYTE ( pak, 0x02 ); if( rideclient->Ride->Drive ) { ADDWORD ( pak, rideclient->clientid ); ADDWORD ( pak, clientid ); } else { ADDWORD ( pak, clientid ); ADDWORD ( pak, rideclient->clientid ); } player->client->SendPacket( &pak ); } } //Little addition till the nonsense in server sync is fixed. //StartAction(NULL, 0, 0, true); return true; }
bool CHARACTER::UpdateAffect() { // affect_event 에서 처리할 일은 아니지만, 1초짜리 이벤트에서 처리하는 것이 // 이것 뿐이라 여기서 물약 처리를 한다. if (GetPoint(POINT_HP_RECOVERY) > 0) { if (GetMaxHP() <= GetHP()) { PointChange(POINT_HP_RECOVERY, -GetPoint(POINT_HP_RECOVERY)); } else { int iVal = 0; if (LC_IsYMIR()) { iVal = MIN(GetPoint(POINT_HP_RECOVERY), GetMaxHP() * 9 / 100); } else { iVal = MIN(GetPoint(POINT_HP_RECOVERY), GetMaxHP() * 7 / 100); } PointChange(POINT_HP, iVal); PointChange(POINT_HP_RECOVERY, -iVal); } } if (GetPoint(POINT_SP_RECOVERY) > 0) { if (GetMaxSP() <= GetSP()) PointChange(POINT_SP_RECOVERY, -GetPoint(POINT_SP_RECOVERY)); else { int iVal; if (!g_iUseLocale) iVal = MIN(GetPoint(POINT_SP_RECOVERY), GetMaxSP() * 7 / 100); else iVal = MIN(GetPoint(POINT_SP_RECOVERY), GetMaxSP() * 7 / 100); PointChange(POINT_SP, iVal); PointChange(POINT_SP_RECOVERY, -iVal); } } if (GetPoint(POINT_HP_RECOVER_CONTINUE) > 0) { PointChange(POINT_HP, GetPoint(POINT_HP_RECOVER_CONTINUE)); } if (GetPoint(POINT_SP_RECOVER_CONTINUE) > 0) { PointChange(POINT_SP, GetPoint(POINT_SP_RECOVER_CONTINUE)); } AutoRecoveryItemProcess( AFFECT_AUTO_HP_RECOVERY ); AutoRecoveryItemProcess( AFFECT_AUTO_SP_RECOVERY ); // 스테미나 회복 if (GetMaxStamina() > GetStamina()) { int iSec = (get_dword_time() - GetStopTime()) / 3000; if (iSec) PointChange(POINT_STAMINA, GetMaxStamina()/1); } // ProcessAffect는 affect가 없으면 true를 리턴한다. if (ProcessAffect()) if (GetPoint(POINT_HP_RECOVERY) == 0 && GetPoint(POINT_SP_RECOVERY) == 0 && GetStamina() == GetMaxStamina()) { m_pkAffectEvent = NULL; return false; } return true; }
void CArmorClass::Update (CInstalledArmor *pArmor, CSpaceObject *pObj, int iTick, bool *retbModified) // Update // // Updates the armor. This should be called once every 10 ticks { bool bModified = false; // Compute total regeneration by adding mods to intrinsic if (pArmor->GetMods().IsRegenerating() || pArmor->GetMods().IsPhotoRegenerating() || !m_Regen.IsEmpty()) { CItemCtx ItemCtx(pObj, pArmor); int iHPNeeded = GetMaxHP(ItemCtx) - pArmor->GetHitPoints(); if (iHPNeeded > 0) { // Combine all regeneration CRegenDesc *pRegen; CRegenDesc RegenWithMod; if (pArmor->GetMods().IsRegenerating() || pArmor->GetMods().IsPhotoRegenerating()) { RegenWithMod.Init(4); RegenWithMod.Add(m_Regen); pRegen = &RegenWithMod; } else pRegen = &m_Regen; // Compute the HP that we regenerate this cycle int iHP = Min(iHPNeeded, pRegen->GetRegen(iTick, TICKS_PER_UPDATE)); // If this is photo-repair armor then adjust the cycle // based on how far away we are from the sun. if (iHP > 0) if (m_fPhotoRepair || pArmor->GetMods().IsPhotoRegenerating()) { int iIntensity = pObj->GetSystem()->CalculateLightIntensity(pObj->GetPos()); if (mathRandom(1, 100) > iIntensity) iHP = 0; } // Repair if (iHP > 0) { pArmor->IncHitPoints(iHP); bModified = true; } } } // See if we're decaying if (pArmor->GetHitPoints() > 0 && (pArmor->GetMods().IsDecaying() || !m_Decay.IsEmpty())) { // Combine decay with mod CRegenDesc *pDecay; CRegenDesc DecayWithMod; if (pArmor->GetMods().IsDecaying()) { DecayWithMod.Init(4); DecayWithMod.Add(m_Decay); pDecay = &DecayWithMod; } else pDecay = &m_Decay; // Compute the HP that we decay this cycle int iHP = Min(pArmor->GetHitPoints(), pDecay->GetRegen(iTick, TICKS_PER_UPDATE)); // Decrement if (iHP > 0) { pArmor->IncHitPoints(-iHP); bModified = true; } } // If this is solar armor then recharge the object if (pArmor->GetMods().IsPhotoRecharge() || m_fPhotoRecharge) { int iIntensity = pObj->GetSystem()->CalculateLightIntensity(pObj->GetPos()); // Intensity varies from 0 to 100 so this will recharge up to // 100 units of fuel every 10 ticks or 10 units per tick. At 1.5MW per fuel // unit, this means that a single armor plate can support up to 15MW when // right next to the sun. pObj->Refuel(iIntensity); } // If this armor interferes with shields, then lower shields now if (pArmor->GetMods().IsShieldInterfering() || m_fShieldInterference) pObj->DeactivateShields(); // Done *retbModified = bModified; }
VOID Obj_Monster::SendMsg_RefeshAttrib( VOID ) { __ENTER_FUNCTION BOOL bPublicAttrModified ; bPublicAttrModified = FALSE; GCCharBaseAttrib msgPublicAttr, msgProtectedAttr; msgPublicAttr.setObjID( GetID() ); msgProtectedAttr.setObjID( GetID() ); //msgPublicAttr.setName( GetName() ); //msgProtectedAttr.setName( GetName() ); //msgPublicAttr.setTitle( GetTitle() ); //msgProtectedAttr.setTitle( GetTitle() ); if(m_AttrBackUp.m_HP != GetHP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_HP = GetHP(); BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0); msgPublicAttr.setHPPercent( yHPPercent ); msgProtectedAttr.setHPPercent( yHPPercent ); } if(m_AttrBackUp.m_MaxHp != GetMaxHP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MaxHp = GetMaxHP(); BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0); msgPublicAttr.setHPPercent( yHPPercent ); msgProtectedAttr.setHPPercent( yHPPercent ); } // add by gh 2010/03/30 if(m_AttrBackUp.m_MP != GetMP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MP = GetMP(); BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0); msgPublicAttr.setMPPercent( yMPPercent ); msgProtectedAttr.setMPPercent( yMPPercent ); } if(m_AttrBackUp.m_MaxMp != GetMaxMP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MaxMp = GetMaxMP(); BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0); msgPublicAttr.setMPPercent( yMPPercent ); msgProtectedAttr.setMPPercent( yMPPercent ); } // end of add if(fabs(m_AttrBackUp.m_MoveSpeed-GetMoveSpeed()) > 0.001f) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MoveSpeed = GetMoveSpeed(); msgPublicAttr.setMoveSpeed( GetMoveSpeed() ); msgProtectedAttr.setMoveSpeed( GetMoveSpeed() ); } if(m_AttrBackUp.m_nDataID != GetDataID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nDataID = GetDataID(); } const _CAMP_DATA *pCampData = GetCampData(); if ( pCampData != NULL ) { if(m_AttrBackUp.m_CampData != *pCampData) { bPublicAttrModified = TRUE; m_AttrBackUp.m_CampData = *pCampData; msgPublicAttr.setCampData( pCampData ); msgProtectedAttr.setCampData( pCampData ); } } if(m_AttrBackUp.m_OwnerID != GetOwnerID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_OwnerID = GetOwnerID(); msgPublicAttr.setOwnerID( GetOwnerID() ); msgProtectedAttr.setOwnerID( GetOwnerID() ); } if(m_AttrBackUp.m_OccupantGUID != GetOccupantGUID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_OccupantGUID = GetOccupantGUID(); msgPublicAttr.setOccupantGUID( GetOccupantGUID() ); msgProtectedAttr.setOccupantGUID( GetOccupantGUID() ); } if(m_AttrBackUp.m_nModelID != GetModelID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nModelID = GetModelID(); msgPublicAttr.setModelID( GetModelID() ); msgProtectedAttr.setModelID( GetModelID() ); } if(m_AttrBackUp.m_nMountID != GetMountID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nMountID = GetMountID(); msgPublicAttr.setMountID( GetMountID() ); msgProtectedAttr.setMountID( GetMountID() ); } if (m_AttrBackUp.m_nAIType != GetAIType() ) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nAIType = GetAIType(); INT nRet = GetMonsterAIType(); msgPublicAttr.setAIType(nRet); msgProtectedAttr.setAIType(nRet); } if(m_AttrBackUp.m_nStealthLevel != GetStealthLevel()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nStealthLevel = GetStealthLevel(); msgPublicAttr.setStealthLevel( GetStealthLevel() ); msgProtectedAttr.setStealthLevel( GetStealthLevel() ); } if(m_AttrBackUp.m_nMoodState != GetMoodState()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nMoodState = GetMoodState(); msgPublicAttr.setMoodState( GetMoodState() ); msgProtectedAttr.setMoodState( GetMoodState() ); } //if( m_AttrBackUp.m_iWeaponID != GetWeaponID() ) //{ // bPublicAttrModified = TRUE; // m_AttrBackUp.m_iWeaponID = GetWeaponID(); // //msgPublicAttr.setWeaponID( m_AttrBackUp.m_iWeaponID ); // msgProtectedAttr.setWeaponID( m_AttrBackUp.m_iWeaponID ); //} if( m_AttrBackUp.m_iHorseID != GetHorseID() ) { bPublicAttrModified = TRUE; m_AttrBackUp.m_iHorseID = GetHorseID(); msgPublicAttr.setMountID( m_AttrBackUp.m_iHorseID ); msgProtectedAttr.setMountID( m_AttrBackUp.m_iHorseID ); } if ( bPublicAttrModified ) { if ( bPublicAttrModified ) { m_PublicAttrVersion++; } if ( bPublicAttrModified || m_ProtectedAttrVersion ) { m_ProtectedAttrVersion++; } HUMANLIST listHuman; getScene()->ScanHuman( getZoneID(), MAX_REFESH_OBJ_ZONE_RADIUS, &(listHuman) ); BOOL bSendPublicMsg = bPublicAttrModified; BOOL bSendProtectedMsg = (BOOL)(bPublicAttrModified || m_ProtectedAttrVersion); BYTE i; for ( i = 0; i < listHuman.m_Count; i++ ) { Obj_Human *pTargetHuman = listHuman.m_aHuman[i]; if ( IsCanViewMe( pTargetHuman ) ) { ENUM_REFESH_ATTR_TYPE eType = CalcRefeshAttrType( this, pTargetHuman ); switch( eType ) { case REFESH_ATTR_TYPE_NONE: break; case REFESH_ATTR_TYPE_PUBLIC: case REFESH_ATTR_TYPE_PUBLIC_AND_LEVEL: if ( bSendPublicMsg ) { pTargetHuman->GetPlayer()->SendPacket( &msgPublicAttr ); } break; case REFESH_ATTR_TYPE_PROTECTED: if ( bSendProtectedMsg ) { pTargetHuman->GetPlayer()->SendPacket( &msgProtectedAttr ); } break; default: break; } } } } __LEAVE_FUNCTION }
// Check For Debuffs void CCharacter::RefreshBuff( ) { bool bflag = false; for( UINT i=0; i<30; i++) { if(MagicStatus[i].Buff==0) continue; clock_t etime = clock() - MagicStatus[i].BuffTime; if( etime >= MagicStatus[i].Duration * CLOCKS_PER_SEC ) { switch(MagicStatus[i].Buff) { case A_ATTACK: if(i<15) Status->Attack_up = 0xff; else Status->Attack_down = 0xff; Stats->Attack_Power = GetAttackPower( ); break; case A_DEFENSE: if(i<15) Status->Defense_up= 0xff; else Status->Defense_down = 0xff; Stats->Defense = GetDefense( ); break; case A_ACCUR: if(i<15) Status->Accury_up= 0xff; else Status->Accury_down = 0xff; Stats->Accury = GetAccury( ); break; case A_MRESIST: if(i<15) Status->Magic_Defense_up = 0xff; else Status->Magic_Defense_down = 0xff; Stats->Magic_Defense = GetMagicDefense( ); break; case A_DODGE: if(i<15) Status->Dodge_up = 0xff; else Status->Dodge_down = 0xff; Stats->Dodge = GetDodge( ); break; case A_DASH: if(i<15) Status->Dash_up = 0xff; else Status->Dash_down = 0xff; Stats->Move_Speed = GetMoveSpeed( ); break; case A_HASTE: if(i < 15) { Status->Haste_up = 0xff; } else { Status->Haste_down = 0xff; } Stats->Attack_Speed = GetAttackSpeed(); break; case A_CRITICAL: if(i<15) Status->Critical_up = 0xff; else Status->Critical_down = 0xff; Stats->Critical = GetCritical( ); break; case A_MAX_HP: if(i<15) Status->HP_up = 0xff; else Status->HP_down = 0xff; Stats->MaxHP = GetMaxHP( ); break; case A_MAX_MP: if(i<15) Status->MP_up = 0xff; else Status->MP_down = 0xff; Stats->MaxMP = GetMaxMP( ); break; case A_STUN: Status->Stuned = 0xff; printf("removing stun\n"); //StartAction2(NULL, 0, 0, true); break; case A_POISON: Status->Poisoned = 0xff; printf("removing poison\n"); break; case A_MUTE: Status->Muted = 0xff; break; case A_GMExtra_Damage: case A_Extra_Damage: if(i<15) { Status->ExtraDamage_up = 0xff; Stats->ExtraDamage = 0; } else Status->ExtraDamage_down = 0xff; break; } MagicStatus[i].Buff = 0; MagicStatus[i].BuffTime = 0; MagicStatus[i].Duration = 0; MagicStatus[i].Value = 0; bflag = true; } else if (MagicStatus[i].Buff == A_POISON && etime > 1*CLOCKS_PER_SEC) //Do poison dmg every 1.5 seconds { Stats->HP -= MagicStatus[i].Value; MagicStatus[i].BuffTime+= 1*CLOCKS_PER_SEC; MagicStatus[i].Duration-=1; printf("did %i poison dmg to the player, still %i seconds and %i HP remain \n", MagicStatus[i].Value, MagicStatus[i].Duration, Stats->HP); //A bunch of messy code to send dmg packet BEGINPACKET( pak, 0x7b6 ); ADDWORD ( pak, clientid ); ADDWORD ( pak, 0 ); ADDDWORD ( pak, 0x000007f8 ); ADDBYTE ( pak, 0x00 ); ADDDWORD ( pak, MagicStatus[i].Value ); //If Enemy is killed if( IsDead()) { printf("char died\n"); CDrop* thisdrop = NULL; //ADDDWORD ( pak, 16 );//i don't think this one belongs in irose if( !IsSummon( ) && !IsPlayer( )) { thisdrop = GetDrop( ); if( thisdrop!=NULL) { ADDFLOAT ( pak, thisdrop->pos.x*100 ); ADDFLOAT ( pak, thisdrop->pos.y*100 ); if( thisdrop->type==1) { ADDDWORD( pak, 0xccdf );//0xccccccdf ); ADDDWORD( pak, thisdrop->amount ); } else { ADDDWORD ( pak, GServer->BuildItemHead( thisdrop->item ) ); ADDDWORD ( pak, GServer->BuildItemData( thisdrop->item ) ); } ADDWORD ( pak, thisdrop->clientid ); ADDWORD ( pak, thisdrop->owner ); CMap* map = GServer->MapList.Index[thisdrop->posMap]; map->AddDrop( thisdrop ); } } GServer->SendToVisible( &pak, this, thisdrop ); } //If enemy is still alive else { ADDDWORD ( pak, 4 ); GServer->SendToVisible( &pak, this ); } } } if(bflag) { BEGINPACKET( pak,0x7b7 ); ADDWORD ( pak, clientid ); ADDDWORD ( pak, GServer->BuildBuffs( this ) ); GServer->SendToVisible( &pak, this ); } }
void CShieldClass::Update (CInstalledDevice *pDevice, CSpaceObject *pSource, int iTick, bool *retbSourceDestroyed, bool *retbConsumedItems) // Update // // Updates the shield { // Initialize to not regenerating pDevice->SetRegenerating(false); // If we're not enabled then we drop shields if (!pDevice->IsEnabled()) { if (GetHPLeft(pDevice, 0)) { // Note: We don't call SetDepleted because we don't want to fire the OnShieldDown // event. If necessary, we should add an OnDeviceDisabled event. SetHPLeft(pDevice, 0); pSource->OnComponentChanged(comShields); } return; } // If we're damaged, then there is a chance that we might be depleted if (pDevice->IsDamaged() || pDevice->IsDisrupted()) { if ((iTick % 10) == 0 && mathRandom(1, 100) <= 5) { Deplete(pDevice, pSource); pSource->OnDeviceStatus(pDevice, failShieldFailure); } } // If we regenerate then do so now. if (!m_Regen.IsEmpty()) { // If we're depleted, then we don't increase // HP (but we still set the regenerating flag // because we will consume power) if (UpdateDepleted(pDevice)) pDevice->SetRegenerating(true); // Otherwise, see if need to regenerate else { int iMaxHP = GetMaxHP(pDevice, pSource); int iHPLeft = GetHPLeft(pDevice, pSource); if (iHPLeft != iMaxHP) { int iRegenHP = m_Regen.GetRegen(iTick); // Figure out how much to regen if (m_iExtraRegenPerCharge && ((iTick % 30) == 0)) { int iCharges = pDevice->GetCharges(pSource); int iExtra180 = (m_iExtraRegenPerCharge * iCharges); int iExtra30 = iExtra180 / 6; int iExtraRemainder = iExtra180 % 6; iRegenHP += iExtra30; if (mathRandom(1, 6) <= iExtraRemainder) iRegenHP += 1; } // Regen SetHPLeft(pDevice, min(iMaxHP, iHPLeft + iRegenHP)); pSource->OnComponentChanged(comShields); // Remember that we regenerated this turn (so that we can // consume power) pDevice->SetRegenerating(true); } } } if (retbConsumedItems) *retbConsumedItems = false; }