Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
 public MeleeAttackEventArgs(ObjectMessageType attackType, ILivingEntity target, float attackSpeed, int unknownParameter)
 {
     this.AttackType       = attackType;
     this.Target           = target;
     this.AttackSpeed      = attackSpeed;
     this.UnknownParameter = unknownParameter;
 }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        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();
        }
Ejemplo n.º 7
0
        /// <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);
                }
            }
        }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
        /// <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
                };
            }
Ejemplo n.º 10
0
 public MeleeAttackEventArgs(ObjectMessageType attackType, ILivingEntity target, float attackSpeed)
     : this(attackType, target, attackSpeed, 0)
 {
 }