コード例 #1
0
        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--;
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: FieldRenderer.cs プロジェクト: NecroSharper/WCell
        /// <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());
        }
コード例 #4
0
        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());
        }
コード例 #5
0
ファイル: FieldRenderer.cs プロジェクト: NecroSharper/WCell
        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++;
            }
        }