Exemple #1
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 #2
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));
            }
        }