예제 #1
0
 private void HandleObjectInfoPacket(ObjectInfoPacket packet)
 {
     if (packet.Type == 0x2006)
     {
         LastCorpseId = packet.Id;
     }
 }
예제 #2
0
        public void Can_deserialize_packet_with_dye()
        {
            var rawPacket = FakePackets.Instantiate(new byte[]
            {
                0x1A,                   // packet
                0x00, 0x10,             // size
                0x40, 0x03, 0x7C, 0xBD, // object id
                0x1A, 0xD7,             // type
                0x14, 0xF4,             // xloc
                0x8B, 0xAE,             // yloc
                0x06,                   // zloc
                0x09, 0x80              // dye
            });

            var packet = new ObjectInfoPacket();

            packet.Deserialize(rawPacket);

            packet.Id.Should().Be(new ObjectId(0x40037cbd));
            packet.Type.Should().Be((ModelId)0x1ad7);
            packet.Location.X.Should().Be(0x14f4);
            packet.Location.Y.Should().Be(0x0BAE);
            packet.Location.Z.Should().Be(0x06);
            packet.Dye.Should().Be((Color)0x0980);
        }
예제 #3
0
        public void Can_deserialize_packet_with_negative_zcoord()
        {
            var rawPacket = FakePackets.Instantiate(new byte[]
            {
                0x1A,
                0x00, 0x0E,
                0x40, 0x00, 0x11, 0x37,
                0x0E, 0x80,
                0x0A, 0xAB,
                0x0C, 0xB5,
                0xF0,
            });

            var packet = new ObjectInfoPacket();

            packet.Deserialize(rawPacket);

            packet.Id.Should().Be(new ObjectId(0x40001137));
            packet.Type.Should().Be((ModelId)0x0E80);
            packet.Location.X.Should().Be(0x0AAB);
            packet.Location.Y.Should().Be(0x0CB5);
            unchecked
            {
                packet.Location.Z.Should().Be((sbyte)0xF0);
            }
        }
예제 #4
0
        public ObjectId AddNewItemToGround(ModelId type, Location2D location, int amount = 1, Color?color = null)
        {
            var newItemId = NewItemId();

            var packet = new ObjectInfoPacket(newItemId, type, (Location3D)location, color, (ushort?)amount);

            sendPacket(packet.RawPacket.Payload);

            return(newItemId);
        }
예제 #5
0
        private void EnterGameSA()
        {
            SendToClient(new CharLocaleAndBodyPacket()
            {
                PlayerId     = legacyApi.Me.PlayerId,
                BodyType     = legacyApi.Me.BodyType,
                Direction    = legacyApi.Me.Direction,
                MovementType = legacyApi.Me.MovementType,
                Location     = legacyApi.Me.Location,
            }.Serialize());

            SendToClient(new SetMapPacket(reloginInfo.MapId).RawPacket);

            var enableFeaturesPacket = packetRegistry.Instantiate <EnableLockedClientFeaturesPacket>(0xB9);

            enableFeaturesPacket.Flags = reloginInfo.EnabledFeatureFlags;
            SendToClient(enableFeaturesPacket.Serialize());

            var drawPlayer = new DrawGamePlayerPacket(legacyApi.Me.PlayerId, legacyApi.Me.BodyType, legacyApi.Me.Location,
                                                      legacyApi.Me.Direction, legacyApi.Me.MovementType, legacyApi.Me.Color);

            SendToClient(drawPlayer.Serialize());

            foreach (var obj in UO.Items.OnGround())
            {
                var objectInfo = new ObjectInfoPacket(obj.Id, obj.Type, obj.Location, obj.Color, obj.Amount);
                SendToClient(objectInfo.RawPacket);
            }

            foreach (var mobile in UO.Mobiles)
            {
                var drawPacket = packetRegistry.Instantiate <DrawObjectPacket>(0x78);
                drawPacket.Color        = mobile.Color.HasValue ? mobile.Color.Value : (Color)0;
                drawPacket.Direction    = mobile.Orientation.HasValue ? mobile.Orientation.Value : Direction.North;
                drawPacket.Flags        = mobile.Flags;
                drawPacket.Id           = mobile.Id;
                drawPacket.Location     = mobile.Location;
                drawPacket.MovementType = mobile.CurrentMovementType.HasValue ? mobile.CurrentMovementType.Value : MovementType.Walk;
                drawPacket.Notoriety    = mobile.Notoriety.HasValue ? mobile.Notoriety.Value : Notoriety.Innocent;
                drawPacket.Type         = mobile.Type;

                var items = UO.Items.InContainer(mobile.Id).Where(i => i.Layer.HasValue).ToArray();
                drawPacket.Items = items;

                SendToClient(drawPacket.Serialize());
            }

            drawPlayer = new DrawGamePlayerPacket(legacyApi.Me.PlayerId, legacyApi.Me.BodyType, legacyApi.Me.Location,
                                                  legacyApi.Me.Direction, legacyApi.Me.MovementType, legacyApi.Me.Color);
            SendToClient(drawPlayer.Serialize());

            SendToClient(new Packet(new byte[] { 0x55 }));
        }
예제 #6
0
        public void Can_deserialize_packet_without_any_optional_part()
        {
            var packet = new ObjectInfoPacket();

            packet.Deserialize(ObjectInfoPacket);

            packet.Id.Should().Be(new ObjectId(0x4000000F));
            packet.Type.Should().Be((ModelId)0x372A);
            packet.Amount.Should().Be(1);
            packet.Location.X.Should().Be(0x129B);
            packet.Location.Y.Should().Be(0x0551);
            packet.Location.Z.Should().Be(0x0A);
            packet.Flags.Should().HaveFlag(ObjectFlag.None);
        }
예제 #7
0
        public void Can_materialize_packet_with_amount()
        {
            var packet = new ObjectInfoPacket();

            packet.Deserialize(ObjectInfoPacketWithAmountWithFlag);

            packet.Id.Should().Be(new ObjectId(0x4000000B));
            packet.Type.Should().Be((ModelId)0x0EED);
            packet.Amount.Should().Be(0x01F4);
            packet.Location.X.Should().Be(0x128A);
            packet.Location.Y.Should().Be(0x0542);
            packet.Location.Z.Should().Be(0x0A);
            packet.Flags.Should().HaveFlag(ObjectFlag.Movable);
        }
예제 #8
0
 private void HandleObjectInfoPacket(ObjectInfoPacket packet)
 {
     if (gameObjects.TryGet(packet.Id, out GameObject existingObject) && existingObject is Item existingItem)
     {
         gameObjects.UpdateObject(existingItem.Update(packet.Type, packet.Amount, packet.Location,
                                                      existingItem.Color,
                                                      existingItem.ContainerId));
     }
     else
     {
         var item = packet.Type == 0x2006
             ? new Corpse(packet.Id, packet.Type, packet.Amount, packet.Location, packet.Dye, null, null)
             : new Item(packet.Id, packet.Type, packet.Amount, packet.Location, packet.Dye, null, null);
         gameObjects.AddObject(item);
         OnItemEnteredView(item);
     }
 }
예제 #9
0
        private Packet?FilterItemShapes(Packet rawPacket)
        {
            if (enabled && rawPacket.Id == PacketDefinitions.ObjectInfo.Id)
            {
                var packet = PacketDefinitionRegistry.Materialize <ObjectInfoPacket>(rawPacket);

                foreach (var def in itemShapeShiftDefinitions)
                {
                    if (def.SourceSpec.Matches(packet.Type))
                    {
                        var newPacket =
                            new ObjectInfoPacket(packet.Id, def.TargetType, packet.Location, def.TargetColor ?? packet.Dye);

                        return(newPacket.RawPacket);
                    }
                }
            }

            return(rawPacket);
        }
예제 #10
0
 private void HandleObjectInfoPacket(ObjectInfoPacket packet)
 {
     if (gameObjects.TryGet(packet.Id, out var existingObject) && existingObject is Item existingItem)
     {
         // ObjectInfo packet holds information about items that are on ground, not in a container, so if
         // an item is in a container and it is updated by a ObjectInfo packet, the item has to be
         // taken out of the container and put on the ground.
         gameObjects.UpdateObject(existingItem.Update(packet.Type, packet.Amount, packet.Location,
                                                      existingItem.Color,
                                                      null));
     }
     else
     {
         var item = packet.Type == 0x2006
             ? new Corpse(packet.Id, packet.Type, packet.Amount, packet.Location, packet.Dye, null, null)
             : new Item(packet.Id, packet.Type, packet.Amount, packet.Location, packet.Dye, null, null);
         gameObjects.AddObject(item);
         OnItemEnteredView(item);
     }
 }
예제 #11
0
        public void Can_deserialize_packet_with_facing()
        {
            var rawPacket = FakePackets.Instantiate(new byte[]
            {
                0x1A,                   // packet
                0x00, 0x0F,             // size
                0x40, 0x03, 0x24, 0xDD, // object id
                0x19, 0x8A,             // type
                0x94, 0xEB,             // xloc
                0x0B, 0xD0,             // yloc
                0x01,                   // facing
                0x00,                   // zloc
            });

            var packet = new ObjectInfoPacket();

            packet.Deserialize(rawPacket);

            packet.Id.Should().Be(new ObjectId(0x400324dd));
            packet.Type.Should().Be((ModelId)0x198a);
            packet.Location.X.Should().Be(0x14EB);
            packet.Location.Y.Should().Be(0x0bd0);
            packet.Location.Z.Should().Be(0x00);
        }
예제 #12
0
        public void ObjectInfo(ObjectId id, ModelId type, Location3D location, Color?color)
        {
            ObjectInfoPacket packet = new ObjectInfoPacket(id, type, location, color);

            Send(packet.RawPacket);
        }
예제 #13
0
        internal void ObjectInfo(ObjectId id, ModelId type, int amount, Location3D location, Color color)
        {
            var packet = new ObjectInfoPacket(id, type, location, color, (ushort)amount);

            sendPacket(packet.RawPacket.Payload);
        }