/// <summary> /// Get the id of the block in this transaction. Returns <see langword="null"/> if not found. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <returns></returns> public NamespacedBlock GetBlock(int x, int y, int z) { var sec = y >> 4; if (_blocks[sec] == null) { return(null); } return(_palette[sec][_blocks[sec][LowLevelChunk.GetBlockIndexByCoord(x, y, z)]]); }
/// <summary> /// Get the id of the block in this transaction. Returns -1 if not found. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <returns></returns> public int GetBlockId(int x, int y, int z) { var sec = y >> 4; if (_blocks[sec] == null) { return(-1); } return(_blocks[sec][LowLevelChunk.GetBlockIndexByCoord(x, y, z)]); }
/// <summary> /// Set a block by its id in the palette. /// See <see cref="FindOrCreate"/> for the id. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <param name="paletteId"></param> public void SetBlock(int x, int y, int z, ushort paletteId) { if (IsAbandoned) { throw new InvalidOperationException(); } var sec = y >> 4; EnsureSection(sec); _blocks[sec][LowLevelChunk.GetBlockIndexByCoord(x, y, z)] = paletteId; ModifiedSection(sec); Modified(); }
/// <summary> /// Set a block. /// For an efficient way to set multiple blocks, see other overloads. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <param name="block"></param> public void SetBlock(int x, int y, int z, NamespacedBlock block) { if (IsAbandoned) { throw new InvalidOperationException(); } var sec = y >> 4; var inArrayIndex = LowLevelChunk.GetBlockIndexByCoord(x, y, z); EnsureSection(sec); var index = FindOrCreateInternal(sec, block); _paletteCountUse[sec][_blocks[sec][inArrayIndex]]--; _paletteCountUse[sec][index]++; _blocks[sec][inArrayIndex] = unchecked ((ushort)index); ModifiedSection(sec); Modified(); }
public void SetBlock(ICollection <ChangeBlockRequest> requests, IList <NamespacedBlock> customPalette) { if (IsAbandoned) { throw new InvalidOperationException(); } var paletteMapping = new int[customPalette.Count]; foreach (var grp in requests.GroupBy(req => req.Y >> 4)) { EnsureSection(grp.Key); var blocks = _blocks[grp.Key]; var blockChanges = grp.ToArray(); foreach (var rq in blockChanges) { paletteMapping[rq.InListIndex] = FindOrCreateInternal(grp.Key, customPalette[rq.InListIndex]); } var paletteCount = _paletteCountUse[grp.Key]; foreach (var rq in blockChanges) { var mappedId = paletteMapping[rq.InListIndex]; var inArrayId = LowLevelChunk.GetBlockIndexByCoord(rq.X, rq.Y, rq.Z); paletteCount[blocks[inArrayId]]--; paletteCount[mappedId]++; blocks[inArrayId] = (ushort)mappedId; } ModifiedSection(grp.Key); } Modified(); }