/// <summary> /// Casts a melee skill on a target. /// </summary> /// <param name="caster">Living entity casting a skill.</param> /// <param name="target">Living target entity touched by the skill.</param> /// <param name="skill">Skill to be casted.</param> /// <param name="skillUseType">Skill use type.</param> private void CastMeleeSkill(ILivingEntity caster, ILivingEntity target, SkillInfo skill, SkillUseType skillUseType) { int skillCastingTime = GetSkillCastingTime(caster, skill); if (skill.Data.SpellRegionType == SpellRegionType.Around) { // TODO: AoE _textPacketFactory.SendFeatureNotImplemented(caster as IPlayerEntity, "AoE skills"); } else { _skillPacketFactory.SendUseSkill(caster, target, skill, skillCastingTime, skillUseType); caster.Delayer.DelayAction(TimeSpan.FromMilliseconds(skill.LevelData.ComboSkillTime), () => { ExecuteSkill(caster, target, skill); }); } }
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); }