/// <summary> /// Updates nearby players when Client is hurt. /// </summary> /// <param name="cause"></param> /// <param name="hitBy">The Client hurting the current Client.</param> /// <param name="args">First argument should always be the damage amount.</param> public void DamageClient(DamageCause cause, EntityBase hitBy = null, params object[] args) { //event start EntityDamageEventArgs entevent = new EntityDamageEventArgs(_Player, Convert.ToInt16(args[0]), null, cause); _Player.Server.PluginManager.CallEvent(Event.ENTITY_DAMAGE, entevent); if (_Player.GameMode == 1) { entevent.EventCanceled = true; } if (entevent.EventCanceled) return; //event end switch (cause) { case DamageCause.BlockExplosion: break; case DamageCause.Contact: break; case DamageCause.Drowning: break; case DamageCause.EntityAttack: if (hitBy != null) { } break; case DamageCause.EntityExplosion: break; case DamageCause.Fall: if (args.Length > 0) { _Player.Health -= Convert.ToInt16(args[0]); } break; case DamageCause.Fire: break; case DamageCause.FireBurn: break; case DamageCause.Lava: break; case DamageCause.Lightning: break; case DamageCause.Projectile: break; case DamageCause.Suffocation: break; case DamageCause.Void: break; default: _Player.Health -= 1; break; } SendPacket(new UpdateHealthPacket { Health = _Player.Health, Food = Owner.Food, FoodSaturation = Owner.FoodSaturation, }); foreach (Client c in _Player.Server.GetNearbyPlayers(_Player.World, new AbsWorldCoords(_Player.Position.X, _Player.Position.Y, _Player.Position.Z))) { if (c == this) continue; c.SendPacket(new AnimationPacket // Hurt Animation { Animation = 2, PlayerId = _Player.EntityId }); c.SendPacket(new EntityStatusPacket // Hurt Action { EntityId = _Player.EntityId, EntityStatus = 2 }); } if (_Player.Health == 0) _Player.HandleDeath(hitBy); }
public virtual void OnDamaged(EntityDamageEventArgs e) { }
public virtual void Damage(DamageCause cause, short damageAmount, EntityBase hitBy = null, params object[] args) { if (damageAmount <= 0) { World.Logger.Log(Logger.LogLevel.Warning, string.Format("Invalid damage {0} of type {1} caused by {2} to {3}({4})", damageAmount, cause, (hitBy == null ? "null" :hitBy.EntityId.ToString()), Name, EntityId)); return; } lock (_damageLock) { if (World.WorldTicks - LastDamageTick < 10) return; LastDamageTick = World.WorldTicks; EntityDamageEventArgs e = new EntityDamageEventArgs(this, damageAmount, hitBy, cause); Server.PluginManager.CallEvent(Event.EntityDamage, e); if (e.EventCanceled) return; damageAmount = e.Damage; hitBy = e.DamagedBy; // Debug if (hitBy is Player) { var hitByPlayer = hitBy as Player; ItemStack itemHeld = hitByPlayer.Inventory.ActiveItem; hitByPlayer.Client.SendMessage("You hit a " + Name + " with a " + itemHeld.Type + " dealing " + damageAmount + " damage."); } Health -= damageAmount; SendUpdateOnDamage(); // TODO: Entity Knockback if (Health <= 0) HandleDeath(hitBy); } }
public void DamageMob(EntityBase hitBy = null) { var hitByPlayer = hitBy as Player; var hitByMob = hitBy as Mob; if (hitByPlayer != null) { //TODO: Make damage more customizable. CSV anyone? //TODO: Fix damage. //Damage values taken from http://www.minecraftwiki.net/wiki/Damage#Dealing_Damage short damage = 2; ItemStack itemHeld = hitByPlayer.Inventory.ActiveItem; switch (itemHeld.Type) { case 268: case 283: damage = 5; break; case 272: damage = 7; break; case 267: damage = 9; break; case 276: damage = 11; break; case 273: damage = 3; break; case 274: damage = 4; break; case 275: damage = 5; break; } //Event EntityDamageEventArgs e = new EntityDamageEventArgs(this, damage, hitByPlayer, DamageCause.EntityAttack); Server.PluginManager.CallEvent(Plugins.Events.Event.ENTITY_DAMAGE, e); if (e.EventCanceled) return; damage = e.Damage; hitByPlayer = e.DamagedBy; //End Event //Debug hitByPlayer.Client.SendMessage("You hit a " + this.Name + " with a " + itemHeld.Type.ToString() + " dealing " + damage.ToString() + " damage."); this.Health -= damage; } else if (hitByMob != null) { // Hit by a Mob so apply its' attack strength as damage short damage = hitByMob.AttackStrength; //Event EntityDamageEventArgs e = new EntityDamageEventArgs(this, damage, null, DamageCause.EntityAttack); Server.PluginManager.CallEvent(Plugins.Events.Event.ENTITY_DAMAGE, e); if (e.EventCanceled) return; damage = e.Damage; //End Event // TODO: Generic damage from falling/lava/fire? this.Health -= damage; } else { short damage = 1; //Event EntityDamageEventArgs e = new EntityDamageEventArgs(this, damage, null, DamageCause.EntityAttack); Server.PluginManager.CallEvent(Plugins.Events.Event.ENTITY_DAMAGE, e); if (e.EventCanceled) return; damage = e.Damage; //End Event // TODO: Generic damage from falling/lava/fire? this.Health -= damage; } foreach (Client c in World.Server.GetNearbyPlayers(World, new AbsWorldCoords(Position.X, Position.Y, Position.Z))) { c.SendPacket(new AnimationPacket // Hurt Animation { Animation = 2, PlayerId = this.EntityId }); c.SendPacket(new EntityStatusPacket // Hurt Action { EntityId = this.EntityId, EntityStatus = 2 }); } // TODO: Entity Knockback if (this.Health <= 0) HandleDeath(hitByPlayer); }
private void OnDamaged(EntityDamageEventArgs e) { foreach (EventListener el in Plugins) { if (el.Event == Event.ENTITY_DAMAGE) { EntityListener l = el.Listener as EntityListener; l.OnDamaged(e); } } }