Exemple #1
0
        private static void HandleCast(GameSession session, PacketReader packet)
        {
            long   skillSN     = packet.ReadLong();
            int    serverTick  = packet.ReadInt();
            int    skillId     = packet.ReadInt();
            short  skillLevel  = packet.ReadShort();
            byte   attackPoint = packet.ReadByte();
            CoordF position    = packet.Read <CoordF>();
            CoordF direction   = packet.Read <CoordF>();
            CoordF rotation    = packet.Read <CoordF>();

            packet.ReadFloat();
            int clientTick = packet.ReadInt();

            packet.ReadBool();
            packet.ReadLong();
            bool flag = packet.ReadBool();

            if (flag)
            {
                packet.ReadInt();
                string unkString = packet.ReadUnicodeString();
            }

            SkillCast skillCast = new SkillCast(skillId, skillLevel, skillSN, serverTick, session.FieldPlayer.ObjectId, clientTick, attackPoint);

            session.FieldPlayer.Value.Cast(skillCast);

            if (skillCast != null)
            {
                session.FieldManager.BroadcastPacket(SkillUsePacket.SkillUse(skillCast, position, direction, rotation));
                session.Send(StatPacket.SetStats(session.FieldPlayer));
            }
        }
Exemple #2
0
        public override void Cast(SkillCast skillCast)
        {
            int spiritCost  = skillCast.GetSpCost();
            int staminaCost = skillCast.GetStaCost();

            if (Value.Stats[StatId.Spirit].Total < spiritCost || Value.Stats[StatId.Stamina].Total < staminaCost)
            {
                return;
            }

            SkillCast = skillCast;

            ConsumeSp(spiritCost);
            ConsumeStamina(staminaCost);
            Value.Session.SendNotice(skillCast.SkillId.ToString());

            // TODO: Move this and all others combat cases like recover sp to its own class.
            // Since the cast is always sent by the skill, we have to check buffs even when not doing damage.
            if (skillCast.IsBuffToOwner() || skillCast.IsBuffToEntity() || skillCast.IsBuffShield() || skillCast.IsDebuffToOwner())
            {
                Status status = new(skillCast, ObjectId, ObjectId, 1);
                StatusHandler.Handle(Value.Session, status);
            }

            Value.Session.FieldManager.BroadcastPacket(SkillUsePacket.SkillUse(skillCast));
            Value.Session.Send(StatPacket.SetStats(this));

            StartCombatStance();
        }
Exemple #3
0
        private static void HandleFirstSent(GameSession session, PacketReader packet)
        {
            long  skillSN    = packet.ReadLong();
            int   unkValue   = packet.ReadInt();
            int   skillId    = packet.ReadInt();
            short skillLevel = packet.ReadShort();

            packet.ReadByte();
            CoordF coords = packet.Read <CoordF>();

            packet.ReadShort();

            SkillCast skillCast   = new SkillCast(skillId, skillLevel, skillSN, unkValue);
            int       spiritCost  = skillCast.GetSpCost();
            int       staminaCost = skillCast.GetStaCost();

            if (session.Player.Stats[PlayerStatId.Spirit].Current >= spiritCost && session.Player.Stats[PlayerStatId.Stamina].Current >= staminaCost)
            {
                session.Player.ConsumeSp(spiritCost);
                session.Player.ConsumeStamina(staminaCost);
                // TODO: Add SP recovery
                session.FieldPlayer.Value.SkillCast = skillCast;
                session.Send(SkillUsePacket.SkillUse(skillCast, coords));
                session.Send(StatPacket.SetStats(session.FieldPlayer));
            }
        }
        private static void HandleRegionSkills(GameSession session, PacketReader packet)
        {
            long   skillSN  = packet.ReadLong();
            byte   mode     = packet.ReadByte();
            int    unknown  = packet.ReadInt();
            int    unknown2 = packet.ReadInt();
            CoordF position = packet.Read <CoordF>();
            CoordF rotation = packet.Read <CoordF>();

            // TODO: Verify rest of skills to proc correctly.
            // Send status correctly when Region attacks are proc.
            if (SkillUsePacket.SkillCastMap[skillSN].GetConditionSkill() == null)
            {
                return;
            }

            foreach (SkillCondition conditionSkill in SkillUsePacket.SkillCastMap[skillSN].GetConditionSkill())
            {
                if (!conditionSkill.Splash)
                {
                    continue;
                }

                SkillCast skillCast = new SkillCast(conditionSkill.Id, conditionSkill.Level, GuidGenerator.Long(), session.ServerTick);
                SkillUsePacket.SkillUse(skillCast, position, CoordF.From(0, 0, 0), rotation, session.FieldPlayer.ObjectId);
                RegionSkillHandler.Handle(session, session.FieldPlayer.ObjectId, session.FieldPlayer.Coord, skillCast);
            }
        }
Exemple #5
0
        private void HandleFirstSent(GameSession session, PacketReader packet)
        {
            long  skillUid   = packet.ReadLong();
            int   value      = packet.ReadInt();
            int   skillId    = packet.ReadInt();
            short skillLevel = packet.ReadShort();

            packet.ReadByte();
            CoordF coords = packet.Read <CoordF>();

            packet.ReadShort();
            session.Send(SkillUsePacket.SkillUse(session.FieldPlayer, value, skillUid, coords));
        }
Exemple #6
0
        private static void HandleFirstSent(GameSession session, PacketReader packet)
        {
            long  skillSN    = packet.ReadLong();
            int   unkValue   = packet.ReadInt();
            int   skillId    = packet.ReadInt();
            short skillLevel = packet.ReadShort();

            packet.ReadByte();
            CoordF coords = packet.Read <CoordF>();

            packet.ReadShort();
            SkillCast skillCast = new SkillCast(skillId, skillLevel, skillSN, unkValue);

            session.FieldPlayer.Value.SkillCast = skillCast;
            session.Send(SkillUsePacket.SkillUse(skillCast, coords));
        }
Exemple #7
0
        public override void Execute(GameCommandTrigger trigger)
        {
            int   id    = trigger.Get <int>("id");
            short level = trigger.Get <short>("level") > 0 ? trigger.Get <short>("level") : (short)1;

            if (SkillMetadataStorage.GetSkill(id) == null)
            {
                trigger.Session.SendNotice($"Skill with id: {id} is not defined.");
                return;
            }

            SkillCast             skillCast = new SkillCast(id, level, GuidGenerator.Long(), trigger.Session.ServerTick, trigger.Session.FieldPlayer.ObjectId, trigger.Session.ClientTick);
            CoordF                empty     = CoordF.From(0, 0, 0);
            IFieldObject <Player> player    = trigger.Session.FieldPlayer;

            trigger.Session.FieldManager.BroadcastPacket(SkillUsePacket.SkillUse(skillCast, player.Coord, empty, empty));
        }
Exemple #8
0
        private static void HandleCast(GameSession session, PacketReader packet)
        {
            long  skillSN    = packet.ReadLong();
            int   unkValue   = packet.ReadInt();
            int   skillId    = packet.ReadInt();
            short skillLevel = packet.ReadShort();

            packet.ReadByte();
            CoordF coords = packet.Read <CoordF>();

            packet.ReadShort();

            SkillCast skillCast = session.Player.Cast(skillId, skillLevel, skillSN, unkValue);

            if (skillCast != null)
            {
                session.Send(SkillUsePacket.SkillUse(skillCast, coords));
                session.Send(StatPacket.SetStats(session.FieldPlayer));
            }
        }