private static void ReadAndDumpField(UpdateField uf, StringBuilder sb, GenericReader gr, UpdateTypes updatetype, StreamWriter data, WoWObject obj) { MemoryStream ms = new MemoryStream(gr.ReadBytes(4)); GenericReader gr2 = new GenericReader(ms); if (updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT || updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT2) { obj.SetUInt32Value(uf.Identifier, gr2.ReadUInt32()); gr2.BaseStream.Position -= 4; } switch (uf.Type) { // TODO: add data writing /*case 3: string val1 = gr.ReadSingle().ToString().Replace(",", "."); if (updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT || updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT2) data.WriteLine(uf.Name + " (" + uf.Identifier + "): " + val1); sb.AppendLine(uf.Name + " (" + index + "): " + val1); break; default: uint val2 = gr.ReadUInt32(); if (updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT || updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT2) data.WriteLine(uf.Name + " (" + uf.Identifier + "): " + val2); sb.AppendLine(uf.Name + " (" + uf.Identifier + "): " + val2); break;*/ case 1: // uint32 sb.AppendLine(uf.Name + " (" + uf.Identifier + "): " + gr2.ReadUInt32().ToString("X8")); break; case 2: // uint16+uint16 ushort value1 = gr2.ReadUInt16(); ushort value2 = gr2.ReadUInt16(); sb.AppendLine(uf.Name + " (" + uf.Identifier + "): " + "first " + value1.ToString("X4") + ", second " + value2.ToString("X4")); if (uf.Name.StartsWith("PLAYER_SKILL_INFO_1_")) { int num = uf.Identifier - 858; if ((num % 3) == 0) { ushort skill = value1; ushort flag = value2; string str = String.Format("skill {0}, flag {1}", skill, (ProfessionFlags)flag); sb.AppendLine(str); } else if (((num - 1) % 3) == 0) { ushort minskill = value1; ushort maxskill = value2; string str = String.Format("minskill {0}, maxskill {1}", minskill, maxskill); sb.AppendLine(str); } else { ushort minbonus = value1; ushort maxbonus = value2; string str = String.Format("minbonus {0}, maxbonus {1}", minbonus, maxbonus); sb.AppendLine(str); } } break; case 3: // float sb.AppendLine(uf.Name + " (" + uf.Identifier + "): " + gr2.ReadSingle()); //sb.AppendLine(uf.Name + " (" + uf.Identifier + "): " + gr.ReadSingle().ToString().Replace(",", ".")); break; case 4: // uint64 (can be only low part) sb.AppendLine(uf.Name + " (" + uf.Identifier + "): " + gr2.ReadUInt32().ToString("X8")); break; case 5: // bytes uint value = gr2.ReadUInt32(); sb.AppendLine(uf.Name + " (" + uf.Identifier + "): " + value.ToString("X8")); if (uf.Identifier == 36) // UNIT_FIELD_BYTES_0 { byte[] bytes = BitConverter.GetBytes(value); Races race = (Races)bytes[0]; Class class_ = (Class)bytes[1]; Gender gender = (Gender)bytes[2]; Powers powertype = (Powers)bytes[3]; string str = String.Format("Race: {0}, class: {1}, gender: {2}, powertype: {3}", race, class_, gender, powertype); sb.AppendLine(str); } break; default: sb.AppendLine(uf.Name + " (" + uf.Identifier + "): " + "unknown type " + gr2.ReadUInt32().ToString("X8")); break; } gr2.Close(); }
public static void LoadUpdateFields() { StreamReader sr = new StreamReader("updatefields_240.dat"); while (sr.Peek() >= 0) { string curline = sr.ReadLine(); if (curline.StartsWith("#") || curline.StartsWith("/")) // skip commentary lines { continue; } if (curline.Length == 0) // empty line { continue; } if (curline.StartsWith(":")) // label lines { if (curline.Contains("unit+player")) { type = 1; } else if (curline.Contains("gameobject")) { type = 2; } else if (curline.Contains("dynamicobject")) { type = 3; } else if (curline.Contains("corpse")) { type = 4; } continue; } string[] arr = curline.Split(' '); if (arr.Length < 3) { continue; } int id = Convert.ToInt32(arr[0]); string name = arr[1]; uint type1 = Convert.ToUInt32(arr[2]); //uint format = Convert.ToUInt32(arr[3]); uint format = 0; UpdateField uf = new UpdateField(id, name, type1, format, 0); switch (type) { case 0: item_uf.Add(id, uf); break; case 1: unit_uf.Add(id, uf); break; case 2: go_uf.Add(id, uf); break; case 3: do_uf.Add(id, uf); break; case 4: corpse_uf.Add(id, uf); break; } } CheckIntegrity(); }
private static bool ParseValuesUpdateBlock(GenericReader gr, StringBuilder sb, StreamWriter swe, StreamWriter data, ObjectTypes objectTypeId, UpdateTypes updatetype, WoWObject obj) { sb.AppendLine("=== values_update_block_start ==="); byte blocks_count = gr.ReadByte(); // count of update blocks (4 bytes for each update block) sb.AppendLine("Bit mask blocks count: " + blocks_count); int[] updatemask = new int[blocks_count]; // create array of update blocks for (int j = 0; j < blocks_count; j++) updatemask[j] = gr.ReadInt32(); // populate array of update blocks with data Mask = new BitArray(updatemask); int reallength = Mask.Count; // bitmask size (bits) int bitmask_max_size = 0; uint values_end = 0; switch (objectTypeId) { case ObjectTypes.TYPEID_ITEM: bitmask_max_size = 64; values_end = UpdateFieldsLoader.ITEM_END; break; case ObjectTypes.TYPEID_CONTAINER: bitmask_max_size = 160; values_end = UpdateFieldsLoader.CONTAINER_END; break; case ObjectTypes.TYPEID_UNIT: bitmask_max_size = 256; values_end = UpdateFieldsLoader.UNIT_END; break; case ObjectTypes.TYPEID_PLAYER: bitmask_max_size = 1536; // 2.3.2 - 1472 values_end = UpdateFieldsLoader.PLAYER_END; break; case ObjectTypes.TYPEID_GAMEOBJECT: bitmask_max_size = 32; values_end = UpdateFieldsLoader.GO_END; break; case ObjectTypes.TYPEID_DYNAMICOBJECT: bitmask_max_size = 32; values_end = UpdateFieldsLoader.DO_END; break; case ObjectTypes.TYPEID_CORPSE: bitmask_max_size = 64; values_end = UpdateFieldsLoader.CORPSE_END; break; } if (reallength > bitmask_max_size) { long pos = gr.BaseStream.Position; swe.WriteLine("error position {0}", pos.ToString("X2")); swe.WriteLine("error while parsing {0} values update block, count {1}", objectTypeId, reallength); return false; } for (int index = 0; index < reallength; index++) { if (index > values_end) break; if (Mask[index]) { UpdateField uf = new UpdateField(); switch (objectTypeId) { case ObjectTypes.TYPEID_ITEM: case ObjectTypes.TYPEID_CONTAINER: uf = UpdateFieldsLoader.item_uf[index]; break; case ObjectTypes.TYPEID_UNIT: case ObjectTypes.TYPEID_PLAYER: uf = UpdateFieldsLoader.unit_uf[index]; break; case ObjectTypes.TYPEID_GAMEOBJECT: uf = UpdateFieldsLoader.go_uf[index]; break; case ObjectTypes.TYPEID_DYNAMICOBJECT: uf = UpdateFieldsLoader.do_uf[index]; break; case ObjectTypes.TYPEID_CORPSE: uf = UpdateFieldsLoader.corpse_uf[index]; break; } ReadAndDumpField(uf, sb, gr, updatetype, data, obj); } } if ((objectTypeId == ObjectTypes.TYPEID_GAMEOBJECT || objectTypeId == ObjectTypes.TYPEID_UNIT) && (updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT || updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT2) && obj.IsNew) obj.Save(); sb.AppendLine("=== values_update_block_end ==="); return true; }
public static void LoadUpdateFields() { StreamReader sr = new StreamReader("updatefields_240.dat"); while (sr.Peek() >= 0) { string curline = sr.ReadLine(); if (curline.StartsWith("#") || curline.StartsWith("/")) // skip commentary lines continue; if (curline.Length == 0) // empty line continue; if (curline.StartsWith(":")) // label lines { if (curline.Contains("unit+player")) type = 1; else if (curline.Contains("gameobject")) type = 2; else if (curline.Contains("dynamicobject")) type = 3; else if (curline.Contains("corpse")) type = 4; continue; } string[] arr = curline.Split(' '); if (arr.Length < 3) continue; int id = Convert.ToInt32(arr[0]); string name = arr[1]; uint type1 = Convert.ToUInt32(arr[2]); //uint format = Convert.ToUInt32(arr[3]); uint format = 0; UpdateField uf = new UpdateField(id, name, type1, format, 0); switch (type) { case 0: item_uf.Add(id, uf); break; case 1: unit_uf.Add(id, uf); break; case 2: go_uf.Add(id, uf); break; case 3: do_uf.Add(id, uf); break; case 4: corpse_uf.Add(id, uf); break; } } CheckIntegrity(); }