/// <summary> /// Reduces caster fatigue points or mana points. /// </summary> /// <param name="caster">Living entity casting the skill.</param> /// <param name="skill">Casted skill by the living entity.</param> private void ReduceCasterPoints(ILivingEntity caster, SkillInfo skill) { if (skill.LevelData.RequiredFP > 0) { caster.Attributes[DefineAttributes.FP] -= skill.LevelData.RequiredFP; _moverPacketFactory.SendUpdateAttributes(caster, DefineAttributes.FP, caster.Attributes[DefineAttributes.FP]); } if (skill.LevelData.RequiredMP > 0) { caster.Attributes[DefineAttributes.MP] -= skill.LevelData.RequiredMP; _moverPacketFactory.SendUpdateAttributes(caster, DefineAttributes.MP, caster.Attributes[DefineAttributes.MP]); } }
/// <summary> /// Update monster moves. /// </summary> /// <param name="monster"></param> private void ProcessMonsterMovements(IMonsterEntity monster) { if (monster.Object.MovingFlags.HasFlag(ObjectState.OBJSTA_STAND)) { if (monster.Timers.NextMoveTime < Time.TimeInSeconds()) { monster.Object.MovingFlags &= ~ObjectState.OBJSTA_STAND; monster.Object.MovingFlags |= ObjectState.OBJSTA_FMOVE; monster.Moves.DestinationPosition.Copy(monster.Region.GetRandomPosition()); monster.Object.Angle = Vector3.AngleBetween(monster.Object.Position, monster.Moves.DestinationPosition); _moverPacketFactory.SendDestinationPosition(monster); _moverPacketFactory.SendDestinationAngle(monster, false); } else if (monster.Moves.ReturningToOriginalPosition) { monster.Attributes[DefineAttributes.HP] = monster.Data.AddHp; _moverPacketFactory.SendUpdateAttributes(monster, DefineAttributes.HP, monster.Attributes[DefineAttributes.HP]); monster.Moves.ReturningToOriginalPosition = false; } else if (monster.Moves.SpeedFactor >= 2f) { monster.Moves.SpeedFactor = 1f; _moverPacketFactory.SendSpeedFactor(monster, monster.Moves.SpeedFactor); } } }
/// <inheritdoc /> public void ResurectLodelight(IPlayerEntity player) { IMapRevivalRegion revivalRegion = player.Object.CurrentMap.GetNearRevivalRegion(player.Object.Position); if (revivalRegion == null) { _logger.LogError($"Cannot find any revival region for map '{player.Object.CurrentMap.Name}'."); return; } decimal recoveryRate = _gameResources.Penalities.GetRevivalPenality(player.Object.Level) / 100; var jobData = player.PlayerData.JobData; int strength = player.Attributes[DefineAttributes.STR]; int stamina = player.Attributes[DefineAttributes.STA]; int dexterity = player.Attributes[DefineAttributes.DEX]; int intelligence = player.Attributes[DefineAttributes.INT]; player.Attributes[DefineAttributes.HP] = (int)(HealthFormulas.GetMaxOriginHp(player.Object.Level, stamina, jobData.MaxHpFactor) * recoveryRate); player.Attributes[DefineAttributes.MP] = (int)(HealthFormulas.GetMaxOriginMp(player.Object.Level, intelligence, jobData.MaxMpFactor, true) * recoveryRate); player.Attributes[DefineAttributes.FP] = (int)(HealthFormulas.GetMaxOriginFp(player.Object.Level, stamina, dexterity, strength, jobData.MaxFpFactor, true) * recoveryRate); if (player.Object.MapId != revivalRegion.MapId) { IMapInstance revivalMap = _mapManager.GetMap(revivalRegion.MapId); if (revivalMap == null) { _logger.LogError($"Cannot find revival map with id '{revivalRegion.MapId}'."); // TODO: disconnect client //player.Connection.Server.DisconnectClient(player.Connection.Id); return; } revivalRegion = revivalMap.GetRevivalRegion(revivalRegion.Key); } _teleportSystem.Teleport(player, revivalRegion.MapId, revivalRegion.RevivalPosition.X, null, revivalRegion.RevivalPosition.Z); _moverPacketFactory.SendMotion(player, ObjectMessageType.OBJMSG_ACC_STOP | ObjectMessageType.OBJMSG_STOP_TURN | ObjectMessageType.OBJMSG_STAND); _playerPacketFactory.SendPlayerRevival(player); _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.HP, player.Attributes[DefineAttributes.HP]); _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.MP, player.Attributes[DefineAttributes.MP]); _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.FP, player.Attributes[DefineAttributes.FP]); ProcessDeathPenality(player); }
/// <inheritdoc /> public bool IncreaseGold(IPlayerEntity player, int goldAmount) { // We cast player gold to long because otherwise it would use Int32 arithmetic and would overflow long gold = (long)player.PlayerData.Gold + goldAmount; if (gold > int.MaxValue || gold < 0) // Check gold overflow { _textPacketFactory.SendDefinedText(player, DefineText.TID_GAME_TOOMANYMONEY_USE_PERIN); return(false); } else { player.PlayerData.Gold = (int)gold; _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.GOLD, player.PlayerData.Gold); } return(true); }
/// <inheritdoc /> public void IdleRecevory(IPlayerEntity player, bool isSitted = false) { int nextHealDelay = isSitted ? NextIdleHealSit : NextIdleHealStand; player.Timers.NextHealTime = Time.TimeInSeconds() + nextHealDelay; if (player.IsDead) { return; } int strength = player.Attributes[DefineAttributes.STR]; int stamina = player.Attributes[DefineAttributes.STA]; int dexterity = player.Attributes[DefineAttributes.DEX]; int intelligence = player.Attributes[DefineAttributes.INT]; int maxHp = HealthFormulas.GetMaxOriginHp(player.Object.Level, stamina, player.PlayerData.JobData.MaxHpFactor); int maxMp = HealthFormulas.GetMaxOriginMp(player.Object.Level, intelligence, player.PlayerData.JobData.MaxMpFactor, true); int maxFp = HealthFormulas.GetMaxOriginFp(player.Object.Level, stamina, dexterity, strength, player.PlayerData.JobData.MaxFpFactor, true); int recoveryHp = HealthFormulas.GetHpRecovery(maxHp, player.Object.Level, stamina, player.PlayerData.JobData.HpRecoveryFactor); int recoveryMp = HealthFormulas.GetMpRecovery(maxMp, player.Object.Level, intelligence, player.PlayerData.JobData.MpRecoveryFactor); int recoveryFp = HealthFormulas.GetFpRecovery(maxFp, player.Object.Level, stamina, player.PlayerData.JobData.FpRecoveryFactor); player.Attributes[DefineAttributes.HP] += recoveryHp; player.Attributes[DefineAttributes.MP] += recoveryMp; player.Attributes[DefineAttributes.FP] += recoveryFp; if (player.Attributes[DefineAttributes.HP] > maxHp) { player.Attributes[DefineAttributes.HP] = maxHp; } if (player.Attributes[DefineAttributes.MP] > maxMp) { player.Attributes[DefineAttributes.MP] = maxMp; } if (player.Attributes[DefineAttributes.FP] > maxFp) { player.Attributes[DefineAttributes.FP] = maxFp; } _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.HP, player.Attributes[DefineAttributes.HP]); _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.MP, player.Attributes[DefineAttributes.MP]); _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.FP, player.Attributes[DefineAttributes.FP]); }
public void UseFoodItem(IPlayerEntity player, Item foodItemToUse) { foreach (KeyValuePair <DefineAttributes, int> parameter in foodItemToUse.Data.Params) { if (parameter.Key == DefineAttributes.HP || parameter.Key == DefineAttributes.MP || parameter.Key == DefineAttributes.FP) { int currentPoints = player.Attributes[parameter.Key]; int maxPoints = PlayerHelper.GetMaxPoints(player, parameter.Key); int itemMaxRecovery = foodItemToUse.Data.AbilityMin; if (parameter.Value >= 0) { if (currentPoints >= itemMaxRecovery) { float limitedRecovery = parameter.Value * 0.3f; if (currentPoints + limitedRecovery > maxPoints) { currentPoints = maxPoints; } else { switch (parameter.Key) { case DefineAttributes.HP: _textPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LIMITHP); break; case DefineAttributes.MP: _textPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LIMITMP); break; case DefineAttributes.FP: _textPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LIMITFP); break; } currentPoints += (int)limitedRecovery; } } else { currentPoints = Math.Min(currentPoints + parameter.Value, maxPoints); } } PlayerHelper.SetPoints(player, parameter.Key, currentPoints); _moverPacketFactory.SendUpdateAttributes(player, parameter.Key, player.Attributes[parameter.Key]); } else { // TODO: food triggers a skill. _logger.LogWarning($"Activating a skill throught food."); _textPacketFactory.SendFeatureNotImplemented(player, "skill with food"); } } DecreaseItem(player, foodItemToUse); }
/// <inheritdoc /> public void GiveExeperience(IPlayerEntity player, long experience) { if (player.PlayerData.Mode.HasFlag(ModeType.MODE_EXPUP_STOP)) { return; } var exp = CalculateExtraExperience(player, experience); // TODO: experience to party if (GiveExperienceToPlayer(player, exp)) { _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.HP, player.Attributes[DefineAttributes.HP]); _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.MP, player.Attributes[DefineAttributes.MP]); _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.FP, player.Attributes[DefineAttributes.FP]); _playerPacketFactory.SendPlayerSetLevel(player, player.Object.Level); _playerPacketFactory.SendPlayerStatsPoints(player); } _playerPacketFactory.SendPlayerExperience(player); // TODO: send packet to friends, messenger, guild, couple, party, etc... }