public void Dump(string indent, IndentTextWriter writer) { writer.WriteLine(indent + "UpdateBlock: " + EntityId + " (FieldCount: " + UpdateCount + ")"); writer.IndentLevel++; writer.WriteLine(indent + "Type: " + Type); if (m_movement != null) { writer.WriteLine(); writer.WriteLine(indent + "Movement:"); m_movement.Dump(indent + "\t", writer); } writer.WriteLine(); if (EntityIds != null) { writer.WriteLine(); writer.WriteLine(indent + "EntityIds:"); foreach (var id in EntityIds) { writer.WriteLine(indent + "\t" + id); } } if (Values != null) { writer.WriteLine(indent + "Fields:"); var renderer = FieldRenderUtil.GetRenderer(EntityId.ObjectType); // use the exact if its available if (m_movement != null) { renderer = FieldRenderUtil.GetRenderer(m_movement.ObjectTypeId); // } writer.IndentLevel++; uint size = 0; for (uint i = 0; i < SetIndices.Length; i++) { var index = SetIndices[i]; size = renderer.Render(index, Values, writer); while (size > 1 && SetIndices.Length > i + 1) { // check if we can skip the next indices var next = SetIndices[i + 1]; if (next != index + 4) { break; } size--; i++; } } writer.IndentLevel--; } writer.WriteLine(); writer.IndentLevel--; }
public FieldRenderInfo(object field, UpdateFieldType type) { Field = field; Type = type; Name = FieldRenderUtil.GetFriendlyName(field); FieldRenderUtil.CustomRenderers.TryGetValue(field, out Renderer); if (Renderer == null) { Renderer = FieldRenderUtil.TypeRenderers[(int)Type]; } Index = Convert.ToUInt32(field); }
/// <summary> /// Returns a string representation of the given field in the given block /// </summary> public static string Render(ExtendedUpdateFieldId fieldId, UpdateBlock block) { var renderer = FieldRenderUtil.GetRenderer(fieldId.ObjectType); uint fieldNum = (uint)fieldId.RawId; var field = renderer.Fields.Get(fieldNum); if (field != null) { string strVal; field.Renderer(field, block.Values, out strVal); return(strVal); } return(block.Values.GetUInt32(fieldNum).ToString()); }
internal byte[] ReadMask(uint blockCount, uint valueSize, string name, Action <uint, byte[]> parser) { var bitFields = new uint[blockCount][]; var totalCount = 0; for (var j = 0; j < blockCount; j++) { var mask = ReadUIntAmount(valueSize); bitFields[j] = Utility.GetSetIndices(mask); totalCount += bitFields[j].Length; } var fieldCount = 8 * valueSize; var blockSize = fieldCount * valueSize; // a block has 8 * valueSize fields and each field has again valueSize bytes var values = new byte[blockSize * bitFields.Length]; for (uint j = 0; j < blockCount; j++) { var bitField = bitFields[j]; for (uint k = 0; k < bitField.Length; k++) { var bit = bitField[k]; var index = j * blockSize + (bit * valueSize); try { parser(index, values); } catch (Exception e) { var field = index / valueSize; var msg = string.Format("Unable to parse {0} of UpdateBlock at index {1} ({7})\n\tBlocks: {2}/{3}\n\tField: {4} ({5}/{6})", name, index, j + 1, blockCount, bit, k + 1, bitField.Length, FieldRenderUtil.GetFriendlyName(ObjectType, field)); LogUtil.ErrorException(e, msg); return(values.ToArray()); } } } return(values.ToArray()); }
public FieldRenderer(ObjectTypeId enumType) { EnumType = enumType; var fields = FieldRenderUtil.GetValues(enumType); Fields = new FieldRenderInfo[fields.Length]; uint i = 0; var fieldDefs = UpdateFieldMgr.Get(enumType); foreach (var e in fields) { var fieldDef = fieldDefs.Fields.Get((uint)((int)e)); UpdateFieldType type = fieldDef == null ? UpdateFieldType.UInt32 : fieldDef.Type; Fields[i] = new FieldRenderInfo(e, type); i++; } }