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)); } }
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(); }
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); } }
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)); }
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)); }
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)); }
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)); } }