public static int PhysicalAttack(YiObj attacker, MsgInteractType attackType = MsgInteractType.Physical) { if (!CanAttackPhysical(attacker, attacker.CurrentTarget)) { return(-1); } if (attacker.HasFlag(StatusEffect.Invisibility)) { attacker.RemoveStatusEffect(StatusEffect.Invisibility); } if (attacker is Player player) { if (player.AttackJob != null) { player.AttackJob.Cancelled = true; } if (player.CurrentTarget != null && player.CurrentTarget.Alive) { player.AttackJob = YiScheduler.Instance.DoReturn(TimeSpan.FromMilliseconds(attacker.AttackSpeed), () => MsgInteract.Handle(player, MsgInteract.Create(attacker, attacker.CurrentTarget, attackType, 0))); } } return(AttackCalcs.GetDamage(attacker, attacker.CurrentTarget, attackType)); }
public static void ShareExp(YiObj attacker, YiObj target, uint bonus) { if (!Teams.ContainsKey(attacker.UniqueId)) { return; } foreach (var member in Teams[attacker.UniqueId].Members.Values) { if (!Position.CanSeeBig(attacker, member)) { continue; } var exp = AttackCalcs.AdjustExp((int)bonus, attacker, target); if (exp > member.Level * 360) { exp = (uint)(member.Level * 360); } if (member.Partner == attacker.Name) { exp *= 2; } if (member.Class >= 133 && member.Class <= 135) { exp *= 2; } //exp = (uint)Math.Round(exp*GameWorld.Maps[attacker.MapId].ExpModifier); (member as Player)?.Send(MsgText.Create("TeamData", member.Name, $"You've been awarded {exp} experience!", MsgTextType.Top)); member.Experience += exp; } }