public void PlayerAttackMonster(Connection client, AttackTargetRequest atr) { if (!_monsters.ContainsKey(atr.TargetID)) { LogInterface.Log(string.Format("Character({0}) attacking non existant monster {1} on map {2}", client.Character.ID, atr.TargetID, client.Character.MapID), LogInterface.LogMessageType.Game); client.SendPacket(new SeePlayerAttack(atr.TargetID, 0, client.Character, atr, 6)); // Wrong target } else { Monster m = _monsters[atr.TargetID]; client.Character.AttackTarget(m, atr); SeePlayerAttack pkt = new SeePlayerAttack(m.ID, m.CurHP, client.Character, atr); foreach (Connection c in _players.Values) { c.SendPacket(pkt); } if (m.Dead) { // Do loot! m.GiveLoot(client); } } }
public void AttackTarget(Monster m, AttackTargetRequest atr) { bool millena = Millena; int damage = Program.Server.Rand.Next(millena ? _abilityPMin : _abilityMMin, millena ? _abilityPMax : _abilityMMax); bool critical = (Program.Server.Rand.NextDouble() < 0.25); if (critical) { damage *= 2; } atr.Critical = critical; m.TakeDamage((uint)damage, ID); }