예제 #1
0
        public override async Task Generate(IField field)
        {
            var mob = new FieldMob(_mobTemplate, _lifeTemplate.Left)
            {
                Position     = _lifeTemplate.Position,
                Foothold     = (short)_lifeTemplate.FH,
                HomeFoothold = (short)_lifeTemplate.FH
            };

            if (RegenInterval.TotalSeconds > 0)
            {
                mob.Generator = this;
                Generated     = mob;
            }
            await field.Enter(mob, () => mob.GetEnterFieldPacket(MobAppearType.Regen));
        }
예제 #2
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldMob mob)
        {
            var mobCtrlSN = packet.Decode <short>();
            var v7        = packet
                            .Decode <byte>();          //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.Decode <byte>();
            var illegalVelocity = packet.Decode <int>();
            var v8 = packet.Decode <byte>();

            var cheatedRandom   = (v8 & 0xF0) != 0;
            var cheatedCtrlMove = (v8 & 0xF) != 0;

            var multiTargetForBall = packet.Decode <int>();

            for (var i = 0; i < multiTargetForBall; i++)
            {
                packet.Decode <long>();                                         // int, int
            }
            var randTimeForAreaAttack = packet.Decode <int>();

            for (var i = 0; i < randTimeForAreaAttack; i++)
            {
                packet.Decode <int>();
            }

            packet.Decode <int>(); // HackedCode
            packet.Decode <int>(); // idk
            packet.Decode <int>(); // HackedCodeCrc
            packet.Decode <int>(); // idk

            using (var p = new Packet(SendPacketOperations.MobCtrlAck))
            {
                p.Encode <int>(mob.ID);
                p.Encode <short>(mobCtrlSN);
                p.Encode <bool>(mobMoveStartResult);
                p.Encode <short>(0); // nMP
                p.Encode <byte>(0);  // SkillCommand
                p.Encode <byte>(0);  // SLV

                await mob.Controller.SendPacket(p);
            }

            using (var p = new Packet(SendPacketOperations.MobMove))
            {
                p.Encode <int>(mob.ID);
                p.Encode <bool>(mobMoveStartResult);
                p.Encode <byte>(curSplit);
                p.Encode <byte>(0); // not sure
                p.Encode <byte>(0); // not sure
                p.Encode <int>(illegalVelocity);

                p.Encode <int>(0); // MultiTargetForBall
                p.Encode <int>(0); // RandTimeForAreaAttack

                mob.Move(packet).Encode(p);

                await mob.Field.BroadcastPacket(mob.Controller, p);
            }
        }
예제 #3
0
 public abstract Task Handle(RecvPacketOperations operation, IPacket packet, FieldMob mob);