problem with items I with advice from friend this. (Packet 0xF3)
Code:
private static CallbackResult OnItemDetailsNew(byte[] data, CallbackResult prevState)
{
lock (World.SyncRoot)
{
PacketReader reader = new PacketReader(data);
byte id = reader.ReadByte();
if (id != 0xF3) throw new Exception("Invalid packet passed to OnItemDetailsNew.");
ushort osiShit = reader.ReadUInt16();
byte dataType = reader.ReadByte();
uint serial = reader.ReadUInt32();
bool isNew = false;
RealItem item = World.FindRealItem(serial);
ushort graphic = reader.ReadUInt16();
byte facing = reader.ReadByte();
ushort amount = reader.ReadUInt16();
ushort amount2 = reader.ReadUInt16();
ushort x = reader.ReadUInt16();
ushort y = reader.ReadUInt16();
sbyte z = reader.ReadSByte();
byte lightLevel = reader.ReadByte();
ushort hue = reader.ReadUInt16();
byte flag = reader.ReadByte();
ushort access = reader.ReadUInt16();
if (item == null)
{
item = new RealItem(serial);
item.Graphic = graphic;
item.X = x;
item.Y = y;
item.Z = z;
item.Flags = flag;
item.Color = hue;
item.Amount = amount;
World.Add(item);
isNew = true;
}
item.Detach();
#if WORLDDEBUG
Trace.WriteLine(String.Format("Item updated ({0}).", item.Description), "World");
#endif
if (isNew)
itemAdded.InvokeAsync(null, new ObjectChangedEventArgs(serial, ObjectChangeType.NewItem));
ObjectChanged(serial, ObjectChangeType.ItemUpdated);
itemUpdated.InvokeAsync(null, new ObjectChangedEventArgs(item.Serial, ObjectChangeType.ItemUpdated));
return CallbackResult.Normal;
}
}
old items (Packet 0x1A)
Code:
private static CallbackResult OnItemDetails(byte[] data, CallbackResult prevResult)
{
lock (World.SyncRoot) {
PacketReader reader = new PacketReader(data);
byte id = reader.ReadByte();
if (id != 0x1A) throw new Exception("Invalid packet passed to OnItemDetails.");
ushort blockSize = reader.ReadUInt16();
if (blockSize != reader.Length)
return CallbackResult.Normal;
uint serial = reader.ReadUInt32();
bool isNew = false;
RealItem item = World.FindRealItem(serial);
if (item == null) {
item = new RealItem(serial);
World.Add(item);
isNew = true;
}
ushort dispId = reader.ReadUInt16();
if ((serial & 0x80000000) != 0) {
item.Amount = reader.ReadUInt16();
}
if ((dispId & 0x8000) != 0) {
dispId += reader.ReadByte();
}
item.Graphic = (ushort)(dispId & 0x7FFF);
ushort x = reader.ReadUInt16();
item.X = (ushort)(x & 0x7FFF);
ushort y = reader.ReadUInt16();
item.Y = (ushort)(y & 0x3FFF);
if ((x & 0x8000) != 0) {
byte direction = reader.ReadByte();
}
item.Z = reader.ReadSByte();
if ((y & 0x8000) != 0) {
item.Color = reader.ReadUInt16();
}
if ((y & 0x4000) != 0) {
item.Flags = reader.ReadByte();
}
item.Detach();
#if WORLDDEBUG
Trace.WriteLine(String.Format("Item updated ({0}).", item.Description), "World");
#endif
if (isNew)
itemAdded.InvokeAsync(null, new ObjectChangedEventArgs(serial, ObjectChangeType.NewItem));
ObjectChanged(serial, ObjectChangeType.ItemUpdated);
itemUpdated.InvokeAsync(null, new ObjectChangedEventArgs(item.Serial, ObjectChangeType.ItemUpdated));
return CallbackResult.Normal;
}
}
Look at it ... in 0x1A load item only with ID but in new packet (I don't know why) I must load almost whole packet and insert data to item before than add dynamic list of item.
hope it will help you, if not write me couse i had this problem yesterday and solved it so i can now log on kelevar with different external program i´m developing.
Edit : You are edited tiledata for new UO if injection working with?