private void WriteArrayField(TextWriter writer, ExtendedUpdateField field, int num) { writer.WriteLine("\t\t/// <summary>"); writer.WriteLine("\t\t/// {0}", field.Description); writer.WriteLine("\t\t/// </summary>"); writer.WriteLine("\t\t{0}_{1} = {2},", field.Name, num + 1, field.Offset + num); }
private void WriteField(ExtendedUpdateField field, TextWriter writer) { writer.WriteLine("\t\t/// <summary>"); writer.WriteLine("\t\t/// {0}", field.Description); writer.WriteLine("\t\t/// </summary>"); writer.WriteLine("\t\t{0} = {1},", field.Name, field.Offset); }
private void WriteFieldFromArray(List <string> array, TextWriter writer, ExtendedUpdateField field, int fieldStart, int id) { writer.WriteLine("\t\t/// <summary>"); writer.WriteLine("\t\t/// {0}", field.Description); writer.WriteLine("\t\t/// </summary>"); writer.WriteLine("\t\t{0} = {1},", array[fieldStart + id], field.Offset + id); }
private void FillList(BinaryReader binReader) { m_fieldCount = 0; string previousField = String.Empty; string currentField; binReader.BaseStream.Position = m_dataStartOffset; while (true) { var field = new ExtendedUpdateField { NameOffset = binReader.ReadUInt32() }; // 4A4C90 for GUID (4869264) if (field.NameOffset < 0x9999) { uint oldNameOffset = field.NameOffset; field.NameOffset = binReader.ReadUInt32(); } field.Offset = binReader.ReadUInt32(); field.Size = binReader.ReadUInt32(); field.Type = (UpdateFieldType)binReader.ReadUInt32(); field.Flags = (UpdateFieldFlags)binReader.ReadUInt32(); if (m_fieldCount == 0) { // 0x401A00 m_stringOffsetDelta = field.NameOffset - m_stringStartOffset; } long stringOffset = field.NameOffset - m_stringOffsetDelta; long oldpos = binReader.BaseStream.Position; binReader.BaseStream.Position = stringOffset; currentField = binReader.ReadCString(); binReader.BaseStream.Position = oldpos; var sb = new StringBuilder(); sb.AppendFormat("Size: {0} - ", field.Size); sb.AppendFormat("Type: {0} - ", field.Type); sb.AppendFormat("Flags: {0}", field.Flags); field.Description = sb.ToString(); field.Name = currentField; m_updateFieldList.Add(field); m_fieldCount++; if (!previousField.Equals("CORPSE_FIELD_PAD") && currentField.Equals("CORPSE_FIELD_PAD")) { break; } previousField = currentField; } }
private void FillStartAndEndValues() { for (int i = 0; i < m_fieldCount; i++) { ExtendedUpdateField field = m_updateFieldList[i]; if (field.Name.StartsWith("OBJECT")) { // workaround for GameObjectFields first field being named CREATED_BY if (field.Name.StartsWith("OBJECT_FIELD_CREATED_BY")) { if (m_gameObjectStart == 0) { m_gameObjectStart = i; m_gameObjectEnd = m_gameObjectStart; } m_gameObjectEnd++; m_totalGameObjectSize += (int)field.Size; field.Group = ObjectTypeId.GameObject; } else { if (field.Offset == 0) { m_objectStart = i; m_objectEnd = m_objectStart; } m_objectEnd++; m_totalObjectSize += (int)field.Size; field.Group = ObjectTypeId.Object; } } else if (field.Name.StartsWith("ITEM")) { if (field.Offset == 0) { m_itemStart = i; m_itemEnd = m_itemStart; } m_itemEnd++; m_totalItemSize += (int)field.Size; field.Group = ObjectTypeId.Item; } else if (field.Name.StartsWith("CONTAINER")) { if (field.Offset == 0) { m_containerStart = i; m_containerEnd = m_containerStart; } m_containerEnd++; m_totalContainerSize += (int)field.Size; field.Group = ObjectTypeId.Container; } else if (field.Name.StartsWith("GAMEOBJECT")) { // Dont need to check for first because first GameObject field is CREATED_BY m_gameObjectEnd++; m_totalGameObjectSize += (int)field.Size; field.Group = ObjectTypeId.GameObject; } else if (field.Name.StartsWith("UNIT")) { if (field.Offset == 0) { m_unitStart = i; m_unitEnd = m_unitStart; } m_unitEnd++; m_totalUnitSize += (int)field.Size; field.Group = ObjectTypeId.Unit; } else if (field.Name.StartsWith("PLAYER")) { if (field.Offset == 0) { m_playerStart = i; m_playerEnd = m_playerStart; } m_playerEnd++; m_totalPlayerSize += (int)field.Size; field.Group = ObjectTypeId.Player; } else if (field.Name.StartsWith("CORPSE")) { if (field.Offset == 0) { m_corpseStart = i; m_corpseEnd = m_corpseStart; } m_corpseEnd++; m_totalCorpseSize += (int)field.Size; field.Group = ObjectTypeId.Corpse; } else if (field.Name.StartsWith("DYNAMIC")) { if (field.Offset == 0) { m_dynamicObjectStart = i; m_dynamicObjectEnd = m_dynamicObjectStart; } m_dynamicObjectEnd++; m_totalDynamicObjectSize += (int)field.Size; field.Group = ObjectTypeId.DynamicObject; } else { Console.WriteLine("WARNING: Field was ignored - " + field.Name); } } }
public NewField(ExtendedUpdateField field) : base(field) { }
public DeprecatedField(ExtendedUpdateField field) : base(field) { }
public ChangedField(ExtendedUpdateField original, ExtendedUpdateField mt) : base(original) { Changed = mt; }
public FieldVariation(ExtendedUpdateField original) { Original = original; }
private void Compare() { Dictionary <string, ExtendedUpdateField> newFields = new Dictionary <string, ExtendedUpdateField>(100); for (var group = (ObjectTypeId)0; group < (ObjectTypeId)UpdateField.ObjectTypeCount; group++) { var oldGroup = origFields[(int)group]; var newGroup = newVersionFields[(int)group]; var groupChange = Changes[(int)group] = new List <FieldVariation>(20); var count = Math.Max(oldGroup.Length, newGroup.Length); uint indexDiff = 0; for (uint i = 0; i < count; i++) { var origField = oldGroup.Get(i); var newField = newGroup.Get(i + indexDiff); if (origField == null && newField == null) { continue; } else if (origField == null || newField == null || origField.Name != newField.Name) { // Field moved or got removed ExtendedUpdateField movedTo = null; if (origField != null) { if (!newFields.TryGetValue(origField.Name, out movedTo)) { movedTo = Find(newGroup, origField.Name, i + 1); } else { // Field moved to a previous index newFields.Remove(origField.Name); } } if (movedTo == null) { indexDiff = 0; if (origField != null) { // Original Field got deprecated groupChange.Add(new DeprecatedField(origField)); } } else { // Field got moved indexDiff = movedTo.Offset - origField.Offset; groupChange.Add(new ChangedField(origField, movedTo)); } if (newField != null) { // Field of the new version might be a new addition newFields[newField.Name] = newField; } } else if (!origField.Equals(newField)) { groupChange.Add(new ChangedField(origField, newField)); } } foreach (var newField in newFields.Values) { bool found = false; for (int i = 0; i < groupChange.Count; i++) { var change = groupChange[i]; if (change is ChangedField && ((ChangedField)change).Changed != null && ((ChangedField)change).Changed.Offset >= newField.Offset) { groupChange.Insert(i, new NewField(newField)); found = true; break; } } if (!found) { groupChange.Add(new NewField(newField)); } } newFields.Clear(); } }