/// <inheritdoc/> /// <remarks>Depending on the options set for this <see cref="AlphaBlockCollection"/>, this method can be very /// heavy-handed in the amount of work it does to maintain consistency of tile entities, lighting, fluid, etc. /// for the affected block and possibly many other indirectly-affected blocks in the collection or neighboring /// collections. If many SetID calls are expected to be made, some of this auto-reconciliation behavior should /// be disabled, and the data should be rebuilt at the <see cref="AlphaBlockCollection"/>-level at the end.</remarks> public void SetID(int x, int y, int z, int id) { int oldid = _blocks[x, y, z]; if (oldid == id) { return; } // Update value _blocks[x, y, z] = id; // Update tile entities BlockInfo info1 = BlockInfo.BlockTable[oldid]; BlockInfo info2 = BlockInfo.BlockTable[id]; BlockInfoEx einfo1 = info1 as BlockInfoEx; BlockInfoEx einfo2 = info2 as BlockInfoEx; if (einfo1 != einfo2) { if (einfo1 != null || !info1.Registered) { ClearTileEntity(x, y, z); } if (einfo2 != null) { CreateTileEntity(x, y, z); } } // Light consistency if (_autoLight) { if (info1.ObscuresLight != info2.ObscuresLight) { _lightManager.UpdateHeightMap(x, y, z); } if (info1.Luminance != info2.Luminance || info1.Opacity != info2.Opacity || info1.TransmitsLight != info2.TransmitsLight) { UpdateBlockLight(x, y, z); } if (info1.Opacity != info2.Opacity || info1.TransmitsLight != info2.TransmitsLight) { UpdateSkyLight(x, y, z); } } // Fluid consistency if (_autoFluid) { if (info1.State == BlockState.FLUID || info2.State == BlockState.FLUID) { UpdateFluid(x, y, z); } } // TileTick consistency if (_autoTick) { if (info1.ID != info2.ID) { ClearTileTick(x, y, z); if (info2.Tick > 0) { SetTileTickValue(x, y, z, info2.Tick); } } } _dirty = true; }
static BlockInfo() { _blockTable = new BlockInfo[MAX_BLOCKS]; _opacityTable = new int[MAX_BLOCKS]; _luminanceTable = new int[MAX_BLOCKS]; _blockTableCache = new CacheTableArray <BlockInfo>(_blockTable); _opacityTableCache = new CacheTableArray <int>(_opacityTable); _luminanceTableCache = new CacheTableArray <int>(_luminanceTable); Air = new BlockInfo(0, "Air").SetOpacity(0).SetState(BlockState.NONSOLID); Stone = new BlockInfo(1, "Stone"); Grass = new BlockInfo(2, "Grass").SetTick(10); Dirt = new BlockInfo(3, "Dirt"); Cobblestone = new BlockInfo(4, "Cobblestone"); WoodPlank = new BlockInfo(5, "Wooden Plank"); Sapling = new BlockInfo(6, "Sapling").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); Bedrock = new BlockInfo(7, "Bedrock"); Water = new BlockInfo(8, "Water").SetOpacity(3).SetState(BlockState.FLUID).SetTick(5); StationaryWater = new BlockInfo(9, "Stationary Water").SetOpacity(3).SetState(BlockState.FLUID); Lava = new BlockInfo(10, "Lava").SetOpacity(0).SetLuminance(MAX_LUMINANCE).SetState(BlockState.FLUID).SetTick(30); StationaryLava = new BlockInfo(11, "Stationary Lava").SetOpacity(0).SetLuminance(MAX_LUMINANCE).SetState(BlockState.FLUID).SetTick(10); Sand = new BlockInfo(12, "Sand").SetTick(3); Gravel = new BlockInfo(13, "Gravel").SetTick(3); GoldOre = new BlockInfo(14, "Gold Ore"); IronOre = new BlockInfo(15, "Iron Ore"); CoalOre = new BlockInfo(16, "Coal Ore"); Wood = new BlockInfo(17, "Wood"); Leaves = new BlockInfo(18, "Leaves").SetOpacity(1).SetTick(10); Sponge = new BlockInfo(19, "Sponge"); Glass = new BlockInfo(20, "Glass").SetOpacity(0); LapisOre = new BlockInfo(21, "Lapis Lazuli Ore"); LapisBlock = new BlockInfo(22, "Lapis Lazuli Block"); Dispenser = (BlockInfoEx) new BlockInfoEx(23, "Dispenser").SetTick(4); Sandstone = new BlockInfo(24, "Sandstone"); NoteBlock = new BlockInfoEx(25, "Note Block"); Bed = new BlockInfo(26, "Bed").SetOpacity(0); PoweredRail = new BlockInfo(27, "Powered Rail").SetOpacity(0).SetState(BlockState.NONSOLID); DetectorRail = new BlockInfo(28, "Detector Rail").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(20); StickyPiston = new BlockInfo(29, "Sticky Piston").SetOpacity(0); Cobweb = new BlockInfo(30, "Cobweb").SetOpacity(0).SetState(BlockState.NONSOLID); TallGrass = new BlockInfo(31, "Tall Grass").SetOpacity(0).SetState(BlockState.NONSOLID); DeadShrub = new BlockInfo(32, "Dead Shrub").SetOpacity(0).SetState(BlockState.NONSOLID); Piston = new BlockInfo(33, "Piston").SetOpacity(0); PistonHead = new BlockInfo(34, "Piston Head").SetOpacity(0); Wool = new BlockInfo(35, "Wool"); PistonMoving = (BlockInfoEx) new BlockInfoEx(36, "Piston Moving").SetOpacity(0); YellowFlower = new BlockInfo(37, "Yellow Flower").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); RedRose = new BlockInfo(38, "Red Rose").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); BrownMushroom = new BlockInfo(39, "Brown Mushroom").SetOpacity(0).SetLuminance(1).SetState(BlockState.NONSOLID).SetTick(10); RedMushroom = new BlockInfo(40, "Red Mushroom").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); GoldBlock = new BlockInfo(41, "Gold Block"); IronBlock = new BlockInfo(42, "Iron Block"); DoubleStoneSlab = new BlockInfo(43, "Double Slab"); StoneSlab = new BlockInfo(44, "Slab").SetOpacity(0); BrickBlock = new BlockInfo(45, "Brick Block"); TNT = new BlockInfo(46, "TNT"); Bookshelf = new BlockInfo(47, "Bookshelf"); MossStone = new BlockInfo(48, "Moss Stone"); Obsidian = new BlockInfo(49, "Obsidian"); Torch = new BlockInfo(50, "Torch").SetOpacity(0).SetLuminance(MAX_LUMINANCE - 1).SetState(BlockState.NONSOLID).SetTick(10); Fire = new BlockInfo(51, "Fire").SetOpacity(0).SetLuminance(MAX_LUMINANCE).SetState(BlockState.NONSOLID).SetTick(40); MonsterSpawner = (BlockInfoEx) new BlockInfoEx(52, "Monster Spawner").SetOpacity(0); WoodStairs = new BlockInfo(53, "Wooden Stairs").SetOpacity(0); Chest = (BlockInfoEx) new BlockInfoEx(54, "Chest").SetOpacity(0); RedstoneWire = new BlockInfo(55, "Redstone Wire").SetOpacity(0).SetState(BlockState.NONSOLID); DiamondOre = new BlockInfo(56, "Diamond Ore"); DiamondBlock = new BlockInfo(57, "Diamond Block"); CraftTable = new BlockInfo(58, "Crafting Table"); Crops = new BlockInfo(59, "Crops").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); Farmland = new BlockInfo(60, "Farmland").SetOpacity(0).SetTick(10); Furnace = new BlockInfoEx(61, "Furnace"); BurningFurnace = (BlockInfoEx) new BlockInfoEx(62, "Burning Furnace").SetLuminance(MAX_LUMINANCE - 1); SignPost = (BlockInfoEx) new BlockInfoEx(63, "Sign Post").SetOpacity(0).SetState(BlockState.NONSOLID); WoodDoor = new BlockInfo(64, "Wooden Door").SetOpacity(0); Ladder = new BlockInfo(65, "Ladder").SetOpacity(0); Rails = new BlockInfo(66, "Rails").SetOpacity(0).SetState(BlockState.NONSOLID); CobbleStairs = new BlockInfo(67, "Cobblestone Stairs").SetOpacity(0); WallSign = (BlockInfoEx) new BlockInfoEx(68, "Wall Sign").SetOpacity(0).SetState(BlockState.NONSOLID); Lever = new BlockInfo(69, "Lever").SetOpacity(0).SetState(BlockState.NONSOLID); StonePlate = new BlockInfo(70, "Stone Pressure Plate").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(20); IronDoor = new BlockInfo(71, "Iron Door").SetOpacity(0); WoodPlate = new BlockInfo(72, "Wooden Pressure Plate").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(20); RedstoneOre = new BlockInfo(73, "Redstone Ore").SetTick(30); GlowRedstoneOre = new BlockInfo(74, "Glowing Redstone Ore").SetLuminance(9).SetTick(30); RedstoneTorch = new BlockInfo(75, "Redstone Torch (Off)").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(2); RedstoneTorchOn = new BlockInfo(76, "Redstone Torch (On)").SetOpacity(0).SetLuminance(7).SetState(BlockState.NONSOLID).SetTick(2); StoneButton = new BlockInfo(77, "Stone Button").SetOpacity(0).SetState(BlockState.NONSOLID); Snow = new BlockInfo(78, "Snow").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); Ice = new BlockInfo(79, "Ice").SetOpacity(3).SetTick(10); SnowBlock = new BlockInfo(80, "Snow Block").SetTick(10); Cactus = new BlockInfo(81, "Cactus").SetOpacity(0).SetTick(10); ClayBlock = new BlockInfo(82, "Clay Block"); SugarCane = new BlockInfo(83, "Sugar Cane").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); Jukebox = new BlockInfo(84, "Jukebox"); Fence = new BlockInfo(85, "Fence").SetOpacity(0); Pumpkin = new BlockInfo(86, "Pumpkin"); Netherrack = new BlockInfo(87, "Netherrack"); SoulSand = new BlockInfo(88, "Soul Sand"); Glowstone = new BlockInfo(89, "Glowstone Block").SetLuminance(MAX_LUMINANCE); Portal = new BlockInfo(90, "Portal").SetOpacity(0).SetLuminance(11).SetState(BlockState.NONSOLID); JackOLantern = new BlockInfo(91, "Jack-O-Lantern").SetLuminance(MAX_LUMINANCE); CakeBlock = new BlockInfo(92, "Cake Block").SetOpacity(0); RedstoneRepeater = new BlockInfo(93, "Redstone Repeater (Off)").SetOpacity(0).SetTick(10); RedstoneRepeaterOn = new BlockInfo(94, "Redstone Repeater (On)").SetOpacity(0).SetLuminance(7).SetTick(10); LockedChest = (BlockInfoEx) new BlockInfoEx(95, "Locked Chest").SetLuminance(MAX_LUMINANCE).SetTick(10); Trapdoor = new BlockInfo(96, "Trapdoor").SetOpacity(0); SilverfishStone = new BlockInfo(97, "Stone with Silverfish"); StoneBrick = new BlockInfo(98, "Stone Brick"); HugeRedMushroom = new BlockInfo(99, "Huge Red Mushroom"); HugeBrownMushroom = new BlockInfo(100, "Huge Brown Mushroom"); IronBars = new BlockInfo(101, "Iron Bars").SetOpacity(0); GlassPane = new BlockInfo(102, "Glass Pane").SetOpacity(0); Melon = new BlockInfo(103, "Melon"); PumpkinStem = new BlockInfo(104, "Pumpkin Stem").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); MelonStem = new BlockInfo(105, "Melon Stem").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); Vines = new BlockInfo(106, "Vines").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); FenceGate = new BlockInfo(107, "Fence Gate").SetOpacity(0); BrickStairs = new BlockInfo(108, "Brick Stairs").SetOpacity(0); StoneBrickStairs = new BlockInfo(109, "Stone Brick Stairs").SetOpacity(0); Mycelium = new BlockInfo(110, "Mycelium").SetTick(10); LillyPad = new BlockInfo(111, "Lilly Pad").SetOpacity(0).SetState(BlockState.NONSOLID); NetherBrick = new BlockInfo(112, "Nether Brick"); NetherBrickFence = new BlockInfo(113, "Nether Brick Fence").SetOpacity(0); NetherBrickStairs = new BlockInfo(114, "Nether Brick Stairs").SetOpacity(0); NetherWart = new BlockInfo(115, "Nether Wart").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); EnchantmentTable = (BlockInfoEx) new BlockInfoEx(116, "Enchantment Table").SetOpacity(0); BrewingStand = (BlockInfoEx) new BlockInfoEx(117, "Brewing Stand").SetOpacity(0); Cauldron = new BlockInfo(118, "Cauldron").SetOpacity(0); EndPortal = (BlockInfoEx) new BlockInfoEx(119, "End Portal").SetOpacity(0).SetLuminance(MAX_LUMINANCE).SetState(BlockState.NONSOLID); EndPortalFrame = new BlockInfo(120, "End Portal Frame").SetLuminance(MAX_LUMINANCE); EndStone = new BlockInfo(121, "End Stone"); DragonEgg = new BlockInfo(122, "Dragon Egg").SetOpacity(0).SetLuminance(1).SetTick(3); RedstoneLampOff = new BlockInfo(123, "Redstone Lamp (Off)").SetTick(2); RedstoneLampOn = new BlockInfo(124, "Redstone Lamp (On)").SetLuminance(15).SetTick(2); DoubleWoodSlab = new BlockInfo(125, "Double Wood Slab"); WoodSlab = new BlockInfo(126, "Wood Slab"); CocoaPlant = new BlockInfo(127, "Cocoa Plant").SetLuminance(2).SetOpacity(0); SandstoneStairs = new BlockInfo(128, "Sandstone Stairs").SetOpacity(0); EmeraldOre = new BlockInfo(129, "Emerald Ore"); EnderChest = (BlockInfoEx) new BlockInfoEx(130, "Ender Chest").SetLuminance(7).SetOpacity(0); TripwireHook = new BlockInfo(131, "Tripwire Hook").SetOpacity(0).SetState(BlockState.NONSOLID); Tripwire = new BlockInfo(132, "Tripwire").SetOpacity(0).SetState(BlockState.NONSOLID); EmeraldBlock = new BlockInfo(133, "Emerald Block"); SpruceWoodStairs = new BlockInfo(134, "Sprice Wood Stairs").SetOpacity(0); BirchWoodStairs = new BlockInfo(135, "Birch Wood Stairs").SetOpacity(0); JungleWoodStairs = new BlockInfo(136, "Jungle Wood Stairs").SetOpacity(0); CommandBlock = (BlockInfoEx) new BlockInfoEx(137, "Command Block"); BeaconBlock = (BlockInfoEx) new BlockInfoEx(138, "Beacon Block").SetOpacity(0).SetLuminance(MAX_LUMINANCE); CobblestoneWall = new BlockInfo(139, "Cobblestone Wall").SetOpacity(0); FlowerPot = new BlockInfo(140, "Flower Pot").SetOpacity(0); Carrots = new BlockInfo(141, "Carrots").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); Potatoes = new BlockInfo(142, "Potatoes").SetOpacity(0).SetState(BlockState.NONSOLID).SetTick(10); WoodButton = new BlockInfo(143, "Wooden Button").SetOpacity(0).SetState(BlockState.NONSOLID); Heads = new BlockInfo(144, "Heads").SetOpacity(0); for (int i = 0; i < MAX_BLOCKS; i++) { if (_blockTable[i] == null) { _blockTable[i] = new BlockInfo(i); } } // Override default light transmission rules Lava.SetLightTransmission(false); StationaryLava.SetLightTransmission(false); StoneSlab.SetLightTransmission(false); WoodStairs.SetLightTransmission(false); Farmland.SetLightTransmission(false); CobbleStairs.SetLightTransmission(false); BrickStairs.SetLightTransmission(false); StoneBrickStairs.SetLightTransmission(false); NetherBrickStairs.SetLightTransmission(false); WoodSlab.SetLightTransmission(false); SandstoneStairs.SetLightTransmission(false); SpruceWoodStairs.SetLightTransmission(false); BirchWoodStairs.SetLightTransmission(false); JungleWoodStairs.SetLightTransmission(false); // Override default fluid blocking rules SignPost.SetBlocksFluid(true); WallSign.SetBlocksFluid(true); Cactus.SetBlocksFluid(false); // Set Tile Entity Data Dispenser.SetTileEntity("Trap"); NoteBlock.SetTileEntity("Music"); PistonMoving.SetTileEntity("Piston"); MonsterSpawner.SetTileEntity("MobSpawner"); Chest.SetTileEntity("Chest"); Furnace.SetTileEntity("Furnace"); BurningFurnace.SetTileEntity("Furnace"); SignPost.SetTileEntity("Sign"); WallSign.SetTileEntity("Sign"); EnchantmentTable.SetTileEntity("EnchantTable"); BrewingStand.SetTileEntity("Cauldron"); EndPortal.SetTileEntity("Airportal"); EnderChest.SetTileEntity("EnderChest"); CommandBlock.SetTileEntity("Control"); BeaconBlock.SetTileEntity("Beacon"); // Set Data Limits Wood.SetDataLimits(0, 2, 0); Leaves.SetDataLimits(0, 2, 0); Jukebox.SetDataLimits(0, 2, 0); Sapling.SetDataLimits(0, 15, 0); Cactus.SetDataLimits(0, 15, 0); SugarCane.SetDataLimits(0, 15, 0); Water.SetDataLimits(0, 7, 0x8); Lava.SetDataLimits(0, 7, 0x8); TallGrass.SetDataLimits(0, 2, 0); Crops.SetDataLimits(0, 7, 0); PoweredRail.SetDataLimits(0, 5, 0x8); DetectorRail.SetDataLimits(0, 5, 0x8); StickyPiston.SetDataLimits(1, 5, 0x8); Piston.SetDataLimits(1, 5, 0x8); PistonHead.SetDataLimits(1, 5, 0x8); Wool.SetDataLimits(0, 15, 0); Torch.SetDataLimits(1, 5, 0); RedstoneTorch.SetDataLimits(0, 5, 0); RedstoneTorchOn.SetDataLimits(0, 5, 0); Rails.SetDataLimits(0, 9, 0); Ladder.SetDataLimits(2, 5, 0); WoodStairs.SetDataLimits(0, 3, 0x4); CobbleStairs.SetDataLimits(0, 3, 0x4); Lever.SetDataLimits(0, 6, 0x8); WoodDoor.SetDataLimits(0, 3, 0xC); IronDoor.SetDataLimits(0, 3, 0xC); StoneButton.SetDataLimits(1, 4, 0x8); Snow.SetDataLimits(0, 7, 0); SignPost.SetDataLimits(0, 15, 0); WallSign.SetDataLimits(2, 5, 0); Furnace.SetDataLimits(2, 5, 0); BurningFurnace.SetDataLimits(2, 5, 0); Dispenser.SetDataLimits(2, 5, 0); Pumpkin.SetDataLimits(0, 3, 0); JackOLantern.SetDataLimits(0, 3, 0); StonePlate.SetDataLimits(0, 0, 0x1); WoodPlate.SetDataLimits(0, 0, 0x1); StoneSlab.SetDataLimits(0, 5, 0); DoubleStoneSlab.SetDataLimits(0, 5, 0x8); Cactus.SetDataLimits(0, 5, 0); Bed.SetDataLimits(0, 3, 0x8); RedstoneRepeater.SetDataLimits(0, 0, 0xF); RedstoneRepeaterOn.SetDataLimits(0, 0, 0xF); Trapdoor.SetDataLimits(0, 3, 0x4); StoneBrick.SetDataLimits(0, 2, 0); HugeRedMushroom.SetDataLimits(0, 10, 0); HugeBrownMushroom.SetDataLimits(0, 10, 0); Vines.SetDataLimits(0, 0, 0xF); FenceGate.SetDataLimits(0, 3, 0x4); SilverfishStone.SetDataLimits(0, 2, 0); BrewingStand.SetDataLimits(0, 0, 0x7); Cauldron.SetDataLimits(0, 3, 0); EndPortalFrame.SetDataLimits(0, 0, 0x7); WoodSlab.SetDataLimits(0, 5, 0); DoubleWoodSlab.SetDataLimits(0, 5, 0x8); TripwireHook.SetDataLimits(0, 3, 0xC); Tripwire.SetDataLimits(0, 0, 0x5); }