/// <summary> /// Executes a melee or magic skill and inflicts the damages to the 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="reduceCasterPoints">Value that indicates if it should reduce caster points or not.</param> private void ExecuteSkill(ILivingEntity caster, ILivingEntity target, SkillInfo skill, bool reduceCasterPoints = true) { ObjectMessageType skillMessageType = ObjectMessageType.OBJMSG_NONE; IAttackArbiter attackArbiter = null; switch (skill.Data.Type) { case SkillType.Magic: attackArbiter = new MagicSkillAttackArbiter(caster, target, skill); skillMessageType = ObjectMessageType.OBJMSG_MAGICSKILL; break; case SkillType.Skill: attackArbiter = new MeleeSkillAttackArbiter(caster, target, skill); skillMessageType = ObjectMessageType.OBJMSG_MELEESKILL; break; } _battleSystem.DamageTarget(caster, target, attackArbiter, skillMessageType); if (skill.LevelData.CooldownTime > 0) { skill.SetCoolTime(skill.LevelData.CooldownTime); } if (reduceCasterPoints) { ReduceCasterPoints(caster, skill); } }
public MeleeAttackEventArgs(ObjectMessageType attackType, ILivingEntity target, float attackSpeed, int unknownParameter) { this.AttackType = attackType; this.Target = target; this.AttackSpeed = attackSpeed; this.UnknownParameter = unknownParameter; }
/// <inheritdoc /> public void SendMotion(IWorldEntity entity, ObjectMessageType objectMessage) { using var packet = new FFPacket(); packet.StartNewMergedPacket(entity.Id, SnapshotType.MOTION); packet.Write((int)objectMessage); SendToVisible(packet, entity, sendToPlayer: true); }
/// <inheritdoc /> public void SendMeleeAttack(ILivingEntity attacker, ObjectMessageType motion, uint targetId, int unknwonParam, AttackFlags attackFlags) { using var packet = new FFPacket(); packet.StartNewMergedPacket(attacker.Id, SnapshotType.MELEE_ATTACK); packet.Write((int)motion); packet.Write(targetId); packet.Write(unknwonParam); packet.Write((int)attackFlags); SendToVisible(packet, attacker); }
/// <inheritdoc /> public void SendRangeAttack(ILivingEntity attacker, ObjectMessageType motion, uint targetId, int power, int projectileId) { using var packet = new FFPacket(); packet.StartNewMergedPacket(attacker.Id, SnapshotType.RANGE_ATTACK); packet.Write((int)motion); packet.Write(targetId); packet.Write(power); packet.Write(0); // unused parameter, always 0 packet.Write(projectileId); SendToVisible(packet, attacker); }
public void BroadCastEntityUpdate(ObjectMessageType objectMessageType, Entity entity) { NetOutgoingMessage om = s_client.CreateMessage(); om.Write((byte)ServerInfo.Broadcast); om.Write((byte)MessageType.ObjectUpdate); om.Write((byte)objectMessageType); om.Write(entity.objectID); switch (objectMessageType) { case ObjectMessageType.PlayerSpawn: Player player = (Player)entity; om.Write(player.onlinePlayer.clientID); XNAExtensions.Write(om, entity.Hitbox.Center); om.Write((byte)player.carType); om.Write((byte)player.carFrontType); om.Write((byte)player.abilityType); break; case ObjectMessageType.Spawn: om.Write((byte)entity.entityType); XNAExtensions.Write(om, entity.Hitbox.Center); break; case ObjectMessageType.UpdatePosition: XNAExtensions.Write(om, entity.Hitbox.Center); om.Write(entity.Hitbox.RotationRad); XNAExtensions.Write(om, entity.Velocity); break; case ObjectMessageType.Despawn: //doesnt need more information break; case ObjectMessageType.StateChange: break; case ObjectMessageType.UpdateHitpoints: om.Write(entity.hitpoints); break; } s_client.SendMessage(om, NetDeliveryMethod.ReliableOrdered); s_client.FlushSendQueue(); }
/// <inheritdoc /> public void Execute(IPlayerEntity player, object[] parameters) { ObjectMessageType defaultAttackType = ObjectMessageType.OBJMSG_ATK1; float defaultAttackSpeed = 1.0f; for (int i = 0; i < player.Object.Entities.Count; i++) { if (player.Object.Entities[i] is IMonsterEntity monsterEntity) { if (!monsterEntity.Follow.IsFollowing) { _followSystem.Follow(monsterEntity, player); } _battleSystem.MeleeAttack(player, monsterEntity, defaultAttackType, defaultAttackSpeed); } } }
public static void SendDie(IPlayerEntity player, ILivingEntity deadEntity, ILivingEntity killerEntity, ObjectMessageType motion) { using (var packet = new FFPacket()) { packet.StartNewMergedPacket(deadEntity.Id, SnapshotType.MOVERDEATH); packet.Write((int)motion); packet.Write(killerEntity.Id); SendToVisible(packet, player, sendToPlayer: true); } }
/// <inheritdoc /> public AttackResult DamageTarget(ILivingEntity attacker, ILivingEntity defender, IAttackArbiter attackArbiter, ObjectMessageType attackType) { if (!CanAttack(attacker, defender)) { ClearBattleTargets(defender); ClearBattleTargets(attacker); return(null); } if (defender is IPlayerEntity undyingPlayer) { if (undyingPlayer.PlayerData.Mode == ModeType.MATCHLESS_MODE) { _logger.LogDebug($"{attacker.Object.Name} wasn't able to inflict any damages to {defender.Object.Name} because he is in undying mode"); return(null); } } AttackResult attackResult; if (attacker is IPlayerEntity player && player.PlayerData.Mode.HasFlag(ModeType.ONEKILL_MODE)) { attackResult = new AttackResult { Damages = defender.Attributes[DefineAttributes.HP], Flags = AttackFlags.AF_GENERIC }; }
public MeleeAttackEventArgs(ObjectMessageType attackType, ILivingEntity target, float attackSpeed) : this(attackType, target, attackSpeed, 0) { }