public async Task ModifyStats(Action <IModifyStatContext> action = null, bool exclRequest = false) { var context = new ModifyStatContext(Character); action?.Invoke(context); await UpdateStats(); if (!IsInstantiated) { return; } var statPacket = new UnstructuredOutgoingPacket(PacketSendOperations.StatChanged); statPacket.WriteBool(exclRequest); statPacket.Write(context); statPacket.WriteBool(false); statPacket.WriteBool(false); await Dispatch(statPacket); if (Party != null && (context.Flag.HasFlag(ModifyStatType.Job) || context.Flag.HasFlag(ModifyStatType.Level))) { _ = GameStage.PartyService.UpdateChangeLevelOrJob(new PartyUpdateChangeLevelOrJobRequest { Character = ID, Level = context.Level, Job = context.Job }); } }
public async Task Message(IMessage message) { var response = new UnstructuredOutgoingPacket(PacketSendOperations.Message); response.Write(message); await Dispatch(response); }
public async Task ModifySkills(Action <IModifySkillContext> action = null, bool exclRequest = false) { var context = new ModifySkillContext(Character); action?.Invoke(context); await UpdateStats(); var skillPacket = new UnstructuredOutgoingPacket(PacketSendOperations.ChangeSkillRecordResult); skillPacket.WriteBool(exclRequest); skillPacket.Write(context); skillPacket.WriteBool(true); await Dispatch(skillPacket); }
public async Task ModifyForcedStats(Action <IModifyForcedStatContext> action = null, bool exclRequest = false) { var context = new ModifyForcedStatContext(ForcedStats as ForcedStats); action?.Invoke(context); await UpdateStats(); var statPacket = new UnstructuredOutgoingPacket(context.Flag > 0 ? PacketSendOperations.ForcedStatSet : PacketSendOperations.ForcedStatReset); if (context.Flag > 0) { statPacket.Write(context); } await Dispatch(statPacket); }
public async Task ModifyInventory(Action <IModifyMultiInventoryContext> action = null, bool exclRequest = false) { var context = new ModifyMultiInventoryContext(Character.Inventories, GameStage.ItemTemplates); action?.Invoke(context); var inventoryPacket = new UnstructuredOutgoingPacket(PacketSendOperations.InventoryOperation); inventoryPacket.WriteBool(exclRequest); inventoryPacket.Write(context); inventoryPacket.WriteBool(false); await Dispatch(inventoryPacket); if ( context.History.Any(o => o.Slot < 0) || context.History.OfType <MoveModifyInventoryOperation>().Any(o => o.ToSlot < 0) ) { await UpdateStats(); await UpdateAvatar(); } }
protected override async Task Handle( GameStageUser stageUser, IFieldObjUser user, IPacketReader packet ) { _ = packet.ReadLong(); _ = packet.ReadByte(); _ = packet.ReadLong(); _ = packet.ReadInt(); _ = packet.ReadInt(); _ = packet.ReadInt(); var path = packet.Read(new MovePath()); var movement = new UnstructuredOutgoingPacket(PacketSendOperations.UserMove); movement.WriteInt(user.ID); movement.Write(path); await user.Move(path); await user.FieldSplit.Dispatch(user, movement); }
protected override async Task Handle( GameStageUser stageUser, IFieldObjUser controller, IFieldObjNPC controlled, IPacketReader packet ) { var movement = new UnstructuredOutgoingPacket(PacketSendOperations.NpcMove); movement.WriteInt(controlled.ID); movement.WriteByte(packet.ReadByte()); // TODO: actions movement.WriteByte(packet.ReadByte()); if (controlled.Info.Move) { var path = packet.Read(new MovePath()); movement.Write(path); await controlled.Move(path); } await controlled.FieldSplit.Dispatch(movement); }
protected override async Task Handle( GameStageUser stageUser, IFieldObjUser controller, IFieldObjMob controlled, IPacketReader packet ) { if (controlled.HP <= 0) { return; } var mobCtrlSN = packet.ReadShort(); var v7 = packet.ReadByte(); //v85 = nDistance | 4 * (v184 | 2 * ((unsigned __int8)retaddr | 2 * v72)); [ CONFIRMED ] var oldSplit = (v7 & 0xF0) != 0; //this is a type of CFieldSplit var mobMoveStartResult = (v7 & 0xF) != 0; var curSplit = packet.ReadByte(); var illegalVelocity = packet.ReadInt(); var v8 = packet.ReadByte(); var cheatedRandom = (v8 & 0xF0) != 0; var cheatedCtrlMove = (v8 & 0xF) != 0; var multiTargetForBall = packet.ReadInt(); for (var i = 0; i < multiTargetForBall; i++) { packet.ReadLong(); // int, int } var randTimeForAreaAttack = packet.ReadInt(); for (var i = 0; i < randTimeForAreaAttack; i++) { packet.ReadInt(); } packet.ReadInt(); // HackedCode packet.ReadInt(); // idk packet.ReadInt(); // HackedCodeCrc packet.ReadInt(); // idk var path = packet.Read(new MovePath()); await controlled.Move(path); var response = new UnstructuredOutgoingPacket(PacketSendOperations.MobCtrlAck); response.WriteInt(controlled.ID); response.WriteShort(mobCtrlSN); response.WriteBool(mobMoveStartResult); response.WriteShort((short)controlled.MP); // nMP response.WriteByte(0); // SkillCommand response.WriteByte(0); // SLV await controller.Dispatch(response); var movement = new UnstructuredOutgoingPacket(PacketSendOperations.MobMove); movement.WriteInt(controlled.ID); movement.WriteBool(false); // NotForceLandingWhenDiscard movement.WriteBool(false); // NotChangeAction movement.WriteBool(false); // NextAttackPossible movement.WriteBool(false); // Left movement.WriteInt(illegalVelocity); movement.WriteInt(0); // MultiTargetForBall movement.WriteInt(0); // RandTimeForAreaAttack movement.Write(path); await controlled.Field.Dispatch(controller, movement); }