Exemplo n.º 1
0
        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
                });
            }
        }
Exemplo n.º 2
0
        public async Task Message(IMessage message)
        {
            var response = new UnstructuredOutgoingPacket(PacketSendOperations.Message);

            response.Write(message);
            await Dispatch(response);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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();
            }
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
        }