static void DeserializeObject(WORLDMSG msgID, BinReader data) { string str = data.ReadString(); Type type = dbTypes.GetType(str); if (type == null) { throw new Exception("Failed to deserialize " + str + ": type == null"); } uint ObjectID = data.ReadUInt32(); DBObject obj = GetDBObject(type, ObjectID); if (obj != null) { obj.Deserialize(data); // we will probably never deserialized an existing object Console.WriteLine("woooah! WorldServer deserialized a " + str + " that already exists. Notify something!"); } else { obj = (DBObject)Activator.CreateInstance(type); obj.Deserialize(data); AddDBObject(obj); } if (type == typeof(DBCharacter)) { int n = data.ReadInt32(); DBCharacter c = (DBCharacter)obj; if (n > 0) { c.Items = new DBItem[n]; for (int i = 0; i < n; i++) { ObjectID = data.ReadUInt32(); DBItem item = (DBItem)GetDBObject(typeof(DBItem), ObjectID); if (item == null) { item = new DBItem(); item.Deserialize(data); AddDBObject(item); } else { item.Deserialize(data); } item.Template = (DBItemTemplate)GetDBObject(typeof(DBItemTemplate), item.TemplateID); if (item.Template == null) { Console.WriteLine("Missing Item Template " + item.TemplateID); } c.Items[i] = item; } } else { c.Items = null; } } }
static void OnSaveDBObject(WorldConnection connection, WORLDMSG msgID, BinReader data) { try { string str = data.ReadString(); Type type = dbTypes.GetType(str, true); uint objectID = data.ReadUInt32(); string field = DataObject.GetTableName(type) + "_ID"; DataObject[] objs = DataServer.Database.SelectObjects(type, field + " = '" + objectID + "'"); if (objs.Length == 0) { throw new Exception("Requested objectID " + objectID + " for " + str + " didn't exist!"); } DBObject obj = (DBObject)objs[0]; obj.Deserialize(data); DataServer.Database.SaveObject(obj); } catch (Exception e) { Console.WriteLine("Error in OnSaveDBObject!"); Console.WriteLine(e); } }