From e53de234d714629c4b3c7876c26c0b0cf2778909 Mon Sep 17 00:00:00 2001 From: Grahmindol Date: Sun, 9 Aug 2026 00:10:05 +0200 Subject: [PATCH 01/38] added section padding --- .../resources/opencomputers.core.mixins.json | 12 + src/main/scala/li/cil/oc/CreativeTab.scala | 4 +- .../li/cil/oc/common/init/OCBlocks.scala | 100 ++--- .../scala/li/cil/oc/common/init/OCItems.scala | 379 ++++++++++-------- .../cil/oc/mixin/CreativeModeTabMixin.scala | 29 ++ .../templates/META-INF/neoforge.mods.toml | 3 + 6 files changed, 304 insertions(+), 223 deletions(-) create mode 100644 src/main/resources/opencomputers.core.mixins.json create mode 100644 src/main/scala/li/cil/oc/mixin/CreativeModeTabMixin.scala diff --git a/src/main/resources/opencomputers.core.mixins.json b/src/main/resources/opencomputers.core.mixins.json new file mode 100644 index 0000000000..8c7c3b722d --- /dev/null +++ b/src/main/resources/opencomputers.core.mixins.json @@ -0,0 +1,12 @@ +{ + "required": false, + "minVersion": "0.8", + "package": "li.cil.oc.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "CreativeModeTabMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/scala/li/cil/oc/CreativeTab.scala b/src/main/scala/li/cil/oc/CreativeTab.scala index 78b7c6c465..2bdf21be98 100644 --- a/src/main/scala/li/cil/oc/CreativeTab.scala +++ b/src/main/scala/li/cil/oc/CreativeTab.scala @@ -24,8 +24,8 @@ object CreativeTab { @SubscribeEvent def onBuildContents(event: BuildCreativeModeTabContentsEvent): Unit = { if (event.getTabKey == MAIN.getKey) { - OCItems.decorateCreativeTab(event, ModOpenComputers.hasRedstoneCardT2) - OpenPrinter.addCreativeItems(event) + //OCItems.decorateCreativeTab(event, ModOpenComputers.hasRedstoneCardT2) + //OpenPrinter.addCreativeItems(event) } else if (event.getTabKey == CreativeModeTabs.TOOLS_AND_UTILITIES) { event.accept(OCItems.createChargedHoverBoots()) } diff --git a/src/main/scala/li/cil/oc/common/init/OCBlocks.scala b/src/main/scala/li/cil/oc/common/init/OCBlocks.scala index 34cf6e869c..18b7e947a0 100644 --- a/src/main/scala/li/cil/oc/common/init/OCBlocks.scala +++ b/src/main/scala/li/cil/oc/common/init/OCBlocks.scala @@ -18,66 +18,66 @@ object OCBlocks { private def defaultItemProps = new Item.Properties() - val Adapter: DeferredBlock[Adapter] = BLOCKS.register(Constants.BlockName.Adapter, () => Items.registerBlock(new Adapter(defaultProps), Constants.BlockName.Adapter, defaultItemProps)) - val Assembler: DeferredBlock[Assembler] = BLOCKS.register(Constants.BlockName.Assembler, () => Items.registerBlock(new Assembler(defaultProps), Constants.BlockName.Assembler, defaultItemProps)) - val Cable: DeferredBlock[Cable] = BLOCKS.register(Constants.BlockName.Cable, () => Items.registerBlock(new Cable(defaultProps), Constants.BlockName.Cable, defaultItemProps)) - val Capacitor: DeferredBlock[Capacitor] = BLOCKS.register(Constants.BlockName.Capacitor, () => Items.registerBlock(new Capacitor(defaultProps), Constants.BlockName.Capacitor, defaultItemProps)) - val CaseTier1: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseTier1, () => Items.registerBlock(new Case(defaultProps, Tier.One), Constants.BlockName.CaseTier1, defaultItemProps)) - val CaseTier2: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseTier2, () => Items.registerBlock(new Case(defaultProps, Tier.Two), Constants.BlockName.CaseTier2, defaultItemProps.rarity(Rarity.UNCOMMON))) - val CaseTier3: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseTier3, () => Items.registerBlock(new Case(defaultProps, Tier.Three), Constants.BlockName.CaseTier3, defaultItemProps.rarity(Rarity.RARE))) - val CaseTier4: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseTier4, () => Items.registerBlock(new Case(defaultProps, Tier.Four), Constants.BlockName.CaseTier4, defaultItemProps.rarity(OCRarity.LEGENDARY))) - val ChameliumBlock: DeferredBlock[ChameliumBlock] = BLOCKS.register(Constants.BlockName.ChameliumBlock, () => Items.registerBlock(new ChameliumBlock(Properties.of().mapColor(MapColor.STONE).strength(2, 5)), Constants.BlockName.ChameliumBlock, defaultItemProps)) - val Charger: DeferredBlock[Charger] = BLOCKS.register(Constants.BlockName.Charger, () => Items.registerBlock(new Charger(defaultProps), Constants.BlockName.Charger, defaultItemProps)) - val Disassembler: DeferredBlock[Disassembler] = BLOCKS.register(Constants.BlockName.Disassembler, () => Items.registerBlock(new Disassembler(defaultProps), Constants.BlockName.Disassembler, defaultItemProps)) - val DiskDrive: DeferredBlock[DiskDrive] = BLOCKS.register(Constants.BlockName.DiskDrive, () => Items.registerBlock(new DiskDrive(defaultProps), Constants.BlockName.DiskDrive, defaultItemProps)) - val Geolyzer: DeferredBlock[Geolyzer] = BLOCKS.register(Constants.BlockName.Geolyzer, () => Items.registerBlock(new Geolyzer(defaultProps), Constants.BlockName.Geolyzer, defaultItemProps)) - val HologramTier1: DeferredBlock[Hologram] = BLOCKS.register(Constants.BlockName.HologramTier1, () => Items.registerBlock(new Hologram(defaultProps, Tier.One), Constants.BlockName.HologramTier1, defaultItemProps)) - val HologramTier2: DeferredBlock[Hologram] = BLOCKS.register(Constants.BlockName.HologramTier2, () => Items.registerBlock(new Hologram(defaultProps, Tier.Two), Constants.BlockName.HologramTier2, defaultItemProps.rarity(Rarity.UNCOMMON))) - val HologramTier3: DeferredBlock[Hologram] = BLOCKS.register(Constants.BlockName.HologramTier3, () => Items.registerBlock(new Hologram(defaultProps, Tier.Three), Constants.BlockName.HologramTier3, defaultItemProps.rarity(Rarity.RARE))) - val HoloScreenTier1: DeferredBlock[HoloScreen] = BLOCKS.register(Constants.BlockName.HoloScreenTier1, () => Items.registerBlock(new HoloScreen(defaultProps.noOcclusion, Tier.One), Constants.BlockName.HoloScreenTier1, defaultItemProps)) - val HoloScreenTier2: DeferredBlock[HoloScreen] = BLOCKS.register(Constants.BlockName.HoloScreenTier2, () => Items.registerBlock(new HoloScreen(defaultProps.noOcclusion, Tier.Two), Constants.BlockName.HoloScreenTier2, defaultItemProps.rarity(Rarity.UNCOMMON))) - val HoloScreenTier3: DeferredBlock[HoloScreen] = BLOCKS.register(Constants.BlockName.HoloScreenTier3, () => Items.registerBlock(new HoloScreen(defaultProps.noOcclusion, Tier.Three), Constants.BlockName.HoloScreenTier3, defaultItemProps.rarity(Rarity.RARE))) - val HoloScreenTier4: DeferredBlock[HoloScreen] = BLOCKS.register(Constants.BlockName.HoloScreenTier4, () => Items.registerBlock(new HoloScreen(defaultProps.noOcclusion, Tier.Four), Constants.BlockName.HoloScreenTier4, defaultItemProps.rarity(OCRarity.LEGENDARY))) - val Keyboard: DeferredBlock[Keyboard] = BLOCKS.register(Constants.BlockName.Keyboard, () => Items.registerBlock(new Keyboard(Properties.of().mapColor(MapColor.STONE).strength(2, 5).noOcclusion), Constants.BlockName.Keyboard, defaultItemProps)) - val MotionSensor: DeferredBlock[MotionSensor] = BLOCKS.register(Constants.BlockName.MotionSensor, () => Items.registerBlock(new MotionSensor(defaultProps), Constants.BlockName.MotionSensor, defaultItemProps)) - val PowerConverter: DeferredBlock[PowerConverter] = BLOCKS.register(Constants.BlockName.PowerConverter, () => Items.registerBlock(new PowerConverter(defaultProps), Constants.BlockName.PowerConverter, defaultItemProps)) - val PowerDistributor: DeferredBlock[PowerDistributor] = BLOCKS.register(Constants.BlockName.PowerDistributor, () => Items.registerBlock(new PowerDistributor(defaultProps), Constants.BlockName.PowerDistributor, defaultItemProps)) - val Printer: DeferredBlock[Printer] = BLOCKS.register(Constants.BlockName.Printer, () => Items.registerBlock(new Printer(defaultProps), Constants.BlockName.Printer, defaultItemProps)) - val Raid: DeferredBlock[Raid] = BLOCKS.register(Constants.BlockName.Raid, () => Items.registerBlock(new Raid(defaultProps), Constants.BlockName.Raid, defaultItemProps)) - val Redstone: DeferredBlock[Redstone] = BLOCKS.register(Constants.BlockName.Redstone, () => Items.registerBlock(new Redstone(defaultProps), Constants.BlockName.Redstone, defaultItemProps)) - val Relay: DeferredBlock[Relay] = BLOCKS.register(Constants.BlockName.Relay, () => Items.registerBlock(new Relay(defaultProps), Constants.BlockName.Relay, defaultItemProps)) - val ScreenTier1: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier1, () => Items.registerBlock(new Screen(defaultProps, Tier.One), Constants.BlockName.ScreenTier1, defaultItemProps)) - val ScreenTier2: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier2, () => Items.registerBlock(new Screen(defaultProps, Tier.Two), Constants.BlockName.ScreenTier2, defaultItemProps.rarity(Rarity.UNCOMMON))) - val ScreenTier3: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier3, () => Items.registerBlock(new Screen(defaultProps, Tier.Three), Constants.BlockName.ScreenTier3, defaultItemProps.rarity(Rarity.RARE))) - val ScreenTier4: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier4, () => Items.registerBlock(new Screen(defaultProps, Tier.Four), Constants.BlockName.ScreenTier4, defaultItemProps.rarity(OCRarity.LEGENDARY))) - val FlatScreenBackTier1: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenBackTier1, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.One, true), Constants.BlockName.FlatScreenBackTier1, defaultItemProps)) - val FlatScreenBackTier2: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenBackTier2, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Two, true), Constants.BlockName.FlatScreenBackTier2, defaultItemProps.rarity(Rarity.UNCOMMON))) - val FlatScreenBackTier3: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenBackTier3, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Three, true), Constants.BlockName.FlatScreenBackTier3, defaultItemProps.rarity(Rarity.RARE))) - val FlatScreenBackTier4: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenBackTier4, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Four, true), Constants.BlockName.FlatScreenBackTier4, defaultItemProps.rarity(OCRarity.LEGENDARY))) - val FlatScreenFrontTier1: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenFrontTier1, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.One, false), Constants.BlockName.FlatScreenFrontTier1, defaultItemProps)) - val FlatScreenFrontTier2: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenFrontTier2, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Two, false), Constants.BlockName.FlatScreenFrontTier2, defaultItemProps.rarity(Rarity.UNCOMMON))) - val FlatScreenFrontTier3: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenFrontTier3, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Three, false), Constants.BlockName.FlatScreenFrontTier3, defaultItemProps.rarity(Rarity.RARE))) - val FlatScreenFrontTier4: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenFrontTier4, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Four, false), Constants.BlockName.FlatScreenFrontTier4, defaultItemProps.rarity(OCRarity.LEGENDARY))) - val Rack: DeferredBlock[Rack] = BLOCKS.register(Constants.BlockName.Rack, () => Items.registerBlock(new Rack(defaultProps), Constants.BlockName.Rack, defaultItemProps)) - val Waypoint: DeferredBlock[Waypoint] = BLOCKS.register(Constants.BlockName.Waypoint, () => Items.registerBlock(new Waypoint(defaultProps), Constants.BlockName.Waypoint, defaultItemProps)) + val Adapter: DeferredBlock[Adapter] = BLOCKS.register(Constants.BlockName.Adapter, () => Items.registerBlock(new Adapter(defaultProps), Constants.BlockName.Adapter, defaultItemProps,"25_components")) + val Assembler: DeferredBlock[Assembler] = BLOCKS.register(Constants.BlockName.Assembler, () => Items.registerBlock(new Assembler(defaultProps), Constants.BlockName.Assembler, defaultItemProps,"49_tools")) + val Cable: DeferredBlock[Cable] = BLOCKS.register(Constants.BlockName.Cable, () => Items.registerBlock(new Cable(defaultProps), Constants.BlockName.Cable, defaultItemProps,"10_networking")) + val Capacitor: DeferredBlock[Capacitor] = BLOCKS.register(Constants.BlockName.Capacitor, () => Items.registerBlock(new Capacitor(defaultProps), Constants.BlockName.Capacitor, defaultItemProps,"10_networking")) + val CaseTier1: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseTier1, () => Items.registerBlock(new Case(defaultProps, Tier.One), Constants.BlockName.CaseTier1, defaultItemProps,"25_components")) + val CaseTier2: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseTier2, () => Items.registerBlock(new Case(defaultProps, Tier.Two), Constants.BlockName.CaseTier2, defaultItemProps.rarity(Rarity.UNCOMMON),"25_components")) + val CaseTier3: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseTier3, () => Items.registerBlock(new Case(defaultProps, Tier.Three), Constants.BlockName.CaseTier3, defaultItemProps.rarity(Rarity.RARE),"25_components")) + val CaseTier4: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseTier4, () => Items.registerBlock(new Case(defaultProps, Tier.Four), Constants.BlockName.CaseTier4, defaultItemProps.rarity(OCRarity.LEGENDARY),"25_components")) + val CaseCreative: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseCreative, () => Items.registerBlock(new Case(defaultProps, Tier.Five), Constants.BlockName.CaseCreative, defaultItemProps.rarity(Rarity.EPIC),"25_components")) + val ChameliumBlock: DeferredBlock[ChameliumBlock] = BLOCKS.register(Constants.BlockName.ChameliumBlock, () => Items.registerBlock(new ChameliumBlock(Properties.of().mapColor(MapColor.STONE).strength(2, 5)), Constants.BlockName.ChameliumBlock, defaultItemProps,"50_materials")) + val Charger: DeferredBlock[Charger] = BLOCKS.register(Constants.BlockName.Charger, () => Items.registerBlock(new Charger(defaultProps), Constants.BlockName.Charger, defaultItemProps,"10_networking")) + val Disassembler: DeferredBlock[Disassembler] = BLOCKS.register(Constants.BlockName.Disassembler, () => Items.registerBlock(new Disassembler(defaultProps), Constants.BlockName.Disassembler, defaultItemProps,"49_tools")) + val DiskDrive: DeferredBlock[DiskDrive] = BLOCKS.register(Constants.BlockName.DiskDrive, () => Items.registerBlock(new DiskDrive(defaultProps), Constants.BlockName.DiskDrive, defaultItemProps,"25_components")) + val Geolyzer: DeferredBlock[Geolyzer] = BLOCKS.register(Constants.BlockName.Geolyzer, () => Items.registerBlock(new Geolyzer(defaultProps), Constants.BlockName.Geolyzer, defaultItemProps,"25_components")) + val HologramTier1: DeferredBlock[Hologram] = BLOCKS.register(Constants.BlockName.HologramTier1, () => Items.registerBlock(new Hologram(defaultProps, Tier.One), Constants.BlockName.HologramTier1, defaultItemProps,"25_components")) + val HologramTier2: DeferredBlock[Hologram] = BLOCKS.register(Constants.BlockName.HologramTier2, () => Items.registerBlock(new Hologram(defaultProps, Tier.Two), Constants.BlockName.HologramTier2, defaultItemProps.rarity(Rarity.UNCOMMON),"25_components")) + val HologramTier3: DeferredBlock[Hologram] = BLOCKS.register(Constants.BlockName.HologramTier3, () => Items.registerBlock(new Hologram(defaultProps, Tier.Three), Constants.BlockName.HologramTier3, defaultItemProps.rarity(Rarity.RARE),"25_components")) + val HoloScreenTier1: DeferredBlock[HoloScreen] = BLOCKS.register(Constants.BlockName.HoloScreenTier1, () => Items.registerBlock(new HoloScreen(defaultProps.noOcclusion, Tier.One), Constants.BlockName.HoloScreenTier1, defaultItemProps,"25_components")) + val HoloScreenTier2: DeferredBlock[HoloScreen] = BLOCKS.register(Constants.BlockName.HoloScreenTier2, () => Items.registerBlock(new HoloScreen(defaultProps.noOcclusion, Tier.Two), Constants.BlockName.HoloScreenTier2, defaultItemProps.rarity(Rarity.UNCOMMON),"25_components")) + val HoloScreenTier3: DeferredBlock[HoloScreen] = BLOCKS.register(Constants.BlockName.HoloScreenTier3, () => Items.registerBlock(new HoloScreen(defaultProps.noOcclusion, Tier.Three), Constants.BlockName.HoloScreenTier3, defaultItemProps.rarity(Rarity.RARE),"25_components")) + val HoloScreenTier4: DeferredBlock[HoloScreen] = BLOCKS.register(Constants.BlockName.HoloScreenTier4, () => Items.registerBlock(new HoloScreen(defaultProps.noOcclusion, Tier.Four), Constants.BlockName.HoloScreenTier4, defaultItemProps.rarity(OCRarity.LEGENDARY),"25_components")) + val Keyboard: DeferredBlock[Keyboard] = BLOCKS.register(Constants.BlockName.Keyboard, () => Items.registerBlock(new Keyboard(Properties.of().mapColor(MapColor.STONE).strength(2, 5).noOcclusion), Constants.BlockName.Keyboard, defaultItemProps,"25_components")) + val MotionSensor: DeferredBlock[MotionSensor] = BLOCKS.register(Constants.BlockName.MotionSensor, () => Items.registerBlock(new MotionSensor(defaultProps), Constants.BlockName.MotionSensor, defaultItemProps,"25_components")) + val PowerConverter: DeferredBlock[PowerConverter] = BLOCKS.register(Constants.BlockName.PowerConverter, () => Items.registerBlock(new PowerConverter(defaultProps), Constants.BlockName.PowerConverter, defaultItemProps,"10_networking")) + val PowerDistributor: DeferredBlock[PowerDistributor] = BLOCKS.register(Constants.BlockName.PowerDistributor, () => Items.registerBlock(new PowerDistributor(defaultProps), Constants.BlockName.PowerDistributor, defaultItemProps,"10_networking")) + val Printer: DeferredBlock[Printer] = BLOCKS.register(Constants.BlockName.Printer, () => Items.registerBlock(new Printer(defaultProps), Constants.BlockName.Printer, defaultItemProps,"25_components")) + val Raid: DeferredBlock[Raid] = BLOCKS.register(Constants.BlockName.Raid, () => Items.registerBlock(new Raid(defaultProps), Constants.BlockName.Raid, defaultItemProps,"25_components")) + val Redstone: DeferredBlock[Redstone] = BLOCKS.register(Constants.BlockName.Redstone, () => Items.registerBlock(new Redstone(defaultProps), Constants.BlockName.Redstone, defaultItemProps,"25_components")) + val Relay: DeferredBlock[Relay] = BLOCKS.register(Constants.BlockName.Relay, () => Items.registerBlock(new Relay(defaultProps), Constants.BlockName.Relay, defaultItemProps,"25_components")) + val ScreenTier1: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier1, () => Items.registerBlock(new Screen(defaultProps, Tier.One), Constants.BlockName.ScreenTier1, defaultItemProps,"25_components")) + val ScreenTier2: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier2, () => Items.registerBlock(new Screen(defaultProps, Tier.Two), Constants.BlockName.ScreenTier2, defaultItemProps.rarity(Rarity.UNCOMMON),"25_components")) + val ScreenTier3: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier3, () => Items.registerBlock(new Screen(defaultProps, Tier.Three), Constants.BlockName.ScreenTier3, defaultItemProps.rarity(Rarity.RARE),"25_components")) + val ScreenTier4: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier4, () => Items.registerBlock(new Screen(defaultProps, Tier.Four), Constants.BlockName.ScreenTier4, defaultItemProps.rarity(OCRarity.LEGENDARY),"25_components")) + val FlatScreenBackTier1: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenBackTier1, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.One, true), Constants.BlockName.FlatScreenBackTier1, defaultItemProps,"25_components")) + val FlatScreenBackTier2: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenBackTier2, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Two, true), Constants.BlockName.FlatScreenBackTier2, defaultItemProps.rarity(Rarity.UNCOMMON),"25_components")) + val FlatScreenBackTier3: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenBackTier3, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Three, true), Constants.BlockName.FlatScreenBackTier3, defaultItemProps.rarity(Rarity.RARE),"25_components")) + val FlatScreenBackTier4: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenBackTier4, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Four, true), Constants.BlockName.FlatScreenBackTier4, defaultItemProps.rarity(OCRarity.LEGENDARY),"25_components")) + val FlatScreenFrontTier1: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenFrontTier1, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.One, false), Constants.BlockName.FlatScreenFrontTier1, defaultItemProps,"25_components")) + val FlatScreenFrontTier2: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenFrontTier2, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Two, false), Constants.BlockName.FlatScreenFrontTier2, defaultItemProps.rarity(Rarity.UNCOMMON),"25_components")) + val FlatScreenFrontTier3: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenFrontTier3, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Three, false), Constants.BlockName.FlatScreenFrontTier3, defaultItemProps.rarity(Rarity.RARE),"25_components")) + val FlatScreenFrontTier4: DeferredBlock[FlatScreen] = BLOCKS.register(Constants.BlockName.FlatScreenFrontTier4, () => Items.registerBlock(new FlatScreen(defaultProps.noOcclusion, Tier.Four, false), Constants.BlockName.FlatScreenFrontTier4, defaultItemProps.rarity(OCRarity.LEGENDARY),"25_components")) + val Rack: DeferredBlock[Rack] = BLOCKS.register(Constants.BlockName.Rack, () => Items.registerBlock(new Rack(defaultProps), Constants.BlockName.Rack, defaultItemProps,"10_networking")) + val Waypoint: DeferredBlock[Waypoint] = BLOCKS.register(Constants.BlockName.Waypoint, () => Items.registerBlock(new Waypoint(defaultProps), Constants.BlockName.Waypoint, defaultItemProps,"25_components")) - val CaseCreative: DeferredBlock[Case] = BLOCKS.register(Constants.BlockName.CaseCreative, () => Items.registerBlock(new Case(defaultProps, Tier.Five), Constants.BlockName.CaseCreative, defaultItemProps.rarity(Rarity.EPIC))) - val Microcontroller: DeferredBlock[Microcontroller] = BLOCKS.register(Constants.BlockName.Microcontroller, () => Items.registerBlock(new Microcontroller(defaultProps), Constants.BlockName.Microcontroller, new Item.Properties())) - val Print: DeferredBlock[Print] = BLOCKS.register(Constants.BlockName.Print, () => Items.registerBlock(new Print(Properties.of().mapColor(MapColor.METAL).strength(1, 5).noOcclusion.dynamicShape), Constants.BlockName.Print, new Item.Properties())) + val Microcontroller: DeferredBlock[Microcontroller] = BLOCKS.register(Constants.BlockName.Microcontroller, () => Items.registerBlock(new Microcontroller(defaultProps), Constants.BlockName.Microcontroller, new Item.Properties(),"25_components")) + val Print: DeferredBlock[Print] = BLOCKS.register(Constants.BlockName.Print, () => Items.registerBlock(new Print(Properties.of().mapColor(MapColor.METAL).strength(1, 5).noOcclusion.dynamicShape), Constants.BlockName.Print, new Item.Properties(),"25_components")) val RobotAfterimage: DeferredBlock[RobotAfterimage] = BLOCKS.register(Constants.BlockName.RobotAfterimage, () => Items.registerBlockOnly(new RobotAfterimage(Properties.of().mapColor(MapColor.NONE).noCollission.instabreak.noOcclusion.dynamicShape), Constants.BlockName.RobotAfterimage)) - val Robot: DeferredBlock[RobotProxy] = BLOCKS.register(Constants.BlockName.Robot, () => Items.registerBlock(new RobotProxy(defaultProps.noOcclusion.dynamicShape), Constants.BlockName.Robot, new Item.Properties())) + val Robot: DeferredBlock[RobotProxy] = BLOCKS.register(Constants.BlockName.Robot, () => Items.registerBlock(new RobotProxy(defaultProps.noOcclusion.dynamicShape), Constants.BlockName.Robot, new Item.Properties(),"25_components")) // v1.5.10 - val Endstone: DeferredBlock[FakeEndstone] = BLOCKS.register(Constants.BlockName.Endstone, () => Items.registerBlock(new FakeEndstone(Properties.of().mapColor(MapColor.STONE).strength(3, 15)), Constants.BlockName.Endstone, defaultItemProps)) + val Endstone: DeferredBlock[FakeEndstone] = BLOCKS.register(Constants.BlockName.Endstone, () => Items.registerBlock(new FakeEndstone(Properties.of().mapColor(MapColor.STONE).strength(3, 15)), Constants.BlockName.Endstone, defaultItemProps,"50_materials")) // v1.5.14 - val NetSplitter: DeferredBlock[NetSplitter] = BLOCKS.register(Constants.BlockName.NetSplitter, () => Items.registerBlock(new NetSplitter(defaultProps), Constants.BlockName.NetSplitter, defaultItemProps)) + val NetSplitter: DeferredBlock[NetSplitter] = BLOCKS.register(Constants.BlockName.NetSplitter, () => Items.registerBlock(new NetSplitter(defaultProps), Constants.BlockName.NetSplitter, defaultItemProps,"10_networking")) // v1.5.16 - val Transposer: DeferredBlock[Transposer] = BLOCKS.register(Constants.BlockName.Transposer, () => Items.registerBlock(new Transposer(defaultProps), Constants.BlockName.Transposer, defaultItemProps)) + val Transposer: DeferredBlock[Transposer] = BLOCKS.register(Constants.BlockName.Transposer, () => Items.registerBlock(new Transposer(defaultProps), Constants.BlockName.Transposer, defaultItemProps,"25_components")) // v1.7.2 - val CarpetedCapacitor: DeferredBlock[CarpetedCapacitor] = BLOCKS.register(Constants.BlockName.CarpetedCapacitor, () => Items.registerBlock(new CarpetedCapacitor(defaultProps), Constants.BlockName.CarpetedCapacitor, defaultItemProps)) + val CarpetedCapacitor: DeferredBlock[CarpetedCapacitor] = BLOCKS.register(Constants.BlockName.CarpetedCapacitor, () => Items.registerBlock(new CarpetedCapacitor(defaultProps), Constants.BlockName.CarpetedCapacitor, defaultItemProps,"10_networking")) def init(bus: IEventBus): Unit = { BLOCKS.register(bus) diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index fb3f9e3f8c..11f468a9ae 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -22,11 +22,15 @@ import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent import net.neoforged.neoforge.registries.{DeferredItem, DeferredRegister, RegisterEvent} import java.nio.ByteBuffer +import java.util import java.util.concurrent.Callable +import java.util.function.Consumer import scala.collection.mutable import scala.collection.mutable.ArrayBuffer +import scala.jdk.CollectionConverters.CollectionHasAsScala object OCItems extends ItemAPI { + private val ITEM_TO_SECTION = new util.HashMap[String, String] private val ITEMS: DeferredRegister.Items = DeferredRegister.createItems(Settings.resourceDomain) val descriptors = mutable.LinkedHashMap.empty[String, ItemInfo] @@ -69,12 +73,13 @@ object OCItems extends ItemAPI { instance } - def registerBlock[T <: Block](instance: T, id: String, itemProps: Properties): T = { + def registerBlock[T <: Block](instance: T, id: String, itemProps: Properties, section_id: String): T = { if (!descriptors.contains(id)) { instance match { case simple: SimpleBlock => simple.setUnlocalizedName("oc." + id) + ITEM_TO_SECTION.put(id, section_id); val ro: DeferredItem[Item] = ITEMS.register(id, () => { val itemInst: Item = new common.block.Item(simple, itemProps) OpenComputers.proxy.registerModel(itemInst, id) @@ -100,10 +105,12 @@ object OCItems extends ItemAPI { instance } - def registerItem[T <: Item](makeItem: => T, id: String): DeferredItem[T] = { + def registerItem[T <: Item](makeItem: => T, id: String, section_id: String): DeferredItem[T] = { if (descriptors.contains(id)) { throw new IllegalArgumentException("Duplicate item " + id) } + + ITEM_TO_SECTION.put(id, section_id); // Construct items inside the supplier while the registry is writable. val ro: DeferredItem[T] = ITEMS.register(id, () => { val instance = makeItem @@ -343,184 +350,184 @@ object OCItems extends ItemAPI { ///////////////////////////////////////////////////////////////// // Crafting materials. ///////////////////////////////////////////////////////////////// - val CuttingWire: DeferredItem[item.CuttingWire] = registerItem(new item.CuttingWire(defaultProps), Constants.ItemName.CuttingWire) - val Acid: DeferredItem[item.Acid] = registerItem(new item.Acid(defaultProps), Constants.ItemName.Acid) - val RawCircuitBoard: DeferredItem[item.RawCircuitBoard] = registerItem(new item.RawCircuitBoard(defaultProps), Constants.ItemName.RawCircuitBoard) - val CircuitBoard: DeferredItem[item.CircuitBoard] = registerItem(new item.CircuitBoard(defaultProps), Constants.ItemName.CircuitBoard) - val PrintedCircuitBoard: DeferredItem[item.PrintedCircuitBoard] = registerItem(new item.PrintedCircuitBoard(defaultProps), Constants.ItemName.PrintedCircuitBoard) - val Card: DeferredItem[item.CardBase] = registerItem(new item.CardBase(defaultProps), Constants.ItemName.Card) - val Transistor: DeferredItem[item.Transistor] = registerItem(new item.Transistor(defaultProps), Constants.ItemName.Transistor) - val ChipTier1: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps, Tier.One), Constants.ItemName.ChipTier1) - val ChipTier2: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ChipTier2) - val ChipTier3: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ChipTier3) - val ChipTier4: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ChipTier4) - val Alu: DeferredItem[item.ALU] = registerItem(new item.ALU(defaultProps), Constants.ItemName.Alu) - val ControlUnit: DeferredItem[item.ControlUnit] = registerItem(new item.ControlUnit(defaultProps), Constants.ItemName.ControlUnit) - val Disk: DeferredItem[item.Disk] = registerItem(new item.Disk(defaultProps), Constants.ItemName.Disk) - val Interweb: DeferredItem[item.Interweb] = registerItem(new item.Interweb(defaultProps), Constants.ItemName.Interweb) - val ButtonGroup: DeferredItem[item.ButtonGroup] = registerItem(new item.ButtonGroup(defaultProps), Constants.ItemName.ButtonGroup) - val ArrowKeys: DeferredItem[item.ArrowKeys] = registerItem(new item.ArrowKeys(defaultProps), Constants.ItemName.ArrowKeys) - val NumPad: DeferredItem[item.NumPad] = registerItem(new item.NumPad(defaultProps), Constants.ItemName.NumPad) - - val TabletCaseTier1: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps, Tier.One), Constants.ItemName.TabletCaseTier1) - val TabletCaseTier2: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.TabletCaseTier2) - val TabletCaseTier3: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.TabletCaseTier3) - val TabletCaseCreative: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.TabletCaseCreative) - val MicrocontrollerCaseTier1: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps, Tier.One), Constants.ItemName.MicrocontrollerCaseTier1) - val MicrocontrollerCaseTier2: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.MicrocontrollerCaseTier2) - val MicrocontrollerCaseTier3: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.MicrocontrollerCaseTier3) - val MicrocontrollerCaseCreative: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.MicrocontrollerCaseCreative) - val DroneCaseTier1: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps, Tier.One), Constants.ItemName.DroneCaseTier1) - val DroneCaseTier2: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DroneCaseTier2) - val DroneCaseTier3: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.DroneCaseTier3) - val DroneCaseCreative: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.DroneCaseCreative) - - val InkCartridgeEmpty: DeferredItem[item.InkCartridgeEmpty] = registerItem(new item.InkCartridgeEmpty(defaultProps.stacksTo(1)), Constants.ItemName.InkCartridgeEmpty) - val InkCartridge: DeferredItem[item.InkCartridge] = registerItem(new item.InkCartridge(defaultProps.stacksTo(1)), Constants.ItemName.InkCartridge) - val Chamelium: DeferredItem[item.Chamelium] = registerItem(new item.Chamelium(defaultProps), Constants.ItemName.Chamelium) - - val DiamondChip: DeferredItem[item.DiamondChip] = registerItem(new item.DiamondChip(defaultProps), Constants.ItemName.DiamondChip) - val NetheriteSilicon: DeferredItem[NetheriteSilicon] = registerItem(new NetheriteSilicon(defaultProps), Constants.ItemName.NetheriteSilicon) + val CuttingWire: DeferredItem[item.CuttingWire] = registerItem(new item.CuttingWire(defaultProps), Constants.ItemName.CuttingWire, "50_materials") + val Acid: DeferredItem[item.Acid] = registerItem(new item.Acid(defaultProps), Constants.ItemName.Acid, "50_materials") + val RawCircuitBoard: DeferredItem[item.RawCircuitBoard] = registerItem(new item.RawCircuitBoard(defaultProps), Constants.ItemName.RawCircuitBoard, "50_materials") + val CircuitBoard: DeferredItem[item.CircuitBoard] = registerItem(new item.CircuitBoard(defaultProps), Constants.ItemName.CircuitBoard, "50_materials") + val PrintedCircuitBoard: DeferredItem[item.PrintedCircuitBoard] = registerItem(new item.PrintedCircuitBoard(defaultProps), Constants.ItemName.PrintedCircuitBoard, "50_materials") + val Card: DeferredItem[item.CardBase] = registerItem(new item.CardBase(defaultProps), Constants.ItemName.Card, "50_materials") + val Transistor: DeferredItem[item.Transistor] = registerItem(new item.Transistor(defaultProps), Constants.ItemName.Transistor, "50_materials") + val ChipTier1: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps, Tier.One), Constants.ItemName.ChipTier1, "50_materials") + val ChipTier2: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ChipTier2, "50_materials") + val ChipTier3: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ChipTier3, "50_materials") + val ChipTier4: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ChipTier4, "50_materials") + val Alu: DeferredItem[item.ALU] = registerItem(new item.ALU(defaultProps), Constants.ItemName.Alu, "50_materials") + val ControlUnit: DeferredItem[item.ControlUnit] = registerItem(new item.ControlUnit(defaultProps), Constants.ItemName.ControlUnit, "50_materials") + val Disk: DeferredItem[item.Disk] = registerItem(new item.Disk(defaultProps), Constants.ItemName.Disk, "50_materials") + val Interweb: DeferredItem[item.Interweb] = registerItem(new item.Interweb(defaultProps), Constants.ItemName.Interweb, "50_materials") + val ButtonGroup: DeferredItem[item.ButtonGroup] = registerItem(new item.ButtonGroup(defaultProps), Constants.ItemName.ButtonGroup, "50_materials") + val ArrowKeys: DeferredItem[item.ArrowKeys] = registerItem(new item.ArrowKeys(defaultProps), Constants.ItemName.ArrowKeys, "50_materials") + val NumPad: DeferredItem[item.NumPad] = registerItem(new item.NumPad(defaultProps), Constants.ItemName.NumPad, "50_materials") + + val TabletCaseTier1: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps, Tier.One), Constants.ItemName.TabletCaseTier1, "50_materials") + val TabletCaseTier2: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.TabletCaseTier2, "50_materials") + val TabletCaseTier3: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.TabletCaseTier3, "50_materials") + val TabletCaseCreative: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.TabletCaseCreative, "50_materials") + val MicrocontrollerCaseTier1: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps, Tier.One), Constants.ItemName.MicrocontrollerCaseTier1, "50_materials") + val MicrocontrollerCaseTier2: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.MicrocontrollerCaseTier2, "50_materials") + val MicrocontrollerCaseTier3: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.MicrocontrollerCaseTier3, "50_materials") + val MicrocontrollerCaseCreative: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.MicrocontrollerCaseCreative, "50_materials") + val DroneCaseTier1: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps, Tier.One), Constants.ItemName.DroneCaseTier1, "50_materials") + val DroneCaseTier2: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DroneCaseTier2, "50_materials") + val DroneCaseTier3: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.DroneCaseTier3, "50_materials") + val DroneCaseCreative: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.DroneCaseCreative, "50_materials") + + val InkCartridgeEmpty: DeferredItem[item.InkCartridgeEmpty] = registerItem(new item.InkCartridgeEmpty(defaultProps.stacksTo(1)), Constants.ItemName.InkCartridgeEmpty, "50_materials") + val InkCartridge: DeferredItem[item.InkCartridge] = registerItem(new item.InkCartridge(defaultProps.stacksTo(1)), Constants.ItemName.InkCartridge, "50_materials") + val Chamelium: DeferredItem[item.Chamelium] = registerItem(new item.Chamelium(defaultProps), Constants.ItemName.Chamelium, "50_materials") + + val DiamondChip: DeferredItem[item.DiamondChip] = registerItem(new item.DiamondChip(defaultProps), Constants.ItemName.DiamondChip, "50_materials") + val NetheriteSilicon: DeferredItem[NetheriteSilicon] = registerItem(new NetheriteSilicon(defaultProps), Constants.ItemName.NetheriteSilicon, "50_materials") // All kinds of tools. - val Analyzer: DeferredItem[item.Analyzer] = registerItem(new item.Analyzer(defaultProps), Constants.ItemName.Analyzer) - val Debugger: DeferredItem[item.Debugger] = registerItem(new item.Debugger(defaultProps), Constants.ItemName.Debugger) - val Terminal: DeferredItem[item.Terminal] = registerItem(new item.Terminal(defaultProps.stacksTo(1)), Constants.ItemName.Terminal) - val TexturePicker: DeferredItem[item.TexturePicker] = registerItem(new item.TexturePicker(defaultProps), Constants.ItemName.TexturePicker) - val Manual: DeferredItem[item.Manual] = registerItem(new item.Manual(defaultProps), Constants.ItemName.Manual) - val Wrench: DeferredItem[item.Wrench] = registerItem(new item.Wrench(defaultProps.stacksTo(1)), Constants.ItemName.Wrench) + val Analyzer: DeferredItem[item.Analyzer] = registerItem(new item.Analyzer(defaultProps), Constants.ItemName.Analyzer, "49_tools") + val Debugger: DeferredItem[item.Debugger] = registerItem(new item.Debugger(defaultProps), Constants.ItemName.Debugger, "49_tools") + val Terminal: DeferredItem[item.Terminal] = registerItem(new item.Terminal(defaultProps.stacksTo(1)), Constants.ItemName.Terminal, "49_tools") + val TexturePicker: DeferredItem[item.TexturePicker] = registerItem(new item.TexturePicker(defaultProps), Constants.ItemName.TexturePicker, "49_tools") + val Manual: DeferredItem[item.Manual] = registerItem(new item.Manual(defaultProps), Constants.ItemName.Manual, "49_tools") + val Wrench: DeferredItem[item.Wrench] = registerItem(new item.Wrench(defaultProps.stacksTo(1)), Constants.ItemName.Wrench, "49_tools") // 1.5.11 - val HoverBoots: DeferredItem[item.HoverBoots] = registerItem(new item.HoverBoots(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON).setNoRepair), Constants.ItemName.HoverBoots) + val HoverBoots: DeferredItem[item.HoverBoots] = registerItem(new item.HoverBoots(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON).setNoRepair), Constants.ItemName.HoverBoots, "49_tools") // 1.5.18 - val Nanomachines: DeferredItem[item.Nanomachines] = registerItem(new item.Nanomachines(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.Nanomachines) + val Nanomachines: DeferredItem[item.Nanomachines] = registerItem(new item.Nanomachines(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.Nanomachines, "49_tools") ///////////////////////////////////////////////////////////////// // General purpose components. ///////////////////////////////////////////////////////////////// - val CPUTier1: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps, Tier.One), Constants.ItemName.CPUTier1) - val CPUTier2: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CPUTier2) - val CPUTier3: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CPUTier3) - val CPUTier4: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.CPUTier4) - - val ComponentBusTier1: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps, Tier.One), Constants.ItemName.ComponentBusTier1) - val ComponentBusTier2: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ComponentBusTier2) - val ComponentBusTier3: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ComponentBusTier3) - val ComponentBusTier4: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ComponentBusTier4) - - val RAMTier1: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps, Tier.One), Constants.ItemName.RAMTier1) - val RAMTier2: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps, Tier.Two), Constants.ItemName.RAMTier2) - val RAMTier3: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.UNCOMMON), Tier.Three), Constants.ItemName.RAMTier3) - val RAMTier4: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.UNCOMMON), Tier.Four), Constants.ItemName.RAMTier4) - val RAMTier5: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.RARE), Tier.Five), Constants.ItemName.RAMTier5) - val RAMTier6: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.RARE), Tier.Six), Constants.ItemName.RAMTier6) - val RAMTier7: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Seven), Constants.ItemName.RAMTier7) - val RAMTier8: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Eight), Constants.ItemName.RAMTier8) - - val ServerCreative: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.ServerCreative) - val ServerTier1: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1), Tier.One), Constants.ItemName.ServerTier1) - val ServerTier2: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ServerTier2) - val ServerTier3: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ServerTier3) - val ServerTier4: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ServerTier4) - - val APUTier1: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.UNCOMMON), Tier.One), Constants.ItemName.APUTier1) - val APUTier2: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.RARE), Tier.Two), Constants.ItemName.APUTier2) - val APUTier3: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.APUTier3) - val APUCreative: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.APUCreative) + val CPUTier1: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps, Tier.One), Constants.ItemName.CPUTier1, "25_components") + val CPUTier2: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CPUTier2, "25_components") + val CPUTier3: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CPUTier3, "25_components") + val CPUTier4: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.CPUTier4, "25_components") + + val ComponentBusTier1: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps, Tier.One), Constants.ItemName.ComponentBusTier1, "25_components") + val ComponentBusTier2: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ComponentBusTier2, "25_components") + val ComponentBusTier3: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ComponentBusTier3, "25_components") + val ComponentBusTier4: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ComponentBusTier4, "25_components") + val ComponentBusCreative: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.ComponentBusCreative, "25_components") + + val RAMTier1: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps, Tier.One), Constants.ItemName.RAMTier1, "25_components") + val RAMTier2: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps, Tier.Two), Constants.ItemName.RAMTier2, "25_components") + val RAMTier3: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.UNCOMMON), Tier.Three), Constants.ItemName.RAMTier3, "25_components") + val RAMTier4: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.UNCOMMON), Tier.Four), Constants.ItemName.RAMTier4, "25_components") + val RAMTier5: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.RARE), Tier.Five), Constants.ItemName.RAMTier5, "25_components") + val RAMTier6: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.RARE), Tier.Six), Constants.ItemName.RAMTier6, "25_components") + val RAMTier7: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Seven), Constants.ItemName.RAMTier7, "25_components") + val RAMTier8: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Eight), Constants.ItemName.RAMTier8, "25_components") + // 1.9 + val RAMCreative: DeferredItem[item.CreativeMemory] = registerItem(new item.CreativeMemory(defaultProps.rarity(Rarity.EPIC)), Constants.ItemName.RAMCreative, "25_components") + + val ServerTier1: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1), Tier.One), Constants.ItemName.ServerTier1, "25_components") + val ServerTier2: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ServerTier2, "25_components") + val ServerTier3: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ServerTier3, "25_components") + val ServerTier4: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ServerTier4, "25_components") + val ServerCreative: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.ServerCreative, "25_components") + + val APUTier1: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.UNCOMMON), Tier.One), Constants.ItemName.APUTier1, "25_components") + val APUTier2: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.RARE), Tier.Two), Constants.ItemName.APUTier2, "25_components") + val APUTier3: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.APUTier3, "25_components") + val APUCreative: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.APUCreative, "25_components") // 1.6 - val TerminalServer: DeferredItem[item.TerminalServer] = registerItem(new item.TerminalServer(defaultProps.stacksTo(1)), Constants.ItemName.TerminalServer) - val RackKVM: DeferredItem[item.RackKVM] = registerItem(new item.RackKVM(defaultProps.stacksTo(1)), Constants.ItemName.RackKVM) - val DiskDriveMountable: DeferredItem[item.DiskDriveMountable] = registerItem(new item.DiskDriveMountable(defaultProps.stacksTo(1)), Constants.ItemName.DiskDriveMountable) + val TerminalServer: DeferredItem[item.TerminalServer] = registerItem(new item.TerminalServer(defaultProps.stacksTo(1)), Constants.ItemName.TerminalServer, "25_components") + val RackKVM: DeferredItem[item.RackKVM] = registerItem(new item.RackKVM(defaultProps.stacksTo(1)), Constants.ItemName.RackKVM, "25_components") + val DiskDriveMountable: DeferredItem[item.DiskDriveMountable] = registerItem(new item.DiskDriveMountable(defaultProps.stacksTo(1)), Constants.ItemName.DiskDriveMountable, "25_components") // 1.9 - val RAMCreative: DeferredItem[item.CreativeMemory] = registerItem(new item.CreativeMemory(defaultProps.rarity(Rarity.EPIC)), Constants.ItemName.RAMCreative) - val CapacitorMountable: DeferredItem[item.CapacitorMountable] = registerItem(new item.CapacitorMountable(defaultProps.stacksTo(1)), Constants.ItemName.CapacitorMountable) + val CapacitorMountable: DeferredItem[item.CapacitorMountable] = registerItem(new item.CapacitorMountable(defaultProps.stacksTo(1)), Constants.ItemName.CapacitorMountable, "25_components") // Card components. - val DebugCard: DeferredItem[item.DebugCard] = registerItem(new item.DebugCard(defaultProps), Constants.ItemName.DebugCard) - val GraphicsCardTier1: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps, Tier.One), Constants.ItemName.GraphicsCardTier1) - val GraphicsCardTier2: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.GraphicsCardTier2) - val GraphicsCardTier3: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.GraphicsCardTier3) - val GraphicsCardTier4: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.GraphicsCardTier4) - val QuadGraphicsCard: DeferredItem[item.QuadGraphicsCard] = registerItem(new item.QuadGraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY)), Constants.ItemName.QuadGraphicsCard) - val RedstoneCardTier1: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps, Tier.One), Constants.ItemName.RedstoneCardTier1) - val RedstoneCardTier2: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.RedstoneCardTier2) - val NetworkCard: DeferredItem[item.NetworkCard] = registerItem(new item.NetworkCard(defaultProps), Constants.ItemName.NetworkCard) - val WirelessNetworkCardTier2: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.WirelessNetworkCardTier2) - val InternetCard: DeferredItem[item.InternetCard] = registerItem(new item.InternetCard(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.InternetCard) - val LinkedCard: DeferredItem[item.LinkedCard] = registerItem(new item.LinkedCard(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.LinkedCard) + val DebugCard: DeferredItem[item.DebugCard] = registerItem(new item.DebugCard(defaultProps), Constants.ItemName.DebugCard, "25_components") + val GraphicsCardTier1: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps, Tier.One), Constants.ItemName.GraphicsCardTier1, "25_components") + val GraphicsCardTier2: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.GraphicsCardTier2, "25_components") + val GraphicsCardTier3: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.GraphicsCardTier3, "25_components") + val GraphicsCardTier4: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.GraphicsCardTier4, "25_components") + val QuadGraphicsCard: DeferredItem[item.QuadGraphicsCard] = registerItem(new item.QuadGraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY)), Constants.ItemName.QuadGraphicsCard, "25_components") + val RedstoneCardTier1: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps, Tier.One), Constants.ItemName.RedstoneCardTier1, "25_components") + val RedstoneCardTier2: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.RedstoneCardTier2, "25_components") + val NetworkCard: DeferredItem[item.NetworkCard] = registerItem(new item.NetworkCard(defaultProps), Constants.ItemName.NetworkCard, "25_components") + val WirelessNetworkCardTier2: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.WirelessNetworkCardTier2, "25_components") + val InternetCard: DeferredItem[item.InternetCard] = registerItem(new item.InternetCard(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.InternetCard, "25_components") + val LinkedCard: DeferredItem[item.LinkedCard] = registerItem(new item.LinkedCard(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.LinkedCard, "25_components") // 1.5.13 - val DataCardTier1: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps, Tier.One), Constants.ItemName.DataCardTier1) + val DataCardTier1: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps, Tier.One), Constants.ItemName.DataCardTier1, "25_components") // 1.5.15 - val DataCardTier2: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DataCardTier2) - val DataCardTier3: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DataCardTier3) + val DataCardTier2: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DataCardTier2, "25_components") + val DataCardTier3: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DataCardTier3, "25_components") - // 1.9 - val AudioCardTier1: DeferredItem[item.AudioCard] = registerItem(new item.AudioCard(defaultProps), Constants.ItemName.AudioCardTier1) + // 1.7.2 + val WirelessNetworkCardTier1: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps, Tier.One), Constants.ItemName.WirelessNetworkCardTier1, "25_components") + // 1.9 + val AudioCardTier1: DeferredItem[item.AudioCard] = registerItem(new item.AudioCard(defaultProps), Constants.ItemName.AudioCardTier1, "25_components") ///////////////////////////////////////////////////////////////// // Upgrade components. ///////////////////////////////////////////////////////////////// - val AngelUpgrade: DeferredItem[item.UpgradeAngel] = registerItem(new item.UpgradeAngel(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.AngelUpgrade) - val BatteryUpgradeTier1: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps, Tier.One), Constants.ItemName.BatteryUpgradeTier1) - val BatteryUpgradeTier2: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.BatteryUpgradeTier2) - val BatteryUpgradeTier3: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.BatteryUpgradeTier3) - val ChunkloaderUpgrade: DeferredItem[item.UpgradeChunkloader] = registerItem(new item.UpgradeChunkloader(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.ChunkloaderUpgrade) - val CardContainerTier1: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps, Tier.One), Constants.ItemName.CardContainerTier1) - val CardContainerTier2: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CardContainerTier2) - val CardContainerTier3: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CardContainerTier3) - val UpgradeContainerTier1: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps, Tier.One), Constants.ItemName.UpgradeContainerTier1) - val UpgradeContainerTier2: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.UpgradeContainerTier2) - val UpgradeContainerTier3: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.UpgradeContainerTier3) - val CraftingUpgrade: DeferredItem[item.UpgradeCrafting] = registerItem(new item.UpgradeCrafting(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.CraftingUpgrade) - val DatabaseUpgradeTier1: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps, Tier.One), Constants.ItemName.DatabaseUpgradeTier1) - val DatabaseUpgradeTier2: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DatabaseUpgradeTier2) - val DatabaseUpgradeTier3: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DatabaseUpgradeTier3) - val ExperienceUpgrade: DeferredItem[item.UpgradeExperience] = registerItem(new item.UpgradeExperience(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.ExperienceUpgrade) - val GeneratorUpgrade: DeferredItem[item.UpgradeGenerator] = registerItem(new item.UpgradeGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.GeneratorUpgrade) - val InventoryUpgrade: DeferredItem[item.UpgradeInventory] = registerItem(new item.UpgradeInventory(defaultProps), Constants.ItemName.InventoryUpgrade) - val InventoryControllerUpgrade: DeferredItem[item.UpgradeInventoryController] = registerItem(new item.UpgradeInventoryController(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.InventoryControllerUpgrade) - val NavigationUpgrade: DeferredItem[item.UpgradeNavigation] = registerItem(new item.UpgradeNavigation(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.NavigationUpgrade) - val PistonUpgrade: DeferredItem[item.UpgradePiston] = registerItem(new item.UpgradePiston(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.PistonUpgrade) - val SignUpgrade: DeferredItem[item.UpgradeSign] = registerItem(new item.UpgradeSign(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.SignUpgrade) - val SolarGeneratorUpgrade: DeferredItem[item.UpgradeSolarGenerator] = registerItem(new item.UpgradeSolarGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.SolarGeneratorUpgrade) - val TankUpgrade: DeferredItem[item.UpgradeTank] = registerItem(new item.UpgradeTank(defaultProps), Constants.ItemName.TankUpgrade) - val TankControllerUpgrade: DeferredItem[item.UpgradeTankController] = registerItem(new item.UpgradeTankController(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.TankControllerUpgrade) - val TractorBeamUpgrade: DeferredItem[item.UpgradeTractorBeam] = registerItem(new item.UpgradeTractorBeam(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.TractorBeamUpgrade) - val LeashUpgrade: DeferredItem[item.UpgradeLeash] = registerItem(new item.UpgradeLeash(defaultProps), Constants.ItemName.LeashUpgrade) + val AngelUpgrade: DeferredItem[item.UpgradeAngel] = registerItem(new item.UpgradeAngel(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.AngelUpgrade, "80_upgrade") + val BatteryUpgradeTier1: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps, Tier.One), Constants.ItemName.BatteryUpgradeTier1, "80_upgrade") + val BatteryUpgradeTier2: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.BatteryUpgradeTier2, "80_upgrade") + val BatteryUpgradeTier3: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.BatteryUpgradeTier3, "80_upgrade") + val ChunkloaderUpgrade: DeferredItem[item.UpgradeChunkloader] = registerItem(new item.UpgradeChunkloader(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.ChunkloaderUpgrade, "80_upgrade") + val CardContainerTier1: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps, Tier.One), Constants.ItemName.CardContainerTier1, "80_upgrade") + val CardContainerTier2: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CardContainerTier2, "80_upgrade") + val CardContainerTier3: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CardContainerTier3, "80_upgrade") + val UpgradeContainerTier1: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps, Tier.One), Constants.ItemName.UpgradeContainerTier1, "80_upgrade") + val UpgradeContainerTier2: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.UpgradeContainerTier2, "80_upgrade") + val UpgradeContainerTier3: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.UpgradeContainerTier3, "80_upgrade") + val CraftingUpgrade: DeferredItem[item.UpgradeCrafting] = registerItem(new item.UpgradeCrafting(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.CraftingUpgrade, "80_upgrade") + val DatabaseUpgradeTier1: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps, Tier.One), Constants.ItemName.DatabaseUpgradeTier1, "80_upgrade") + val DatabaseUpgradeTier2: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DatabaseUpgradeTier2, "80_upgrade") + val DatabaseUpgradeTier3: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DatabaseUpgradeTier3, "80_upgrade") + val ExperienceUpgrade: DeferredItem[item.UpgradeExperience] = registerItem(new item.UpgradeExperience(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.ExperienceUpgrade, "80_upgrade") + val GeneratorUpgrade: DeferredItem[item.UpgradeGenerator] = registerItem(new item.UpgradeGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.GeneratorUpgrade, "80_upgrade") + val InventoryUpgrade: DeferredItem[item.UpgradeInventory] = registerItem(new item.UpgradeInventory(defaultProps), Constants.ItemName.InventoryUpgrade, "80_upgrade") + val InventoryControllerUpgrade: DeferredItem[item.UpgradeInventoryController] = registerItem(new item.UpgradeInventoryController(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.InventoryControllerUpgrade, "80_upgrade") + val NavigationUpgrade: DeferredItem[item.UpgradeNavigation] = registerItem(new item.UpgradeNavigation(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.NavigationUpgrade, "80_upgrade") + val PistonUpgrade: DeferredItem[item.UpgradePiston] = registerItem(new item.UpgradePiston(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.PistonUpgrade, "80_upgrade") + val SignUpgrade: DeferredItem[item.UpgradeSign] = registerItem(new item.UpgradeSign(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.SignUpgrade, "80_upgrade") + val SolarGeneratorUpgrade: DeferredItem[item.UpgradeSolarGenerator] = registerItem(new item.UpgradeSolarGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.SolarGeneratorUpgrade, "80_upgrade") + val TankUpgrade: DeferredItem[item.UpgradeTank] = registerItem(new item.UpgradeTank(defaultProps), Constants.ItemName.TankUpgrade, "80_upgrade") + val TankControllerUpgrade: DeferredItem[item.UpgradeTankController] = registerItem(new item.UpgradeTankController(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.TankControllerUpgrade, "80_upgrade") + val TractorBeamUpgrade: DeferredItem[item.UpgradeTractorBeam] = registerItem(new item.UpgradeTractorBeam(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.TractorBeamUpgrade, "80_upgrade") + val LeashUpgrade: DeferredItem[item.UpgradeLeash] = registerItem(new item.UpgradeLeash(defaultProps), Constants.ItemName.LeashUpgrade, "80_upgrade") // 1.5.8 - val HoverUpgradeTier1: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps, Tier.One), Constants.ItemName.HoverUpgradeTier1) - val HoverUpgradeTier2: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HoverUpgradeTier2) + val HoverUpgradeTier1: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps, Tier.One), Constants.ItemName.HoverUpgradeTier1, "80_upgrade") + val HoverUpgradeTier2: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HoverUpgradeTier2, "80_upgrade") // 1.6 - val TradingUpgrade: DeferredItem[item.UpgradeTrading] = registerItem(new item.UpgradeTrading(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.TradingUpgrade) - val MFU: DeferredItem[item.UpgradeMF] = registerItem(new item.UpgradeMF(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.MFU) - - // 1.7.2 - val WirelessNetworkCardTier1: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps, Tier.One), Constants.ItemName.WirelessNetworkCardTier1) - val ComponentBusCreative: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.ComponentBusCreative) + val TradingUpgrade: DeferredItem[item.UpgradeTrading] = registerItem(new item.UpgradeTrading(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.TradingUpgrade, "80_upgrade") + val MFU: DeferredItem[item.UpgradeMF] = registerItem(new item.UpgradeMF(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.MFU, "80_upgrade") // 1.8 - val StickyPistonUpgrade: DeferredItem[item.UpgradeStickyPiston] = registerItem(new item.UpgradeStickyPiston(defaultProps), Constants.ItemName.StickyPistonUpgrade) + val StickyPistonUpgrade: DeferredItem[item.UpgradeStickyPiston] = registerItem(new item.UpgradeStickyPiston(defaultProps), Constants.ItemName.StickyPistonUpgrade, "80_upgrade") ///////////////////////////////////////////////////////////////// // Storage media of all kinds. ///////////////////////////////////////////////////////////////// - val EEPROM: DeferredItem[item.EEPROM] = registerItem(new item.EEPROM(defaultProps), Constants.ItemName.EEPROM) - val Floppy: DeferredItem[item.FloppyDisk] = registerItem(new item.FloppyDisk(defaultProps), Constants.ItemName.Floppy) - val HDDTier1: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps, Tier.One), Constants.ItemName.HDDTier1) - val HDDTier2: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HDDTier2) - val HDDTier3: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.HDDTier3) - val HDDTier4: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.HDDTier4) + val EEPROM: DeferredItem[item.EEPROM] = registerItem(new item.EEPROM(defaultProps), Constants.ItemName.EEPROM, "25_components") + val Floppy: DeferredItem[item.FloppyDisk] = registerItem(new item.FloppyDisk(defaultProps), Constants.ItemName.Floppy, "25_components") + val HDDTier1: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps, Tier.One), Constants.ItemName.HDDTier1, "25_components") + val HDDTier2: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HDDTier2, "25_components") + val HDDTier3: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.HDDTier3, "25_components") + val HDDTier4: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.HDDTier4, "25_components") - val SSDTier1: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(Rarity.UNCOMMON), Tier.One), Constants.ItemName.SSDTier1) - val SSDTier2: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(Rarity.RARE), Tier.Two), Constants.ItemName.SSDTier2) - val SSDTier3: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.SSDTier3) + val SSDTier1: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(Rarity.UNCOMMON), Tier.One), Constants.ItemName.SSDTier1, "25_components") + val SSDTier2: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(Rarity.RARE), Tier.Two), Constants.ItemName.SSDTier2, "25_components") + val SSDTier3: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.SSDTier3, "25_components") private def initPostStorage(): Unit = { val luaBios = { @@ -534,11 +541,11 @@ object OCItems extends ItemAPI { ///////////////////////////////////////////////////////////////// // Special purpose items that don't fit into any other category. ///////////////////////////////////////////////////////////////// - val Tablet: DeferredItem[item.Tablet] = registerItem(new item.Tablet(defaultProps.stacksTo(1)), Constants.ItemName.Tablet) - val Drone: DeferredItem[item.Drone] = registerItem(new item.Drone(defaultProps), Constants.ItemName.Drone) - val Present: DeferredItem[item.Present] = registerItem(new item.Present(defaultProps), Constants.ItemName.Present) + val Tablet: DeferredItem[item.Tablet] = registerItem(new item.Tablet(defaultProps.stacksTo(1)), Constants.ItemName.Tablet, "99_misc") + val Drone: DeferredItem[item.Drone] = registerItem(new item.Drone(defaultProps), Constants.ItemName.Drone, "99_misc") + val Present: DeferredItem[item.Present] = registerItem(new item.Present(defaultProps), Constants.ItemName.Present, "99_misc") - def decorateCreativeTab(event: BuildCreativeModeTabContentsEvent, hasRedstoneCardT2: Boolean): Unit = { + def decorateCreativeTab(displayItems: Consumer[ItemStack], searchItems: Consumer[ItemStack]): Unit = { import Constants.{BlockName => B, ItemName => I} // Assembled devices are not usable without their component data. Their // configured creative variants are added explicitly below. @@ -547,34 +554,64 @@ object OCItems extends ItemAPI { def accept(id: String, info: ItemInfo): Unit = { if (id != B.PowerConverter || !Settings.get.ignorePower) { val stack = info.createItemStack(1) - if (!stack.isEmpty) event.accept(stack) + if (!stack.isEmpty) { + displayItems.accept(stack); + searchItems.accept(stack); + } } } - // Block items first, then regular items — mirrors 1.16.5 registry order. - // Items registered at mod-load time enter descriptors before blocks (which are - // registered lazily during the BLOCKS event), so we partition explicitly. - // Loot disk floppies (registered into descriptors via Items.registerStack in - // Loot.createLootDisk) are excluded here because they're already added below via - // Loot.disksForClient; including both caused duplicate ItemStack entries and crashed - // BuildCreativeModeTabContentsEvent. - for ((id, info) <- descriptors if info.block != null && !excluded.contains(id) && id != I.RedstoneCardTier2 && !Loot.lootDiskDescriptorIds.contains(id)) - accept(id, info) - for ((id, info) <- descriptors if info.block == null && !excluded.contains(id) && id != I.RedstoneCardTier2 && !Loot.lootDiskDescriptorIds.contains(id)) - accept(id, info) - - event.accept(OCItems.createConfiguredDrone()) - event.accept(OCItems.createConfiguredMicrocontroller()) - event.accept(OCItems.createConfiguredRobot()) - event.accept(OCItems.createConfiguredTablet()) - - Loot.disksForClient.foreach(event.accept) - registeredItems.foreach(event.accept) - - if (hasRedstoneCardT2) { + val sectionMap = new util.HashMap[String, util.List[ItemStack]] + for ((id, info) <- descriptors if !excluded.contains(id)){ + val sectionId = ITEM_TO_SECTION.get(id) + val stack = info.createItemStack(1) + if(sectionId == null) + sectionMap.computeIfAbsent("99_misc", (s) => new util.LinkedList).add(stack) + sectionMap.computeIfAbsent(sectionId, (s) => new util.LinkedList).add(stack) + } + + for (i <- 0 until 9) { + displayItems.accept(ItemStack.EMPTY) + } + + var y = 0 + val sectionKeys = sectionMap.keySet.asScala + .filter(_ != null) + .toList + .sorted + sectionKeys.foreach(key =>{ + var itemCount = 0 + val sectionItems = sectionMap.get(key) + sectionItems.forEach(stack => { + if (!stack.isEmpty) { + displayItems.accept(stack) + searchItems.accept(stack) + itemCount += 1 + } + }) + //SECTION_Y_VALUES.put(key, y) + val rowCount = Math.ceil(itemCount / 9.0f).toInt + y += rowCount + 1 + if (key.equals(sectionKeys.last)) return + var padding = 9 - itemCount % 9 + if (padding < 9) padding += 9 + for (i <- 0 until padding) { + displayItems.accept(ItemStack.EMPTY) + } + }) + + displayItems.accept(OCItems.createConfiguredDrone()) + displayItems.accept(OCItems.createConfiguredMicrocontroller()) + displayItems.accept(OCItems.createConfiguredRobot()) + displayItems.accept(OCItems.createConfiguredTablet()) + + Loot.disksForClient.foreach(displayItems.accept) + registeredItems.foreach(displayItems.accept) + + /*if (hasRedstoneCardT2) { descriptors.get(Constants.ItemName.RedstoneCardTier2).foreach { info => event.accept(info.createItemStack(1)) } - } + }*/ } } diff --git a/src/main/scala/li/cil/oc/mixin/CreativeModeTabMixin.scala b/src/main/scala/li/cil/oc/mixin/CreativeModeTabMixin.scala new file mode 100644 index 0000000000..54794f68cc --- /dev/null +++ b/src/main/scala/li/cil/oc/mixin/CreativeModeTabMixin.scala @@ -0,0 +1,29 @@ +package li.cil.oc.mixin + +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod +import com.llamalad7.mixinextras.injector.wrapoperation.Operation +import li.cil.oc.CreativeTab +import li.cil.oc.common.init.OCItems +import net.minecraft.world.item.CreativeModeTab +import net.minecraft.world.item.ItemStack +import org.spongepowered.asm.mixin.Mixin +import org.spongepowered.asm.mixin.Shadow + +import java.util + + +@Mixin(Array(classOf[CreativeModeTab])) class CreativeModeTabMixin { + @Shadow private var displayItems: util.Collection[ItemStack] = new util.LinkedList[ItemStack] + @Shadow private var displayItemsSearchTab: util.Set[ItemStack] = new util.LinkedHashSet[ItemStack] + + @WrapMethod(method = Array("buildContents")) private def openComputers$buildContents(parameters: CreativeModeTab.ItemDisplayParameters, original: Operation[Void]): Unit = { + val self = this.asInstanceOf[AnyRef].asInstanceOf[CreativeModeTab] + if (self eq CreativeTab.MAIN.get()) { + displayItems.clear() + displayItemsSearchTab.clear() + OCItems.decorateCreativeTab(displayItems.add, displayItemsSearchTab.add) + return + } + original.call(parameters) + } +} diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml index 761496ef64..ac666a95d1 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -18,6 +18,9 @@ enumExtensions="META-INF/enumextensions.json" [[mixins]] config="opencomputers.mixins.json" +[[mixins]] +config="opencomputers.core.mixins.json" + [[dependencies.opencomputers]] modId="minecraft" mandatory=true From bd2b0e354bb23899c65813fb963560054871bc5a Mon Sep 17 00:00:00 2001 From: Grahmindol Date: Sun, 9 Aug 2026 15:00:44 +0200 Subject: [PATCH 02/38] added section title --- .../AbstractContainerScreenAccess.java | 14 ++++ .../CreativeModeInventoryScreenAccess.java | 13 ++++ .../assets/opencomputers/lang/en_us.json | 6 ++ .../opencomputers/textures/gui/banner.png | Bin 0 -> 1784 bytes .../resources/opencomputers.core.mixins.json | 6 ++ src/main/scala/li/cil/oc/CreativeTab.scala | 65 ++++++++++++++++-- .../li/cil/oc/common/init/OCBlocks.scala | 2 +- .../scala/li/cil/oc/common/init/OCItems.scala | 4 +- .../CreativeModeInventoryScreenMixin.scala | 39 +++++++++++ .../cil/oc/mixin/CreativeModeTabMixin.scala | 4 ++ .../li/cil/oc/mixin/ItemPickerMenuMixin.scala | 21 ++++++ 11 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 src/main/java/li/cil/oc/mixin/accessor/AbstractContainerScreenAccess.java create mode 100644 src/main/java/li/cil/oc/mixin/accessor/CreativeModeInventoryScreenAccess.java create mode 100644 src/main/resources/assets/opencomputers/textures/gui/banner.png create mode 100644 src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala create mode 100644 src/main/scala/li/cil/oc/mixin/ItemPickerMenuMixin.scala diff --git a/src/main/java/li/cil/oc/mixin/accessor/AbstractContainerScreenAccess.java b/src/main/java/li/cil/oc/mixin/accessor/AbstractContainerScreenAccess.java new file mode 100644 index 0000000000..a89252e389 --- /dev/null +++ b/src/main/java/li/cil/oc/mixin/accessor/AbstractContainerScreenAccess.java @@ -0,0 +1,14 @@ +package li.cil.oc.mixin.accessor; + +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(AbstractContainerScreen.class) +public interface AbstractContainerScreenAccess { + @Accessor() + int getLeftPos(); + + @Accessor + int getTopPos(); +} diff --git a/src/main/java/li/cil/oc/mixin/accessor/CreativeModeInventoryScreenAccess.java b/src/main/java/li/cil/oc/mixin/accessor/CreativeModeInventoryScreenAccess.java new file mode 100644 index 0000000000..3a8a9b1ec2 --- /dev/null +++ b/src/main/java/li/cil/oc/mixin/accessor/CreativeModeInventoryScreenAccess.java @@ -0,0 +1,13 @@ +package li.cil.oc.mixin.accessor; + +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import net.minecraft.util.Mth; +import net.minecraft.world.item.CreativeModeTab; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(CreativeModeInventoryScreen.class) +public interface CreativeModeInventoryScreenAccess { + @Shadow + static CreativeModeTab selectedTab = null; +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/lang/en_us.json b/src/main/resources/assets/opencomputers/lang/en_us.json index 2526be2b00..2472a0cb27 100644 --- a/src/main/resources/assets/opencomputers/lang/en_us.json +++ b/src/main/resources/assets/opencomputers/lang/en_us.json @@ -189,6 +189,12 @@ "item.oc.worldsensorcard": "World Sensor Card", "item.oc.wrench": "Scrench", "itemGroup.OpenComputers": "OpenComputers", + "itemGroup.OpenComputers.section.10_networking": "Networking§f", + "itemGroup.OpenComputers.section.25_components": "Components§f", + "itemGroup.OpenComputers.section.49_tools": "Tools§f", + "itemGroup.OpenComputers.section.50_materials": "Materials§f", + "itemGroup.OpenComputers.section.80_upgrade": "Upgrades§f", + "itemGroup.OpenComputers.section.99_misc": "Miscellaneous§f", "entity.oc.Drone": "Drone", "oc:gui.Analyzer.Address": "§6Address§f: %s", "oc:gui.Analyzer.AddressCopied": "Address copied to clipboard.", diff --git a/src/main/resources/assets/opencomputers/textures/gui/banner.png b/src/main/resources/assets/opencomputers/textures/gui/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..996448545b6764b55095d81dcf86494316112022 GIT binary patch literal 1784 zcmVh*#%|$F*c?=MtQ#S34ePh`>jzM6+3JvQhOQGdr(2|&4tR8BFi_795NH) zJ6if|iFZHqbVfP8%#LWYxw)x4k5Vp+=fZIueyBVqK6g>|7geTlu)4I$yP2Mu=C4)H zPjAl^_QO|SG|qFJC*rpcIK7um7P`r;lc*+%%gFrd3*XyXnfuuDIi1|Xpqm6KQ&Us? zt?7iQYQMI(7G|hcpp&2psTAhGAg%7ecQ zI?^m{)Zcrf*Z6tAmyV3usHn1d|H)17K?S`xms0s(e(JS;ao@+s$DS^RhKBfidQA1X zOFdop9mdU(HZjH6x!N-_B28S;q5hO4_&XSi6`+0>qJmIl(48L%Vz9E`MJr6!`1$ry~6{pU->R zm}cM5zSq~+c^?}aZ}HcT<9L3zG)pL#%XNJ!jLj8dD_t*606;fmb3*h{nE?R69)T)z zQ>CFEyPG%EL9!;Q&4r5V6Lyngl?r1`=cLYqN!cp@$=_0S)g>nN-WMtps``1nn;NHS z>98dFB{9UZca+LoCtqqhXz|2Gz?MlOZgj!jOZJ;RFL{(&$<>h7HE_Zg+)t6{7jeI`O7dhRkKHFR&0sugwz=Q|@02kPt5M%Q) z0{}oA1lkar(1iTmgU*EA)K2Scfc3Fd-QV4;3hPkX?_4xCyr|F&hrxG5Mo*oYg@}y4 zJ<5krDhYccm9>khylEKE=|5(L4X8{_!-Z@UK3hlFzJJ~QqvN-6d-ieUYfMZ?VK-AE z>_$}#mxjW)+`HFeu5X~TN79PoI_P;Vw#zQW<_fU|RP+S^*u>_9=>N9`005QKl$k2U2SMb>h- zP7_@QiOSrd3$3EizD?^7+QK9xEa}j!lZ}m8K3rPRLC#EB6A3LIsQT@q3$HPOs_MmJ z(WFV@u(?7+U^W0CQP`Xi0RSLT1ggwiTjyCI9q>T<>awnyT&veY3rSWRj}%1#Og)vf z*nnK;u%{|&Aco0QF)0q=Vw!D3%>_}-4W=d%`dpaSAJlFkpzzSgoh@Us1wd3fy?1k% zEEr1MUSZnb_VyzGeaqvdnK=U~`3tI79$IqOdt3ChDI7006kky#0K!4QYto z)FSYaU)yKT#2iiQy}6hKi^{d&CMW;$AEG8{-W7e!(aG$)MKcV8$Cv^TOKPLU6Ug3{6^&vMn0;(XTST=b4(SWEK__W zys~lZh-VvJ5eO6H0B$Nrli!*Q?JrwcQw~A5L!fPJt`GqLAW>jK1OR{wFd+f}zy;if zIDTh=Y1b8vFV;F^0P^wTN*+`p9?uuhaOWs>vADl`d!kZvbw%a$5Sj8;j9G!00000 aG4em&s9bP9Gj+BA0000 CreativeModeTab.builder() .title(Component.translatable(s"itemGroup.${OpenComputers.Name}")) @@ -30,4 +37,52 @@ object CreativeTab { event.accept(OCItems.createChargedHoverBoots()) } } + + def renderBanners(screen: CreativeModeInventoryScreen, graphics: GuiGraphics, mouseX: Int, mouseY: Int): Unit = { + val ps = graphics.pose + ps.pushPose() + RenderSystem.enableDepthTest() + RenderSystem.setShaderColor(1, 1, 1, 1) + + val left = screen.asInstanceOf[AbstractContainerScreenAccess].getLeftPos + 8 + val top = screen.asInstanceOf[AbstractContainerScreenAccess].getTopPos + 17 + ps.translate(left, top, 0) + + val BannerWidth = 162 + val BannerHeight = 18 + val VisibleRows = 5 + + + for ((id, yValue) <- SECTION_Y_VALUES.asScala + if yValue >= CURRENT_ROW && yValue < CURRENT_ROW + VisibleRows) { + + val bannerTexture = ResourceLocation.fromNamespaceAndPath( + OpenComputers.ID, + s"textures/gui/banner.png" + ) + + //OpenComputers.log.warn("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + //OpenComputers.log.warn(bannerTexture) + + val y = (yValue - CURRENT_ROW) * BannerHeight + + graphics.blit( + bannerTexture, + 0, + y, + 0, + 0, + BannerWidth, + BannerHeight, + BannerWidth, + BannerHeight + ) + + val font = Minecraft.getInstance.font + graphics.drawString(font, Component.translatable(s"itemGroup.${OpenComputers.Name}.section.$id"), 8, y+6, 0x7, false) + } + + RenderSystem.disableDepthTest(); + ps.popPose(); + } } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/init/OCBlocks.scala b/src/main/scala/li/cil/oc/common/init/OCBlocks.scala index 18b7e947a0..5af392dbd3 100644 --- a/src/main/scala/li/cil/oc/common/init/OCBlocks.scala +++ b/src/main/scala/li/cil/oc/common/init/OCBlocks.scala @@ -46,7 +46,7 @@ object OCBlocks { val Printer: DeferredBlock[Printer] = BLOCKS.register(Constants.BlockName.Printer, () => Items.registerBlock(new Printer(defaultProps), Constants.BlockName.Printer, defaultItemProps,"25_components")) val Raid: DeferredBlock[Raid] = BLOCKS.register(Constants.BlockName.Raid, () => Items.registerBlock(new Raid(defaultProps), Constants.BlockName.Raid, defaultItemProps,"25_components")) val Redstone: DeferredBlock[Redstone] = BLOCKS.register(Constants.BlockName.Redstone, () => Items.registerBlock(new Redstone(defaultProps), Constants.BlockName.Redstone, defaultItemProps,"25_components")) - val Relay: DeferredBlock[Relay] = BLOCKS.register(Constants.BlockName.Relay, () => Items.registerBlock(new Relay(defaultProps), Constants.BlockName.Relay, defaultItemProps,"25_components")) + val Relay: DeferredBlock[Relay] = BLOCKS.register(Constants.BlockName.Relay, () => Items.registerBlock(new Relay(defaultProps), Constants.BlockName.Relay, defaultItemProps,"10_networking")) val ScreenTier1: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier1, () => Items.registerBlock(new Screen(defaultProps, Tier.One), Constants.BlockName.ScreenTier1, defaultItemProps,"25_components")) val ScreenTier2: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier2, () => Items.registerBlock(new Screen(defaultProps, Tier.Two), Constants.BlockName.ScreenTier2, defaultItemProps.rarity(Rarity.UNCOMMON),"25_components")) val ScreenTier3: DeferredBlock[Screen] = BLOCKS.register(Constants.BlockName.ScreenTier3, () => Items.registerBlock(new Screen(defaultProps, Tier.Three), Constants.BlockName.ScreenTier3, defaultItemProps.rarity(Rarity.RARE),"25_components")) diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index 11f468a9ae..2b7e5b2c16 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -31,6 +31,7 @@ import scala.jdk.CollectionConverters.CollectionHasAsScala object OCItems extends ItemAPI { private val ITEM_TO_SECTION = new util.HashMap[String, String] + var SECTION_Y_VALUES = new util.HashMap[String, Int] private val ITEMS: DeferredRegister.Items = DeferredRegister.createItems(Settings.resourceDomain) val descriptors = mutable.LinkedHashMap.empty[String, ItemInfo] @@ -574,6 +575,7 @@ object OCItems extends ItemAPI { displayItems.accept(ItemStack.EMPTY) } + SECTION_Y_VALUES.clear() var y = 0 val sectionKeys = sectionMap.keySet.asScala .filter(_ != null) @@ -589,7 +591,7 @@ object OCItems extends ItemAPI { itemCount += 1 } }) - //SECTION_Y_VALUES.put(key, y) + SECTION_Y_VALUES.put(key, y) val rowCount = Math.ceil(itemCount / 9.0f).toInt y += rowCount + 1 if (key.equals(sectionKeys.last)) return diff --git a/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala b/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala new file mode 100644 index 0000000000..04703c3409 --- /dev/null +++ b/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala @@ -0,0 +1,39 @@ +package li.cil.oc.mixin + +import li.cil.oc.CreativeTab +import li.cil.oc.mixin.accessor.CreativeModeInventoryScreenAccess +import net.minecraft.client.gui.GuiGraphics +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen +import org.spongepowered.asm.mixin.Mixin +import org.spongepowered.asm.mixin.injection.{At, Inject} +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo + +// Inspired by : +// https://github.com/Creators-of-Aeronautics/Simulated-Project/blob/main/simulated/common/src/main/java/dev/simulated_team/simulated/mixin/creative_tab_sections/CreativeModeInventoryScreenMixin.java +// On 09/08/26 under MIT Licence + +@Mixin(Array(classOf[CreativeModeInventoryScreen])) +class CreativeModeInventoryScreenMixin { + + @Inject( + method = Array("render"), + at = Array(new At("TAIL")) + ) + private def openComputers$render( + guiGraphics: GuiGraphics, + mouseX: Int, + mouseY: Int, + partialTick: Float, + ci: CallbackInfo + ): Unit = { + val tab = CreativeModeInventoryScreenAccess.selectedTab + if (tab eq CreativeTab.MAIN.get()) { + CreativeTab.renderBanners( + this.asInstanceOf[CreativeModeInventoryScreen], + guiGraphics, + mouseX, + mouseY + ) + } + } +} diff --git a/src/main/scala/li/cil/oc/mixin/CreativeModeTabMixin.scala b/src/main/scala/li/cil/oc/mixin/CreativeModeTabMixin.scala index 54794f68cc..52745b8dcc 100644 --- a/src/main/scala/li/cil/oc/mixin/CreativeModeTabMixin.scala +++ b/src/main/scala/li/cil/oc/mixin/CreativeModeTabMixin.scala @@ -9,6 +9,10 @@ import net.minecraft.world.item.ItemStack import org.spongepowered.asm.mixin.Mixin import org.spongepowered.asm.mixin.Shadow +// Inspired by : +// https://github.com/Creators-of-Aeronautics/Simulated-Project/blob/main/simulated/common/src/main/java/dev/simulated_team/simulated/mixin/creative_tab_sections/CreativeModeTabMixin.java +// On 09/08/26 under MIT Licence + import java.util diff --git a/src/main/scala/li/cil/oc/mixin/ItemPickerMenuMixin.scala b/src/main/scala/li/cil/oc/mixin/ItemPickerMenuMixin.scala new file mode 100644 index 0000000000..0b91bee5d0 --- /dev/null +++ b/src/main/scala/li/cil/oc/mixin/ItemPickerMenuMixin.scala @@ -0,0 +1,21 @@ +package li.cil.oc.mixin + + +import li.cil.oc.CreativeTab +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen +import org.spongepowered.asm.mixin.{Mixin, Shadow} +import org.spongepowered.asm.mixin.injection.{At, Inject} +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo + +@Mixin(Array(classOf[CreativeModeInventoryScreen.ItemPickerMenu])) +abstract class ItemPickerMenuMixin { + + @Shadow + protected def getRowIndexForScroll(f: Float): Int + + @Inject(method = Array("scrollTo"), at = Array(new At("HEAD"))) + private def simulated$scrollTo(f: Float, ci: CallbackInfo): Unit = { + CreativeTab.CURRENT_ROW = getRowIndexForScroll(f) + } +} + From 00e8f57f363308025d8a29b2028fc122487192ea Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:35:37 -0700 Subject: [PATCH 03/38] sneak-dbl click --- .../li/cil/oc/common/item/GraphicsCard.scala | 2 ++ .../oc/common/item/traits/SimpleItem.scala | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala b/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala index 1f1968d130..06ded1287d 100644 --- a/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala +++ b/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala @@ -6,6 +6,8 @@ import net.neoforged.neoforge.common.extensions.IItemExtension class GraphicsCard(props: Properties, val tier: Int) extends Item(props) with traits.SimpleItem with traits.ItemTier with traits.GPULike with IItemExtension { + override protected def supportsDoubleSneakClick = true + @Deprecated override def getDescriptionId = super.getDescriptionId + tier diff --git a/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala b/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala index 27e7adba5b..b29cfcdf0a 100644 --- a/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala +++ b/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala @@ -76,9 +76,21 @@ trait SimpleItem extends Item with api.driver.item.UpgradeRenderer with IItemExt @Deprecated def onItemUse(stack: ItemStack, player: Player, position: BlockPosition, side: Direction, hitX: Float, hitY: Float, hitZ: Float): Boolean = false + /** + * Opt in to the shared double sneak-right-click gesture handled by SimpleItem. + * Items only need to override this flag; the timing and action live here. + */ + protected def supportsDoubleSneakClick: Boolean = false + @Deprecated override def use(world: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = player.getItemInHand(hand) match { + case stack: ItemStack if supportsDoubleSneakClick && player.isShiftKeyDown => + if (!world.isClientSide && SimpleItem.registerSneakClick(player, hand, stack.getItem, world.getGameTime)) { + // Dummy action only. Replace this later with the real shared behavior. + player.sendSystemMessage(Component.literal("Double sneak-click detected.")) + } + new InteractionResultHolder(InteractionResult.sidedSuccess(world.isClientSide), stack) case stack: ItemStack => use(stack, world, player) case _ => super.use(world, player, hand) } @@ -129,3 +141,17 @@ trait SimpleItem extends Item with api.driver.item.UpgradeRenderer with IItemExt @OnlyIn(Dist.CLIENT) override def render(matrix: PoseStack, buffer: MultiBufferSource, light: Int, stack: ItemStack, mountPoint: MountPoint, robot: Robot, pt: Float): Unit = ItemUpgradeRenderer.render(matrix, buffer, light, stack, mountPoint) } + + +object SimpleItem { + private val DoubleSneakClickWindowTicks = 6L + private val lastSneakClicks = scala.collection.mutable.HashMap.empty[(java.util.UUID, InteractionHand, Item), Long] + + private def registerSneakClick(player: Player, hand: InteractionHand, item: Item, now: Long): Boolean = synchronized { + val key = (player.getUUID, hand, item) + val isDoubleClick = lastSneakClicks.get(key).exists(last => now - last > 0 && now - last <= DoubleSneakClickWindowTicks) + if (isDoubleClick) lastSneakClicks.remove(key) + else lastSneakClicks.update(key, now) + isDoubleClick + } +} From 51ea97d27c0d1f2965820385c3034e9546a95ad2 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Fri, 7 Aug 2026 16:33:41 -0700 Subject: [PATCH 04/38] Complete the double-sneak-click system. --- .../li/cil/oc/common/item/GraphicsCard.scala | 2 +- .../cil/oc/common/item/QuadGraphicsCard.scala | 4 ++- .../oc/common/item/traits/SimpleItem.scala | 32 +++++++++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala b/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala index 06ded1287d..be783278bf 100644 --- a/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala +++ b/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala @@ -6,7 +6,7 @@ import net.neoforged.neoforge.common.extensions.IItemExtension class GraphicsCard(props: Properties, val tier: Int) extends Item(props) with traits.SimpleItem with traits.ItemTier with traits.GPULike with IItemExtension { - override protected def supportsDoubleSneakClick = true + override protected def canResetComponentIdentity = true @Deprecated override def getDescriptionId = super.getDescriptionId + tier diff --git a/src/main/scala/li/cil/oc/common/item/QuadGraphicsCard.scala b/src/main/scala/li/cil/oc/common/item/QuadGraphicsCard.scala index 8ba423f2f0..b049852463 100644 --- a/src/main/scala/li/cil/oc/common/item/QuadGraphicsCard.scala +++ b/src/main/scala/li/cil/oc/common/item/QuadGraphicsCard.scala @@ -4,4 +4,6 @@ import net.minecraft.world.item.Item import net.minecraft.world.item.Item.Properties import net.neoforged.neoforge.common.extensions.IItemExtension -class QuadGraphicsCard(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension +class QuadGraphicsCard(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension { + override protected def canResetComponentIdentity = true +} diff --git a/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala b/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala index b29cfcdf0a..8d43764265 100644 --- a/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala +++ b/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala @@ -1,6 +1,7 @@ package li.cil.oc.common.item.traits import java.util + import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.api.event.RobotRenderEvent.MountPoint @@ -31,6 +32,7 @@ import li.cil.oc.util.ExtendedDataComponentHolder._ import net.minecraft.core.component.DataComponents import net.minecraft.world.item.Item.TooltipContext import net.neoforged.neoforge.common.extensions.IItemExtension +import li.cil.oc.common.datacomponents.OCComponents trait SimpleItem extends Item with api.driver.item.UpgradeRenderer with IItemExtension { def createItemStack(amount: Int = 1) = new ItemStack(this, amount) @@ -80,23 +82,32 @@ trait SimpleItem extends Item with api.driver.item.UpgradeRenderer with IItemExt * Opt in to the shared double sneak-right-click gesture handled by SimpleItem. * Items only need to override this flag; the timing and action live here. */ - protected def supportsDoubleSneakClick: Boolean = false + protected def canResetComponentIdentity: Boolean = false @Deprecated override def use(world: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = player.getItemInHand(hand) match { - case stack: ItemStack if supportsDoubleSneakClick && player.isShiftKeyDown => - if (!world.isClientSide && SimpleItem.registerSneakClick(player, hand, stack.getItem, world.getGameTime)) { - // Dummy action only. Replace this later with the real shared behavior. - player.sendSystemMessage(Component.literal("Double sneak-click detected.")) + case stack: ItemStack if canResetComponentIdentity && player.isShiftKeyDown => + if (!world.isClientSide) { + if (SimpleItem.registerSneakClick(player, hand, stack.getItem, world.getGameTime)) { + stack.remove(OCComponents.ADDRESS.get()) + stack.remove(OCComponents.VISIBILITY.get()) + + player.displayClientMessage(Component.literal("Component UUID reset."), true) + } + else { + player.displayClientMessage(Component.literal("Double click quickly to reset"), true) + } } new InteractionResultHolder(InteractionResult.sidedSuccess(world.isClientSide), stack) + case stack: ItemStack => use(stack, world, player) case _ => super.use(world, player, hand) } @Deprecated - def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = new InteractionResultHolder(InteractionResult.PASS, stack) + def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = + new InteractionResultHolder(InteractionResult.PASS, stack) protected def tierFromDriver(stack: ItemStack): Int = api.Driver.driverFor(stack) match { @@ -136,13 +147,14 @@ trait SimpleItem extends Item with api.driver.item.UpgradeRenderer with IItemExt // ----------------------------------------------------------------------- // - override def computePreferredMountPoint(stack: ItemStack, robot: Robot, availableMountPoints: util.Set[String]): String = ItemUpgradeRenderer.preferredMountPoint(stack, availableMountPoints) + override def computePreferredMountPoint(stack: ItemStack, robot: Robot, availableMountPoints: util.Set[String]): String = + ItemUpgradeRenderer.preferredMountPoint(stack, availableMountPoints) @OnlyIn(Dist.CLIENT) - override def render(matrix: PoseStack, buffer: MultiBufferSource, light: Int, stack: ItemStack, mountPoint: MountPoint, robot: Robot, pt: Float): Unit = ItemUpgradeRenderer.render(matrix, buffer, light, stack, mountPoint) + override def render(matrix: PoseStack, buffer: MultiBufferSource, light: Int, stack: ItemStack, mountPoint: MountPoint, robot: Robot, pt: Float): Unit = + ItemUpgradeRenderer.render(matrix, buffer, light, stack, mountPoint) } - object SimpleItem { private val DoubleSneakClickWindowTicks = 6L private val lastSneakClicks = scala.collection.mutable.HashMap.empty[(java.util.UUID, InteractionHand, Item), Long] @@ -150,8 +162,10 @@ object SimpleItem { private def registerSneakClick(player: Player, hand: InteractionHand, item: Item, now: Long): Boolean = synchronized { val key = (player.getUUID, hand, item) val isDoubleClick = lastSneakClicks.get(key).exists(last => now - last > 0 && now - last <= DoubleSneakClickWindowTicks) + if (isDoubleClick) lastSneakClicks.remove(key) else lastSneakClicks.update(key, now) + isDoubleClick } } From 46f7bb8a3fed8583ca85509350c2bab23d5ef65f Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Fri, 7 Aug 2026 17:02:29 -0700 Subject: [PATCH 05/38] Support? Create movement? --- .../li/cil/oc/common/block/SimpleBlock.scala | 31 +++- .../common/blockentity/traits/Rotatable.scala | 4 + .../create/CreateContraptionTransformers.java | 173 ++++++++++++++++++ .../cil/oc/integration/create/ModCreate.scala | 1 + 4 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java diff --git a/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala b/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala index 9079ac73cd..978dcc2630 100644 --- a/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala +++ b/src/main/scala/li/cil/oc/common/block/SimpleBlock.scala @@ -7,12 +7,13 @@ import li.cil.oc.common.blockentity import li.cil.oc.common.blockentity.traits.Colored import li.cil.oc.common.blockentity.traits.Inventory import li.cil.oc.common.blockentity.traits.Rotatable +import li.cil.oc.common.block.property.PropertyRotatable import li.cil.oc.server.loot.LootFunctions import li.cil.oc.util.Color import li.cil.oc.util.Tooltip import net.minecraft.world.level.block.state.BlockBehaviour.Properties import net.minecraft.world.level.block.state.BlockState -import net.minecraft.world.level.block.{Block, BaseEntityBlock => ContainerBlock, RenderShape => BlockRenderType} +import net.minecraft.world.level.block.{Block, BaseEntityBlock => ContainerBlock, Mirror, RenderShape => BlockRenderType, Rotation} import net.minecraft.world.item.{TooltipFlag => ITooltipFlag, Item} import net.minecraft.world.entity.Entity import net.minecraft.world.entity.player.{Player => PlayerEntity} @@ -112,6 +113,34 @@ abstract class SimpleBlock(props: Properties) extends ContainerBlock(props) { override def canHarvestBlock(state: BlockState, world: BlockGetter, pos: BlockPos, player: PlayerEntity) = true override def canBeReplaced(state: BlockState, ctx: BlockPlaceContext): Boolean = false + + /** + * Vanilla/Create transform block states directly. This is separate from the + * legacy wrench path below, which rotates the block entity in-place. + */ + @SuppressWarnings(Array("deprecation")) + override protected def rotate(state: BlockState, rotation: Rotation): BlockState = { + var result = state + if (state.hasProperty(PropertyRotatable.Facing)) { + result = result.setValue(PropertyRotatable.Facing, rotation.rotate(state.getValue(PropertyRotatable.Facing))) + } + if (state.hasProperty(PropertyRotatable.Yaw)) { + result = result.setValue(PropertyRotatable.Yaw, rotation.rotate(state.getValue(PropertyRotatable.Yaw))) + } + result + } + + @SuppressWarnings(Array("deprecation")) + override protected def mirror(state: BlockState, mirror: Mirror): BlockState = { + var result = state + if (state.hasProperty(PropertyRotatable.Facing)) { + result = result.setValue(PropertyRotatable.Facing, mirror.mirror(state.getValue(PropertyRotatable.Facing))) + } + if (state.hasProperty(PropertyRotatable.Yaw)) { + result = result.setValue(PropertyRotatable.Yaw, mirror.mirror(state.getValue(PropertyRotatable.Yaw))) + } + result + } def getValidRotations(world: World, pos: BlockPos): Array[Direction] = validRotations_ diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/Rotatable.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/Rotatable.scala index a629bc031b..c4f2d39130 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/Rotatable.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/Rotatable.scala @@ -62,6 +62,10 @@ trait Rotatable extends RotationAware with internal.Rotatable { trySetPitchYaw(Direction.NORTH, yaw) } + /** Public bridge for integrations that transform a block entity off-world. */ + def setFromPitchAndYaw(newPitch: Direction, newYaw: Direction): Boolean = + trySetPitchYaw(newPitch, newYaw) + def invertRotation() = trySetPitchYaw(pitch match { case Direction.DOWN | Direction.UP => pitch.getOpposite diff --git a/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java b/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java new file mode 100644 index 0000000000..106cb7f248 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java @@ -0,0 +1,173 @@ +package li.cil.oc.integration.create; + +import com.simibubi.create.api.contraption.transformable.MovedBlockTransformerRegistries; +import com.simibubi.create.content.contraptions.StructureTransform; +import li.cil.oc.common.block.SimpleBlock; +import li.cil.oc.common.blockentity.BlockEntityTypes; +import li.cil.oc.common.blockentity.traits.Rotatable; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; + +/** Create transformations for OC blocks. This got a bit out of hand. */ +final class CreateContraptionTransformers { + private static final String PITCH = "pitch"; + private static final String YAW = "yaw"; + private static final String FACING = "facing"; + private static final String MOUNT = "mount"; + + private CreateContraptionTransformers() { + } + + static void register() { + // I tried to make a list of these. The registry loop was less typing. + // Maybe this works. + for (Block block : BuiltInRegistries.BLOCK) { + if (block instanceof SimpleBlock) { + MovedBlockTransformerRegistries.BLOCK_TRANSFORMERS.register( + block, CreateContraptionTransformers::transformBlock); + } + } + + registerBlockEntity(BlockEntityTypes.HOLOGRAM.get()); + registerBlockEntity(BlockEntityTypes.PRINT.get()); + registerBlockEntity(BlockEntityTypes.ROBOT.get()); + } + + private static void registerBlockEntity(final BlockEntityType type) { + MovedBlockTransformerRegistries.BLOCK_ENTITY_TRANSFORMERS.register( + type, CreateContraptionTransformers::transformBlockEntity); + } + + static BlockState transformBlock(final BlockState state, final StructureTransform transform) { + Direction pitch = getDirection(state, PITCH); + Direction yaw = getDirection(state, YAW); + if (pitch != null && yaw != null) { + return transformPitchAndYaw(state, pitch, yaw, transform); + } + + Direction facing = getDirection(state, FACING); + if (facing != null) { + Direction transformed = transformDirection(facing, transform); + if (hasDirection(state, FACING, transformed)) { + return setDirection(state, FACING, transformed); + } + } + + Direction mount = getDirection(state, MOUNT); + if (mount != null) { + Direction transformed = transformDirection(mount, transform); + if (hasDirection(state, MOUNT, transformed)) { + return setDirection(state, MOUNT, transformed); + } + } + + return state; + } + + private static BlockState transformPitchAndYaw(final BlockState state, final Direction pitch, + final Direction yaw, final StructureTransform transform) { + // Pitch is either actually pitch or NORTH pretending not to be pitch. + // Hmmm. Like this? + Direction forward = yaw; + Direction up = Direction.UP; + if (pitch.getAxis().isVertical()) { + forward = pitch; + up = yaw; + } + forward = transformDirection(forward, transform); + up = transformDirection(up, transform); + + if (forward.getAxis().isVertical()) { + BlockState result = setDirection(state, PITCH, forward); + if (hasDirection(result, YAW, up)) { + result = setDirection(result, YAW, up); + } + return result; + } + + // PropertyRotatable.Pitch only allows UP, DOWN, or NORTH. Horizontal + // orientation lives in Yaw, so NORTH is the "no pitch" sentinel here. + // FUCK YOU MINECRAFT! Why is NORTH the "not really pitch" direction? + BlockState result = setDirection(state, PITCH, Direction.NORTH); + if (hasDirection(result, YAW, forward)) { + result = setDirection(result, YAW, forward); + } + return result; + } + + private static Direction transformDirection(final Direction direction, final StructureTransform transform) { + Direction result = direction; + if (transform.mirror != null && transform.mirror != Mirror.NONE) { + result = transform.mirrorFacing(result); + } + // Create calls this with Rotation.NONE sometimes, which is fine. + if (transform.rotation != null && transform.rotationAxis != null + && transform.rotation.ordinal() != 0) { + result = transform.rotateFacing(result); + } + return result; + } + + private static void transformBlockEntity(final BlockEntity blockEntity, final StructureTransform transform) { + if (!(blockEntity instanceof Rotatable rotatable)) { + return; + } + + Direction oldPitch = rotatable.pitch(); + Direction oldYaw = rotatable.yaw(); + Direction forward = oldYaw; + Direction up = Direction.UP; + if (oldPitch.getAxis().isVertical()) { + forward = oldPitch; + up = oldYaw; + } + forward = transformDirection(forward, transform); + up = transformDirection(up, transform); + + // There is probably a nicer way to do this. This is the way that is + // least likely to make the old block orientation code angry. + if (forward.getAxis().isVertical()) { + rotatable.setFromPitchAndYaw(forward, + up.getAxis().isHorizontal() ? up : oldYaw); + } else { + rotatable.setFromPitchAndYaw(Direction.NORTH, forward); + } + } + + private static Direction getDirection(final BlockState state, final String name) { + final Property property = findProperty(state, name); + if (property == null) { + return null; + } + return state.getValue(directionProperty(property)); + } + + private static boolean hasDirection(final BlockState state, final String name, final Direction value) { + final Property property = findProperty(state, name); + return property != null && property.getPossibleValues().contains(value); + } + + private static BlockState setDirection(final BlockState state, final String name, final Direction value) { + return state.setValue(directionProperty(findProperty(state, name)), value); + } + + private static Property findProperty(final BlockState state, final String name) { + for (Property property : state.getProperties()) { + if (property.getName().equals(name)) { + return property; + } + } + return null; + } + + @SuppressWarnings("unchecked") + private static Property directionProperty(final Property property) { + return (Property) property; + } +} diff --git a/src/main/scala/li/cil/oc/integration/create/ModCreate.scala b/src/main/scala/li/cil/oc/integration/create/ModCreate.scala index 1b0c3e761e..63d9008779 100644 --- a/src/main/scala/li/cil/oc/integration/create/ModCreate.scala +++ b/src/main/scala/li/cil/oc/integration/create/ModCreate.scala @@ -6,6 +6,7 @@ object ModCreate extends ModProxy { override def getMod = Mods.Create override def initialize(): Unit = { + CreateContraptionTransformers.register() CreateDrivers.register() } } From 35c3cdd8a40902fbbb72c3a70f06099d919abf11 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Fri, 7 Aug 2026 19:27:23 -0700 Subject: [PATCH 06/38] Fix fan sound being heard everywhere. Fixes #32 --- src/main/resources/assets/opencomputers/sounds.json | 4 ++-- src/main/scala/li/cil/oc/client/Sound.scala | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/opencomputers/sounds.json b/src/main/resources/assets/opencomputers/sounds.json index 727dadf9b5..b34931a284 100644 --- a/src/main/resources/assets/opencomputers/sounds.json +++ b/src/main/resources/assets/opencomputers/sounds.json @@ -2,7 +2,7 @@ "computer_running": { "category": "block", "sounds": [ - {"name": "opencomputers:computer_running", "stream": true} + {"name": "opencomputers:computer_running", "stream": false} ] }, "floppy_access": { @@ -40,4 +40,4 @@ {"name": "opencomputers:hdd_access7", "preload": true} ] } -} \ No newline at end of file +} diff --git a/src/main/scala/li/cil/oc/client/Sound.scala b/src/main/scala/li/cil/oc/client/Sound.scala index b042da10e0..1af9aba368 100644 --- a/src/main/scala/li/cil/oc/client/Sound.scala +++ b/src/main/scala/li/cil/oc/client/Sound.scala @@ -148,7 +148,9 @@ object Sound { var stopped = false volume = subVolume * Settings.get.soundVolume - relative = blockEntity.get.isDefined + // Computer running sounds are world-positioned and must attenuate with + // distance. Relative sounds are listener-relative and bypass world range. + relative = false looping = true updatePosition() From cb084860889dcb2e1fb1c9be2d04073117b08100 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Fri, 7 Aug 2026 19:27:36 -0700 Subject: [PATCH 07/38] Create contraption support. --- build.gradle | 4 + .../blockentity/traits/BaseBlockEntity.scala | 51 ++++ .../common/blockentity/traits/Computer.scala | 18 +- .../blockentity/traits/Environment.scala | 26 +- .../common/blockentity/traits/Inventory.scala | 3 +- .../blockentity/traits/RedstoneAware.scala | 21 +- .../common/blockentity/traits/Rotatable.scala | 11 +- .../blockentity/traits/TextBuffer.scala | 34 +++ .../cil/oc/common/component/TextBuffer.scala | 32 +- .../create/CreateContraptionTransformers.java | 274 +++++++++++++++++- .../li/cil/oc/server/PacketHandler.scala | 4 +- 11 files changed, 461 insertions(+), 17 deletions(-) diff --git a/build.gradle b/build.gradle index e0274f309f..02be3928a7 100644 --- a/build.gradle +++ b/build.gradle @@ -246,6 +246,10 @@ dependencies { // Create implementation("com.simibubi.create:create-${minecraft_version}:${create_version}:slim") { transitive = false } implementation("net.createmod.ponder:ponder-neoforge:${ponder_version}+mc${minecraft_version}") + // Create's MovementBehaviour API exposes Registrate's NonNullConsumer in + // a method signature. Keep it available while compiling the optional OC + // Create bridge as well as at dev-runtime. + compileOnly("com.tterrag.registrate:Registrate:${registrate_version}") runtimeOnly("dev.engine-room.flywheel:flywheel-neoforge-${minecraft_version}:${flywheel_version}") runtimeOnly("com.tterrag.registrate:Registrate:${registrate_version}") compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")) diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala index f2fa58558a..5beed3df4d 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala @@ -7,6 +7,7 @@ import li.cil.oc.client.Sound import li.cil.oc.common.SaveHandler import li.cil.oc.util.{BlockPosition, SideTracker} import net.minecraft.core.HolderLookup +import net.minecraft.core.{BlockPos, Direction} import net.minecraft.core.component.{DataComponentHolder, DataComponentMap, DataComponentPatch, DataComponentType, PatchedDataComponentMap} import net.minecraft.nbt.{CompoundTag, NbtOps} import net.minecraft.network.Connection @@ -14,10 +15,60 @@ import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket import net.neoforged.api.distmarker.{Dist, OnlyIn} import net.neoforged.neoforge.client.model.data.ModelProperty import net.neoforged.neoforge.common.MutableDataComponentHolder +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.phys.Vec3 + +import java.util.function.UnaryOperator trait BaseBlockEntity extends net.minecraft.world.level.block.entity.BlockEntity { private final val IsServerDataTag = Settings.namespace + "isServerData" + // Create keeps captured block entities off-world while a contraption moves. + // These helpers live here because Rotatable and RedstoneAware are sibling + // traits, not children of Environment. + protected var movingLevel: Level = null + protected var movingPosition: Vec3 = null + protected var movingRotation: UnaryOperator[Vec3] = null + protected var movingState: BlockState = null + + def isMoving: Boolean = movingPosition != null + + def beginMoving(level: Level, position: Vec3, rotation: UnaryOperator[Vec3], state: BlockState): Unit = { + movingLevel = level + movingPosition = position + movingRotation = rotation + movingState = state + initialize() + } + + def updateMovingPosition(position: Vec3, rotation: UnaryOperator[Vec3], state: BlockState): Unit = { + movingPosition = position + movingRotation = rotation + movingState = state + } + + def movingBlockPos: BlockPos = if (movingPosition == null) getBlockPos else BlockPos.containing(movingPosition) + + def movingBlockState: BlockState = if (movingState == null) getBlockState else movingState + + def movingDirection(side: Direction): Direction = { + if (movingRotation == null) side + else { + val vector = movingRotation.apply(new Vec3(side.getStepX, side.getStepY, side.getStepZ)) + Direction.getNearest(vector.x, vector.y, vector.z) + } + } + + def movingNeighbor(side: Direction): BlockPos = movingBlockPos.relative(movingDirection(side)) + + def endMoving(): Unit = { + movingLevel = null + movingPosition = null + movingRotation = null + movingState = null + } + def x: Int = getBlockPos.getX def y: Int = getBlockPos.getY diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala index 09664dd791..84320377ce 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala @@ -61,7 +61,7 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B if (value) { hasErrored = false } - if (getLevel != null) { + if (getLevel != null && !isMoving) { getLevel.sendBlockUpdated(getBlockPos, getLevel.getBlockState(getBlockPos), getLevel.getBlockState(getBlockPos), 3) if (getLevel.isClientSide) { runSound.foreach(sound => @@ -132,6 +132,22 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B machine.update() } + /** Used by the optional Create integration while this block entity is off-world. */ + def tickMoving(): Unit = updateEntity() + + /** Save the live machine/component state back into Create's captured NBT. */ + override def saveMovingState(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = saveAdditional(nbt, provider) + + /** Dispose the temporary machine and its component nodes before reassembly. */ + override def disposeMoving(): Unit = { + disconnectComponents() + // Do not call machine.stop() here. That only queues a deferred close, + // while Create is about to throw this temporary host away. Removing the + // machine node closes it synchronously and avoids the old fake host + // waking up after the real block entity has been rebuilt. + super.disposeMoving() + } + protected def onRunningChanged(): Unit = { setChanged() ServerPacketSender.sendComputerState(this) diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/Environment.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/Environment.scala index 1b818e39c9..dbed4ed23c 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/Environment.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/Environment.scala @@ -14,13 +14,29 @@ import net.neoforged.neoforge.client.model.data.{ModelData, ModelProperty} trait Environment extends BaseBlockEntity with network.Environment with network.EnvironmentHost { protected var isChangeScheduled = false - override def getEnvironmentLevel: Level = getLevel + override def getEnvironmentLevel: Level = if (movingLevel != null) movingLevel else getLevel - override def xPosition: Double = x + 0.5 + override def xPosition: Double = if (movingPosition != null) movingPosition.x else x + 0.5 - override def yPosition: Double = y + 0.5 + override def yPosition: Double = if (movingPosition != null) movingPosition.y else y + 0.5 - override def zPosition: Double = z + 0.5 + override def zPosition: Double = if (movingPosition != null) movingPosition.z else z + 0.5 + + /** Save a captured environment while Create still owns its off-world NBT. */ + def saveMovingState(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = saveAdditional(nbt, provider) + + /** Remove the temporary OC node before Create places the real block entity. */ + def disposeMoving(): Unit = { + Option(node).foreach(_.remove()) + this match { + case sidedEnvironment: SidedEnvironment => + for (side <- Direction.values) { + Option(sidedEnvironment.sidedNode(side)).foreach(_.remove()) + } + case _ => + } + endMoving() + } override def markChanged(): Unit = if (this.isInstanceOf[Tickable]) isChangeScheduled = true else this.setChanged() @@ -30,7 +46,7 @@ trait Environment extends BaseBlockEntity with network.Environment with network. override protected def initialize(): Unit = { super.initialize() - if (isServer) { + if (isServer && !isMoving) { EventHandler.scheduleServer(this) } } diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/Inventory.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/Inventory.scala index bf35324908..3c948dcce6 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/Inventory.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/Inventory.scala @@ -71,7 +71,8 @@ trait Inventory extends BaseBlockEntity with container.Inventory { // ----------------------------------------------------------------------- // override def stillValid(player: Player) = - player.distanceToSqr(x + 0.5, y + 0.5, z + 0.5) <= 64 + if (isMoving) player.distanceToSqr(movingPosition.x, movingPosition.y, movingPosition.z) <= 64 + else player.distanceToSqr(x + 0.5, y + 0.5, z + 0.5) <= 64 // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/RedstoneAware.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/RedstoneAware.scala index 64aafd5833..8b265818ca 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/RedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/RedstoneAware.scala @@ -132,7 +132,13 @@ trait RedstoneAware extends RotationAware { } } - def updateRedstoneInput(side: Direction): Unit = setInput(side, BundledRedstone.computeInput(position, side)) + def updateRedstoneInput(side: Direction): Unit = { + val inputPosition = if (isMoving) { + li.cil.oc.util.BlockPosition(movingBlockPos, getLevel) + } else position + val inputSide = if (isMoving) movingDirection(side) else side + setInput(side, BundledRedstone.computeInput(inputPosition, inputSide)) + } // ----------------------------------------------------------------------- // @@ -171,16 +177,21 @@ trait RedstoneAware extends RotationAware { protected def onRedstoneOutputEnabledChanged(): Unit = { if (getLevel != null) { - getLevel.updateNeighborsAt(getBlockPos, getBlockState.getBlock) + val blockPos = if (isMoving) movingBlockPos else getBlockPos + val block = if (isMoving) movingBlockState.getBlock else getBlockState.getBlock + getLevel.updateNeighborsAt(blockPos, block) if (isServer) ServerPacketSender.sendRedstoneState(this) else getLevel.sendBlockUpdated(getBlockPos, getLevel.getBlockState(getBlockPos), getLevel.getBlockState(getBlockPos), 3) } } protected def onRedstoneOutputChanged(side: Direction): Unit = { - val blockPos = BlockPosHelper.relative(getBlockPos, side) - getLevel.neighborChanged(blockPos, getBlockState.getBlock, blockPos) - getLevel.updateNeighborsAtExceptFromFacing(blockPos, getLevel.getBlockState(blockPos).getBlock, side.getOpposite) + val sourcePos = if (isMoving) movingBlockPos else getBlockPos + val sourceBlock = if (isMoving) movingBlockState.getBlock else getBlockState.getBlock + val outputSide = if (isMoving) movingDirection(side) else side + val blockPos = if (isMoving) movingNeighbor(side) else BlockPosHelper.relative(sourcePos, side) + getLevel.neighborChanged(blockPos, sourceBlock, sourcePos) + getLevel.updateNeighborsAtExceptFromFacing(blockPos, getLevel.getBlockState(blockPos).getBlock, outputSide.getOpposite) if (isServer) ServerPacketSender.sendRedstoneState(this) else getLevel.sendBlockUpdated(getBlockPos, getLevel.getBlockState(getBlockPos), getLevel.getBlockState(getBlockPos), 3) diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/Rotatable.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/Rotatable.scala index c4f2d39130..52f13bb30f 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/Rotatable.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/Rotatable.scala @@ -26,7 +26,10 @@ trait Rotatable extends RotationAware with internal.Rotatable { // Accessors // ----------------------------------------------------------------------- // - def pitch = if (getLevel != null && getLevel.isLoaded(getBlockPos)) getLevel.getBlockState(getBlockPos) match { + def pitch = if (isMoving) movingBlockState match { + case rotatable if rotatable.getProperties.contains(PropertyRotatable.Pitch) => rotatable.getValue(PropertyRotatable.Pitch) + case _ => Direction.NORTH + } else if (getLevel != null && getLevel.isLoaded(getBlockPos)) getLevel.getBlockState(getBlockPos) match { case rotatable if rotatable.getProperties.contains(PropertyRotatable.Pitch) => rotatable.getValue(PropertyRotatable.Pitch) case _ => Direction.NORTH } else null @@ -37,7 +40,11 @@ trait Rotatable extends RotationAware with internal.Rotatable { case _ => Direction.NORTH }, yaw) - def yaw = if (getLevel != null && getLevel.isLoaded(getBlockPos)) getLevel.getBlockState(getBlockPos) match { + def yaw = if (isMoving) movingBlockState match { + case rotatable if rotatable.getProperties.contains(PropertyRotatable.Yaw) => rotatable.getValue(PropertyRotatable.Yaw) + case rotatable if rotatable.getProperties.contains(PropertyRotatable.Facing) => rotatable.getValue(PropertyRotatable.Facing) + case _ => Direction.SOUTH + } else if (getLevel != null && getLevel.isLoaded(getBlockPos)) getLevel.getBlockState(getBlockPos) match { case rotatable if rotatable.getProperties.contains(PropertyRotatable.Yaw) => rotatable.getValue(PropertyRotatable.Yaw) case rotatable if rotatable.getProperties.contains(PropertyRotatable.Facing) => rotatable.getValue(PropertyRotatable.Facing) case _ => Direction.SOUTH diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala index 8151d11d80..44f796fc78 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala @@ -7,13 +7,16 @@ import li.cil.oc.api.internal import li.cil.oc.api.network.Node import li.cil.oc.common.datacomponents.CompoundStorage import net.minecraft.core.HolderLookup +import net.minecraft.core.component.DataComponentHolder import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn import net.minecraft.nbt.{CompoundTag, NbtOps} +import net.minecraft.world.level.Level trait TextBuffer extends Environment with Tickable { private final val ClientBufferComponentsTag = Settings.namespace + "clientBufferComponents" private var pendingServerBufferData: CompoundTag = _ + private var movingClientLevel: Level = _ lazy val buffer: internal.TextBuffer = { val screenItem = api.Items.get(Constants.BlockName.ScreenTier1).createItemStack(1) val buffer = api.Driver.driverFor(screenItem, getClass).createEnvironment(screenItem, this).asInstanceOf[api.internal.TextBuffer] @@ -35,6 +38,21 @@ trait TextBuffer extends Environment with Tickable { } } + /** Create renders captured screens in a virtual level, but packets use the real client level. */ + def registerMovingClientBuffer(level: Level): Unit = buffer match { + case moving: li.cil.oc.common.component.TextBuffer => + movingClientLevel = level + moving.registerClientBufferOnLevel(level) + case _ => + } + + def unregisterMovingClientBuffer(): Unit = buffer match { + case moving: li.cil.oc.common.component.TextBuffer if movingClientLevel != null => + moving.unregisterClientBufferOnLevel(movingClientLevel) + movingClientLevel = null + case _ => + } + // ----------------------------------------------------------------------- // private def reapplyTierToBuffer(): Unit = { @@ -50,6 +68,22 @@ trait TextBuffer extends Environment with Tickable { buffer.setMaximumColorDepth(Settings.screenDepthsByTier(tier)) } + override def loadComponentsForClient(holder: DataComponentHolder): Unit = { + super.loadComponentsForClient(holder) + // BaseBlockEntity loads the legacy/client NBT before it loads OC's + // components, so tier still has the constructor default during loadForClient. + // Do this again after Screen.loadComponentsCommon has supplied the real tier. + reapplyTierToBuffer() + } + + override def loadComponentsForServer(holder: DataComponentHolder): Unit = { + super.loadComponentsForServer(holder) + // The moving Screen is reconstructed from Create's NBT just like a client + // render Screen: component loading supplies its real tier after the buffer + // may already have been forced by loadForServer. + reapplyTierToBuffer() + } + override def loadForServer(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.loadForServer(nbt, provider) // BlockEntity.loadStatic calls loadWithComponents/loadAdditional before it diff --git a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala index a0b70cd5ee..2f85020fdc 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -27,6 +27,7 @@ import net.minecraft.world.InteractionHand import net.minecraft.world.entity.player.Player import net.minecraft.world.item.component.CustomData import net.minecraft.world.level.ChunkPos +import net.minecraft.world.level.Level import net.neoforged.api.distmarker.{Dist, OnlyIn} import net.neoforged.bus.api.SubscribeEvent import net.neoforged.neoforge.common.MutableDataComponentHolder @@ -108,6 +109,14 @@ class TextBuffer(val host: EnvironmentHost) extends AbstractManagedEnvironment w if (!isInitialized) TextBuffer.registerClientBuffer(this) } + /** Register a captured Create screen with the real client world. */ + def registerClientBufferOnLevel(level: Level): Unit = + TextBuffer.registerClientBuffer(this, level) + + /** Remove a captured Create screen from the client tracker after disassembly. */ + def unregisterClientBufferOnLevel(level: Level): Unit = + TextBuffer.unregisterClientBuffer(this, level) + def isInitialized: Boolean = syncCooldown < 0 private final lazy val deviceInfo = Map( @@ -556,9 +565,19 @@ object TextBuffer { } def registerClientBuffer(t: TextBuffer): Unit = { - val level = t.host.getEnvironmentLevel + registerClientBuffer(t, t.host.getEnvironmentLevel) + } + + def registerClientBuffer(t: TextBuffer, level: Level): Unit = { if (level == null || Strings.isNullOrEmpty(t.proxy.nodeAddress)) return + // Captured block entities initially register against Create's virtual + // render level. Move the same buffer to the real client level instead. + val hostLevel = t.host.getEnvironmentLevel + if (hostLevel != null && hostLevel != level) { + ClientComponentTracker.remove(hostLevel, t) + } + // Re-applying component data during chunk/menu synchronization must not // leave duplicate/stale client buffer registrations behind. ClientComponentTracker.remove(level, t) @@ -571,6 +590,17 @@ object TextBuffer { ClientPacketSender.sendTextBufferInit(t.proxy.nodeAddress) } + def unregisterClientBuffer(t: TextBuffer, level: Level): Unit = { + if (level == null) return + + ClientComponentTracker.remove(level, t) + val hostLevel = t.host.getEnvironmentLevel + if (hostLevel != null && hostLevel != level) { + ClientComponentTracker.remove(hostLevel, t) + } + clientBuffers -= t + } + abstract class Proxy { def owner: TextBuffer diff --git a/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java b/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java index 106cb7f248..4bdcc82086 100644 --- a/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java +++ b/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java @@ -1,18 +1,45 @@ package li.cil.oc.integration.create; import com.simibubi.create.api.contraption.transformable.MovedBlockTransformerRegistries; +import com.simibubi.create.api.behaviour.movement.MovementBehaviour; +import com.simibubi.create.api.behaviour.interaction.MovingInteractionBehaviour; +import com.simibubi.create.content.contraptions.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.StructureTransform; +import li.cil.oc.api.Network; +import li.cil.oc.common.block.Case; +import li.cil.oc.common.block.Cable; +import li.cil.oc.common.block.Keyboard; +import li.cil.oc.common.block.Microcontroller; +import li.cil.oc.common.block.Redstone; +import li.cil.oc.common.block.RobotProxy; +import li.cil.oc.common.block.Screen; import li.cil.oc.common.block.SimpleBlock; import li.cil.oc.common.blockentity.BlockEntityTypes; +import li.cil.oc.common.blockentity.traits.Computer; +import li.cil.oc.common.blockentity.traits.Environment; +import li.cil.oc.common.blockentity.traits.RedstoneAware; import li.cil.oc.common.blockentity.traits.Rotatable; +import li.cil.oc.common.blockentity.traits.Tickable; +import li.cil.oc.common.menu.MenuTypes; +import li.cil.oc.util.BlockPosHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; +import net.minecraft.world.phys.Vec3; /** Create transformations for OC blocks. This got a bit out of hand. */ final class CreateContraptionTransformers { @@ -32,6 +59,19 @@ static void register() { MovedBlockTransformerRegistries.BLOCK_TRANSFORMERS.register( block, CreateContraptionTransformers::transformBlock); } + if (block instanceof Case || block instanceof Microcontroller || block instanceof RobotProxy + || block instanceof Cable || block instanceof Redstone || block instanceof Screen + || block instanceof Keyboard) { + // This is the part where the computer gets dragged into Create's actor system. + // Maybe this works. + MovementBehaviour.REGISTRY.register(block, OC_MOVEMENT); + } + if (block instanceof Case || block instanceof Microcontroller || block instanceof Screen + || block instanceof Keyboard) { + // Chests get this for free. OC needs a special invitation. + // FUCK YOU MINECRAFT! Apparently moving blocks have a second click system. + MovingInteractionBehaviour.REGISTRY.register(block, OC_INTERACTION); + } } registerBlockEntity(BlockEntityTypes.HOLOGRAM.get()); @@ -44,6 +84,238 @@ private static void registerBlockEntity(final BlockEntityType type) { type, CreateContraptionTransformers::transformBlockEntity); } + private static final MovementBehaviour OC_MOVEMENT = new MovementBehaviour() { + @Override + public void startMoving(final MovementContext context) { + // Create does not keep a live BlockEntity around while it is moving. + // So we make one. This sounds worse when written down. + if (!context.world.isClientSide) { + context.temporaryData = makeEnvironment(context); + } + } + + @Override + public void tick(final MovementContext context) { + if (context.world.isClientSide) { + return; + } + + Environment environment = movingEnvironment(context); + if (environment == null) { + return; + } + + // The position is the center of the actor block. OC wants that + // position for wireless range, sounds, events, and packet logs. + Vec3 position = context.position; + if (position == null) { + position = new Vec3( + context.localPos.getX() + 0.5, + context.localPos.getY() + 0.5, + context.localPos.getZ() + 0.5); + } + environment.updateMovingPosition(position, context.rotation, context.state); + if (environment instanceof Computer computer) { + computer.tickMoving(); + } else if (environment instanceof Tickable tickable) { + tickable.tick(); + } + + // Vanilla redstone is not ticking inside Create's little magic box. + // So if the OC output is next to a captured lamp, fake the one bit + // of redstone simulation we actually need. Hmmm. Like this? + syncMovingLamp(context, environment); + + // Hmmm. The real cable network is also off-world. Reconnect the + // fake nodes whenever both ends of an OC connection exist. + connectMovingNeighbors(context, environment); + } + + @Override + public void stopMoving(final MovementContext context) { + if (context.world.isClientSide) { + unregisterMovingScreen(context); + return; + } + + saveEnvironment(context); + Environment environment = movingEnvironment(context); + if (environment != null) { + environment.disposeMoving(); + } + context.temporaryData = null; + } + + @Override + public void writeExtraData(final MovementContext context) { + // Hmmm. Like this? Create may save a running contraption before it stops. + saveEnvironment(context); + } + }; + + private static final MovingInteractionBehaviour OC_INTERACTION = new MovingInteractionBehaviour() { + @Override + public boolean handlePlayerInteraction(final Player player, final InteractionHand hand, + final BlockPos localPos, + final AbstractContraptionEntity contraptionEntity) { + if (contraptionEntity.level().isClientSide) { + // Case menus are opened by the server. Screens are the weird + // exception: their terminal GUI is deliberately client-only. + BlockEntity renderEntity = contraptionEntity.getContraption() + .getOrCreateClientContraptionLazy().getBlockEntity(localPos); + StructureBlockInfo capturedInfo = contraptionEntity.getContraption().getBlocks().get(localPos); + if (renderEntity == null || capturedInfo == null) { + return true; + } + BlockState capturedState = capturedInfo.state(); + if (renderEntity instanceof li.cil.oc.common.blockentity.Screen screen + && capturedState.getBlock() instanceof Screen screenBlock) { + screen.registerMovingClientBuffer(contraptionEntity.level()); + screenBlock.rightClick(renderEntity.getLevel(), localPos, player, hand, + player.getItemInHand(hand), screen.facing(), 0.5f, 0.5f, 0.5f, true); + } else if (renderEntity instanceof li.cil.oc.common.blockentity.Keyboard keyboard + && capturedState.getBlock() instanceof Keyboard keyboardBlock) { + keyboardBlock.localOnBlockActivated(renderEntity.getLevel(), localPos, player, hand, + player.getItemInHand(hand), keyboard.facing(), 0.5f, 0.5f, 0.5f); + } + return true; + } + + if (!(player instanceof ServerPlayer serverPlayer)) { + return false; + } + + var actor = contraptionEntity.getContraption().getActorAt(localPos); + if (actor == null || actor.right == null + || !(actor.right.temporaryData instanceof Environment environment)) { + return false; + } + + if (environment instanceof li.cil.oc.common.blockentity.Case computer + && computer.stillValid(player)) { + MenuTypes.openCaseGui(serverPlayer, computer); + return true; + } + + if (environment instanceof li.cil.oc.common.blockentity.Microcontroller microcontroller) { + if (microcontroller.machine().isRunning()) { + microcontroller.machine().stop(); + } else { + microcontroller.machine().start(); + } + return true; + } + + return false; + } + }; + + private static Environment makeEnvironment(final MovementContext context) { + if (!(context.state.getBlock() instanceof EntityBlock entityBlock)) { + return null; + } + + BlockEntity blockEntity = entityBlock.newBlockEntity(context.localPos, context.state); + if (!(blockEntity instanceof Environment environment)) { + return null; + } + + blockEntity.setLevel(context.world); + + // Screen buffers live in SaveHandler files named by their world chunk. + // Make the fake block entity look like it is still at its pre-assembly + // position while loadWithComponents reads that file. If we let it use + // localPos here, it finds nothing and builds a blank T1 buffer instead. + BlockPos originalPos = context.localPos.offset(context.contraption.anchor); + environment.beginMoving( + context.world, + new Vec3( + originalPos.getX() + 0.5, + originalPos.getY() + 0.5, + originalPos.getZ() + 0.5), + context.rotation, + context.state); + if (context.blockEntityData != null) { + blockEntity.loadWithComponents(context.blockEntityData, context.world.registryAccess()); + } + + // The fake BE is not in Level.blockEntities, so the normal neighbor scan + // cannot find it. A private network still lets its machine and cards run. + Network.joinNewNetwork(environment.node()); + return environment; + } + + private static Environment movingEnvironment(final MovementContext context) { + return context.temporaryData instanceof Environment environment ? environment : null; + } + + private static void unregisterMovingScreen(final MovementContext context) { + if (context.contraption == null || context.contraption.entity == null) { + return; + } + + BlockEntity renderEntity = context.contraption.getOrCreateClientContraptionLazy() + .getBlockEntity(context.localPos); + if (renderEntity instanceof li.cil.oc.common.blockentity.Screen screen) { + screen.unregisterMovingClientBuffer(); + } + } + + private static void saveEnvironment(final MovementContext context) { + Environment environment = movingEnvironment(context); + if (environment != null && context.blockEntityData != null) { + environment.saveMovingState(context.blockEntityData, context.world.registryAccess()); + } + } + + private static void connectMovingNeighbors(final MovementContext context, final Environment environment) { + for (Direction side : Direction.values()) { + BlockPos neighborPos = BlockPosHelper.relative(context.localPos, side); + for (var actor : context.contraption.getActors()) { + if (!neighborPos.equals(actor.left.pos())) { + continue; + } + Environment neighbor = actor.right.temporaryData instanceof Environment other ? other : null; + if (neighbor != null && neighbor.node() != null && environment.node() != null) { + environment.node().connect(neighbor.node()); + } + } + } + } + + private static void syncMovingLamp(final MovementContext context, final Environment environment) { + if (!(environment instanceof RedstoneAware redstone) + || context.contraption == null + || context.contraption.entity == null) { + return; + } + + for (Direction localSide : Direction.values()) { + Direction worldSide = redstone.toGlobal(localSide); + if (worldSide == null) { + continue; + } + + BlockPos lampPos = BlockPosHelper.relative(context.localPos, localSide); + StructureBlockInfo lampInfo = context.contraption.getBlocks().get(lampPos); + if (lampInfo == null || !lampInfo.state().is(Blocks.REDSTONE_LAMP)) { + continue; + } + + boolean lit = redstone.getOutput(worldSide) > 0; + boolean alreadyLit = lampInfo.state().getValue(BlockStateProperties.LIT); + if (lit == alreadyLit) { + continue; + } + + // FUCK YOU MINECRAFT! A moving lamp is not really a lamp right now. + BlockState newState = lampInfo.state().setValue(BlockStateProperties.LIT, lit); + context.contraption.entity.setBlock( + lampPos, + new StructureBlockInfo(lampInfo.pos(), newState, lampInfo.nbt())); + } + } + static BlockState transformBlock(final BlockState state, final StructureTransform transform) { Direction pitch = getDirection(state, PITCH); Direction yaw = getDirection(state, YAW); diff --git a/src/main/scala/li/cil/oc/server/PacketHandler.scala b/src/main/scala/li/cil/oc/server/PacketHandler.scala index 455f293adf..2f7df6fab2 100644 --- a/src/main/scala/li/cil/oc/server/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/server/PacketHandler.scala @@ -43,7 +43,9 @@ object PacketHandler extends CommonPacketHandler { private def canInteractWith(buffer: api.internal.TextBuffer, player: Player): Boolean = buffer match { case textBuffer: TextBuffer => textBuffer.host match { case screen: Screen => screen.screens.exists(part => - player.distanceToSqr(part.x + 0.5, part.y + 0.5, part.z + 0.5) <= 64) + // A Create contraption keeps the fake Screen at its local block position, + // but EnvironmentHost exposes the real moving position for interaction. + player.distanceToSqr(part.xPosition, part.yPosition, part.zPosition) <= 64) case remote: RemoteTerminalHost => remote.isBufferUsable(buffer, player) case _ => true } From 9abe1f657b8a3081bacc4b15185dab2ccc7452d3 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Fri, 7 Aug 2026 19:43:19 -0700 Subject: [PATCH 08/38] Fix java.lang.NoClassDefFoundError dev/engine_room/flywheel/api/visualization/VisualizationLevel --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 02be3928a7..2c4586ff33 100644 --- a/build.gradle +++ b/build.gradle @@ -250,6 +250,7 @@ dependencies { // a method signature. Keep it available while compiling the optional OC // Create bridge as well as at dev-runtime. compileOnly("com.tterrag.registrate:Registrate:${registrate_version}") + compileOnly("dev.engine-room.flywheel:flywheel-neoforge-${minecraft_version}:${flywheel_version}") runtimeOnly("dev.engine-room.flywheel:flywheel-neoforge-${minecraft_version}:${flywheel_version}") runtimeOnly("com.tterrag.registrate:Registrate:${registrate_version}") compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")) From 6c400154cb11a0b867d6eb2c732f9bb2ea2708a3 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Fri, 7 Aug 2026 21:37:21 -0700 Subject: [PATCH 09/38] Computers work on trains. --- .../common/blockentity/traits/Computer.scala | 30 +++++-- .../blockentity/traits/TextBuffer.scala | 2 +- .../create/CreateContraptionTransformers.java | 88 ++++++++++++++----- .../li/cil/oc/server/machine/Machine.scala | 47 +++++++++- 4 files changed, 137 insertions(+), 30 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala index 84320377ce..6a947e82ec 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala @@ -136,15 +136,18 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B def tickMoving(): Unit = updateEntity() /** Save the live machine/component state back into Create's captured NBT. */ - override def saveMovingState(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = saveAdditional(nbt, provider) + override def saveMovingState(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { + saveAdditional(nbt, provider) + // One-shot marker. A normal chunk save writes fresh NBT and drops it after + // the restored machine has consumed the grace period. + nbt.putInt(MovingRestoreGraceTag, 40) + } /** Dispose the temporary machine and its component nodes before reassembly. */ override def disposeMoving(): Unit = { - disconnectComponents() - // Do not call machine.stop() here. That only queues a deferred close, - // while Create is about to throw this temporary host away. Removing the - // machine node closes it synchronously and avoids the old fake host - // waking up after the real block entity has been rebuilt. + // Removing the machine node closes the VM synchronously, then its normal + // onDisconnect callback removes internal components. Doing that cleanup + // first would feed fake component_removed events to the still-live VM. super.disposeMoving() } @@ -166,6 +169,13 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B private final val HasErroredTag = Settings.namespace + "hasErrored" private final val IsRunningTag = Settings.namespace + "isRunning" private final val UsersTag = Settings.namespace + "users" + private final val MovingRestoreGraceTag = Settings.namespace + "movingRestoreGrace" + private var pendingMovingRestoreGrace = 0 + + override def loadAdditional(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { + pendingMovingRestoreGrace = nbt.getInt(MovingRestoreGraceTag) + super.loadAdditional(nbt, provider) + } override def loadComponentsForServer(holder: DataComponentHolder): Unit = { super.loadComponentsForServer(holder) @@ -186,6 +196,14 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B private def loadMachineData(holder: DataComponentHolder): Unit = { machine.loadData(holder) + if (pendingMovingRestoreGrace > 0) { + machine match { + case implementation: li.cil.oc.server.machine.Machine => + implementation.beginComponentRestoreGrace(pendingMovingRestoreGrace) + case _ => + } + pendingMovingRestoreGrace = 0 + } // Kickstart initialization to avoid values getting overwritten by // loadForClient if that packet is handled after a manual diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala index 44f796fc78..4727792ff5 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala @@ -40,7 +40,7 @@ trait TextBuffer extends Environment with Tickable { /** Create renders captured screens in a virtual level, but packets use the real client level. */ def registerMovingClientBuffer(level: Level): Unit = buffer match { - case moving: li.cil.oc.common.component.TextBuffer => + case moving: li.cil.oc.common.component.TextBuffer if movingClientLevel ne level => movingClientLevel = level moving.registerClientBufferOnLevel(level) case _ => diff --git a/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java b/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java index 4bdcc82086..1c5266fc93 100644 --- a/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java +++ b/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java @@ -8,11 +8,8 @@ import com.simibubi.create.content.contraptions.StructureTransform; import li.cil.oc.api.Network; import li.cil.oc.common.block.Case; -import li.cil.oc.common.block.Cable; import li.cil.oc.common.block.Keyboard; import li.cil.oc.common.block.Microcontroller; -import li.cil.oc.common.block.Redstone; -import li.cil.oc.common.block.RobotProxy; import li.cil.oc.common.block.Screen; import li.cil.oc.common.block.SimpleBlock; import li.cil.oc.common.blockentity.BlockEntityTypes; @@ -58,13 +55,12 @@ static void register() { if (block instanceof SimpleBlock) { MovedBlockTransformerRegistries.BLOCK_TRANSFORMERS.register( block, CreateContraptionTransformers::transformBlock); - } - if (block instanceof Case || block instanceof Microcontroller || block instanceof RobotProxy - || block instanceof Cable || block instanceof Redstone || block instanceof Screen - || block instanceof Keyboard) { - // This is the part where the computer gets dragged into Create's actor system. - // Maybe this works. - MovementBehaviour.REGISTRY.register(block, OC_MOVEMENT); + if (block.defaultBlockState().hasBlockEntity()) { + // Any OC block entity can be an external component. Give it a + // live moving host instead of only supporting the handful of + // blocks that happened to be used by the first test rig. + MovementBehaviour.REGISTRY.register(block, OC_MOVEMENT); + } } if (block instanceof Case || block instanceof Microcontroller || block instanceof Screen || block instanceof Keyboard) { @@ -97,12 +93,19 @@ public void startMoving(final MovementContext context) { @Override public void tick(final MovementContext context) { if (context.world.isClientSide) { + registerMovingScreen(context); return; } Environment environment = movingEnvironment(context); if (environment == null) { - return; + // Train carriages can deserialize their actor contexts without + // temporaryData. Rebuild OC's off-world block entity on demand. + environment = makeEnvironment(context); + context.temporaryData = environment; + if (environment == null) { + return; + } } // The position is the center of the actor block. OC wants that @@ -138,12 +141,7 @@ public void stopMoving(final MovementContext context) { return; } - saveEnvironment(context); - Environment environment = movingEnvironment(context); - if (environment != null) { - environment.disposeMoving(); - } - context.temporaryData = null; + stopMovingEnvironments(context); } @Override @@ -227,12 +225,15 @@ private static Environment makeEnvironment(final MovementContext context) { // position while loadWithComponents reads that file. If we let it use // localPos here, it finds nothing and builds a blank T1 buffer instead. BlockPos originalPos = context.localPos.offset(context.contraption.anchor); - environment.beginMoving( - context.world, - new Vec3( + Vec3 savedPosition = context.position != null + ? context.position + : new Vec3( originalPos.getX() + 0.5, originalPos.getY() + 0.5, - originalPos.getZ() + 0.5), + originalPos.getZ() + 0.5); + environment.beginMoving( + context.world, + savedPosition, context.rotation, context.state); if (context.blockEntityData != null) { @@ -261,6 +262,18 @@ private static void unregisterMovingScreen(final MovementContext context) { } } + private static void registerMovingScreen(final MovementContext context) { + if (context.contraption == null || context.contraption.entity == null) { + return; + } + + BlockEntity renderEntity = context.contraption.getOrCreateClientContraptionLazy() + .getBlockEntity(context.localPos); + if (renderEntity instanceof li.cil.oc.common.blockentity.Screen screen) { + screen.registerMovingClientBuffer(context.contraption.entity.level()); + } + } + private static void saveEnvironment(final MovementContext context) { Environment environment = movingEnvironment(context); if (environment != null && context.blockEntityData != null) { @@ -268,6 +281,39 @@ private static void saveEnvironment(final MovementContext context) { } } + private static void stopMovingEnvironments(final MovementContext context) { + if (movingEnvironment(context) == null || context.contraption == null) { + return; + } + + // Create stops actors one at a time. If the floppy drive happens to go + // first, OpenOS gets told its boot filesystem vanished before Create + // reaches the computer. Save the entire OC network while it still + // exists, then tear it down ourselves in an order that cannot do that. + for (var actor : context.contraption.getActors()) { + if (actor.right.temporaryData instanceof Environment) { + saveEnvironment(actor.right); + } + } + + // Close every VM before removing any external component host. Their + // state is safely in NBT now, and a dead listener cannot queue a fake + // component_removed while the remaining actors disappear. + for (var actor : context.contraption.getActors()) { + if (actor.right.temporaryData instanceof Computer computer) { + computer.disposeMoving(); + actor.right.temporaryData = null; + } + } + + for (var actor : context.contraption.getActors()) { + if (actor.right.temporaryData instanceof Environment environment) { + environment.disposeMoving(); + actor.right.temporaryData = null; + } + } + } + private static void connectMovingNeighbors(final MovementContext context, final Environment environment) { for (Direction side : Direction.values()) { BlockPos neighborPos = BlockPosHelper.relative(context.localPos, side); diff --git a/src/main/scala/li/cil/oc/server/machine/Machine.scala b/src/main/scala/li/cil/oc/server/machine/Machine.scala index 65b3ec20ba..ef4eb7185a 100644 --- a/src/main/scala/li/cil/oc/server/machine/Machine.scala +++ b/src/main/scala/li/cil/oc/server/machine/Machine.scala @@ -88,6 +88,12 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac private val addedComponents = mutable.Set.empty[Component] + // A Create contraption places its captured block entities one at a time. + // Keep already-known components alive while those tiny temporary networks + // split and merge, then reconcile them against the finished structure. + private var componentRestoreGrace = 0 + private val deferredRemovedComponents = mutable.Map.empty[String, String] + private val _users = mutable.Set.empty[String] private val signals = mutable.Queue.empty[Machine.Signal] @@ -529,6 +535,7 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac // but that wouldn't trigger a connect message anymore due to the higher // reachability). processAddedComponents() + tickComponentRestoreGrace() // Component overflow check, crash if too many components are connected, to // avoid confusion on the user's side due to components not showing up. @@ -703,6 +710,7 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac // ----------------------------------------------------------------------- // def addComponent(component: Component): Unit = { + deferredRemovedComponents -= component.address if (!_components.contains(component.address)) { addedComponents += component } @@ -710,12 +718,43 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac def removeComponent(component: Component): Unit = { if (_components.contains(component.address)) { - _components.synchronized(_components -= component.address) - signal("component_removed", component.address, component.name) + if (componentRestoreGrace > 0) { + deferredRemovedComponents(component.address) = component.name + } + else { + _components.synchronized(_components -= component.address) + signal("component_removed", component.address, component.name) + } } addedComponents -= component } + /** Suppress transient component removal events while Create restores blocks. */ + def beginComponentRestoreGrace(ticks: Int): Unit = { + if (isRunning) { + componentRestoreGrace = math.max(componentRestoreGrace, ticks) + pause(componentRestoreGrace / 20.0) + } + } + + private def tickComponentRestoreGrace(): Unit = if (componentRestoreGrace > 0) { + componentRestoreGrace -= 1 + if (componentRestoreGrace == 0) { + val network = node.network + for ((address, name) <- deferredRemovedComponents) { + val restored = network != null && (network.node(address) match { + case component: Component => component.name == name + case _ => false + }) + if (!restored && _components.contains(address)) { + _components.synchronized(_components -= address) + signal("component_removed", address, name) + } + } + deferredRemovedComponents.clear() + } + } + private def processAddedComponents(): Unit = { if (addedComponents.nonEmpty) { for (component <- addedComponents) { @@ -733,6 +772,8 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac } private def verifyComponents(): Unit = { + if (componentRestoreGrace > 0) return + val invalid = mutable.Set.empty[String] for ((address, name) <- _components) { node.network.node(address) match { @@ -977,6 +1018,8 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac this.synchronized(state.synchronized { state.clear() state.push(Machine.State.Stopped) + componentRestoreGrace = 0 + deferredRemovedComponents.clear() Option(architecture).foreach(_.close()) signals.clear() uptime = 0 From 1b653c787a818f97f0153d3651f0c6a14fde3630 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Fri, 7 Aug 2026 23:35:38 -0700 Subject: [PATCH 10/38] Create Train component. --- .../create/CreateTrainEnvironment.java | 314 ++++++++++++++++++ .../assets/opencomputers/sounds.json | 2 +- src/main/scala/li/cil/oc/client/Sound.scala | 58 +++- .../scala/li/cil/oc/common/EventHandler.scala | 3 +- .../create/CreateContraptionTransformers.java | 7 + 5 files changed, 374 insertions(+), 10 deletions(-) create mode 100644 src/main/java/li/cil/oc/integration/create/CreateTrainEnvironment.java diff --git a/src/main/java/li/cil/oc/integration/create/CreateTrainEnvironment.java b/src/main/java/li/cil/oc/integration/create/CreateTrainEnvironment.java new file mode 100644 index 0000000000..b1780c51e7 --- /dev/null +++ b/src/main/java/li/cil/oc/integration/create/CreateTrainEnvironment.java @@ -0,0 +1,314 @@ +package li.cil.oc.integration.create; + +import com.simibubi.create.content.trains.entity.Train; +import com.simibubi.create.content.trains.graph.DiscoveredPath; +import com.simibubi.create.content.trains.graph.EdgePointType; +import com.simibubi.create.content.trains.schedule.Schedule; +import com.simibubi.create.content.trains.station.GlobalStation; +import com.simibubi.create.content.trains.station.TrainEditPacket; +import com.simibubi.create.foundation.utility.StringHelper; +import li.cil.oc.api.Network; +import li.cil.oc.api.driver.NamedBlock; +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.Environment; +import li.cil.oc.api.network.Visibility; +import li.cil.oc.api.prefab.AbstractManagedEnvironment; +import net.createmod.catnip.data.Glob; +import net.createmod.catnip.platform.CatnipServices; +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.CollectionTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.DoubleTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NumericTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.Level; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.WeakHashMap; +import java.util.regex.PatternSyntaxException; + +/** The live Create train represented as an OC component on an onboard computer. */ +public final class CreateTrainEnvironment extends AbstractManagedEnvironment implements NamedBlock { + private static final Map attached = new WeakHashMap<>(); + + private final Train train; + private final Level level; + + private CreateTrainEnvironment(final Train train, final Level level) { + this.train = train; + this.level = level; + setNode(Network.newNode(this, Visibility.Network).withComponent("train").create()); + } + + /** Attach one train component to a computer that is currently inside a train carriage. */ + public static synchronized void attach(final Environment computer, final Train train, final Level level) { + if (computer == null || computer.node() == null || train == null || level == null || attached.containsKey(computer)) + return; + final CreateTrainEnvironment environment = new CreateTrainEnvironment(train, level); + attached.put(computer, environment); + computer.node().connect(environment.node()); + } + + /** Remove the transient component before Create tears down the moving computer. */ + public static synchronized void detach(final Environment computer) { + final CreateTrainEnvironment environment = attached.remove(computer); + if (environment != null && environment.node() != null) + environment.node().remove(); + } + + @Override + public String preferredName() { + return "train"; + } + + @Override + public int priority() { + return 2; + } + + private static Object[] result(final Object... values) { + return values; + } + + @Callback(direct = true, doc = "function():string -- Get the train name.") + public Object[] getName(final Context context, final Arguments args) { + return result(train.name.getString()); + } + + @Callback(doc = "function(name:string) -- Set the train name.") + public Object[] setName(final Context context, final Arguments args) { + final String name = args.checkString(0); + train.name = Component.literal(name); + CatnipServices.NETWORK.sendToAllClients(new TrainEditPacket.TrainEditReturnPacket( + train.id, name, train.icon.getId(), train.mapColorIndex)); + return result(); + } + + @Callback(direct = true, doc = "function():string -- Get the train UUID.") + public Object[] getId(final Context context, final Arguments args) { + return result(train.id.toString()); + } + + @Callback(direct = true, doc = "function():number -- Get the current train speed in blocks per tick.") + public Object[] getSpeed(final Context context, final Arguments args) { + return result(train.speed); + } + + @Callback(direct = true, doc = "function():number -- Get the current throttle from 0 to 1.") + public Object[] getThrottle(final Context context, final Arguments args) { + return result(train.throttle); + } + + @Callback(doc = "function(value:number) -- Set the throttle from 1/18 to 1.") + public Object[] setThrottle(final Context context, final Arguments args) { + train.throttle = Math.max(1.0 / 18.0, Math.min(1.0, args.checkDouble(0))); + return result(train.throttle); + } + + @Callback(direct = true, doc = "function():boolean -- Whether the train has a forward conductor.") + public Object[] hasForwardConductor(final Context context, final Arguments args) { + return result(train.hasForwardConductor()); + } + + @Callback(direct = true, doc = "function():boolean -- Whether the train has a backward conductor.") + public Object[] hasBackwardConductor(final Context context, final Arguments args) { + return result(train.hasBackwardConductor()); + } + + @Callback(direct = true, doc = "function():boolean -- Whether the train is derailed.") + public Object[] isDerailed(final Context context, final Arguments args) { + return result(train.derailed); + } + + @Callback(direct = true, doc = "function():string or nil -- Get the current station name.") + public Object[] getCurrentStation(final Context context, final Arguments args) { + final GlobalStation station = train.getCurrentStation(); + return result(station == null ? null : station.name); + } + + @Callback(direct = true, doc = "function():string -- Get the current schedule state.") + public Object[] getState(final Context context, final Arguments args) { + return result(train.runtime.state.toString()); + } + + @Callback(direct = true, doc = "function():boolean -- Whether schedule execution is paused.") + public Object[] isPaused(final Context context, final Arguments args) { + return result(train.runtime.paused); + } + + @Callback(doc = "function(paused:boolean) -- Pause or resume schedule execution.") + public Object[] setPaused(final Context context, final Arguments args) { + train.runtime.paused = args.checkBoolean(0); + return result(train.runtime.paused); + } + + @Callback(direct = true, doc = "function():number -- Get the zero-based current schedule entry.") + public Object[] getCurrentEntry(final Context context, final Arguments args) { + return result(train.runtime.currentEntry); + } + + @Callback(direct = true, doc = "function():string -- Get the current schedule title.") + public Object[] getCurrentTitle(final Context context, final Arguments args) { + return result(train.runtime.currentTitle); + } + + @Callback(direct = true, doc = "function():boolean -- Whether the train has a schedule.") + public Object[] hasSchedule(final Context context, final Arguments args) { + return result(train.runtime.getSchedule() != null); + } + + @Callback(direct = true, doc = "function():table -- Get the train schedule in Create's schedule format.") + public Object[] getSchedule(final Context context, final Arguments args) { + final Schedule schedule = train.runtime.getSchedule(); + if (schedule == null) + throw new IllegalStateException("train doesn't have a schedule"); + return result(fromCompoundTag(schedule.write(level.registryAccess()))); + } + + @Callback(doc = "function(schedule:table) -- Replace the train schedule and start it.") + public Object[] setSchedule(final Context context, final Arguments args) { + final Schedule schedule = Schedule.fromTag(level.registryAccess(), toCompoundTag(args.checkTable(0))); + if (schedule.entries.isEmpty()) + throw new IllegalArgumentException("Schedule must have at least one entry"); + final boolean automatic = train.runtime.getSchedule() == null || train.runtime.isAutoSchedule; + train.runtime.setSchedule(schedule, automatic); + return result(); + } + + @Callback(doc = "function() -- Remove the schedule and cancel navigation.") + public Object[] clearSchedule(final Context context, final Arguments args) { + train.runtime.discardSchedule(); + return result(); + } + + @Callback(direct = true, doc = "function(destination:string):boolean, string or nil -- Test whether a station is reachable.") + public Object[] canReach(final Context context, final Arguments args) { + final PathResult path = findPath(args.checkString(0)); + return path.path != null ? result(true, null) + : result(false, path.destinationExists ? "cannot-reach" : "no-target"); + } + + @Callback(direct = true, doc = "function(destination:string):number or nil, string or nil -- Find the distance to a station.") + public Object[] distanceTo(final Context context, final Arguments args) { + final PathResult path = findPath(args.checkString(0)); + return path.path != null ? result(path.path.distance, null) + : result(null, path.destinationExists ? "cannot-reach" : "no-target"); + } + + private PathResult findPath(final String destinationFilter) { + final String regex = Glob.toRegexPattern(destinationFilter, ""); + boolean anyMatch = false; + final ArrayList stations = new ArrayList<>(); + try { + if (train.graph != null) { + for (final GlobalStation station : train.graph.getPoints(EdgePointType.STATION)) { + if (!station.name.matches(regex)) + continue; + anyMatch = true; + stations.add(station); + } + } + } catch (final PatternSyntaxException ignored) { + } + final DiscoveredPath path = train.navigation.findPathTo(stations, Double.MAX_VALUE); + return new PathResult(path, anyMatch); + } + + private static Map fromCompoundTag(final CompoundTag tag) { + return castMap(fromNbtTag(null, tag)); + } + + private static Object fromNbtTag(final String key, final Tag tag) { + final byte type = tag.getId(); + if (type == Tag.TAG_BYTE && "Count".equals(key)) + return ((NumericTag) tag).getAsByte(); + if (type == Tag.TAG_BYTE) + return ((NumericTag) tag).getAsByte() != 0; + if (type == Tag.TAG_SHORT || type == Tag.TAG_INT || type == Tag.TAG_LONG) + return ((NumericTag) tag).getAsLong(); + if (type == Tag.TAG_FLOAT || type == Tag.TAG_DOUBLE) + return ((NumericTag) tag).getAsDouble(); + if (type == Tag.TAG_STRING) + return tag.getAsString(); + if (type == Tag.TAG_LIST || type == Tag.TAG_BYTE_ARRAY || type == Tag.TAG_INT_ARRAY || type == Tag.TAG_LONG_ARRAY) { + final Map list = new LinkedHashMap<>(); + final CollectionTag collection = (CollectionTag) tag; + for (int index = 0; index < collection.size(); index++) + list.put(index + 1, fromNbtTag(null, collection.get(index))); + return list; + } + if (type == Tag.TAG_COMPOUND) { + final Map table = new LinkedHashMap<>(); + final CompoundTag compound = (CompoundTag) tag; + for (final String compoundKey : compound.getAllKeys()) + table.put(StringHelper.camelCaseToSnakeCase(compoundKey), + fromNbtTag(compoundKey, compound.get(compoundKey))); + return table; + } + throw new IllegalArgumentException("unknown tag type " + tag.getType().getName()); + } + + private static CompoundTag toCompoundTag(final Map table) { + return (CompoundTag) toNbtTag(null, table); + } + + private static Tag toNbtTag(final String key, final Object value) { + if (value instanceof Boolean bool) + return ByteTag.valueOf(bool); + if (value instanceof Byte || "count".equals(key)) + return ByteTag.valueOf(((Number) value).byteValue()); + if (value instanceof Number number) + return number.intValue() == number.doubleValue() + ? IntTag.valueOf(number.intValue()) : DoubleTag.valueOf(number.doubleValue()); + if (value instanceof String string) + return StringTag.valueOf(string); + if (value instanceof Map map && isArrayMap(map)) { + final ListTag list = new ListTag(); + for (int index = 1; index <= map.size(); index++) + list.add(toNbtTag(null, getNumericKey(map, index))); + return list; + } + if (value instanceof Map map) { + final CompoundTag compound = new CompoundTag(); + for (final Map.Entry entry : map.entrySet()) { + if (!(entry.getKey() instanceof String compoundKey)) + throw new IllegalArgumentException("table key is not of type string"); + final String nbtKey = compoundKey.equals("id") && map.containsKey("count") + ? "id" : StringHelper.snakeCaseToCamelCase(compoundKey); + compound.put(nbtKey, toNbtTag(compoundKey, entry.getValue())); + } + return compound; + } + throw new IllegalArgumentException("unknown object type " + (value == null ? "nil" : value.getClass().getName())); + } + + private static boolean isArrayMap(final Map map) { + for (int index = 1; index <= map.size(); index++) + if (getNumericKey(map, index) == null) + return false; + return !map.isEmpty(); + } + + private static Object getNumericKey(final Map map, final int index) { + if (map.containsKey(index)) return map.get(index); + if (map.containsKey((double) index)) return map.get((double) index); + if (map.containsKey((long) index)) return map.get((long) index); + return null; + } + + @SuppressWarnings("unchecked") + private static Map castMap(final Object value) { + return (Map) value; + } + + private record PathResult(DiscoveredPath path, boolean destinationExists) { + } +} diff --git a/src/main/resources/assets/opencomputers/sounds.json b/src/main/resources/assets/opencomputers/sounds.json index b34931a284..b1b542c207 100644 --- a/src/main/resources/assets/opencomputers/sounds.json +++ b/src/main/resources/assets/opencomputers/sounds.json @@ -2,7 +2,7 @@ "computer_running": { "category": "block", "sounds": [ - {"name": "opencomputers:computer_running", "stream": false} + {"name": "opencomputers:computer_running", "stream": false, "preload": true} ] }, "floppy_access": { diff --git a/src/main/scala/li/cil/oc/client/Sound.scala b/src/main/scala/li/cil/oc/client/Sound.scala index 1af9aba368..18870a68c6 100644 --- a/src/main/scala/li/cil/oc/client/Sound.scala +++ b/src/main/scala/li/cil/oc/client/Sound.scala @@ -24,6 +24,10 @@ import net.neoforged.neoforge.event.level.LevelEvent object Sound { private val sources = mutable.WeakHashMap.empty[BlockEntity, PseudoLoopingStream] + // SoundEngine owns the actual sound instance. Keep a strong reference to + // every instance while it is playing so cleanup cannot lose it when the + // block entity key disappears from the weak map during a world transition. + private val activeSounds = mutable.Set.empty[PseudoLoopingStream] private val commandQueue = mutable.PriorityQueue.empty[Command] @@ -84,11 +88,30 @@ object Sound { @SubscribeEvent def onWorldUnload(event: LevelEvent.Unload): Unit = { + stopAll() + } + + def stopAll(): Unit = { commandQueue.synchronized(commandQueue.clear()) - sources.synchronized(try sources.foreach(_._2.stop()) catch { - case _: Throwable => // Ignore. - }) - sources.clear() + sources.synchronized { + try activeSounds.toSeq.foreach(stopSound) catch { + case _: Throwable => // Ignore. + } + activeSounds.clear() + sources.clear() + } + } + + private def stopSound(sound: PseudoLoopingStream): Unit = { + sound.stop() + val minecraft = Minecraft.getInstance + if (minecraft != null && minecraft.getSoundManager != null) { + // Marking a TickableSoundInstance stopped only makes SoundEngine notice + // it on its next tick. Stop the channel too, so a world transition or + // resource reload cannot leave the fan playing in the next world. + minecraft.getSoundManager.stop(sound) + } + activeSounds -= sound } private abstract class Command(val when: Long, val blockEntity: WeakReference[BlockEntity]) extends Ordered[Command] { @@ -103,9 +126,10 @@ object Sound { sources.synchronized { val current = sources.getOrElse(entity, null) if (current == null || !current.getLocation.getPath.equals(name)) { - if (current != null) current.stop() + if (current != null) stopSound(current) val sound = new PseudoLoopingStream(blockEntity, volume, name) sources(entity) = sound + activeSounds += sound Minecraft.getInstance.getSoundManager.play(sound) } } @@ -118,7 +142,7 @@ object Sound { blockEntity.get.foreach { entity => sources.synchronized { sources.remove(entity) match { - case Some(sound) => sound.stop() + case Some(sound) => stopSound(sound) case _ => } } @@ -151,6 +175,7 @@ object Sound { // Computer running sounds are world-positioned and must attenuate with // distance. Relative sounds are listener-relative and bypass world range. relative = false + attenuation = SoundInstance.Attenuation.LINEAR looping = true updatePosition() @@ -168,7 +193,26 @@ object Sound { override def isStopped() = stopped // Required by ITickableSound, which is required to update position while playing - override def tick(): Unit = if (blockEntity.get.isDefined) updatePosition() else stop() + override def tick(): Unit = if (blockEntity.get.isDefined) updatePosition() else stopSound(this) + + // Keep a hard positional cutoff even if a sound-engine implementation or + // resource definition ignores the normal attenuation distance. + override def getVolume(): Float = { + val listener = Minecraft.getInstance.player + val maxDistance = 16.0 + if (listener == null) 0f + else { + val distance = math.sqrt(listener.distanceToSqr(x, y, z)) + if (distance >= maxDistance) 0f + else { + // SoundEngine already applies one linear falloff. Apply a second, + // gentle linear factor here so the fan fades more noticeably with + // distance instead of staying prominent until the cutoff. + val distanceFade = (1.0 - distance / maxDistance).toFloat + super.getVolume() * distanceFade + } + } + } def stop(): Unit = { stopped = true diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index dbdf6beec1..b98b722043 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -204,8 +204,7 @@ object EventHandler { Loot.disksForCyclingClient.clear() Loot.disksForCyclingClient ++= Loot.disksForCyclingServer.map(_.copy()) - client.Sound.startLoop(null, "computer_running", 0f, 0) - scheduleServer(() => client.Sound.stopLoop(null)) + client.Sound.stopAll() } @SubscribeEvent diff --git a/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java b/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java index 1c5266fc93..3b4b525014 100644 --- a/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java +++ b/src/main/scala/li/cil/oc/integration/create/CreateContraptionTransformers.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.StructureTransform; +import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import li.cil.oc.api.Network; import li.cil.oc.common.block.Case; import li.cil.oc.common.block.Keyboard; @@ -243,6 +244,11 @@ private static Environment makeEnvironment(final MovementContext context) { // The fake BE is not in Level.blockEntities, so the normal neighbor scan // cannot find it. A private network still lets its machine and cards run. Network.joinNewNetwork(environment.node()); + if (environment instanceof Computer computer + && context.contraption.entity instanceof CarriageContraptionEntity carriageEntity + && carriageEntity.getCarriage() != null) { + CreateTrainEnvironment.attach(computer, carriageEntity.getCarriage().train, context.world); + } return environment; } @@ -301,6 +307,7 @@ private static void stopMovingEnvironments(final MovementContext context) { // component_removed while the remaining actors disappear. for (var actor : context.contraption.getActors()) { if (actor.right.temporaryData instanceof Computer computer) { + CreateTrainEnvironment.detach(computer); computer.disposeMoving(); actor.right.temporaryData = null; } From 5784fcf5fe969275273c5685865b72dda1eab9c4 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sat, 8 Aug 2026 13:09:49 -0700 Subject: [PATCH 11/38] Fixes crash on dedicated server Fixes #36 --- src/main/scala/li/cil/oc/common/blockentity/Assembler.scala | 1 - src/main/scala/li/cil/oc/common/blockentity/DiskDrive.scala | 3 --- src/main/scala/li/cil/oc/common/blockentity/Hologram.scala | 1 - src/main/scala/li/cil/oc/common/blockentity/NetSplitter.scala | 1 - src/main/scala/li/cil/oc/common/blockentity/Print.scala | 1 - src/main/scala/li/cil/oc/common/blockentity/Printer.scala | 1 - src/main/scala/li/cil/oc/common/blockentity/RobotProxy.scala | 3 --- .../li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala | 4 +++- .../scala/li/cil/oc/common/blockentity/traits/Computer.scala | 1 - .../scala/li/cil/oc/common/blockentity/traits/OpenSides.scala | 3 --- .../cil/oc/common/blockentity/traits/PowerInformation.scala | 3 --- .../li/cil/oc/common/blockentity/traits/RedstoneAware.scala | 3 --- .../cil/oc/common/blockentity/traits/RotatableBaseBlock.scala | 2 -- .../li/cil/oc/common/blockentity/traits/TextBuffer.scala | 3 --- 14 files changed, 3 insertions(+), 27 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/blockentity/Assembler.scala b/src/main/scala/li/cil/oc/common/blockentity/Assembler.scala index 3ee120cb93..ffd248b634 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/Assembler.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/Assembler.scala @@ -186,7 +186,6 @@ class Assembler(pos: BlockPos, state: BlockState) requiredEnergy = nbt.getDouble(RemainingTag) } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) nbt.putDouble(RemainingTag, requiredEnergy) diff --git a/src/main/scala/li/cil/oc/common/blockentity/DiskDrive.scala b/src/main/scala/li/cil/oc/common/blockentity/DiskDrive.scala index 0b3a32a3b7..117708117c 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/DiskDrive.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/DiskDrive.scala @@ -29,8 +29,6 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.core.{BlockPos, Direction, HolderLookup} import net.minecraft.world.level.block.state.BlockState -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn import net.neoforged.neoforge.common.extensions.IBlockEntityExtension import scala.jdk.CollectionConverters._ @@ -152,7 +150,6 @@ class DiskDrive(pos: BlockPos, state: BlockState) } } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) if (!items(0).isEmpty) nbt.setNewCompoundTag(DiskTag, _ => items(0).save(provider)) diff --git a/src/main/scala/li/cil/oc/common/blockentity/Hologram.scala b/src/main/scala/li/cil/oc/common/blockentity/Hologram.scala index d02b0598ae..c5802ce69c 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/Hologram.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/Hologram.scala @@ -522,7 +522,6 @@ class Hologram(pos: BlockPos, state: BlockState, var tier: Int) rotationSpeedZ = nbt.getFloat(RotationSpeedZTag) } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) nbt.putIntArray(VolumeTag, volume) diff --git a/src/main/scala/li/cil/oc/common/blockentity/NetSplitter.scala b/src/main/scala/li/cil/oc/common/blockentity/NetSplitter.scala index be680cc8bf..7ae05d9a0f 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/NetSplitter.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/NetSplitter.scala @@ -127,7 +127,6 @@ class NetSplitter(pos: BlockPos, state: BlockState) requestModelDataUpdate() } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) nbt.putBoolean(IsInvertedTag, isInverted) diff --git a/src/main/scala/li/cil/oc/common/blockentity/Print.scala b/src/main/scala/li/cil/oc/common/blockentity/Print.scala index ce9b11e231..bcc79d717e 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/Print.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/Print.scala @@ -148,7 +148,6 @@ class Print(pos: BlockPos, blockState: BlockState, val canToggle: Option[() => B } } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) nbt.setNewCompoundTag(DataTag, (nbt: CompoundTag) => data.saveData(nbt, provider)) diff --git a/src/main/scala/li/cil/oc/common/blockentity/Printer.scala b/src/main/scala/li/cil/oc/common/blockentity/Printer.scala index 26e06120bf..071f576af1 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/Printer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/Printer.scala @@ -350,7 +350,6 @@ class Printer(pos: BlockPos, state: BlockState) requiredEnergy = nbt.getDouble(RemainingTag) } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) nbt.setNewCompoundTag(DataTag, (nbt: CompoundTag) => data.saveData(nbt, provider)) diff --git a/src/main/scala/li/cil/oc/common/blockentity/RobotProxy.scala b/src/main/scala/li/cil/oc/common/blockentity/RobotProxy.scala index a269bacc70..c60d347326 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/RobotProxy.scala @@ -18,8 +18,6 @@ import li.cil.oc.common.container.InventoryProxy import li.cil.oc.common.blockentity.traits.RedstoneAware import li.cil.oc.server.{PacketSender => ServerPacketSender} import net.minecraft.core.component.DataComponentHolder -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn import net.minecraft.world.item.ItemStack import net.minecraft.core.{BlockPos, Direction, HolderLookup} import net.minecraft.world.level.block.entity.BlockEntity @@ -251,7 +249,6 @@ class RobotProxy(pos: BlockPos, state: BlockState, val robot: Robot) override def loadComponentsForClient(holder: DataComponentHolder): Unit = robot.loadComponentsForClient(holder) - @OnlyIn(Dist.CLIENT) override def saveComponentsForClient(holder: MutableDataComponentHolder): Unit = robot.saveComponentsForClient(holder) override def setChanged(): Unit = robot.setChanged() diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala index 5beed3df4d..c057c64dd2 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/BaseBlockEntity.scala @@ -137,7 +137,9 @@ trait BaseBlockEntity extends net.minecraft.world.level.block.entity.BlockEntity @OnlyIn(Dist.CLIENT) def loadComponentsForClient(holder: DataComponentHolder): Unit = {} - @OnlyIn(Dist.CLIENT) + + // The dedicated server writes this client-facing snapshot into update tags + // sent to clients. Only loading the snapshot is client-only. def saveComponentsForClient(holder: MutableDataComponentHolder): Unit = {} // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala index 6a947e82ec..bcd947fe94 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/Computer.scala @@ -239,7 +239,6 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B Sound.startLoop(this, sound, 0.5f, (1000 + getLevel.random.nextInt(2000)).toLong) } - @OnlyIn(Dist.CLIENT) override def saveComponentsForClient(holder: MutableDataComponentHolder): Unit = { super.saveComponentsForClient(holder) holder.setComponent(OCComponents.IS_ERRORED, machine != null && machine.lastError != null) diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/OpenSides.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/OpenSides.scala index f803d8f34d..27d355f42c 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/OpenSides.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/OpenSides.scala @@ -4,8 +4,6 @@ import li.cil.oc.Settings import li.cil.oc.util.RotationHelper import net.minecraft.nbt.CompoundTag import net.minecraft.core.{Direction, HolderLookup} -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn /** * @author Vexatos @@ -43,7 +41,6 @@ trait OpenSides extends BaseBlockEntity { openSides = uncompressSides(nbt.getByte(Settings.namespace + "openSides")) } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) nbt.putByte(Settings.namespace + "openSides", compressSides) diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/PowerInformation.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/PowerInformation.scala index 74590bfbea..9d203bad08 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/PowerInformation.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/PowerInformation.scala @@ -4,8 +4,6 @@ import li.cil.oc.Settings import li.cil.oc.server.{PacketSender => ServerPacketSender} import net.minecraft.core.HolderLookup import net.minecraft.nbt.CompoundTag -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn trait PowerInformation extends BaseBlockEntity { private var lastSentRatio = -1.0 @@ -50,7 +48,6 @@ trait PowerInformation extends BaseBlockEntity { globalBufferSize = nbt.getDouble(GlobalBufferSizeTag) } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) lastSentRatio = if (globalBufferSize > 0) globalBuffer / globalBufferSize else 0 diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/RedstoneAware.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/RedstoneAware.scala index 8b265818ca..c6420a0c72 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/RedstoneAware.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/RedstoneAware.scala @@ -8,8 +8,6 @@ import li.cil.oc.server.{PacketSender => ServerPacketSender} import li.cil.oc.util.BlockPosHelper import net.minecraft.nbt.CompoundTag import net.minecraft.core.{Direction, HolderLookup} -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn case class RedstoneChangedEventArgs (side: Direction, oldValue: Int, newValue: Int, color: Int = -1) @@ -164,7 +162,6 @@ trait RedstoneAware extends RotationAware { nbt.getIntArray("output").copyToArray(_output) } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) nbt.putBoolean("isOutputEnabled", _isOutputEnabled) diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/RotatableBaseBlock.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/RotatableBaseBlock.scala index b8a0460812..fd529ebf77 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/RotatableBaseBlock.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/RotatableBaseBlock.scala @@ -3,7 +3,6 @@ package li.cil.oc.common.blockentity.traits import li.cil.oc.Settings import net.minecraft.core.{Direction, HolderLookup} import net.minecraft.nbt.CompoundTag -import net.neoforged.api.distmarker.{Dist, OnlyIn} /** * Like Rotatable, but stores the rotation information in the TE's NBT instead @@ -57,7 +56,6 @@ trait RotatableBaseBlock extends Rotatable { validatePitchAndYaw() } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) nbt.putInt(PitchTag, pitch.ordinal) diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala index 4727792ff5..63807340e1 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala @@ -8,8 +8,6 @@ import li.cil.oc.api.network.Node import li.cil.oc.common.datacomponents.CompoundStorage import net.minecraft.core.HolderLookup import net.minecraft.core.component.DataComponentHolder -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn import net.minecraft.nbt.{CompoundTag, NbtOps} import net.minecraft.world.level.Level @@ -143,7 +141,6 @@ trait TextBuffer extends Environment with Tickable { else buffer.loadData(nbt, provider) } - @OnlyIn(Dist.CLIENT) override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { super.saveForClient(nbt, provider) val storage = new CompoundStorage() From 4e1eb14b26b30ac16d4668d1386f1b7a06d8a4e5 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sat, 8 Aug 2026 13:51:00 -0700 Subject: [PATCH 12/38] Fix tablet crashing on dedicated server Use direct registry access for item stack serialization so tablet updates don't call the server lifecycle hook on the client. --- src/main/scala/li/cil/oc/client/PacketSender.scala | 6 +++--- .../scala/li/cil/oc/common/PacketBuilder.scala | 6 +++--- src/main/scala/li/cil/oc/common/item/Tablet.scala | 4 ++-- src/main/scala/li/cil/oc/server/PacketSender.scala | 14 +++++++------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/scala/li/cil/oc/client/PacketSender.scala b/src/main/scala/li/cil/oc/client/PacketSender.scala index d83463cff4..a43888961a 100644 --- a/src/main/scala/li/cil/oc/client/PacketSender.scala +++ b/src/main/scala/li/cil/oc/client/PacketSender.scala @@ -11,7 +11,7 @@ import li.cil.oc.common.blockentity.traits.Computer import net.minecraft.client.Minecraft import net.minecraft.client.resources.sounds.SimpleSoundInstance import net.minecraft.world.item.ItemStack -import net.minecraft.core.Direction +import net.minecraft.core.{Direction, RegistryAccess} import net.minecraft.resources.ResourceLocation import net.minecraft.sounds.SoundEvents @@ -119,10 +119,10 @@ object PacketSender { } } - def sendMachineItemStateRequest(stack: ItemStack): Unit = { + def sendMachineItemStateRequest(stack: ItemStack, registryAccess: RegistryAccess): Unit = { val pb = new SimplePacketBuilder(PacketType.MachineItemStateRequest) - pb.writeItemStack(stack) + pb.writeItemStack(stack, registryAccess) pb.sendToServer() } diff --git a/src/main/scala/li/cil/oc/common/PacketBuilder.scala b/src/main/scala/li/cil/oc/common/PacketBuilder.scala index b963f19158..4ad960b565 100644 --- a/src/main/scala/li/cil/oc/common/PacketBuilder.scala +++ b/src/main/scala/li/cil/oc/common/PacketBuilder.scala @@ -3,7 +3,7 @@ package li.cil.oc.common import li.cil.oc.Settings import li.cil.oc.api.network.EnvironmentHost import li.cil.oc.util.BlockPosition -import net.minecraft.core.{Direction, Registry} +import net.minecraft.core.{Direction, Registry, RegistryAccess} import net.minecraft.nbt.{CompoundTag, NbtIo} import net.minecraft.server.level.{ServerLevel, ServerPlayer} import net.minecraft.world.entity.Entity @@ -50,11 +50,11 @@ abstract class PacketBuilder(stream: OutputStream) extends DataOutputStream(stre case _ => writeByte(-1: Byte) } - def writeItemStack(stack: ItemStack) = { + def writeItemStack(stack: ItemStack, registryAccess: RegistryAccess): Unit = { val haveStack = !stack.isEmpty && stack.getCount > 0 writeBoolean(haveStack) if (haveStack) { - writeNBT(stack.save(ServerLifecycleHooks.getCurrentServer.registryAccess()).asInstanceOf[CompoundTag]) + writeNBT(stack.save(registryAccess).asInstanceOf[CompoundTag]) } } diff --git a/src/main/scala/li/cil/oc/common/item/Tablet.scala b/src/main/scala/li/cil/oc/common/item/Tablet.scala index 640f7f2ac2..f6552ddace 100644 --- a/src/main/scala/li/cil/oc/common/item/Tablet.scala +++ b/src/main/scala/li/cil/oc/common/item/Tablet.scala @@ -401,7 +401,7 @@ class TabletWrapper(var stack: ItemStack, var player: Player) extends ComponentI buffer.setMaximumResolution(80, 25) } - client.PacketSender.sendMachineItemStateRequest(stack) + client.PacketSender.sendMachineItemStateRequest(stack, level.registryAccess()) } if (!level.isClientSide) { if (isCreative && level.getGameTime % Settings.get.tickFrequency == 0) { @@ -536,7 +536,7 @@ object Tablet { if (timesChanged != weak.timesChanged) { if (!weak.isDirty) { weak.isDirty = true - client.PacketSender.sendMachineItemStateRequest(stack) + client.PacketSender.sendMachineItemStateRequest(stack, holder.level.registryAccess()) } weak.timesChanged = timesChanged } diff --git a/src/main/scala/li/cil/oc/server/PacketSender.scala b/src/main/scala/li/cil/oc/server/PacketSender.scala index 5fe785b9e4..770ce70e8e 100644 --- a/src/main/scala/li/cil/oc/server/PacketSender.scala +++ b/src/main/scala/li/cil/oc/server/PacketSender.scala @@ -154,7 +154,7 @@ object PacketSender { def sendMachineItemState(player: ServerPlayer, stack: ItemStack, isRunning: Boolean): Unit = { val pb = new SimplePacketBuilder(PacketType.MachineItemStateResponse) - pb.writeItemStack(stack) + pb.writeItemStack(stack, player.server.registryAccess()) pb.writeBoolean(isRunning) pb.sendToPlayer(player) @@ -307,7 +307,7 @@ object PacketSender { val pb = new SimplePacketBuilder(PacketType.FloppyChange) pb.writeTileEntity(t) - pb.writeItemStack(stack) + pb.writeItemStack(stack, t.getLevel.registryAccess()) pb.sendToPlayersNearTileEntity(t) } @@ -425,14 +425,14 @@ object PacketSender { for (stack <- stacks) { val pb = new SimplePacketBuilder(PacketType.LootDisk) - pb.writeItemStack(stack) + pb.writeItemStack(stack, p.server.registryAccess()) pb.sendToPlayer(p) } for (stack <- Loot.disksForCyclingServer) { val pb = new SimplePacketBuilder(PacketType.CyclingDisk) - pb.writeItemStack(stack) + pb.writeItemStack(stack, p.server.registryAccess()) pb.sendToPlayer(p) } @@ -556,7 +556,7 @@ object PacketSender { pb.writeInt(t.getContainerSize) for (slot <- 0 until t.getContainerSize) { pb.writeInt(slot) - pb.writeItemStack(t.getItem(slot)) + pb.writeItemStack(t.getItem(slot), t.getLevel.registryAccess()) } pb.sendToPlayersNearTileEntity(t) @@ -568,7 +568,7 @@ object PacketSender { pb.writeTileEntity(t) pb.writeInt(1) pb.writeInt(slot) - pb.writeItemStack(t.getItem(slot)) + pb.writeItemStack(t.getItem(slot), t.getLevel.registryAccess()) pb.sendToPlayersNearTileEntity(t) } @@ -655,7 +655,7 @@ object PacketSender { pb.writeTileEntity(t.proxy) pb.writeInt(slot) - pb.writeItemStack(stack) + pb.writeItemStack(stack, t.getLevel.registryAccess()) pb.sendToPlayersNearTileEntity(t) } From b123acbeea1d5b8a4827f3a7428c0048b799f28c Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sat, 8 Aug 2026 16:16:11 -0700 Subject: [PATCH 13/38] Implement #39 with the component clear method Reimplements PR #39 with the component clear methods. Needs review before merge. # Conflicts: # src/main/scala/li/cil/oc/common/init/OCItems.scala # src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala --- .../event/ChunkloaderUpgradeHandler.scala | 2 +- .../scala/li/cil/oc/common/init/OCItems.scala | 75 +++++++++-------- .../scala/li/cil/oc/common/item/ALU.scala | 8 -- .../scala/li/cil/oc/common/item/APU.scala | 5 +- .../li/cil/oc/common/item/ArrowKeys.scala | 10 --- .../li/cil/oc/common/item/AudioCard.scala | 2 +- .../li/cil/oc/common/item/BasicItem.scala | 22 +++++ .../li/cil/oc/common/item/ButtonGroup.scala | 10 --- .../scala/li/cil/oc/common/item/CPU.scala | 3 +- .../oc/common/item/CapacitorMountable.scala | 7 -- .../li/cil/oc/common/item/CardBase.scala | 8 -- .../li/cil/oc/common/item/CircuitBoard.scala | 8 -- .../li/cil/oc/common/item/ComponentBus.scala | 2 - .../li/cil/oc/common/item/ControlUnit.scala | 8 -- .../cil/oc/common/item/CreativeMemory.scala | 13 --- .../li/cil/oc/common/item/CuttingWire.scala | 8 -- .../li/cil/oc/common/item/DataCard.scala | 5 +- .../li/cil/oc/common/item/DebugCard.scala | 3 +- .../li/cil/oc/common/item/DiamondChip.scala | 8 -- .../scala/li/cil/oc/common/item/Disk.scala | 8 -- .../li/cil/oc/common/item/DroneCase.scala | 2 - .../li/cil/oc/common/item/GraphicsCard.scala | 7 +- .../oc/common/item/InkCartridgeEmpty.scala | 8 -- .../li/cil/oc/common/item/InternetCard.scala | 8 -- .../li/cil/oc/common/item/Interweb.scala | 8 -- .../scala/li/cil/oc/common/item/Memory.scala | 2 - .../li/cil/oc/common/item/Microchip.scala | 2 - .../oc/common/item/MicrocontrollerCase.scala | 2 - .../cil/oc/common/item/NetheriteSilicon.scala | 7 -- .../li/cil/oc/common/item/NetworkCard.scala | 8 -- .../scala/li/cil/oc/common/item/NumPad.scala | 8 -- .../oc/common/item/PrintedCircuitBoard.scala | 8 -- .../cil/oc/common/item/QuadGraphicsCard.scala | 4 +- .../scala/li/cil/oc/common/item/RackKVM.scala | 7 -- .../cil/oc/common/item/RawCircuitBoard.scala | 8 -- .../li/cil/oc/common/item/RedstoneCard.scala | 3 +- .../scala/li/cil/oc/common/item/Server.scala | 2 - .../li/cil/oc/common/item/TabletCase.scala | 2 - .../li/cil/oc/common/item/Transistor.scala | 8 -- .../li/cil/oc/common/item/UpgradeAngel.scala | 8 -- .../cil/oc/common/item/UpgradeBattery.scala | 2 - .../oc/common/item/UpgradeChunkloader.scala | 8 -- .../oc/common/item/UpgradeContainerCard.scala | 2 - .../common/item/UpgradeContainerUpgrade.scala | 2 - .../cil/oc/common/item/UpgradeCrafting.scala | 8 -- .../cil/oc/common/item/UpgradeDatabase.scala | 2 - .../li/cil/oc/common/item/UpgradeHover.scala | 2 - .../cil/oc/common/item/UpgradeInventory.scala | 8 -- .../item/UpgradeInventoryController.scala | 7 -- .../li/cil/oc/common/item/UpgradeLeash.scala | 8 -- .../oc/common/item/UpgradeNavigation.scala | 8 -- .../li/cil/oc/common/item/UpgradePiston.scala | 8 -- .../li/cil/oc/common/item/UpgradeSign.scala | 8 -- .../oc/common/item/UpgradeStickyPiston.scala | 11 --- .../common/item/UpgradeTankController.scala | 8 -- .../oc/common/item/UpgradeTractorBeam.scala | 8 -- .../cil/oc/common/item/UpgradeTrading.scala | 10 --- .../oc/common/item/WirelessNetworkCard.scala | 3 +- .../oc/common/item/traits/ComponentItem.scala | 47 +++++++++++ .../oc/common/item/traits/SimpleItem.scala | 82 ++++--------------- 60 files changed, 138 insertions(+), 431 deletions(-) delete mode 100644 src/main/scala/li/cil/oc/common/item/ALU.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/ArrowKeys.scala create mode 100644 src/main/scala/li/cil/oc/common/item/BasicItem.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/ButtonGroup.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/CapacitorMountable.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/CardBase.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/CircuitBoard.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/ControlUnit.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/CreativeMemory.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/CuttingWire.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/DiamondChip.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/Disk.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/InkCartridgeEmpty.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/InternetCard.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/Interweb.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/NetheriteSilicon.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/NetworkCard.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/NumPad.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/PrintedCircuitBoard.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/RackKVM.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/RawCircuitBoard.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/Transistor.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeAngel.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeChunkloader.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeCrafting.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeInventory.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeInventoryController.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeLeash.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeNavigation.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradePiston.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeSign.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeStickyPiston.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeTankController.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeTractorBeam.scala delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeTrading.scala create mode 100644 src/main/scala/li/cil/oc/common/item/traits/ComponentItem.scala diff --git a/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala b/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala index ea28481e1a..cc543f4184 100644 --- a/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala +++ b/src/main/scala/li/cil/oc/common/event/ChunkloaderUpgradeHandler.scala @@ -147,4 +147,4 @@ object ChunkloaderUpgradeHandler { case _ => } } -} \ No newline at end of file +} diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index 2b7e5b2c16..ab01027eec 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -4,7 +4,6 @@ import li.cil.oc.api.detail.{ItemAPI, ItemInfo} import li.cil.oc.api.fs.FileSystem import li.cil.oc.common.block.SimpleBlock import li.cil.oc.common.datacomponents.OCComponents -import li.cil.oc.common.item.NetheriteSilicon import li.cil.oc.common.item.data._ import li.cil.oc.common.item.traits.SimpleItem import li.cil.oc.common.{Loot, Tier, item} @@ -138,6 +137,10 @@ object OCItems extends ItemAPI { ro } + private def registerBasicItem(id: String, section_id: String, props: Item.Properties = defaultProps): DeferredItem[Item] = registerItem(new item.BasicItem(props, id), id, section_id) + + private def registerBasicTieredItem(id: String, section_id: String, props: Item.Properties): DeferredItem[Item] = registerItem(new item.BasicTieredItem(props, id), id, section_id) + def registerStack(stack: ItemStack, id: String): ItemStack = { val immutableStack = stack.copy() descriptors += id -> new ItemInfo { @@ -351,24 +354,24 @@ object OCItems extends ItemAPI { ///////////////////////////////////////////////////////////////// // Crafting materials. ///////////////////////////////////////////////////////////////// - val CuttingWire: DeferredItem[item.CuttingWire] = registerItem(new item.CuttingWire(defaultProps), Constants.ItemName.CuttingWire, "50_materials") + val CuttingWire: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CuttingWire, "50_materials") val Acid: DeferredItem[item.Acid] = registerItem(new item.Acid(defaultProps), Constants.ItemName.Acid, "50_materials") - val RawCircuitBoard: DeferredItem[item.RawCircuitBoard] = registerItem(new item.RawCircuitBoard(defaultProps), Constants.ItemName.RawCircuitBoard, "50_materials") - val CircuitBoard: DeferredItem[item.CircuitBoard] = registerItem(new item.CircuitBoard(defaultProps), Constants.ItemName.CircuitBoard, "50_materials") - val PrintedCircuitBoard: DeferredItem[item.PrintedCircuitBoard] = registerItem(new item.PrintedCircuitBoard(defaultProps), Constants.ItemName.PrintedCircuitBoard, "50_materials") - val Card: DeferredItem[item.CardBase] = registerItem(new item.CardBase(defaultProps), Constants.ItemName.Card, "50_materials") - val Transistor: DeferredItem[item.Transistor] = registerItem(new item.Transistor(defaultProps), Constants.ItemName.Transistor, "50_materials") + val RawCircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RawCircuitBoard, "50_materials") + val CircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CircuitBoard, "50_materials") + val PrintedCircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.PrintedCircuitBoard, "50_materials") + val Card: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "cardbase"), Constants.ItemName.Card, "50_materials") + val Transistor: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Transistor, "50_materials") val ChipTier1: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps, Tier.One), Constants.ItemName.ChipTier1, "50_materials") val ChipTier2: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ChipTier2, "50_materials") val ChipTier3: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ChipTier3, "50_materials") val ChipTier4: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ChipTier4, "50_materials") - val Alu: DeferredItem[item.ALU] = registerItem(new item.ALU(defaultProps), Constants.ItemName.Alu, "50_materials") - val ControlUnit: DeferredItem[item.ControlUnit] = registerItem(new item.ControlUnit(defaultProps), Constants.ItemName.ControlUnit, "50_materials") - val Disk: DeferredItem[item.Disk] = registerItem(new item.Disk(defaultProps), Constants.ItemName.Disk, "50_materials") - val Interweb: DeferredItem[item.Interweb] = registerItem(new item.Interweb(defaultProps), Constants.ItemName.Interweb, "50_materials") - val ButtonGroup: DeferredItem[item.ButtonGroup] = registerItem(new item.ButtonGroup(defaultProps), Constants.ItemName.ButtonGroup, "50_materials") - val ArrowKeys: DeferredItem[item.ArrowKeys] = registerItem(new item.ArrowKeys(defaultProps), Constants.ItemName.ArrowKeys, "50_materials") - val NumPad: DeferredItem[item.NumPad] = registerItem(new item.NumPad(defaultProps), Constants.ItemName.NumPad, "50_materials") + val Alu: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Alu, "50_materials") + val ControlUnit: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "controlunit"), Constants.ItemName.ControlUnit, "50_materials") + val Disk: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Disk, "50_materials") + val Interweb: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Interweb, "50_materials") + val ButtonGroup: DeferredItem[Item] = registerBasicItem(Constants.ItemName.ButtonGroup, "50_materials", defaultProps) + val ArrowKeys: DeferredItem[Item] = registerBasicItem(Constants.ItemName.ArrowKeys, "50_materials") + val NumPad: DeferredItem[Item] = registerBasicItem(Constants.ItemName.NumPad, "50_materials") val TabletCaseTier1: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps, Tier.One), Constants.ItemName.TabletCaseTier1, "50_materials") val TabletCaseTier2: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.TabletCaseTier2, "50_materials") @@ -383,12 +386,12 @@ object OCItems extends ItemAPI { val DroneCaseTier3: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.DroneCaseTier3, "50_materials") val DroneCaseCreative: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.DroneCaseCreative, "50_materials") - val InkCartridgeEmpty: DeferredItem[item.InkCartridgeEmpty] = registerItem(new item.InkCartridgeEmpty(defaultProps.stacksTo(1)), Constants.ItemName.InkCartridgeEmpty, "50_materials") + val InkCartridgeEmpty: DeferredItem[Item] = registerBasicItem(Constants.ItemName.InkCartridgeEmpty, "50_materials", defaultProps.stacksTo(1)) val InkCartridge: DeferredItem[item.InkCartridge] = registerItem(new item.InkCartridge(defaultProps.stacksTo(1)), Constants.ItemName.InkCartridge, "50_materials") val Chamelium: DeferredItem[item.Chamelium] = registerItem(new item.Chamelium(defaultProps), Constants.ItemName.Chamelium, "50_materials") - val DiamondChip: DeferredItem[item.DiamondChip] = registerItem(new item.DiamondChip(defaultProps), Constants.ItemName.DiamondChip, "50_materials") - val NetheriteSilicon: DeferredItem[NetheriteSilicon] = registerItem(new NetheriteSilicon(defaultProps), Constants.ItemName.NetheriteSilicon, "50_materials") + val DiamondChip: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "diamondchip"), Constants.ItemName.DiamondChip, "50_materials") + val NetheriteSilicon: DeferredItem[Item] = registerBasicItem(Constants.ItemName.NetheriteSilicon, "50_materials", defaultProps) // All kinds of tools. val Analyzer: DeferredItem[item.Analyzer] = registerItem(new item.Analyzer(defaultProps), Constants.ItemName.Analyzer, "49_tools") @@ -427,7 +430,7 @@ object OCItems extends ItemAPI { val RAMTier7: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Seven), Constants.ItemName.RAMTier7, "25_components") val RAMTier8: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Eight), Constants.ItemName.RAMTier8, "25_components") // 1.9 - val RAMCreative: DeferredItem[item.CreativeMemory] = registerItem(new item.CreativeMemory(defaultProps.rarity(Rarity.EPIC)), Constants.ItemName.RAMCreative, "25_components") + val RAMCreative: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RAMCreative, "25_components", defaultProps.rarity(Rarity.EPIC)) val ServerTier1: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1), Tier.One), Constants.ItemName.ServerTier1, "25_components") val ServerTier2: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ServerTier2, "25_components") @@ -442,11 +445,11 @@ object OCItems extends ItemAPI { // 1.6 val TerminalServer: DeferredItem[item.TerminalServer] = registerItem(new item.TerminalServer(defaultProps.stacksTo(1)), Constants.ItemName.TerminalServer, "25_components") - val RackKVM: DeferredItem[item.RackKVM] = registerItem(new item.RackKVM(defaultProps.stacksTo(1)), Constants.ItemName.RackKVM, "25_components") + val RackKVM: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RackKVM, "25_components", defaultProps.stacksTo(1)) val DiskDriveMountable: DeferredItem[item.DiskDriveMountable] = registerItem(new item.DiskDriveMountable(defaultProps.stacksTo(1)), Constants.ItemName.DiskDriveMountable, "25_components") // 1.9 - val CapacitorMountable: DeferredItem[item.CapacitorMountable] = registerItem(new item.CapacitorMountable(defaultProps.stacksTo(1)), Constants.ItemName.CapacitorMountable, "25_components") + val CapacitorMountable: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CapacitorMountable, "25_components", defaultProps.stacksTo(1)) // Card components. val DebugCard: DeferredItem[item.DebugCard] = registerItem(new item.DebugCard(defaultProps), Constants.ItemName.DebugCard, "25_components") @@ -454,12 +457,12 @@ object OCItems extends ItemAPI { val GraphicsCardTier2: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.GraphicsCardTier2, "25_components") val GraphicsCardTier3: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.GraphicsCardTier3, "25_components") val GraphicsCardTier4: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.GraphicsCardTier4, "25_components") - val QuadGraphicsCard: DeferredItem[item.QuadGraphicsCard] = registerItem(new item.QuadGraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY)), Constants.ItemName.QuadGraphicsCard, "25_components") + val QuadGraphicsCard: DeferredItem[Item] = registerItem(new item.QuadGraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY)), Constants.ItemName.QuadGraphicsCard, "25_components") val RedstoneCardTier1: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps, Tier.One), Constants.ItemName.RedstoneCardTier1, "25_components") val RedstoneCardTier2: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.RedstoneCardTier2, "25_components") - val NetworkCard: DeferredItem[item.NetworkCard] = registerItem(new item.NetworkCard(defaultProps), Constants.ItemName.NetworkCard, "25_components") + val NetworkCard: DeferredItem[Item] = registerItem(new item.BasicTieredComponentItem(defaultProps, "networkcard"), Constants.ItemName.NetworkCard, "25_components") val WirelessNetworkCardTier2: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.WirelessNetworkCardTier2, "25_components") - val InternetCard: DeferredItem[item.InternetCard] = registerItem(new item.InternetCard(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.InternetCard, "25_components") + val InternetCard: DeferredItem[Item] = registerItem(new item.BasicTieredComponentItem(defaultProps.rarity(Rarity.UNCOMMON), "internetcard"), Constants.ItemName.InternetCard, "25_components") val LinkedCard: DeferredItem[item.LinkedCard] = registerItem(new item.LinkedCard(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.LinkedCard, "25_components") // 1.5.13 @@ -477,44 +480,44 @@ object OCItems extends ItemAPI { ///////////////////////////////////////////////////////////////// // Upgrade components. ///////////////////////////////////////////////////////////////// - val AngelUpgrade: DeferredItem[item.UpgradeAngel] = registerItem(new item.UpgradeAngel(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.AngelUpgrade, "80_upgrade") + val AngelUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradeangel"), Constants.ItemName.AngelUpgrade, "80_upgrade") val BatteryUpgradeTier1: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps, Tier.One), Constants.ItemName.BatteryUpgradeTier1, "80_upgrade") val BatteryUpgradeTier2: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.BatteryUpgradeTier2, "80_upgrade") val BatteryUpgradeTier3: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.BatteryUpgradeTier3, "80_upgrade") - val ChunkloaderUpgrade: DeferredItem[item.UpgradeChunkloader] = registerItem(new item.UpgradeChunkloader(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.ChunkloaderUpgrade, "80_upgrade") + val ChunkloaderUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.RARE), "upgradechunkloader"), Constants.ItemName.ChunkloaderUpgrade, "80_upgrade") val CardContainerTier1: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps, Tier.One), Constants.ItemName.CardContainerTier1, "80_upgrade") val CardContainerTier2: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CardContainerTier2, "80_upgrade") val CardContainerTier3: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CardContainerTier3, "80_upgrade") val UpgradeContainerTier1: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps, Tier.One), Constants.ItemName.UpgradeContainerTier1, "80_upgrade") val UpgradeContainerTier2: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.UpgradeContainerTier2, "80_upgrade") val UpgradeContainerTier3: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.UpgradeContainerTier3, "80_upgrade") - val CraftingUpgrade: DeferredItem[item.UpgradeCrafting] = registerItem(new item.UpgradeCrafting(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.CraftingUpgrade, "80_upgrade") + val CraftingUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradecrafting"), Constants.ItemName.CraftingUpgrade, "80_upgrade") val DatabaseUpgradeTier1: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps, Tier.One), Constants.ItemName.DatabaseUpgradeTier1, "80_upgrade") val DatabaseUpgradeTier2: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DatabaseUpgradeTier2, "80_upgrade") val DatabaseUpgradeTier3: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DatabaseUpgradeTier3, "80_upgrade") val ExperienceUpgrade: DeferredItem[item.UpgradeExperience] = registerItem(new item.UpgradeExperience(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.ExperienceUpgrade, "80_upgrade") val GeneratorUpgrade: DeferredItem[item.UpgradeGenerator] = registerItem(new item.UpgradeGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.GeneratorUpgrade, "80_upgrade") - val InventoryUpgrade: DeferredItem[item.UpgradeInventory] = registerItem(new item.UpgradeInventory(defaultProps), Constants.ItemName.InventoryUpgrade, "80_upgrade") - val InventoryControllerUpgrade: DeferredItem[item.UpgradeInventoryController] = registerItem(new item.UpgradeInventoryController(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.InventoryControllerUpgrade, "80_upgrade") - val NavigationUpgrade: DeferredItem[item.UpgradeNavigation] = registerItem(new item.UpgradeNavigation(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.NavigationUpgrade, "80_upgrade") - val PistonUpgrade: DeferredItem[item.UpgradePiston] = registerItem(new item.UpgradePiston(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.PistonUpgrade, "80_upgrade") - val SignUpgrade: DeferredItem[item.UpgradeSign] = registerItem(new item.UpgradeSign(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.SignUpgrade, "80_upgrade") + val InventoryUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradeinventory"), Constants.ItemName.InventoryUpgrade, "80_upgrade") + val InventoryControllerUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradeinventorycontroller"), Constants.ItemName.InventoryControllerUpgrade, "80_upgrade") + val NavigationUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradenavigation"), Constants.ItemName.NavigationUpgrade, "80_upgrade") + val PistonUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradepiston"), Constants.ItemName.PistonUpgrade, "80_upgrade") + val SignUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradesign"), Constants.ItemName.SignUpgrade, "80_upgrade") val SolarGeneratorUpgrade: DeferredItem[item.UpgradeSolarGenerator] = registerItem(new item.UpgradeSolarGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.SolarGeneratorUpgrade, "80_upgrade") val TankUpgrade: DeferredItem[item.UpgradeTank] = registerItem(new item.UpgradeTank(defaultProps), Constants.ItemName.TankUpgrade, "80_upgrade") - val TankControllerUpgrade: DeferredItem[item.UpgradeTankController] = registerItem(new item.UpgradeTankController(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.TankControllerUpgrade, "80_upgrade") - val TractorBeamUpgrade: DeferredItem[item.UpgradeTractorBeam] = registerItem(new item.UpgradeTractorBeam(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.TractorBeamUpgrade, "80_upgrade") - val LeashUpgrade: DeferredItem[item.UpgradeLeash] = registerItem(new item.UpgradeLeash(defaultProps), Constants.ItemName.LeashUpgrade, "80_upgrade") + val TankControllerUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradetankcontroller"), Constants.ItemName.TankControllerUpgrade, "80_upgrade") + val TractorBeamUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.RARE), "upgradetractorbeam"), Constants.ItemName.TractorBeamUpgrade, "80_upgrade") + val LeashUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradeleash"), Constants.ItemName.LeashUpgrade, "80_upgrade") // 1.5.8 val HoverUpgradeTier1: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps, Tier.One), Constants.ItemName.HoverUpgradeTier1, "80_upgrade") val HoverUpgradeTier2: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HoverUpgradeTier2, "80_upgrade") // 1.6 - val TradingUpgrade: DeferredItem[item.UpgradeTrading] = registerItem(new item.UpgradeTrading(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.TradingUpgrade, "80_upgrade") + val TradingUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradetrading"), Constants.ItemName.TradingUpgrade, "80_upgrade") val MFU: DeferredItem[item.UpgradeMF] = registerItem(new item.UpgradeMF(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.MFU, "80_upgrade") // 1.8 - val StickyPistonUpgrade: DeferredItem[item.UpgradeStickyPiston] = registerItem(new item.UpgradeStickyPiston(defaultProps), Constants.ItemName.StickyPistonUpgrade, "80_upgrade") + val StickyPistonUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradestickypiston"), Constants.ItemName.StickyPistonUpgrade, "80_upgrade") ///////////////////////////////////////////////////////////////// // Storage media of all kinds. diff --git a/src/main/scala/li/cil/oc/common/item/ALU.scala b/src/main/scala/li/cil/oc/common/item/ALU.scala deleted file mode 100644 index b27e33f92a..0000000000 --- a/src/main/scala/li/cil/oc/common/item/ALU.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class ALU(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/APU.scala b/src/main/scala/li/cil/oc/common/item/APU.scala index c30c2052da..3d78ca7a92 100644 --- a/src/main/scala/li/cil/oc/common/item/APU.scala +++ b/src/main/scala/li/cil/oc/common/item/APU.scala @@ -8,7 +8,7 @@ import net.neoforged.neoforge.common.extensions.IItemExtension import scala.language.existentials -class APU(props: Properties, val tier: Int) extends Item(props) with traits.SimpleItem with traits.ItemTier with traits.CPULike with traits.GPULike with IItemExtension { +class APU(props: Properties, val tier: Int) extends Item(props) with traits.ComponentItem with traits.ItemTier with traits.CPULike with traits.GPULike with IItemExtension { @Deprecated override def getDescriptionId = super.getDescriptionId + tier @@ -18,9 +18,8 @@ class APU(props: Properties, val tier: Int) extends Item(props) with traits.Simp override def gpuTier = math.min(Tier.Four, tier) - override protected def tooltipName = Option(unlocalizedName) - override protected def tooltipData: Seq[Any] = { super[CPULike].tooltipData ++ super[GPULike].tooltipData } + } diff --git a/src/main/scala/li/cil/oc/common/item/ArrowKeys.scala b/src/main/scala/li/cil/oc/common/item/ArrowKeys.scala deleted file mode 100644 index aae1321baf..0000000000 --- a/src/main/scala/li/cil/oc/common/item/ArrowKeys.scala +++ /dev/null @@ -1,10 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class ArrowKeys(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension { - override protected def tooltipName = None -} diff --git a/src/main/scala/li/cil/oc/common/item/AudioCard.scala b/src/main/scala/li/cil/oc/common/item/AudioCard.scala index 5856045eeb..0df85c67a3 100644 --- a/src/main/scala/li/cil/oc/common/item/AudioCard.scala +++ b/src/main/scala/li/cil/oc/common/item/AudioCard.scala @@ -5,4 +5,4 @@ import net.minecraft.world.item.Item.Properties import net.neoforged.neoforge.common.extensions.IItemExtension -class AudioCard(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension \ No newline at end of file +class AudioCard(props: Properties) extends Item(props) with traits.ComponentItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/BasicItem.scala b/src/main/scala/li/cil/oc/common/item/BasicItem.scala new file mode 100644 index 0000000000..b953568ad8 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/BasicItem.scala @@ -0,0 +1,22 @@ +package li.cil.oc.common.item + +import net.minecraft.world.item.Item +import net.minecraft.world.item.Item.Properties +import net.neoforged.neoforge.common.extensions.IItemExtension + + +final class BasicItem(props: Properties, name: String) extends Item(props) with traits.SimpleItem with IItemExtension { + unlocalizedName = name +} + +final class BasicTieredItem(props: Properties, name: String) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension { + unlocalizedName = name +} + +final class BasicComponentItem(props: Properties, name: String) extends Item(props) with traits.ComponentItem with IItemExtension { + unlocalizedName = name +} + +final class BasicTieredComponentItem(props: Properties, name: String) extends Item(props) with traits.ComponentItem with traits.ItemTier with IItemExtension { + unlocalizedName = name +} diff --git a/src/main/scala/li/cil/oc/common/item/ButtonGroup.scala b/src/main/scala/li/cil/oc/common/item/ButtonGroup.scala deleted file mode 100644 index 5fa5ca079c..0000000000 --- a/src/main/scala/li/cil/oc/common/item/ButtonGroup.scala +++ /dev/null @@ -1,10 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class ButtonGroup(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension { - override protected def tooltipName = None -} diff --git a/src/main/scala/li/cil/oc/common/item/CPU.scala b/src/main/scala/li/cil/oc/common/item/CPU.scala index bb4fbe1980..009e6bd8ea 100644 --- a/src/main/scala/li/cil/oc/common/item/CPU.scala +++ b/src/main/scala/li/cil/oc/common/item/CPU.scala @@ -6,11 +6,10 @@ import net.neoforged.neoforge.common.extensions.IItemExtension import scala.language.existentials -class CPU(props: Properties, val tier: Int) extends Item(props) with traits.SimpleItem with traits.ItemTier with traits.CPULike with IItemExtension { +class CPU(props: Properties, val tier: Int) extends Item(props) with traits.ComponentItem with traits.ItemTier with traits.CPULike with IItemExtension { @Deprecated override def getDescriptionId = super.getDescriptionId + tier override def cpuTier = tier - override protected def tooltipName = Option(unlocalizedName) } diff --git a/src/main/scala/li/cil/oc/common/item/CapacitorMountable.scala b/src/main/scala/li/cil/oc/common/item/CapacitorMountable.scala deleted file mode 100644 index 52200d3dce..0000000000 --- a/src/main/scala/li/cil/oc/common/item/CapacitorMountable.scala +++ /dev/null @@ -1,7 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - -class CapacitorMountable(props: Properties) extends Item(props) with IItemExtension with traits.SimpleItem \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/CardBase.scala b/src/main/scala/li/cil/oc/common/item/CardBase.scala deleted file mode 100644 index a356215822..0000000000 --- a/src/main/scala/li/cil/oc/common/item/CardBase.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class CardBase(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/CircuitBoard.scala b/src/main/scala/li/cil/oc/common/item/CircuitBoard.scala deleted file mode 100644 index 65eac46cc8..0000000000 --- a/src/main/scala/li/cil/oc/common/item/CircuitBoard.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class CircuitBoard(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/ComponentBus.scala b/src/main/scala/li/cil/oc/common/item/ComponentBus.scala index 88d04e865f..bc94efbe97 100644 --- a/src/main/scala/li/cil/oc/common/item/ComponentBus.scala +++ b/src/main/scala/li/cil/oc/common/item/ComponentBus.scala @@ -13,7 +13,5 @@ class ComponentBus(props: Properties, val tier: Int) extends Item(props) with tr override protected def tierFromDriver(stack: ItemStack) = tier - override protected def tooltipName = Option(unlocalizedName) - override protected def tooltipData = Seq(Settings.get.cpuComponentSupport(tier)) } diff --git a/src/main/scala/li/cil/oc/common/item/ControlUnit.scala b/src/main/scala/li/cil/oc/common/item/ControlUnit.scala deleted file mode 100644 index d01b2cb2d2..0000000000 --- a/src/main/scala/li/cil/oc/common/item/ControlUnit.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class ControlUnit(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/CreativeMemory.scala b/src/main/scala/li/cil/oc/common/item/CreativeMemory.scala deleted file mode 100644 index b615770312..0000000000 --- a/src/main/scala/li/cil/oc/common/item/CreativeMemory.scala +++ /dev/null @@ -1,13 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class CreativeMemory(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension { - @Deprecated - override def getDescriptionId = super.getDescriptionId - - override protected def tooltipName = Option(unlocalizedName) -} diff --git a/src/main/scala/li/cil/oc/common/item/CuttingWire.scala b/src/main/scala/li/cil/oc/common/item/CuttingWire.scala deleted file mode 100644 index 58592e711b..0000000000 --- a/src/main/scala/li/cil/oc/common/item/CuttingWire.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class CuttingWire(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/DataCard.scala b/src/main/scala/li/cil/oc/common/item/DataCard.scala index 5770b02ea3..68a724b89f 100644 --- a/src/main/scala/li/cil/oc/common/item/DataCard.scala +++ b/src/main/scala/li/cil/oc/common/item/DataCard.scala @@ -5,7 +5,8 @@ import net.minecraft.world.item.Item.Properties import net.neoforged.neoforge.common.extensions.IItemExtension -class DataCard(props: Properties, val tier: Int) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension { +class DataCard(props: Properties, val tier: Int) extends Item(props) with traits.ComponentItem with traits.ItemTier with IItemExtension { @Deprecated override def getDescriptionId = super.getDescriptionId + tier -} \ No newline at end of file + +} diff --git a/src/main/scala/li/cil/oc/common/item/DebugCard.scala b/src/main/scala/li/cil/oc/common/item/DebugCard.scala index 7596a3c066..183b5cf98d 100644 --- a/src/main/scala/li/cil/oc/common/item/DebugCard.scala +++ b/src/main/scala/li/cil/oc/common/item/DebugCard.scala @@ -17,7 +17,8 @@ import net.minecraft.world.entity.player.Player import net.minecraft.Util import net.neoforged.neoforge.common.extensions.IItemExtension -class DebugCard(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension { +class DebugCard(props: Properties) extends Item(props) with traits.ComponentItem with IItemExtension { + override protected def tooltipExtended(stack: ItemStack, tooltip: util.List[Component]): Unit = { super.tooltipExtended(stack, tooltip) val data = new DebugCardData(stack) diff --git a/src/main/scala/li/cil/oc/common/item/DiamondChip.scala b/src/main/scala/li/cil/oc/common/item/DiamondChip.scala deleted file mode 100644 index 787a1e2fef..0000000000 --- a/src/main/scala/li/cil/oc/common/item/DiamondChip.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class DiamondChip(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/Disk.scala b/src/main/scala/li/cil/oc/common/item/Disk.scala deleted file mode 100644 index 71d12ff18b..0000000000 --- a/src/main/scala/li/cil/oc/common/item/Disk.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class Disk(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/DroneCase.scala b/src/main/scala/li/cil/oc/common/item/DroneCase.scala index 853ec924bc..a33ba2e208 100644 --- a/src/main/scala/li/cil/oc/common/item/DroneCase.scala +++ b/src/main/scala/li/cil/oc/common/item/DroneCase.scala @@ -11,6 +11,4 @@ class DroneCase(props: Properties, val tier: Int) extends Item(props) with trait override def getDescriptionId = super.getDescriptionId + tier override protected def tierFromDriver(stack: ItemStack) = tier - - override protected def tooltipName = Option(unlocalizedName) } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala b/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala index be783278bf..dd7989d915 100644 --- a/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala +++ b/src/main/scala/li/cil/oc/common/item/GraphicsCard.scala @@ -5,13 +5,10 @@ import net.minecraft.world.item.Item.Properties import net.neoforged.neoforge.common.extensions.IItemExtension -class GraphicsCard(props: Properties, val tier: Int) extends Item(props) with traits.SimpleItem with traits.ItemTier with traits.GPULike with IItemExtension { - override protected def canResetComponentIdentity = true - +class GraphicsCard(props: Properties, val tier: Int) extends Item(props) with traits.ComponentItem with traits.ItemTier with traits.GPULike with IItemExtension { @Deprecated override def getDescriptionId = super.getDescriptionId + tier override def gpuTier = tier - override protected def tooltipName = Option(unlocalizedName) -} \ No newline at end of file +} diff --git a/src/main/scala/li/cil/oc/common/item/InkCartridgeEmpty.scala b/src/main/scala/li/cil/oc/common/item/InkCartridgeEmpty.scala deleted file mode 100644 index 5b0bfc479b..0000000000 --- a/src/main/scala/li/cil/oc/common/item/InkCartridgeEmpty.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class InkCartridgeEmpty(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/InternetCard.scala b/src/main/scala/li/cil/oc/common/item/InternetCard.scala deleted file mode 100644 index ef7d214882..0000000000 --- a/src/main/scala/li/cil/oc/common/item/InternetCard.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class InternetCard(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/Interweb.scala b/src/main/scala/li/cil/oc/common/item/Interweb.scala deleted file mode 100644 index 8647ec4ff2..0000000000 --- a/src/main/scala/li/cil/oc/common/item/Interweb.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.neoforged.neoforge.common.extensions.IItemExtension -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties - - -class Interweb(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/Memory.scala b/src/main/scala/li/cil/oc/common/item/Memory.scala index de5e0a08c1..c5ea9bf29c 100644 --- a/src/main/scala/li/cil/oc/common/item/Memory.scala +++ b/src/main/scala/li/cil/oc/common/item/Memory.scala @@ -11,8 +11,6 @@ class Memory(props: Properties, val tier: Int) extends Item(props) with traits.S @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) - val kiloBytes: Int = Settings.get.ramSizes(tier) override def getName(stack: ItemStack): Component = { diff --git a/src/main/scala/li/cil/oc/common/item/Microchip.scala b/src/main/scala/li/cil/oc/common/item/Microchip.scala index 6f51409c7a..1e3f5144e9 100644 --- a/src/main/scala/li/cil/oc/common/item/Microchip.scala +++ b/src/main/scala/li/cil/oc/common/item/Microchip.scala @@ -9,6 +9,4 @@ import net.neoforged.neoforge.common.extensions.IItemExtension class Microchip(props: Properties, val tier: Int) extends Item(props) with traits.SimpleItem with IItemExtension { @Deprecated override def getDescriptionId = super.getDescriptionId + tier - - override protected def tooltipName = Option(unlocalizedName) } diff --git a/src/main/scala/li/cil/oc/common/item/MicrocontrollerCase.scala b/src/main/scala/li/cil/oc/common/item/MicrocontrollerCase.scala index cc0c262fcc..e1ad40156a 100644 --- a/src/main/scala/li/cil/oc/common/item/MicrocontrollerCase.scala +++ b/src/main/scala/li/cil/oc/common/item/MicrocontrollerCase.scala @@ -11,6 +11,4 @@ class MicrocontrollerCase(props: Properties, val tier: Int) extends Item(props) override def getDescriptionId = super.getDescriptionId + tier override protected def tierFromDriver(stack: ItemStack) = tier - - override protected def tooltipName = Option(unlocalizedName) } diff --git a/src/main/scala/li/cil/oc/common/item/NetheriteSilicon.scala b/src/main/scala/li/cil/oc/common/item/NetheriteSilicon.scala deleted file mode 100644 index b19ead3de8..0000000000 --- a/src/main/scala/li/cil/oc/common/item/NetheriteSilicon.scala +++ /dev/null @@ -1,7 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - -class NetheriteSilicon(props: Properties) extends Item(props) with IItemExtension with traits.SimpleItem diff --git a/src/main/scala/li/cil/oc/common/item/NetworkCard.scala b/src/main/scala/li/cil/oc/common/item/NetworkCard.scala deleted file mode 100644 index 5ae20be2e4..0000000000 --- a/src/main/scala/li/cil/oc/common/item/NetworkCard.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class NetworkCard(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/NumPad.scala b/src/main/scala/li/cil/oc/common/item/NumPad.scala deleted file mode 100644 index f3cb7de0eb..0000000000 --- a/src/main/scala/li/cil/oc/common/item/NumPad.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class NumPad(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/PrintedCircuitBoard.scala b/src/main/scala/li/cil/oc/common/item/PrintedCircuitBoard.scala deleted file mode 100644 index 2861247bb2..0000000000 --- a/src/main/scala/li/cil/oc/common/item/PrintedCircuitBoard.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class PrintedCircuitBoard(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/QuadGraphicsCard.scala b/src/main/scala/li/cil/oc/common/item/QuadGraphicsCard.scala index b049852463..8542225409 100644 --- a/src/main/scala/li/cil/oc/common/item/QuadGraphicsCard.scala +++ b/src/main/scala/li/cil/oc/common/item/QuadGraphicsCard.scala @@ -4,6 +4,4 @@ import net.minecraft.world.item.Item import net.minecraft.world.item.Item.Properties import net.neoforged.neoforge.common.extensions.IItemExtension -class QuadGraphicsCard(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension { - override protected def canResetComponentIdentity = true -} +class QuadGraphicsCard(props: Properties) extends Item(props) with traits.ComponentItem with traits.ItemTier with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/RackKVM.scala b/src/main/scala/li/cil/oc/common/item/RackKVM.scala deleted file mode 100644 index 8869f62737..0000000000 --- a/src/main/scala/li/cil/oc/common/item/RackKVM.scala +++ /dev/null @@ -1,7 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - -class RackKVM(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/RawCircuitBoard.scala b/src/main/scala/li/cil/oc/common/item/RawCircuitBoard.scala deleted file mode 100644 index 7c27c1a64d..0000000000 --- a/src/main/scala/li/cil/oc/common/item/RawCircuitBoard.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class RawCircuitBoard(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala b/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala index f0334c7603..d2d0f4e557 100644 --- a/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala +++ b/src/main/scala/li/cil/oc/common/item/RedstoneCard.scala @@ -5,9 +5,8 @@ import net.minecraft.world.item.Item.Properties import net.neoforged.neoforge.common.extensions.IItemExtension -class RedstoneCard(props: Properties, val tier: Int) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension { +class RedstoneCard(props: Properties, val tier: Int) extends Item(props) with traits.ComponentItem with traits.ItemTier with IItemExtension { @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) } diff --git a/src/main/scala/li/cil/oc/common/item/Server.scala b/src/main/scala/li/cil/oc/common/item/Server.scala index 91e5ebf5a4..cdff6be785 100644 --- a/src/main/scala/li/cil/oc/common/item/Server.scala +++ b/src/main/scala/li/cil/oc/common/item/Server.scala @@ -25,8 +25,6 @@ class Server(props: Properties, val tier: Int) extends Item(props) with traits.S @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) - private object HelperInventory extends ServerInventory { var container = ItemStack.EMPTY diff --git a/src/main/scala/li/cil/oc/common/item/TabletCase.scala b/src/main/scala/li/cil/oc/common/item/TabletCase.scala index f7b901e4af..4d211ea8d1 100644 --- a/src/main/scala/li/cil/oc/common/item/TabletCase.scala +++ b/src/main/scala/li/cil/oc/common/item/TabletCase.scala @@ -11,6 +11,4 @@ class TabletCase(props: Properties, val tier: Int) extends Item(props) with trai override def getDescriptionId = super.getDescriptionId + tier override protected def tierFromDriver(stack: ItemStack) = tier - - override protected def tooltipName = Option(unlocalizedName) } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/Transistor.scala b/src/main/scala/li/cil/oc/common/item/Transistor.scala deleted file mode 100644 index c29ed9eb53..0000000000 --- a/src/main/scala/li/cil/oc/common/item/Transistor.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class Transistor(props: Properties) extends Item(props) with traits.SimpleItem with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeAngel.scala b/src/main/scala/li/cil/oc/common/item/UpgradeAngel.scala deleted file mode 100644 index 0a444b0779..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeAngel.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeAngel(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeBattery.scala b/src/main/scala/li/cil/oc/common/item/UpgradeBattery.scala index d3f4a69da1..bbe71f703f 100644 --- a/src/main/scala/li/cil/oc/common/item/UpgradeBattery.scala +++ b/src/main/scala/li/cil/oc/common/item/UpgradeBattery.scala @@ -15,8 +15,6 @@ class UpgradeBattery(props: Properties, val tier: Int) extends Item(props) with @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) - override protected def tooltipData = Seq(Settings.get.bufferCapacitorUpgrades(tier).toInt) override def isBarVisible(stack: ItemStack) = true diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeChunkloader.scala b/src/main/scala/li/cil/oc/common/item/UpgradeChunkloader.scala deleted file mode 100644 index aafa74d9ec..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeChunkloader.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeChunkloader(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeContainerCard.scala b/src/main/scala/li/cil/oc/common/item/UpgradeContainerCard.scala index c1cc637d79..8eee2bd5ac 100644 --- a/src/main/scala/li/cil/oc/common/item/UpgradeContainerCard.scala +++ b/src/main/scala/li/cil/oc/common/item/UpgradeContainerCard.scala @@ -9,7 +9,5 @@ class UpgradeContainerCard(props: Properties, val tier: Int) extends Item(props) @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) - override protected def tooltipData = Seq(tier + 1) } diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeContainerUpgrade.scala b/src/main/scala/li/cil/oc/common/item/UpgradeContainerUpgrade.scala index bdf75d4ba0..a2422b87c3 100644 --- a/src/main/scala/li/cil/oc/common/item/UpgradeContainerUpgrade.scala +++ b/src/main/scala/li/cil/oc/common/item/UpgradeContainerUpgrade.scala @@ -9,7 +9,5 @@ class UpgradeContainerUpgrade(props: Properties, val tier: Int) extends Item(pro @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) - override protected def tooltipData = Seq(tier + 1) } diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeCrafting.scala b/src/main/scala/li/cil/oc/common/item/UpgradeCrafting.scala deleted file mode 100644 index ae94c5093d..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeCrafting.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeCrafting(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeDatabase.scala b/src/main/scala/li/cil/oc/common/item/UpgradeDatabase.scala index a5d68b29ed..7647112bf2 100644 --- a/src/main/scala/li/cil/oc/common/item/UpgradeDatabase.scala +++ b/src/main/scala/li/cil/oc/common/item/UpgradeDatabase.scala @@ -22,8 +22,6 @@ class UpgradeDatabase(props: Properties, val tier: Int) extends Item(props) with @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) - override protected def tooltipData = Seq(Settings.get.databaseEntriesPerTier(tier)) override def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = { diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeHover.scala b/src/main/scala/li/cil/oc/common/item/UpgradeHover.scala index 33ef746d1a..bbe2bd03cb 100644 --- a/src/main/scala/li/cil/oc/common/item/UpgradeHover.scala +++ b/src/main/scala/li/cil/oc/common/item/UpgradeHover.scala @@ -10,7 +10,5 @@ class UpgradeHover(props: Properties, val tier: Int) extends Item(props) with tr @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) - override protected def tooltipData = Seq(Settings.get.upgradeFlightHeight(tier)) } diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeInventory.scala b/src/main/scala/li/cil/oc/common/item/UpgradeInventory.scala deleted file mode 100644 index e29a084853..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeInventory.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeInventory(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeInventoryController.scala b/src/main/scala/li/cil/oc/common/item/UpgradeInventoryController.scala deleted file mode 100644 index 0508848f0c..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeInventoryController.scala +++ /dev/null @@ -1,7 +0,0 @@ -package li.cil.oc.common.item - -import net.neoforged.neoforge.common.extensions.IItemExtension -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties - -class UpgradeInventoryController(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeLeash.scala b/src/main/scala/li/cil/oc/common/item/UpgradeLeash.scala deleted file mode 100644 index 10161410f5..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeLeash.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeLeash(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeNavigation.scala b/src/main/scala/li/cil/oc/common/item/UpgradeNavigation.scala deleted file mode 100644 index bf883ce90f..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeNavigation.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeNavigation(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/UpgradePiston.scala b/src/main/scala/li/cil/oc/common/item/UpgradePiston.scala deleted file mode 100644 index 210a573b61..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradePiston.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradePiston(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeSign.scala b/src/main/scala/li/cil/oc/common/item/UpgradeSign.scala deleted file mode 100644 index e39cebc820..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeSign.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeSign(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeStickyPiston.scala b/src/main/scala/li/cil/oc/common/item/UpgradeStickyPiston.scala deleted file mode 100644 index a2d61fc769..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeStickyPiston.scala +++ /dev/null @@ -1,11 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeStickyPiston(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension { - override protected def tooltipName: Option[String] = Option(unlocalizedName) -} - diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeTankController.scala b/src/main/scala/li/cil/oc/common/item/UpgradeTankController.scala deleted file mode 100644 index e9a802e442..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeTankController.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeTankController(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeTractorBeam.scala b/src/main/scala/li/cil/oc/common/item/UpgradeTractorBeam.scala deleted file mode 100644 index 2c45e8e8f1..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeTractorBeam.scala +++ /dev/null @@ -1,8 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeTractorBeam(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeTrading.scala b/src/main/scala/li/cil/oc/common/item/UpgradeTrading.scala deleted file mode 100644 index 16b6753600..0000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeTrading.scala +++ /dev/null @@ -1,10 +0,0 @@ -package li.cil.oc.common.item - -import net.minecraft.world.item.Item -import net.minecraft.world.item.Item.Properties -import net.neoforged.neoforge.common.extensions.IItemExtension - - -class UpgradeTrading(props: Properties) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension { - override protected def tooltipName: Option[String] = Option(unlocalizedName) -} diff --git a/src/main/scala/li/cil/oc/common/item/WirelessNetworkCard.scala b/src/main/scala/li/cil/oc/common/item/WirelessNetworkCard.scala index 2d6edc7e38..d9f1f068a5 100644 --- a/src/main/scala/li/cil/oc/common/item/WirelessNetworkCard.scala +++ b/src/main/scala/li/cil/oc/common/item/WirelessNetworkCard.scala @@ -5,9 +5,8 @@ import net.minecraft.world.item.Item.Properties import net.neoforged.neoforge.common.extensions.IItemExtension -class WirelessNetworkCard(props: Properties, var tier: Int) extends Item(props) with traits.SimpleItem with traits.ItemTier with IItemExtension { +class WirelessNetworkCard(props: Properties, var tier: Int) extends Item(props) with traits.ComponentItem with traits.ItemTier with IItemExtension { @Deprecated override def getDescriptionId = super.getDescriptionId + tier - override protected def tooltipName = Option(unlocalizedName) } diff --git a/src/main/scala/li/cil/oc/common/item/traits/ComponentItem.scala b/src/main/scala/li/cil/oc/common/item/traits/ComponentItem.scala new file mode 100644 index 0000000000..761489b05d --- /dev/null +++ b/src/main/scala/li/cil/oc/common/item/traits/ComponentItem.scala @@ -0,0 +1,47 @@ +package li.cil.oc.common.item.traits + +import net.minecraft.network.chat.Component +import net.minecraft.world.{InteractionHand, InteractionResult, InteractionResultHolder} +import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.{Item, ItemStack} +import net.minecraft.world.level.Level + +/** Adds the double-sneak gesture for resetting an item's component identity. */ +trait ComponentItem extends SimpleItem { + @Deprecated + override def use(world: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = + player.getItemInHand(hand) match { + case stack: ItemStack if player.isShiftKeyDown => + var resultStack = stack + if (!world.isClientSide) { + if (ComponentItem.registerSneakClick(player, hand, stack.getItem, world.getGameTime)) { + // Recreate the stack so the reset returns a completely fresh item. + resultStack = new ItemStack(stack.getItem, stack.getCount) + player.setItemInHand(hand, resultStack) + player.displayClientMessage(Component.literal("Item reset."), true) + } + else { + player.displayClientMessage(Component.literal("Double click quickly to reset"), true) + } + } + new InteractionResultHolder(InteractionResult.sidedSuccess(world.isClientSide), resultStack) + + case stack: ItemStack => use(stack, world, player) + case _ => super.use(world, player, hand) + } +} + +object ComponentItem { + private val DoubleSneakClickWindowTicks = 6L + private val lastSneakClicks = scala.collection.mutable.HashMap.empty[(java.util.UUID, InteractionHand, Item), Long] + + private def registerSneakClick(player: Player, hand: InteractionHand, item: Item, now: Long): Boolean = synchronized { + val key = (player.getUUID, hand, item) + val isDoubleClick = lastSneakClicks.get(key).exists(last => now - last > 0 && now - last <= DoubleSneakClickWindowTicks) + + if (isDoubleClick) lastSneakClicks.remove(key) + else lastSneakClicks.update(key, now) + + isDoubleClick + } +} diff --git a/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala b/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala index 8d43764265..6dd6deb0b2 100644 --- a/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala +++ b/src/main/scala/li/cil/oc/common/item/traits/SimpleItem.scala @@ -1,38 +1,28 @@ package li.cil.oc.common.item.traits -import java.util - -import li.cil.oc.Settings -import li.cil.oc.api +import com.mojang.blaze3d.vertex.PoseStack +import li.cil.oc.{Settings, api} import li.cil.oc.api.event.RobotRenderEvent.MountPoint import li.cil.oc.api.internal.Robot import li.cil.oc.client.renderer.item.ItemUpgradeRenderer import li.cil.oc.common.blockentity -import li.cil.oc.util.{BlockPosition, ClientAccessHelper, ItemUtils, Rarity, Tooltip} -import net.minecraft.world.item.ItemStack -import net.minecraft.world.level.LevelReader -import net.minecraft.core.Direction -import net.minecraft.world.{InteractionHand, InteractionResult, InteractionResultHolder, item} -import net.minecraft.core.BlockPos -import net.minecraft.world.entity.player.Player -import net.minecraft.world.item.Item -import net.minecraft.world.item.context.UseOnContext -import net.minecraft.world.level.Level +import li.cil.oc.common.datacomponents.OCComponents +import li.cil.oc.util.ExtendedDataComponentHolder.convert +import li.cil.oc.util.{BlockPosition, ItemUtils, Tooltip} import net.minecraft.client.renderer.MultiBufferSource +import net.minecraft.core.{BlockPos, Direction} import net.minecraft.network.chat.Component -import net.minecraft.world.item.TooltipFlag -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn - -import scala.collection.convert.ImplicitConversionsToScala._ -import com.mojang.blaze3d.vertex.PoseStack -import li.cil.oc.common.item.data.TabletData -import li.cil.oc.common.datacomponents.OCComponents -import li.cil.oc.util.ExtendedDataComponentHolder._ -import net.minecraft.core.component.DataComponents +import net.minecraft.world.entity.player.Player import net.minecraft.world.item.Item.TooltipContext +import net.minecraft.world.item.{Item, ItemStack, TooltipFlag} +import net.minecraft.world.item.context.UseOnContext +import net.minecraft.world.level.{Level, LevelReader} +import net.minecraft.world.{InteractionHand, InteractionResult, InteractionResultHolder} +import net.neoforged.api.distmarker.{Dist, OnlyIn} import net.neoforged.neoforge.common.extensions.IItemExtension -import li.cil.oc.common.datacomponents.OCComponents + +import java.util +import scala.collection.convert.ImplicitConversionsToScala._ trait SimpleItem extends Item with api.driver.item.UpgradeRenderer with IItemExtension { def createItemStack(amount: Int = 1) = new ItemStack(this, amount) @@ -78,33 +68,6 @@ trait SimpleItem extends Item with api.driver.item.UpgradeRenderer with IItemExt @Deprecated def onItemUse(stack: ItemStack, player: Player, position: BlockPosition, side: Direction, hitX: Float, hitY: Float, hitZ: Float): Boolean = false - /** - * Opt in to the shared double sneak-right-click gesture handled by SimpleItem. - * Items only need to override this flag; the timing and action live here. - */ - protected def canResetComponentIdentity: Boolean = false - - @Deprecated - override def use(world: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = - player.getItemInHand(hand) match { - case stack: ItemStack if canResetComponentIdentity && player.isShiftKeyDown => - if (!world.isClientSide) { - if (SimpleItem.registerSneakClick(player, hand, stack.getItem, world.getGameTime)) { - stack.remove(OCComponents.ADDRESS.get()) - stack.remove(OCComponents.VISIBILITY.get()) - - player.displayClientMessage(Component.literal("Component UUID reset."), true) - } - else { - player.displayClientMessage(Component.literal("Double click quickly to reset"), true) - } - } - new InteractionResultHolder(InteractionResult.sidedSuccess(world.isClientSide), stack) - - case stack: ItemStack => use(stack, world, player) - case _ => super.use(world, player, hand) - } - @Deprecated def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = new InteractionResultHolder(InteractionResult.PASS, stack) @@ -154,18 +117,3 @@ trait SimpleItem extends Item with api.driver.item.UpgradeRenderer with IItemExt override def render(matrix: PoseStack, buffer: MultiBufferSource, light: Int, stack: ItemStack, mountPoint: MountPoint, robot: Robot, pt: Float): Unit = ItemUpgradeRenderer.render(matrix, buffer, light, stack, mountPoint) } - -object SimpleItem { - private val DoubleSneakClickWindowTicks = 6L - private val lastSneakClicks = scala.collection.mutable.HashMap.empty[(java.util.UUID, InteractionHand, Item), Long] - - private def registerSneakClick(player: Player, hand: InteractionHand, item: Item, now: Long): Boolean = synchronized { - val key = (player.getUUID, hand, item) - val isDoubleClick = lastSneakClicks.get(key).exists(last => now - last > 0 && now - last <= DoubleSneakClickWindowTicks) - - if (isDoubleClick) lastSneakClicks.remove(key) - else lastSneakClicks.update(key, now) - - isDoubleClick - } -} From 02cdcfb6e805a5b9ddbaf4501061d28746ae43bf Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sat, 8 Aug 2026 16:21:52 -0700 Subject: [PATCH 14/38] Undo the async beep that somehow snuck back in --- src/main/scala/li/cil/oc/server/machine/Machine.scala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/machine/Machine.scala b/src/main/scala/li/cil/oc/server/machine/Machine.scala index ef4eb7185a..7181fe76d3 100644 --- a/src/main/scala/li/cil/oc/server/machine/Machine.scala +++ b/src/main/scala/li/cil/oc/server/machine/Machine.scala @@ -475,7 +475,7 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac def isRunning(context: Context, args: Arguments): Array[AnyRef] = result(isRunning) - @Callback(doc = """function([frequency:string or number[, duration:number]]) -- Plays a tone, useful to alert users via audible feedback.""") + @Callback(doc = """function([frequency:string or number[, duration:number[, async:boolean]]]) -- Plays a tone, useful to alert users via audible feedback.""") def beep(context: Context, args: Arguments): Array[AnyRef] = { if (args.count == 1 && args.isString(0)) { beep(args.checkString(0)) @@ -486,7 +486,10 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac } val duration = args.optDouble(1, 0.1) val durationInMilliseconds = math.max(50, math.min(5000, (duration * 1000).toInt)) - context.pause(durationInMilliseconds / 1000.0) + val async = args.optBoolean(2, false) + if (async) { + context.pause(durationInMilliseconds / 1000.0) + } beep(frequency.toShort, durationInMilliseconds.toShort) } null From 868d18e0af3d45cb8c0c2fada69093c592e6e5d2 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 00:43:26 -0700 Subject: [PATCH 15/38] update funscii to unifont 17.0.05 Per asie. --- .../resources/assets/opencomputers/font.hex | 4056 +++++++++++++++-- 1 file changed, 3558 insertions(+), 498 deletions(-) diff --git a/src/main/resources/assets/opencomputers/font.hex b/src/main/resources/assets/opencomputers/font.hex index d557cbbf7f..01ff777caf 100644 --- a/src/main/resources/assets/opencomputers/font.hex +++ b/src/main/resources/assets/opencomputers/font.hex @@ -977,8 +977,8 @@ 03D9:0000000000003C4242424242423C1818 03DA:000000001C22414040404040201C021C 03DB:0000000001021C2040404040201C021C -03DC:000000007E4240407840404040400000 -03DD:0000000000003C222020382020202020 +03DC:000000007E4040407C44444040400000 +03DD:0000000000007E4040407C4444404040 03DE:0000000060202020203E040408080000 03DF:000000000000201010223C4408080806 03E0:0000000078840C1222060A1202040000 @@ -1512,13 +1512,13 @@ 060D:00000000000000000C18204000000000 060E:0000000000000000000000000000000000000E00110011060FF8000000000000 060F:0000000000000600080008000600080013001480188009001600200000000000 -0610:00060939160000000000000000000000 +0610:0006497E504000000000000000000000 0611:00000060048007F0040004000000000000000000000000000000000000000000 0612:00001F880208041008E008000000000000000000000000000000000000000000 0613:1000061049107E2050C040000000000000000000000000000000000000000000 0614:0000000000081FC8002800100000000000000000000000000000000000000000 0615:0000040005C006200FC000000000000000000000000000000000000000000000 -0616:0500050005000D0010000FE00000000000000000000000000000000000000000 +0616:010001000500090010001FE00000000000000000000000000000000000000000 0617:0000008000000080008003000000000000000000000000000000000000000000 0618:00001800000000000000000000000000 0619:181C1020000000000000000000000000 @@ -1526,15 +1526,15 @@ 061B:00000000000000081018001800000000 061C:AAAA000180000001B2224A37FA2A4A23CBA20001800000018000000180005555 061D:000000003844402010160E0000000000 -061E:0000000000000000000000000000000000000000000000800000014000000000 +061E:00000000000000000800140000000000 061F:0000003E414020100808000800000000 -0620:000000000000000C5248443810281000 +0620:0000000000000000040A080402423C00 0621:000000000000001C203C102000000000 0622:00013E40080808080808080000000000 0623:30403840101010101010000000000000 0624:00000C100C10000C12121E0204483000 -0625:0000000008080808080808000C100C10 -0626:00000000182018200046484846423C00 +0625:0000000808080808080808000C100C10 +0626:0000000030403040044A484442423C00 0627:08080808080808080808000000000000 0628:0000000000818181FF7E001800000000 0629:000033000E1F11111F0E000000000000 @@ -1681,10 +1681,10 @@ 06B6:000200020202020202224242443C0000 06B7:040009000202020202224242443C0000 06B8:00000002020202020222423C00140008 -06B9:00000000000800000422424244380008 +06B9:00000000001000000422424244380008 06BA:00000000000000000422424244380000 06BB:000010101C1C00000422424244380000 -06BC:000000000008000004224242443C0A04 +06BC:000000000010000004224242443C0A04 06BD:00000010002400000422424244380000 06BE:000000000000102C2A1A244000000000 06BF:00000000001000007E2040544048221C @@ -1832,50 +1832,50 @@ 0750:000000000000000422423C00002A0000 0751:000000100028000422423C0000080000 0752:000000000000000422423C0008001400 -0753:000000000820000422423C0008001400 -0754:000000000010000422423C0000140000 +0753:000000001400000422423C0008001400 +0754:000000000800000422423C0000140000 0755:000000000000000422423C0008142200 0756:000000442810000422423C0000000000 -0757:00000000000028007E1020404040221C +0757:00000000002800007E1020404040221C 0758:00000000000000007E1024404A40221C 0759:202028347800080402427C0010001000 075A:000000000000080402427C0008142200 075B:00000000000000000402021F04483000 -075C:00000000001400140115155E48483000 +075C:000000001400140115155E4848300000 075D:000000000028001824201C204040423C 075E:000000280010001824201C204040423C 075F:000000100010001824201C204040423C 0760:0000000000060A0642423C000A000000 0761:0000000000060A0642423C0004000A00 -0762:00000004881020403C827E0000000000 +0762:00000044081020403C827E0000000000 0763:004000A4081020403C827E0000000000 0764:00000004081020403C827E0008001400 0765:00000000000800001C061E2020202020 0766:00000000000000001C061E2028202020 -0767:00000000000020000422424244380014 +0767:00000000001000000422424244380014 0768:20202834780020000422424244380000 -0769:00004428100020000422424244380000 -076A:000000040404041E0424444444380000 +0769:00004428100010000422424244380000 +076A:000000040404041E042444444C380000 076B:00000000100010000402020204483000 076C:00000018201820000402020204483000 -076D:00000000040004000115155E48483000 +076D:000000040004000115155E4848300000 076E:00000000000000007E10284C4A5C221C 076F:00000000007E10284C4A5C405440221C -0770:00202028347800140115155E48483000 +0770:202028347800140115155E4848300000 0771:20202834780010400402020204483000 0772:00001010141A3C007E1020404040221C 0773:28283020282808080808080000000000 0774:2A2A3420282808080808080000000000 -0775:00000014141810101046484846423C00 -0776:00000015151A10101046484846423C00 -0777:0000000046484846423C000816101010 +0775:000000141418101010044A4844423C00 +0776:00000015151A101010044A4844423C00 +0777:0000000000000C5248443800102C2020 0778:000050506040404C12121E0204483000 0779:000054546840404C12121E0204483000 077A:00000000005050604048541020407F00 077B:00000000005454684048541020407F00 077C:00000000000000007E10244B4848221C -077D:00000008161010100115155E48483000 -077E:00000000081422000115155E48483000 +077D:000008161010100115155E4848300000 +077E:000000081422000115155E4848300000 077F:000028020A120A2242423C0000000000 0780:00000000000004081060000000000000 0781:000000000000121C1020C00000000000 @@ -2079,17 +2079,17 @@ 085A:000000000000000000000000000000000000000000000000000003E000000000 085B:0000000000000000000000000000000000000000000000000000008000800000 085E:0000000000000180066008100990124812480990081006600180000000000000 -0860:000000000000000003C004200A100610001000E00020201010100FF000000000 -0861:00000000000000001EF029082908100800081F082088407040003FF800240018 -0862:0000000000000000180026002984106A001201AC024021A010100FF000000000 -0863:0000000000000000400020001000080004000200010E00840044003800000000 -0864:000000000000000003C004200A10061000D0012000E0201010100FF000000000 -0865:000000000000000007C0082008100410001000E00020201010100FF000000000 -0866:000000000000000007F01808200803F00400040003F00008080807F000000000 -0867:0000000000000000000001000080004000400040008001000600180000000000 -0868:00000000000000000C00120022002400280030002018212421241EF800000000 -0869:00000000000000002000100008000800080008000830084808480FF800400180 -086A:0000000000000000003004480848105010201050109009080A0807F000000000 +0860:000000000000000003C007E00A700630003000E000E030303FF01FF000000000 +0861:00000000000000001EF03FF82918180800081F0820F060007FF83FF800240018 +0862:00000000000000001E00278029EC107A01B2026C01E030303FF01FF000000000 +0863:000000000000000040006000300018000C000600030E018E00C4007800000000 +0864:000000000000000003C007E00A30063000F0012000E030303FF01FF000000000 +0865:000000000000000007C00FE008300430003000E000E030303FF01FF000000000 +0866:000000000000000007F01FF83818201803F0040003F008180FF807F000000000 +0867:00000000000000000000018001C000C000400040008001000600180000000000 +0868:00000000000000000C0012002200240028003018202421243FFC1EF800000000 +0869:0000000000000000300038001800080008000830084808480FF80FF800400180 +086A:0000000000000000003004480C48185010201050109009180FF807F000000000 0870:00000638080808080808080000000000 0871:00000C30202020202020200000000000 0872:00000020202C30202020200000000000 @@ -2121,6 +2121,7 @@ 088C:000000202020202C32227C0014000800 088D:00000004081020403C827E0008000800 088E:000000000000000000080F0808080800 +088F:00000010281000000422424244380000 0890:5555800000E180983FFD8000000180000001800000018000000180000001AAAA 0891:55558000070199003FFD8000000180000001800000018000000180000001AAAA 0897:00394E00000000000000000000000000 @@ -2133,14 +2134,14 @@ 089E:7F803F40000000000000000000000000 089F:78813E40000000000000000000000000 08A0:000000000000000422423C0022140800 -08A1:00000C100C10000422423C0010000000 -08A2:00000000000820007E1020404840221C -08A3:000000202228202C32227C0000000000 +08A1:00000C100C10000422423C0000080000 +08A2:00000000002800007E1020404840221C +08A3:000000202A20202C32227C0000000000 08A4:0010002800060A0642423C0010000000 08A5:000000002400001C120A264244380010 -08A6:00000004041F041F0424444448380000 +08A6:00000004041E041E0424444448380000 08A7:00000000080014001C061E2020202020 -08A8:0000000018201820044A4844423C0028 +08A8:0000000030403040044A4844423C0028 08A9:0000000000001000044A4844423C0028 08AA:00000000000000000402020234483402 08AB:000000000000000C12120E2204483000 @@ -2149,7 +2150,7 @@ 08AE:000000000000080402427C0028001000 08AF:000000000000000006194E4830042008 08B0:00000810244850403C827E0000000000 -08B1:000000000000000814141E0404040400 +08B1:000000000000001824241E0404040400 08B2:00001028440010000402020204483000 08B3:0000000000001824201C20544048423C 08B4:000000020A120A2242423C0000080000 @@ -2159,8 +2160,8 @@ 08B8:00000000140000229D413E0000000000 08B9:00200008044448300402020204483000 08BA:0020000804444830044A4844423C0028 -08BB:0000000000060A06423C000000000000 -08BC:0000000000060A0642423C0000000000 +08BB:0000000000060A0642423C0000000000 +08BC:000000000000001C120A264244380000 08BD:00000000000000000422424244380000 08BE:000000442810000422423C0014000800 08BF:004428100014000422423C0000000000 @@ -2230,11 +2231,11 @@ 08FF:001C0202041800000000000000000000 0900:01C0022004800000000000000000000000000000000000000000000000000000 0901:0480022001C00000000000000000000000000000000000000000000000000000 -0902:0180018000000000000000000000000000000000000000000000000000000000 +0902:0060006000000000000000000000000000000000000000000000000000000000 0903:0000000000000000000000000003000300000000000000030003000000000000 0904:010000FC000201CF02220012001200620412041E0212022201C2000000000000 0905:00000000000001CF02220012001200620412041E0212022201C2000000000000 -0906:0000000000000E7F1114009400940314209420F4109411140E14000000000000 +0906:0000000000000E7F1112009200920312209220F2109211120E12000000000000 0907:0000000000003FFF004003C00400040003C000200010019001E0004000200010 0908:00E0011000803FFF004003C00400040003C000200010019001E0004000200010 0909:0000000000001FFF0010000804080430020802080108011000E0000000000000 @@ -2245,47 +2246,47 @@ 090E:040003E000101FFF021002100210021002100100008000400020002000000000 090F:0000000000001FFF021002100210021002100100008000400020002000000000 0910:07C0002000101FFF021002100210021002100100008000400020002000000000 -0911:011000E000000E7F1114009400940314209420F4109411140E14000000000000 -0912:080007F800040E7F1114009400940314209420F4109411140E14000000000000 -0913:07F0000800040E7F1114009400940314209420F4109411140E14000000000000 -0914:01F8000400FC0E3F1114009400940314209420F4109411140E14000000000000 +0911:011000E000000E7F1112009200920312209220F2109211120E12000000000000 +0912:040003FC00020E7F1112009200920312209220F2109211120E12000000000000 +0913:03F8000400020E7F1112009200920312209220F2109211120E12000000000000 +0914:01F8000400FC0E3F1112009200920312209220F2109211120E12000000000000 0915:000000000000FFFF008000800EB011C811880E88009000800080000000000000 0916:000000000000FFFF0810081009D01A301A3011D00810043003D0000000000000 0917:000000000000FFFF0210021002100A1006100210001000100010000000000000 -0918:000000000000FFFF08080608018802080408041803E800080008000000000000 +0918:000000000000FFFF10100C10031004100810083007D000100010000000000000 0919:000000000000FFFF008003800400041813981040084008400780000000000000 -091A:000000000000FFFF000800080FF8021802680188000800080008000000000000 +091A:000000000000FFFF001000101FF0043004500390001000100010000000000000 091B:000000000000FFFF004006600890085006200830084804480388001000000000 -091C:000000000000FFFF000800080878084804480388000800080008000000000000 -091D:000000000000FFFF010807080808080807F8010801080E080C08020001000000 -091E:000000000000FFFF0008000803C8132810280838082804480388000000000000 -091F:000000000000FFFF0080008003800400080008000808041003E0000000000000 +091C:000000000000FFFF0010001010F0109008900710001000100010000000000000 +091D:000000000000FFFF011007100810081007F0011001100E100C10020001000000 +091E:000000000000FFFF001000100390125010501070085008900710000000000000 +091F:000000000000FFFF0080008003800400080008000810042003C0000000000000 0920:000000000000FFFF0080008003E00410080808080808041003E0000000000000 0921:000000000000FFFF002000E00100010004E004100210021001E0000000000000 0922:000000000000FFFF0080008003800400086008900890045003E0000000000000 0923:000000000000FFFF049004900490049003100010001000100010000000000000 0924:000000000000FFFF0010001003F0041008100810081004100210000000000000 -0925:0000000000000C3F120811080908010802080C18082804480388000000000000 +0925:0000000000000C3F121011100910011002100C30083004500390000000000000 0926:000000000000FFFF0080008003800400080008000830043003E0001000080000 -0927:0000000000000CFF1208140808080C0807080808081807E80008000000000000 -0928:000000000000FFFF0008000803F8060806080008000800080008000000000000 -0929:000000000000FFFF0008000803F80608060800080008000800C800C000000000 +0927:0000000000000CFF1210141008100C1007100810083007D00010000000000000 +0928:000000000000FFFF0010001007F00C100C100010001000100010000000000000 +0929:000000000000FFFF0010001007F00C100C100010001000100190018000000000 092A:000000000000FFFF081008100810083004500390001000100010000000000000 092B:000000000000FFFF104010401040107008C80748004800480050000000000000 092C:000000000000FFFF0010001007D00C300A300950079000100010000000000000 -092D:0000000000000C7F12080E080208020807F80608000800080008000000000000 +092D:0000000000000C7F12100E100210021007F00610001000100010000000000000 092E:000000000000FFFF04100410041004100FF00C10001000100010000000000000 092F:000000000000FFFF0210021002100C100810083007D000100010000000000000 -0930:000000000000FFFF020002000200060006000100008000400000000000000000 -0931:000000000000FFFF020002000200060006000100008000400600060000000000 -0932:000000000000FFFF000800080638094808880808040803080008000000000000 +0930:000000000000FFFF010001000100030003000080004000200000000000000000 +0931:000000000000FFFF010001000100030003000080004000200300030000000000 +0932:000000000000FFFF001000100C70129011101010081006100010000000000000 0933:000000000000FFFF002000200C70128810881108128812480C30000000000000 0934:000000000000FFFF002000200C70128810881108128812480C30018001800000 0935:000000000000FFFF0010001007D0083008300850079000100010000000000000 0936:000000000000FFFF0610091009100710011001100E100D100090000000000000 0937:000000000000FFFF0C100A10091008B004500390001000100010000000000000 -0938:000000000000FFFF04100410041004100FF00C10041002100110000000000000 -0939:0000000000003FFF004003C00400040003800440044002000100008000000000 +0938:000000000000FFFF04100410041004100FF00C10041002100010000000000000 +0939:000000000000FFFF004003C00400040003800440044002000100008000000000 093A:0080008000000000000000000000000000000000000000000000000000000000 093B:000000020002000F000200020002000200020002000200020002000000000000 093C:0000000000000000000000000000000000000000000000000000000001800180 @@ -2298,9 +2299,9 @@ 0943:0000000000000000000000000000000000000000000000000000007000800070 0944:0000000000000000000000000000000000000000000000C00100017000800078 0945:0400022001C00000000000000000000000000000000000000000000000000000 -0946:10000F0000800080000000000000000000000000000000000000000000000000 -0947:1E00010000800000000000000000000000000000000000000000000000000000 -0948:07801F4000C00000000000000000000000000000000000000000000000000000 +0946:020001E000100010000000000000000000000000000000000000000000000000 +0947:03C0002000100000000000000000000000000000000000000000000000000000 +0948:01E007D000300000000000000000000000000000000000000000000000000000 0949:001100090006000F000200020002000200020002000200020002000000000000 094A:010000FC0002000F000200020002000200020002000200020002000000000000 094B:01F800040002000F000200020002000200020002000200020002000000000000 @@ -2319,17 +2320,17 @@ 0958:000000000000FFFF008000800EB011C811880E8800900C800C80000000000000 0959:000000000000FFFF0810081009D01A301A3011D00810043003D0000003000300 095A:000000000000FFFF0210021002100A1006100210001000100190018000000000 -095B:000000000000FFFF000800080878084804480388000800080188018000000000 +095B:000000000000FFFF0010001010F0109008900710001000100310030000000000 095C:000000000000FFFF002000E00100010004E004100210021001E0000000C000C0 095D:000000000000FFFF0080008003800400086008900890045003E0000001800180 095E:000000000000FFFF104010401040107008C80748004806480650000000000000 095F:000000000000FFFF0210021002100C100810083007D000100310030000000000 -0960:0000000000007FFF00801E8C21FC0688189800A0009800A2009C000000000000 +0960:000000000000FFFF00801E8C21FC0688189800A0009800A2009C000000000000 0961:000000000000FFFF002000201C70228821082030104008300044003800000000 0962:00000000000000000000000000000000000000000000000000000EE011200818 0963:0000000000000000000000000000000000000000000000080C7012941118080E 0964:0000000000000000008000800080008000800080008000800080000000000000 -0965:0000000000000000024002400240024002400240024002400240000000000000 +0965:0000000000000000048004800480048004800480048004800480000000000000 0966:000000000000000003C0042008100810081008100810042003C0000000000000 0967:000000000000000001C002200220014000800100020001000080004000000000 0968:000000000000000003C00420001000100010032003C001000080004000200000 @@ -2344,16 +2345,16 @@ 0971:0000000000000180018000000000000000000000000000000000000000000000 0972:00420022001C01CF02220012001200620412041E0212022201C2000000000000 0973:00000002000201CF02220012001200620412041E0212022201C2000000000000 -0974:000000020002073F088A004A004A018A104A107A084A088A070A000000000000 -0975:0120009C0072070F088A004A004A018A104A107A084A088A070A000000000000 +0974:0000000200020E7F1112009200920312209220F2109211120E12000000000000 +0975:0120009C00720E1F1112009200920312209220F2109211120E12000000000000 0976:00000000000001CF02220012001200620412041E0212022201C2000000840078 0977:00000000000001CF02220012001200620412041E0212022201C20090026401F8 -0978:000000000000FFFF0400040004000FC00C200020002000400080000000000000 -0979:000000000000FFFF000800080878084804480388000818681868030003000000 +0978:000000000000FFFF02000200020007E006100010001000200040000000000000 +0979:000000000000FFFF0010001010F0109008900710001030D030D0060006000000 097A:000000000000FFFF0210021003100C900850083007D000100010000000000000 097B:000000000000FFFF0210021002100A1006100210001000100FF0000000000000 -097C:000000000000FFFF000800080878084804480388000800080FF8000000000000 -097D:00000000000003E00410080800080008001000E0008000800080000000000000 +097C:000000000000FFFF0010001010F0109008900710001000101FF0000000000000 +097D:00000000000007C00820101000100010002001C0010001000100000000000000 097E:000000000000FFFF002000E00100010004E00410021001E007F8000000000000 097F:000000000000FFFF0010001007D00C300A300950079000100FF0000000000000 0980:0000000000000380044008200920062000200020002000200020002400180000 @@ -2862,6 +2863,7 @@ 0C58:010002807F90002001C001A0001000087808090813900C600000000000000000 0C59:004000A01FE000000C40132012C004000800100011100EE00000000000000000 0C5A:00000000000007C00820101010101FF01110111011100EE00000000000000000 +0C5C:00000000000000000FEE1010272820A4232420A410A40F180000000000000000 0C5D:0000000000001FF8200020001F80200020001F80200020001F80000000000000 0C60:0000000000000000493EA4952492249044908490A4905B600000000000000000 0C61:00000000000000001B3E24A524A2011002100210022001C00000000000000000 @@ -2958,6 +2960,7 @@ 0CCD:00000003000400FE000500020000000000000000000000000000000000000000 0CD5:0000000000000000000200050005000600040004000400040002000000000000 0CD6:0000000000000000000000000000000000040002000400020001000D000D0006 +0CDC:00000000000000000FEE1010272820A4232420A410A40F180000000000000000 0CDD:0000000000001FF8200020001F80200020001F80200020001F80000000000000 0CDE:00000000000000000C60129032982C682008200811100EE00000000000000000 0CE0:00000000004000400F80620E9111711111137115999566620000000000000000 @@ -3211,8 +3214,8 @@ 0E17:000000000000646A3222222222220000 0E18:0000000000003C407824242424180000 0E19:0000000000006464244444444E360000 -0E1A:000000000000323212222222221C0000 -0E1B:000000000002023232122222221C0000 +0E1A:000000000000626222222222221C0000 +0E1B:000000000002026262222222221C0000 0E1C:00000000000069694949494949360000 0E1D:00000000000101696949494949360000 0E1E:00000000000069692949494949360000 @@ -4836,7 +4839,7 @@ 151E:00000000000000000000000000000000000018CC242C2220212018C000000000 151F:0000000000000000000000C000C0000000003318348404440424031800000000 1520:00000000000000000000030003000000000018CC242C2220212018C000000000 -1521:0000000000000000000000000000000000003318348404440424031800000000 +1521:0000000000000000000000000000000000003318342404440484031800000000 1522:00000000000000000000000000000000000018CC212C2220242018C000000000 1523:0000000000000000000000C000C0000000003318342404440484031800000000 1524:0000000000000000000003000300000000000C661096111012100C6000000000 @@ -6137,6 +6140,33 @@ 1ACC:7E201C423C0000000000000000000000 1ACD:58644440800000000000000000000000 1ACE:7C204438000000000000000000000000 +1ACF:00492A14000000000000000000000000 +1AD0:00121418000000000000000000000000 +1AD1:00482818000000000000000000000000 +1AD2:00181412000000000000000000000000 +1AD3:00182848000000000000000000000000 +1AD4:0040407E000000000000000000000000 +1AD5:0002027E000000000000000000000000 +1AD6:00485462000000000000000000000000 +1AD7:00625448000000000000000000000000 +1AD8:00040AF1000000000000000000000000 +1AD9:24FF24FF240000000000000000000000 +1ADA:101C1418000000000000000000000000 +1ADB:007C1010000000000000000000000000 +1ADC:60600606000000000000000000000000 +1ADD:00000000000000000000000000066966 +1AE0:04043C04040000000000000000000000 +1AE1:20203C20200000000000000000000000 +1AE2:00003C00000000000000000000000000 +1AE3:44447C00000000000000000000000000 +1AE4:7C447C00000000000000000000000000 +1AE5:0044AA10000000000000000000000000 +1AE6:000000000000000000000000006C9244 +1AE7:006C9244000000000000000000000000 +1AE8:007E007E000000000000000000000000 +1AE9:7C040400000000000000000000000000 +1AEA:10385410000000000000000000000000 +1AEB:001000083FFC0008001000000000000000000000000000000000000000000000 1B00:0FE0111012900920000000000000000000000000000000000000000000000000 1B01:01000AA00AA007C0000000000000000000000000000000000000000000000000 1B02:0100028000400020000000000000000000000000000000000000000000000000 @@ -6327,7 +6357,7 @@ 1BBC:00000000000000000C0E100210022304228444887C49001100720092006C0000 1BBD:00000000000000000F3E112219260240024002400FF800000000000000000000 1BBE:00000000000000001F7C010419640A28124804101FFC00000000000000000000 -1BBF:00000000000000000FE000200F2000400E4000800C8000000000000000000000 +1BBF:000000000000000003F8000803C80010079000200F2000400F4010800F600018 1BC0:000000000000000000000000000001C04220242018E000000000000000000000 1BC1:000000000000000000000000000001C04220240018E000000000000000000000 1BC2:0000000000000000000000003B80444008401080210000000000000000000000 @@ -7535,7 +7565,7 @@ 20A6:000000002222327F2A7F262622220000 20A7:00FC66667C62666F666666F300000000 20A8:0000000070484B4C74545249494E0000 -20A9:000000002222227F2A7F363622220000 +20A9:00000000222222222A7F363622220000 20AA:000000FA8AAAAAAAAAA2BE0000000000 20AB:000000020F023A4642424242463A007E 20AC:00003C666660FC60F86066663C000000 @@ -7559,6 +7589,7 @@ 20BE:0000287CAAAAAA808080804020FE0000 20BF:00002828FC4242427C42424242FC2828 20C0:000000003C4242404042423C007E0000 +20C1:0000000010141414171C7710E30C0000 20D0:0010207E000000000000000000000000 20D1:0008047E000000000000000000000000 20D2:00000000101010101010101010100000 @@ -10253,6 +10284,7 @@ 2B93:000000000000000000007EFE40004000404040607FF600600040000000000000 2B94:00000000002000403EFC20442024A8007004200E0015240422043F7C02000400 2B95:0000000000000000002000307FF87FFC7FF80030002000000000000000000000 +2B96:000000000000000000001C702288210822881C7000003FF800003FF800000000 2B97:000000007FFC40044FE420082FE8111011100920092005400440028001000000 2B98:00000004003800C803100C10302040403FE00FF003F000F80038000400000000 2B99:00000000010002800280064006400E200E201E101F103E883C68301840040000 @@ -10611,42 +10643,42 @@ 2CFF:00300804000000000000000000000000 2D00:00000000000000007E222020203E0200 2D01:0000000000000000C444447C0402423C -2D02:0000000000000000FC4444444442023C +2D02:00000000000000407C4444444442023C 2D03:0000000000407C141038444444380000 2D04:0000000000000000FC44444444460202 -2D05:000000000000000000000000000000003FF01110111011101110111001000080 +2D05:0000000000000080FE92929292921008 2D06:00000040701010101C121212121C0000 -2D07:000000000000000000000000000000001FF808880888088808880F8800000000 +2D07:0000000000000080FE92929292F20000 2D08:00000000000000007E32220202020000 2D09:0000000020202038242424241C040404 -2D0A:000000000000000000000000000000001FF8088808880888088808F800000000 +2D0A:0000000000000080FE929292929E0000 2D0B:000000203C0404041E24242424180000 2D0C:000000007C4440407C44444444440000 -2D0D:00000000000000000000000000000000311011101110111011101FF800000000 -2D0E:0000000000000000B2D21212121F0000 -2D0F:0000000000000000B2D21212121F0202 -2D10:0000000000000000010001000100010011F011101110111011101F1000000000 +2D0D:00000000000000009292929292FE0200 +2D0E:0000000000000000A4E42424241E0000 +2D0F:0000000000000000A4E42424243E0404 +2D10:00000000101010109E92929292F20000 2D11:000000004040404048484848487C0400 -2D12:0000000000000000FC44447C4040403C -2D13:00000000000000000008000800080008188808880888088808880FF800080008 -2D14:000000000000000000000000000000001FF808880888088808880FF800800080 +2D12:00000000000000007E22223E2020201E +2D13:00000000020202029292929292FE0202 +2D14:0000000000000080FE92929292FE1010 2D15:0000000010101016BAD0101010100000 2D16:0000000000000000FC44444444460000 2D17:0000000000000000622222223E020202 2D18:00000000000000622222223E0202423C 2D19:000000002020203C2424242020202020 -2D1A:0000000000000000FC44444444444038 -2D1B:000000000000000001000100010001001FF011101110111011101F1000000000 -2D1C:000000000000000000000000000000001FF80888088808880888089808000800 +2D1A:00000000000000007E2222222222201C +2D1B:00000000080808087F49494949790000 +2D1C:0000000000000080FE92929292968080 2D1D:00000000000000007C24203804242418 -2D1E:000000000000000066222222223E2020 -2D1F:00000000000000C0FE22140C12214080 -2D20:000000000000000000000000000000003F10111011101110111011F800000000 +2D1E:000000000000000066222222223E201E +2D1F:00000000000000C0FE22140814224080 +2D20:0000000000000080F2929292929E0200 2D21:00000000404040784C40404040400000 2D22:00000000000000004078040404780000 2D23:00000000040404046424243C04040404 2D24:000000000000000000006222223E0808 -2D25:000000000000000000F00110010001001FF011101110111011101F1000000000 +2D25:000000000E121010FE92929292F20000 2D27:00000000000000001824040830404438 2D2D:00000000000000003C040810203C0000 2D30:00000000000000000000182424180000 @@ -10962,7 +10994,7 @@ 2EAF:080008001000120022007C000800100024007E00020000005200490089000000 2EB0:10001000200024004400F800100020004000FC00400000001C00E00040000000 2EB1:3FF8200824482288210822882448200800000000000000000000000000000000 -2EB2:3FF82448244824483FF800000000000000000000000000000000000000000000 +2EB2:3FF82008282824483FF800000000000000000000000000000000000000000000 2EB3:00003FFC20044008044008201010000000000000000000000000000000000000 2EB4:00007FFE4444844804400440044004400440044008400842104210422042403E 2EB5:0000000000003FFC224422442244224422442244224422442244200400000000 @@ -11292,7 +11324,7 @@ 301F:0000000000000000000000000000000000000000000000000900120024000000 3020:00003FFC3FFC00003FFC3FFC5596D9B9A5A5A5A5599A4182242413C8081007E0 3021:0180010001000100010001000100010001000100010001000100010000000000 -3022:006000400C400840084008400840084008400840084000400040004000000000 +3022:0000004000400840084008400840084008400840084008400040004000400000 3023:0008200821082108210821082108210821082108210820082008000800000000 3024:001000101020082004400240018000C001200210040808083000000000000000 3025:00000420043008201CC003000480084008201020102010201040084007800000 @@ -11664,38 +11696,38 @@ 319D:000000001FC0020002003FE00200050008E01040000000000000000000000000 319E:0000084009503DF00B50095009280D0830F80000000000000000000000000000 319F:000004000400040004000A000900108020400000000000000000000000000000 -31A0:00000800080010003FF800080008000800080008000800F00110012000C00000 -31A1:000000001FF8020802080208020802100290026002001E00220022001C000000 -31A2:0000002004200420042004200420086009A00E20002001E00220022001C00000 -31A3:0000000004400440088008801100110022001100110008B808C4044404380000 -31A4:000000000800080008007FFC080408080810080008000800080007F800000000 -31A5:000000000800080008007FFC080408080810080008180824082407F800080000 -31A6:000000007FFC0200020004000800100020002020104008800500020000000000 -31A7:000000007FFC0200020004000800100020C02120114008800560020000000000 -31A8:00000000101008200820044004400280028001FC028004401830600C00000000 -31A9:00000000201010200840048003000200020002000F801200220022001C000000 -31AA:00000000000000180024004400447FF800400040000000000000000000000000 -31AB:0000000010100820082004400440028002800100028C04521822605C00400000 -31AC:0000000020003FF8210821082108210821082108210821082108000000000000 -31AD:000000007FFC0920092009200920092009200920092009201120611E00000000 -31AE:000000007FFC01001100110021003FF801080108020832084C104A1032200000 -31AF:00000000008001000200041008201FC000800118062418243FF80010000C0000 -31B0:00001830044002807FFC41044104410441044104410441044104410441040000 -31B1:000000007FFC01007FFC41044704480450045044488445044204400440040000 -31B2:000000007FFC010001000100010001000100010001000100010001007FFC0000 -31B3:000000800080008000800080008000800080008003E004800880088007000000 -31B4:0000000000000000000000000100020007E00020002000200140008000000000 -31B5:0000000000000000000000000100020007E00120022004200940008000000000 -31B6:00000000000000000000000007E00100020007C0004000400140008000000000 -31B7:000000000000000000000000000007E002000200020002000400080000000000 -31B8:000000003FF80010002000400080010002000400080010003FF8000000000000 -31B9:0000000000002000200020002000200020003FF8000000000000000000000000 -31BA:00000000000001000100010001007FFC01000100010001000000000000000000 -31BB:0000000000000000000004400440088008801100088008800440044000000000 -31BC:000000000200043008300C4002C0018001800240046008301018201800000000 -31BD:00003FF80200043008300C4002C0018001800240046008301018201800000000 -31BE:000000001010101008200820082004403FF80440024002800280018001000000 -31BF:0000000000000440044004200420041004100810080808081008200800000000 +31A0:0000040004000800080011F83E08000800080008001000D00120012000C00000 +31A1:0000000000F83F08010801080108010801100150012007000900090006000000 +31A2:0000002000101010081008100810083008D00B101C1000700090009000600000 +31A3:0000000002100210042008401080210010800840045804240224021800000000 +31A4:00000000080004000400047807883C100420040004000400043803C000000000 +31A5:00000000080004000400047C07883C100420040004180424043803D000080000 +31A6:00000000007C3F80008001000200040008001004080804100220014000800000 +31A7:00000000007C3F80008001000200041808241024081804140220014000800000 +31A8:000000000010181004200220014000FC01400220041008103008000800000000 +31A9:00000008200810100820044004800100010001000100070009C0090006000000 +31AA:0000000000000000000000180024002401F83E10001000000000000000000000 +31AB:0000000000101810042002200140008001400258042408243058008000000000 +31AC:00000000207C1F84108410841084108410841084108410841084108400000000 +31AD:0000000000FC3F20092009200920092009200920092011201120211C01000000 +31AE:00000000007C3F8000800880088010F83F08010802081A082410261019200000 +31AF:00000200020002000420042008401F80010002180424082410F83F1000080000 +31B0:00000010101008200440048021F81F0811081108110811081108110811080000 +31B1:00000000007C3F80008020F81F08110812081418182814481288110810080000 +31B2:0000000000FC3F000100010001000100010001000100010001FC3E0000000000 +31B3:000001000080008000800080008000800080008000E003800480048003000000 +31B4:000000000000000000000800080013C03C400040004000800880050002000000 +31B5:000000000000000000000800080011C03E400440044008400880128021000000 +31B6:00000000000000000000000003E03C00040009C00E4000400040028001000000 +31B7:00000000000000000000000001E01E0008000800080008001000100020000000 +31B8:00000000000001F83E10002000400080010002000400187C3F80000000000000 +31B9:00000000000000002000100010001000100010FC3F0000000000000000000000 +31BA:000000000000000001000080008001FC3E800080008000800000000000000000 +31BB:0000000000000000000000000420042008401080210010800840042004200000 +31BC:000001000100010002000210041008201C2003400080014002200C1030080000 +31BD:0000000000FC3F0001000210041008201C2003400080014002200C1030080000 +31BE:00000000000808080408041004FC3F1002200220012001400140008000800000 +31BF:0000000000000840042004100410080808080808100410042004000000000000 31C0:0000000000000000002000C003001C0008000000000000000000000000000000 31C1:0400020002000100010001000100010001000100010001000100010005000200 31C2:1000100010001000080008000800040004000200020001000090005000200000 @@ -13103,7 +13135,7 @@ 3746:0020FDFE042009FC100011FC150419FC3088D3FE100011FC1104110451FC2104 3747:20201010FEFE00007C7C44447C7C00007C7C080810101EFEF010101050502020 3748:210447C88812F3BC20084B92F83E0380AAAAABAA00007C7C0808FEFE10103030 -3749:0200010001007FFE400280040000000000000000000000007FFC000000000000 +3749:0200010001007FFE400280040000000000000000000000000000FFFE00000000 374A:0200010001007FFE4002800400003FF01010082004400280010006C01830E00E 374B:0200010001007FFE400280041FE0004000800100010001000100010005000200 374C:0200010001007FFE4202820407E004200840104000800180024004201810600C @@ -14563,7 +14595,7 @@ 3CFA:02404240227E22800F00827842085308121026FEEA102210221022102A500420 3CFB:01102110111017FC811041104FFE100013F82208E20823F82208220823F80208 3CFC:00500048FFFE00403E4022243E2800120E2A70C6030A7D90096011202518C206 -3CFD:002027201120113E814047404490141014102754E15221522192211025500220 +3CFD:002027201120113E814247444490141014102754E15221522192211025500220 3CFE:02082108111017FC8040404043F8104010802FFEE1202120222022222422081E 3CFF:0040202013FC1040809041084BFC0844104017FCE0E0215022482C4620400040 3D00:0108210817FE11088000403C4BC00820101013FCE0082010206021802240043E @@ -14573,7 +14605,7 @@ 3D04:000027FE14021492848A450A4402140214F22492E49224922492249227FE0402 3D05:010001087D1005A009603118C50602003FF82448282837D8244827C820083FF8 3D06:000023F8100811F8800843F8400017FE14422844E3F822482248224822580040 -3D07:1088108810881088D6EA52AC52A85AA856EC52AA52AA94C81088108852A82110 +3D07:1110111011101112DDD45558555055505DD85558555499941112111055502220 3D08:0010203813C0120083FC4220422012201FFE2000E04024442444244427FC0004 3D09:00402090110813FC8108421044A417BE10822000E3FC20002000200027FE0000 3D0A:044422441284101487D4411445541554155427D4E15421142204220424140808 @@ -14676,7 +14708,7 @@ 3D6B:01F8201017FE10A0804047BC408411CE17382108E31827FC240427FC240407FC 3D6C:00009DF85488149014FC1D549524555416881C0015FC55549554255427FE4C00 3D6D:0040204413F8105087FE404051FC170411FC2104E1FC20002524249228920000 -3D6E:004027FC10A013188D1643F8411011F0104023F8E24823F8204027FC20400040 +3D6E:004027FC111012088D1643F8411011F0104023F8E24827FC20402FFE20400040 3D6F:40002FF828088BE849084BE80A282BE82A284BE8CA084BFA4A0A53FA55562032 3D70:0140224C12641244834C42644AA40BAC12A412A4E7FE20002110210822040404 3D71:00044FE422842FE40ABE8AA44FE4500417D4200CEFEC2104254425242924030C @@ -14885,7 +14917,7 @@ 3E3C:1040104050FC50887D50502090D813261CF8F02050F8102013FE102010201020 3E3D:080008FC488448847EFC4884888408FC0E84F88448FC08000848084408820902 3E3E:100013FC5044514479445284909411081A403020D0A41282128A128A14781000 -3E3F:1020102053FE50207DFC500093FE12021C04F0F050901090109011121112120E +3E3F:1020102053FE50207DFC500093FE12021C04F09050901090109011121112120E 3E40:1020102053FE5020782053FE9202140419F83010D02013FE1020102010A01040 3E41:1040102053FE50007C0051FC910411041DFCF020512811241222142210A01040 3E42:00007EFC48447E4442287E1048287EC6010011001FF821000100FFFE01000100 @@ -15765,7 +15797,7 @@ 41AC:01007FFE482290140FE008203FF820083FF820083FF820083FF8082010102008 41AD:01007FFE4822901408007F7C08107F1049107F1049FE7F100810FF9008100810 41AE:01007FFE4822901423F8100811F8800843F8500017FC2404E3F8211020E0271C -41AF:01007FFE4822BEFC12480C3032C800003EF812480C3032C8FFFE082007C07838 +41AF:01007FFE482290143EF812480C3012483EF812480C3032C8FFFE082007C07838 41B0:020001007FFE482290143FF8200027F0241027F020002F7829482F7820003FFC 41B1:020001007FFE482290142040124890B04108460410402244E44820A023182C06 41B2:01007FFE482291143FF820802FF820883FFE20882FF824C422A8449858868180 @@ -16468,7 +16500,7 @@ 446B:088410483E0022FC32482A482A48FE4823FE32482A482A48224842884A888508 446C:085010503E50235232D42A582A50FE5822D433522A502A50229242924B12860E 446D:100021007CBE4488640856085508FD484448648857885488448844FE54808800 -446E:100020F87C884488648854885526FE2045FE6420547054A84524462254208820 +446E:100021FC7C444448648E5482550AFE24442065FE547054A84524462254208820 446F:110820887C9045FC6424542455FCFD20452065FE546254A2452A462454208820 4470:081010103E90229E32902A902BFEFE00221032922A922B14220442084A3085C0 4471:104020207BFE4A026D04590049DEFA524A524B526C9A5894491049124A129C0E @@ -16537,7 +16569,7 @@ 44B0:04400440FFFE044000003FFE20002FFC2080208027F8208020802FFC20003FFE 44B1:04400440FFFE04403FF0002000C07D040588095011202118C5060200FFFE0000 44B2:04400440FFFE04401008101CFEE0122022202220643E15E0082214222222C01E -44B3:08200820FFFE082000000FE008201020611C0100FFFE054009203118C1060100 +44B3:0820FFFE082000003FF00410083C1004613801007FFC054009203118C1060100 44B4:08200820FFFE0820040004007FFC08001FF028104FF088100FF0081008500820 44B5:08200820FFFE0820100011F8FC082410242025FE442024201820182024A0C240 44B6:08200820FFFE0820092001003FF821083FF821083FF8010800B001C20E32700E @@ -16686,7 +16718,7 @@ 4545:0820FFFE08200080112C1124FDAC252425FC482029F810882850442080D80306 4546:0440FFFE044020A021102208F5F62000678474A4AFA4A4A427A4248424942588 4547:0820FFFE092000803FFC208021002FF828882FF829082FF84254445C9842603E -4548:0820FFFE0820004809484BFE49487978090009FEF8204BFE487048A88B260820 +4548:0820FFFE0820004809484BFE49487D78410041FE78204BFE487048A84B268820 4549:0820FFFE08203FF824483FF801003FF80100FFFE04403FF80100FFFE01000100 454A:0820FFFE0920FFFE00003FF8200827C824483FF810101FF010101FF00000FFFE 454B:0820FFFE08201040102013FE12207EFC122413FE12241EFCE22004FC048408FC @@ -17198,7 +17230,7 @@ 4745:0020FE200820102030204A209DFC28204C209A202A204820882008202BFE1000 4746:08001FF822484488095012207FFC02000D1072A00CC071A006981886E2800100 4747:000025FC2220424080A425382450249825382454249425502422440243FE8000 -4748:001CFDE01100210061FE95003900517C994435445554914811421242523E2400 +4748:0000FDFE110021006178954839485148994835685550914211421242523E2400 4749:044024481450FFFE800200007FFC02000D1072A00CC071A006981886E2800100 474A:0020FC2013FE202061FC94243BFE502499FC34205520913E112012A0527E2400 474B:0040FC2013FE2202600095FC380050009BFE3420552891241222142250A02040 @@ -18012,7 +18044,7 @@ 4A73:28402820FDFE292238A411287C50548855047CF81088FC881050102010D81306 4A74:2880289EFC9229D23892109E7C9255D255527D5E1152FD5211D21022102A1044 4A75:28002BFEFE2228203BFE10207DFC552455FC7D2411FCFC2013FE102010201020 -4A76:28202924FD2429FC382011FE7C00542055FC7D241124FDFC1020102413FE1102 +4A76:28202924FD2429FC382010407D80542055FC7D241124FDFC1020102413FE1002 4A77:28202810FDFE2884384811FE7D02562454107DFE1040FC7C1044108410941108 4A78:28882888FDFE2888380011FE7C88548854F87C8810F8FC88109E11E810081008 4A79:280028FEFE00287C3844107C7C0054FE54827CAA1092FEFE1092109210921086 @@ -18269,24 +18301,24 @@ 4B74:00001FF811001FF011001FF011001FFC0004292444940108FFFE010001000100 4B75:00007E7848487E4848487E48486848587E580248AA48AA4AAA4A828A14860900 4B76:00007EFE48487E4848487E48484848487E480248AA48AA48AA88828815080A08 -4B77:00087F1C48707F1048107F1C487048107F90009EAAF0AA90AA9280920512020E +4B77:00087E1C48E07E2048207E3C48E048207E20023EABE0AA20AA2282221422081E 4B78:00107E8848847E8449027E02488848887E880250AA50AA20AA50828815040A02 4B79:00007C40519E7D1251127D12511251127D120512555A55945510841014100810 4B7A:00207E1048107EFE48007E00487848487E480248AA48AA4AAA4A828A14860900 4B7B:00107E5048507E5048887E8849044AFA7E480248AA48AA48AA88828815280A10 -4B7C:00007F3C48007F0048007F7E482448247FA400A4AAA4AAA4AAA480A405440284 -4B7D:00087F2848287F28483E7F28484848087F8800FEAA88AA88AA88808805080208 +4B7C:00007E7C48007E0048007EFE484848487E480248AA48AA48AA48828814880908 +4B7D:00107E5048507E50487C7E50489048107E1002FEAA10AA10AA10821014100810 4B7E:00207E2848247E2448207E2048FC48207E200250AA50AA50AA88828815040A02 4B7F:00107E1048507E50487C7E90491048107EFE0210AA28AA28AA28824414440882 4B80:00407E4048FC7E8449047EF4489448947EF40284AA94AA88AA828282147E0800 4B81:00207E2048407E4848847EFC480448487E4802FEAA48AA48AA48828814880908 4B82:00287E2448247E2048FE7E204820483C7E340254AA54AA54AA88828815140822 4B83:00107E1048107E7E48107E10481048FE7E100210AA20AA28AA4482FE14420800 -4B84:00107F0848087F7E48107F10482448247FB80088AA90AA90AAA480BE05020200 +4B84:00207E1048107EFE48207E20484448447EF80208AA10AA24AA4202FE14420800 4B85:00147E1248127E1048FE7E90489248927E920294AA94AAB4AACA828A14160822 4B86:00007EFE48087E1048347E52489048107E000210AA10AAFEAA10821014100810 4B87:00207E2048FC7E2449FE7E2448FC48207E2002FCAA20AA20ABFE822014200820 -4B88:00107F10481E7F2248547F08481048647F88009EAAA2AAC2AA94808805100260 +4B88:00207E20483C7E4448A87E10482048487E90023EAA42AAA4AA18021014600980 4B89:00407E40487E7E8049007E1C48E048A07EA202A4AAA8AA90AA9082A814C40882 4B8A:00207C2051FE7C2051FC7C2451FC51207DFE0422542A54545450848815040A02 4B8B:00027C0253E27C8A508A7CEA50AA512A7DAA056A564A544A54828482150A0A04 @@ -21151,7 +21183,7 @@ 56B6:000003DE02527BDE4A524BDE4A524BDE494A4E3148407FFF008803D000780784 56B7:004007FCF00093B892A893B8911097FC911097FCF1109FFE012803100D480186 56B8:00080FE8E928AD68ABAEA928AFE8A108AFE8A11EE112BFF200121552155E2012 -56B9:0820083CEE20B4FEA4A2A4B8BFE2A49EB582B5BCF5AAB79C18FF010801280210 +56B9:0810081EEF10B47EA452A47CBFD2A44EA440B57EF54A956C1758197E00480098 56BA:01FC095475FC5488505053FE5C4054A25534545875B45452059204500A2011FE 56BB:00007BDE489249124BD24A527A5E03C07A5E4BD24A524A524BD2781E49920240 56BC:000C03F479224A114FFE4A524BFE48004BE24A3F4BE27A3203EA020A03E20206 @@ -21371,7 +21403,7 @@ 5792:0400082010103FF80810102024487EFC0204010001003FF801000100FFFE0000 5793:10201020102017FF10407C481048119010541024144819906030004801840602 5794:00007FFC044004403FF8244824483FF8010001003FF8010001000100FFFE0000 -5795:007C3F8020003FFE20002FF8280828082FF8208020802FFC40804080BFFE0000 +5795:007C3F8020003FFE20002FF8280848084FF8808000801FFC008000807FFE0000 5796:1040108011F811081108FD0811F811001100110011FC1D04E104410401FC0104 5797:10901090109012921194FC98109011981294149210901C90E11241120212040E 5798:10901094109211121110FF7E151011101110112811281D28E128414401440182 @@ -26178,7 +26210,7 @@ 6A59:08EA082C09297EC6084408FA1D011AFC1A84288428FC4884084408480BFF0800 6A5A:102011FC102413FEFC2411FC30203AAA57AE522293FE122213AE12AA12AA1422 6A5B:20002FFE28002A28F9482BEE289278846AA0AAA8ABE828882894291429243242 -6A5C:3FFE289025103FDE22222A882F882294242228803FFE21C022A0449858868080 +6A5C:7FFC51204A207FBC444455105F10452888441100FFFE038005401930E10E0100 6A5D:100013FE105013FEFE5213FE300039FC550455FC910411FC102013FE10201020 6A5E:1020102013FE1020FDFC112431FC392455FC502293FE1042102412A2128A1478 6A5F:08A408A40B787CA408AA097D1BE41C221BFF2894289448C8092909150A230C41 @@ -26379,7 +26411,7 @@ 6B22:00800080FC8004FC050449082A401440104028A024A045108110020804040802 6B23:022004203820203F20423F542490251024102418242824282424244444820701 6B24:2020202020203F7E2042408440107E10021002101A28E2284248024414840902 -6B25:004000407C40447C4484448845207C2044204450445044507C88448801040202 +6B25:004000407C40447C448444884520742044204450445044507C88448801040202 6B26:084008401440147C228452888920082000207E50025004500488088809040202 6B27:00203FA02120213F31512A5226942210261025302928292830443FC400820101 6B28:2040204040407E7C828402887B204A204A204A507A504A500288028815040A02 @@ -27608,7 +27640,7 @@ 6FEF:10000FDF084103CF404127DF2088009009FE0B2015FC112021FC212041FF4000 6FF0:422822242440857E49C85F48027E244829485F7EC14840485548557E50400040 6FF1:10200BFE0A0201FE00A44128227021FC070411FC110421FC210421FC40CC4702 -6FF2:0200421C2F942214071480264F8048BC17142014E2142F8827082A9432240242 +6FF2:0200421C2F942214071480264F8048BC13142614E2142F8827082A9432240242 6FF3:2108152817FE052801084FFF229422D504A70BFC120413FC2204220443FC4000 6FF4:0110455425B8291002A884444FFE484210402764E16821502248244429420080 6FF5:002027FE140213FC822443FC4A000AFC128412FCE28422FC228424FC24480884 @@ -28856,7 +28888,7 @@ 74CF:009000907FFF1250119E17E2101E7FD0125E13D0125E17D01A5E6250025102CF 74D0:0040007CF84023FC224423F0FA4422FC22A822F822A83AF8E20045FC05540BFE 74D1:000007FEF4442598248827DE2488F5DC26AA248824202520353CC920092017FE -74D2:01040514F7DE29242FFF210CF3552DA723FC220422243A24E24400B001080604 +74D2:01080528F7BE29482FFE2318F5AA294623F8220822483A48E24840B001080604 74D3:03DE0252FBDE225223DE222222FAFA2222FA22AA22FA3AAAE2FA427202AA0226 74D4:000003DE7E5213DE125213DE7E5213DE1154122214401BFF608801D000780786 74D5:F7FC124817FCFC4686ECF55416EC155456EC244400007FFC01003FF80120FFFE @@ -31876,7 +31908,7 @@ 809B:00003E0022FE221022103E102210221022103E10221022102210221023FF4600 809C:00043E042208221022203E442204220822103E2222422204220842104A2084C0 809D:00003EFE2210221022103E10221023FF22103E10221022102210221022104610 -809E:00003DF8248824C824A83CA82488245024503C50242024202450448855048A02 +809E:00003DFC248424C424A43CA82488244824503C50242024202450448855048A02 809F:00003CFC2400240024003DFE2440244024803CFC240424042404440454288810 80A0:00003DF82410242024403C8025FE249224923C92251225222622444254948908 80A1:00003CF02490249224923C8E250027F824883C882450245024202450258C4E03 @@ -32139,7 +32171,7 @@ 81A2:002079FC49244BFE492479FC482049FC492479FC48404BFE488849D048709B8C 81A3:00103C1025FF2529244A3D8625FF242824463DFD241024FE2410241027FF4C00 81A4:00003CFE241025FF25113DDD251124DC24003CFC240427FF2404240424FC4C00 -81A5:10141010FDFE11107DD43948554A929611223FF8228824482108228824482018 +81A5:101410107DFE1110FDD43948554A929611223FF8228824482108228824482018 81A6:0020792448A84BFE48A879244A224904490479DE4A444D54489E49044A049C04 81A7:00203DFC2488245037FE2C0025FC25242DFC352425FC242025FC442057FE8800 81A8:00843C8427E4248824883FF2240225E425243DE926312522254224E427084C30 @@ -38293,47 +38325,47 @@ 99AC:00000FFC088008800FF8088008800FF8088008800FFE0022149212522242400C 99AD:00003FFC242424243F2424243F24241424143F98048832982A9428A441420681 99AE:000001FE2120112011FC012001FC0920092011FE1012254A24AA44A24802000C -99AF:00007F7C48107F1048107F104810487E7F900090AA90AA90AA90809005100210 -99B0:00107F1048107F3C48247F44480448247F940094AA84AA84AA84808405280210 -99B1:00107F1048107F10487E7F10481048107F9000A8AAA8AAA8AAA880C405440282 -99B2:00087F1C48707F1048107F104810481E7FF00090AA90AA92AA928092050E0200 +99AF:00007E7C48107E1048107E10481048FE7E100210AA10AA10AA10821014100810 +99B0:00407E4048407E7C48847E84490448447E240224AA04AA04AA04820414280810 +99B1:00207E2048207E2048207EFE482048207E200250AA50AA50AA88828815040A02 +99B2:00087E3C48E07E2048207E204820483E7EE00220AA20AA22AA228222141E0800 99B3:00083FA82428242E3F2A243A3FEA242A242A3FAA04AE12A82AA828A140A1031F 99B4:00223FAA242A242A3F2A242A3F2A242A242A3FAA02AA35AA2AAA2AA241420682 99B5:3FF821003FF021003FF021003FFC4924849408280820FFFE0820102020204020 99B6:00107E1048107EFE48107E1048FC48447E440244AA28AA28AA10822814440882 -99B7:00087F0848087F3E48087F08483E482A7FAA00AAAAAAAAAAAAAE808805080208 -99B8:00007F0C48307F2048207F20483E48247FA400A4AAA4AAA4AAA480A405440284 -99B9:00007F3E48227F2248227F224822483E7FA200A2AAA2AAA2AAA280BE05220200 +99B7:00107E1048107EFE48107E1048FE48927E920292AA92AA9AAA94821014100810 +99B8:00087E1C48E07E8048807E8048FE48887E880288AA88AA88AA88828815080A08 +99B9:00007E0048FC7E8448847E84488448FC7E840284AA84AA84AA8482FC14840800 99BA:00007EFC48447E4848487E50485C48447E440244AA68AAA8AA90829815240842 -99BB:00107F1048207F2848447F7C480448287FA800A8AAA8AAA8AAAA80CA05460280 +99BB:00207E2048207E4848447EFE480248487E480248AA48AA48AA8A828A15060A00 99BC:00083F88240824FF3F2224223F22241424143F88048832982A9428A441420681 99BD:3FF821003FF021003FF021003FFC4924849401083FF8210821083FF801000100 99BE:00107E1048107E1048FE7E92489248107E280228AA28AA28AA48824A148A0906 -99BF:00107F0848007F3E48227F224822483E7FA200A0AAA0AAA0AAA080A005400280 +99BF:00207E1048107EFE48827E82488248FE7E820280AA80AA80AA80828015000A00 99C0:00487E4448447E4049FE7E50485048507E500250AA50AA52AA528292148E0900 99C1:00043FC4242424183F0824143F22244024023FA20494128C2A882894412206C1 99C2:400049FC5120612045FC45203DFC1120112011FEFC0212AA12AA120210141008 -99C3:00107F1048107F10487C7F14481448147F9400FEAA90AA90AAA880A805440282 +99C3:00207E2048207EFC48247E24482448247EFE0220AA50AA50AA88828805041A02 99C4:00103F90241024FF3F1024103F10241824283FA804A832A82AE4289440920301 99C5:00003FBE242224223F2224223F3E243024283FA814A82AA82AA428C441420681 99C6:00003F7F244024423F4224523F4C244424443FCA04CA32D22AE028C0417F0640 -99C7:00107F1048107F20483E7F4448A448247FA800A8AA90AA90AAA880A805440282 +99C7:00207E2048207E3E48447E44484448A47E280228AA10AA10AA28824814840902 99C8:00043F88243024203F20243F3F24242424243FA404A432A42AA428A440FF0300 99C9:00007EFE48827E8248827EBA48AA48AA7EAA02AAAABAAAAAAA828282148A0884 99CA:00107E1048107EFE48927E94489048FC7EA402A4AAA8AAA8AA90832815440A82 -99CB:00007F7E48127F1248127F22482A48447F8000BEAAA2AAA2AAA280A2053E0222 +99CB:00007EFC48247E2448247E44485448887E0002FCAA84AA84AA84828414FC0884 99CC:10003EF84288A2AA1492187EE0001FF011001FF011001FF011001FFC2A44492C -99CD:00007F7C48107F1048547F34483848107FFE0090AA90AA90AA90809005100210 -99CE:00087F0848087F08483E7F2A482A482A7FAA00BEAAAAAAAAAAAA80AA053E0222 -99CF:00007F3E48207F2048207F3E482248227FA200A2AABEAAA0AAA080A0053E0200 +99CD:00007EFC48107E1048947E54485848107FFE0210AA10AA10AA10821014100810 +99CE:00107E1048107E1048FE7E92489248927E9202FEAA92AA92AA92829214FE0882 +99CF:00007EFE48807E8048807EFC488448847E840284AAFCAA80AA80828014FE0800 99D0:00103F882408247F3F8824083F882408247E3F88048812882A88288840FF0300 99D1:04007FFC094412283C100A6C11836FF808800FF808800FFC0044292424844018 99D2:00203F20243E24223F42247A3FAA252A242A3FAA04BA32822A82288240840318 -99D3:00007F3E48087F0848087F18481C482A7FAA00CAAA88AA88AA888080053E0200 -99D4:00007F3C48247F2448247F3C482448247FA400BCAAA4AAA4AAA480A4057E0200 +99D3:00007EFE48107E1048107E20482848647EA20322AA20AA20AA20820015FE0800 +99D4:00007EF848887E8848887EF8488848887E8802F8AA88AA88AA88828815FE0800 99D5:08007F7E09420942117E26004FF808800FF008800FF008800FFE29222492400C -99D6:00107F1048287F2848447F92480848007FBC0084AA88AAA8AA90808805040200 -99D7:00107F1048287F2848447F92482048407F880090AAA0AA84AA88809005200240 +99D6:00107E1048287E2848447E92480848087EFE0202AA04AA44AA28821014080808 +99D7:00107E1048287E2848447E82480848107E640208AA10AA62AA048208143009C0 99D8:00103F90241024143F2224263FF9240124013FBE04A232A22AA228A240BE0300 99D9:00487E4848487E8848FE7E88498848887EC802A8AAA8AA88AA88828814A80890 99DA:00207C2050207DFC51247D24512451247D2407FE542054505450848815040A02 @@ -38346,15 +38378,15 @@ 99E1:00003EF822883EF800001FF811001FF011001FF011001FFC0004292444940008 99E2:00423F22242424FF3F2424243F2424FF24243FA404A432A42AA428A441440684 99E3:00507E5048507F5248D47E58485048587ED40352AA50AA50AA92829215120A0E -99E4:00007F7E48107F1048247F22487E480A7F880088AABEAA88AA888088057E0200 +99E4:00007EFE48107E2048447E8248FE48127E100210AAFEAA10AA10821015FE0800 99E5:00147E1248127E1048FE7E10485248527E5202F4AA54AA54AA8A828A15160822 99E6:111009207FFC0200FFFE08203018DFF611001FF011001FF011001FFC2A44492C 99E7:00007EFE48827E8248BA7E82488248BA7EAA02AAAAAAAABAAA828282148A0884 -99E8:00107F1048107F3E48227F42483A482A7FAA00BAAAAAAAAAAABA808205140208 -99E9:00087F0848147F1448227F40483E48087F880088AABEAA88AA888088057E0200 +99E8:00407E4048FE7E8249027EF2489248927EF20292AA92AAF2AA82820214140808 +99E9:00107E1048287E2848447E82487C48107E100210AA7CAA10AA10821014FE0800 99EA:00107E5048507E7C48907E10481048FE7E280228AA28AA28AA4A824A14860900 99EB:00207E2049247EA448A87E2049FE48507E500250AA50AA52AA528292148E0900 -99EC:00007F7E48247F2448247F3C482448247FBC00A4AAA4AAAEAAF4808405040204 +99EC:00007EFE48447E4448447E7C484448447E7C0244AA44AA5EAAE4820414040804 99ED:00083F882408247F3F1024143FE42428241A3F9204A432C82A9828A441420681 99EE:00083F88247F24243F2224223F45249524143F94048832882A9428A441420681 99EF:00107E5048507E7C48907E10481048FE7E100238AA38AA54AA54829214100810 @@ -38371,12 +38403,12 @@ 99FA:00207E1048FC7E8448847EFC488448847EFC02A2AAA4AA98AA90828814C40882 99FB:00003FBE242224223F3E24223F22243E24003FBE048832882AFF288840880308 99FC:00107E1048287E2848447EBA481048107EFE0210AA58AA54AA92831214500820 -99FD:00007F3E48227F22483E7F00483E48227FA200BEAAA2AABEAAA280A2052A0224 +99FD:00007E7C48447E44487C7E0048FE48827E8202FEAA82AA82AAFE8282148A0884 99FE:00847E4448487E0048FC7E84488448847EFC0248AA48AA48AA48828A148A0906 99FF:00103F98242624FD3F2824293F472490241C3FA404E412A82A9028A841440683 9A00:0010F8D8A394F894A090FBFEA090A094F89408D8AB98A890A8AA88CA0A863102 9A01:00103F10247E24523F7E24523F7E240024FF3F90049032BE2AA228824082030C -9A02:00207F1048107F7C48007F28481048FE7F900090AAFCAA90AA90809005100210 +9A02:00207E1048107EFE48007E44482848FE7E100210AA7CAA10AA10821014100810 9A03:00107E2048447E8248FE7E004840487E7E900210AAFEAA10AA28824414820900 9A04:00007EFC48047E04487C7E04480448FE7E100292AA54AA38AA54829214500820 9A05:00123F922414243F3F2424643FA4243F24243FA404BF32A42AA428A440BF0300 @@ -39116,14 +39148,14 @@ 9CE3:201021FE7C0045FE89027D7A554A55FE7C0054FC54847CFC00841CFCE00041FE 9CE4:210821087DEE469488427C1055FE55027CF8548854F87C8000FC1C84E0FC4084 9CE5:008001000FF008100FF008100FF008000FFF08000FFE1022149212522242400C -9CE6:100020007F3E41027F0441047F0840087F9040107FA000A2AAA2AAA2811E0600 +9CE6:100020007CFC44047C0844107C2040207E4040407E800282AA82AA82827E0C00 9CE7:01000FF008100FF0081008100FFF08000FFE29222492400C03F002110C11700F -9CE8:101020107F1041107F7E41127F1240127F9240127F920092AAA2AAA2814A0684 +9CE8:102020207E2042207EFC42247E2440247F2440247F2401245524554481540688 9CE9:1020104010FC7C8414FC148414FC148014FF158015FE230A20A641520152020C 9CEA:2040208021FC210421FC290425FC250025FE210021FE200222AA22AA2202200C 9CEB:00001FFF108013F8120813F8120813F8120013FF120013FE200A25264492080C 9CEC:01001FF010101FF010101FF010001FFF10001FFE000207E2042C04211821601F -9CED:00400080F9FC290429FC290429FC290029FE290029FE28024AAA4AAA9A02000C +9CED:00400080FDFC250425FC250425FC250025FE250025FE440256AA8AAA0202000C 9CEE:0040008001FCFD0405FC050449FC290011FE110029FE240246AA82AA0202000C 9CEF:00007FF844085FC850485FC850485FC850085FE850085FEA402AAAAAAAA60042 9CF0:0020004038FC088408FC088408FC0C8014FF148012FE222A219641520242000C @@ -39139,7 +39171,7 @@ 9CFA:1040108011FC7D0411FC110411FCFD0011FE110011FE280226AA42AA8202000C 9CFB:0020284024FC248442FC428480FC7C8024FE248024FE240244AA44AA9502080C 9CFC:0040208011FC0104FDFC090409FC490029FE110011FE28022AAA4AAA8202000C -9CFD:00407C8029FC290429FC290429FCFF0029FE290029FE28022AAA2AAA4A02880C +9CFD:00407C8029FC290429FC290429FCFD0029FE290029FE28022AAA4AAA4A02880C 9CFE:0040FE8011FC11047DFC550455FC550055FE550055FE5C0212AA12AA1202100C 9CFF:004000807DFC110411FC11047DFC110011FE110011FE1C02E2AA42AA0202000C 9D00:0040FC8011FC110421FC310469FC6500A5FE210021FE200222AA22AA2202200C @@ -39178,7 +39210,7 @@ 9D21:0040788049FC490449FC790449FC490079FE490049FE48024EAAF2AA0202000C 9D22:04082410243C44245FBC94A4E4BC24A044BE44A094BEF48218AA08AA1282210C 9D23:0810082008FC7F8408FC088408FC3E8022FF228022FE220A3F5601520202000C -9D24:102020207F3C41447F6841A87F1040287FC440827FA00090AA88AAA081100608 +9D24:104020407C7844887C8845507C2040507E8841067E600210AA00AAC082300C08 9D25:102020107C1044FE7C8245047C0040287E2840287E280228AA44AA4482440C82 9D26:00801FFE10827FFF02900C8C77FB040807F8040807FF040007FE1492124A200C 9D27:2020104010FCFE8482FC848400FC788048FE488048FE4A024EAA4AAA8202000C @@ -39202,7 +39234,7 @@ 9D39:4440248029FCFF0411FC11047DFC110011FEFF0011FE100222AA22AA4202800C 9D3A:10201040FEFC10847CFC14847CFC50807EFE128012FE160228AA24AA4502800C 9D3B:20081010107C0FC4427C2244227C02400A7F0A40137E1C0A2156212A4222400C -9D3C:101020107F3C41247F4441287F1040287FC640007FBC00A4AAA4AAA4813C0624 +9D3C:104020407C7844887D5044207C5040887D0640F87E880288AA88AA8882F80C88 9D3D:1000FE7C22441C7CE2001FF010101FF010101FF010001FFC10001FFC2A44452C 9D3E:0810082014FC22847DFC098428FC3E8048FF08807FFE082A095609520A02080C 9D3F:0810082014FC148422FC7D8400FC00803EFF228022FE222A3F9601520242000C @@ -39270,7 +39302,7 @@ 9D7D:0010F720117C5544227C5544897C1040007EF740117E5502222A552A8942100C 9D7E:0020FC4084FC8484FCFC848484FCFC8000FE8880EEFE880288AAAAAACD02880C 9D7F:100020FE7C8244FE7C8244FE7C0040147EE440447E4403FEAA44AA4482840D04 -9D80:102420247F7E41247F24413C7F2440247FBC40247FA400FEAA80AAA481220642 +9D80:108820887DFC44887C8844F87C8840887EF840887E8803FEAA00AA8882840D04 9D81:20201040FEFC008400FC7C8444FC44807CFE108054FE520292AA10AA5102200C 9D82:2020CE4082FC8284EEFC828482FCFE8028FE288028FE28024AAA4CAA8902000C 9D83:100020207CCE44827C8244EE7C8240827EFE40287E280228AA48AA4A828A0D06 @@ -39289,9 +39321,9 @@ 9D90:08208C404AFC48843EFC0884C8FC5C806AFE488048FE48024AAA62AA9A02000C 9D91:2AA42CA84920145022885FF410101FF010101FF010001FFC10001FFC2A44452C 9D92:22082210FA3C222427BCFAA4AABCAAA0FABE22A072BEAA822AAA24AA2482298C -9D93:50405080F9FC510451FC0104F9FCA900A9FEA900F9FEA802AAAAAAAAFA02880C +9D93:28202840FEFC288428FC00847CFC548054FE54807CFE540254AA54AA7D02440C 9D94:00107E20247C18447F7C29444A7CA840107E0840FF7E1C022A2A492A8842080C -9D95:2040108079FC010449FC3104FDFC010079FE490049FE78024AAA4AAA7A02480C +9D95:202010407CFC008444FC2884FEFC00807CFE448044FE7C0244AA44AA7D02440C 9D96:0610381008527E5408901C282A2848440A821FF010101FF010101FFC5244892C 9D97:00407CFC44847CFC44847CFC0080FEFE108010FE5E0252AA52AAB0049FFE0000 9D98:20102720257C7544257C2744257C7540557E5740557E5502752A492A0942130C @@ -39821,10 +39853,10 @@ 9FA4:0848084A146C22485D4A80EA7F5655207F7E00427F42557E7F425542557E4342 9FA5:0800087E140822105D7C80C47F44557C7F44007C7F4455447F7C552855444382 9FA6:112410A410A813FE16025AFA508890F8102011FC112429242524452C40208020 -9FA7:01FC010479FC490449FC484479F848504FFF48804BFC7D0449FC010401FC0104 +9FA7:01F8010879F8490849F8484479F848504FFE48804BF87D0849F8010801F80108 9FA8:00003FFC228024402FFC3440244027F8244027F82440244027FC24003FFC0000 -9FA9:04200420FFFF0420240CFF7024403C40087F7E484A487E480848FF8808880908 -9FAA:0820082008207E2008200820FF20085008500E502848288828845B02480087FF +9FA9:04400440FFFE0440220CFF7022403E40087E7F4849487F480848FF8808880908 +9FAA:0820082008207E2008200820FF200850285028502E882888290458004FFE8000 9FAB:10101010FF1010287E445282537C7E10521052107EFE1010FF10101010101010 9FAC:100013FE1A02268A22527FFE924212227FFE128216825A8232FA1E02E20A0204 9FAD:7DFE51227DFE512251227DFE504850487EFC0248564853FE8200024814840902 @@ -41868,9 +41900,13 @@ A7CA:0000000000003C42307E0C02423C0000 A7CB:0000000044AA28281010284444380000 A7CC:000000003D424648301C126242BC0000 A7CD:0000000000003D4244381C2242BC0000 +A7CE:000000003C4242402010101010100000 +A7CF:0000000000003C424240201010100000 A7D0:00000000FE4444443810080444443800 A7D1:000000000000FE444444380804444438 +A7D2:00000040407C42427C42427C40400000 A7D3:0000000040405C62427C4242625C4040 +A7D4:000000005C6242424C724242424C7040 A7D5:0000000000005C62425C6242425C6040 A7D6:00000038444444484844444448400000 A7D7:0000001C222222E42422222224200000 @@ -41879,6 +41915,7 @@ A7D9:0000000000003C4240303C42423C0000 A7DA:00000000080808080814222241410000 A7DB:00000000C02020101008182844830000 A7DC:00000000080808087F14222241410000 +A7F1:003C40403C02027C0000000000000000 A7F2:003C42404040423C0000000000000000 A7F3:007E40407C4040400000000000000000 A7F4:003C4242524A3C020000000000000000 @@ -42179,7 +42216,7 @@ A939:0000000000000000008001400120029002480620051008A00840000000000000 A93A:000000000000000004200A500948148412802100200040004000000000000000 A93B:000000000000000004440AA80AA8111010002000200040004000000000000000 A93C:00000000000000000210052804E4084008401080108021002100000000000000 -A93D:00000000000000000210052804E4084008401080188025002300000000000000 +A93D:00000000000000000210052004E0084008401080188025002300000000000000 A93E:0000000000000000018802880290049004A008A008C010C01080000000000000 A93F:00000000000000004004400420082008101011100AA00AA00440000000000000 A940:00000000000000000210052004E0084008401080108021002100000000000000 @@ -42623,8 +42660,8 @@ AB47:00000000000028302020202020200000 AB48:000000000000546A4A40404040400000 AB49:0000000000002C3222202070A0A04000 AB4A:0000000000002A3525202070A0A04000 -AB4B:000000000000665A4202020202020000 -AB4C:000000000000CCB48406050505020000 +AB4B:0000000000007E4204081020221C0000 +AB4C:0000000000007E4204081C22221C0000 AB4D:0000000C101010101010101010600000 AB4E:000000000000404040424242463A0000 AB4F:000000000000404040FE44444C340000 @@ -55031,7 +55068,7 @@ FB2C:0000000100494949494D4949497F0000 FB2D:0000004000494949494D4949497F0000 FB2E:0000000000424222122C48444242003C FB2F:0000000000464222122C484442411C08 -FB30:0000000000424222122C484442410800 +FB30:0000000000424222122C484442490000 FB31:00000000007C040404240404047F0000 FB32:000000000030080808440C1422420000 FB33:00000000007E04040424040404040000 @@ -55173,6 +55210,22 @@ FBBF:00000000000000000000000814242810 FBC0:0010101C1C0000000000000000000000 FBC1:00000000000000000000000010101C1C FBC2:040A1E20000000000000000000000000 +FBC3:00000200220012180A240E200BFE1000608000882094548234FE130060080000 +FBC4:2820002449228AA977AE0000005060043EF843005020504A108E110810B20F00 +FBC5:0124092416C42000006213122DF443000A350A10B9EE60080009202A5FD78000 +FBC6:0924192429241EC4000010C0302451F232820D9C001006126A543FAE4A0046A0 +FBC7:0924192429241EC4000010C0302451F232824D9C401040125A543EAE03000250 +FBC8:0124092416C420000A0A0A600A22B9DC600000600010047A3DA2756242044018 +FBC9:0000092419242924192406C40000000040604010407A44A23D62150402180000 +FBCA:0124092416C420000A0A0A600A22B9DC600000604010407A44A23D6215040218 +FBCB:00A41CA4634408102B402948669580297A6211CC0C0015463848E7BE80008000 +FBCC:0000092419242924192406C400000A4028006CC0AAAC6A621FDE000000000000 +FBCD:01240124192426C4400014201180195854C6BFBE80000A0A0A600A22B9DC6000 +FBCE:0124092416C420000A0A0A600A22B9DC6000050804600654D53277EE98008000 +FBCF:01240124092416C420000A0A0A600A22B9DC60000288422043544B323BEE1400 +FBD0:5520D52A282D80D67F800A350A10B9EE6009002A7FD7840204553D035351A0A6 +FBD1:0A8E2AAC6A2214BE00400216190627A2803C0260600A604A28AAFA0A03F25600 +FBD2:00001380306A53CA350A1B4A00720040018010203020502631280EDE00000280 FBD3:100028020A120A2242423C0000000000 FBD4:100028020A120A2242423F0000000000 FBD5:20005004081020403C02FE0000000000 @@ -55267,11 +55320,11 @@ FC2D:00008020503010207E1020404840211E FC2E:00008020503010207E1020404040211E FC2F:00008020503090207E1020404040211E FC30:00000040102818081020103840404040 -FC31:00000400000C0A0602464844423C0000 +FC31:00000400000C0A060206484442423C00 FC32:00000400000C0A0602464844423C0028 FC33:0000005000205030407E20404040221C FC34:00002800102818081020103840404040 -FC35:00001400000C0A0602464844423C0000 +FC35:00001400000C0A060206484442423C00 FC36:00001400000C0A0602464844423C0028 FC37:000000048890A0C0BC827C0000000000 FC38:0000000008102010207E20404840221C @@ -55311,7 +55364,7 @@ FC59:0000000000000402224446221C010400 FC5A:0000000000000402224446221C010450 FC5B:101010002000080402427C0000000000 FC5C:00000008080808000402020204483000 -FC5D:0000000010101000040A4844423C0000 +FC5D:0000000010101000044A484442423C00 FC5E:00046A241800547C0000000000000000 FC5F:0054547C061866186000000000000000 FC60:000006186000547C0000000000000000 @@ -55322,7 +55375,7 @@ FC64:000018201822060A120A090808106000 FC65:000018209822060A120A090808106000 FC66:000000182018230408083C4040404040 FC67:00000018209802060A2A454448300000 -FC68:000000000C100C1000064944423C0000 +FC68:000000000C100C100006494442423C00 FC69:000000000C100C1000064944423C0028 FC6A:000000000002060A120A090808126000 FC6B:000000000012060A120A090808126000 @@ -55334,13 +55387,13 @@ FC70:000005000002060A120A090808106000 FC71:000005002002060A120A090808106000 FC72:00000000000014000C12394040404040 FC73:00000005001002060A2A454448300000 -FC74:000000000000050000064944423C0000 +FC74:00000000000005000006494442423C00 FC75:000000000000050000064944423C0028 FC76:000200050002060A120A090808106000 FC77:000200050022060A120A090808106000 FC78:00000000080014000C12394040404040 FC79:00000200050012060A2A454448300000 -FC7A:000000000002000500064944423C0000 +FC7A:00000000000200050006494442423C00 FC7B:000000000002000500064944423C0028 FC7C:000000000008000C0A46898C44380000 FC7D:000000000008000C0A46898C44380028 @@ -55360,9 +55413,9 @@ FC8A:000000020002060A120A090808106000 FC8B:000000021002060A120A090808106000 FC8C:00000000020002060A12798080808080 FC8D:00000002100002060A2A454448300000 -FC8E:000000000000020000064944423C0000 +FC8E:00000000000002000006494442423C00 FC8F:000000000000020000064944423C0028 -FC90:000000000010101000064944423C0000 +FC90:00000000001010100000434442423C00 FC91:000000000002060A120A090808106500 FC92:000000002002060A120A090808106500 FC93:000000000000030408083C404A404040 @@ -55463,25 +55516,25 @@ FCF1:00000000000000000856D150482B1800 FCF2:000C30022A1400000000FF0000000000 FCF3:040A040A30022A140000FF0000000000 FCF4:000A54200C3000000000FF0000000000 -FCF5:000000000808080E090E4844423C0000 +FCF5:000000000808080E090E484442423C00 FCF6:000000000808080E090E4844423C0028 -FCF7:000000000000000608064844423C0000 +FCF7:00000000000000060806484442423C00 FCF8:000000000000000608064844423C0028 -FCF9:000000000008000608064844423C0000 +FCF9:00000000000800060806484442423C00 FCFA:000000000008000608064844423C0028 -FCFB:00000000000000000000000000000612091208EC4800440042003C0000000000 +FCFB:00000000000000000000000000000612091248EC48004400420042003C000000 FCFC:00000000000000000000000000000612091208EC4800440042003C0000002800 -FCFD:00000000001000000028000000000612091208EC4800440042003C0000000000 +FCFD:00000000001000000028000000000612091248EC48004400420042003C000000 FCFE:00000000001000000028000000000612091208EC4800440042003C0000002800 FCFF:000000006058040E10380844423C0000 FD00:000000006058040E38080844423C0028 -FD01:000000006058040E38090844423C0000 +FD01:000000006058040E3809084442423C00 FD02:000000006058040E38090844423C0028 -FD03:000000046058040E38080844423C0000 +FD03:000000046058040E3808084442423C00 FD04:000000026058040E38080844423C0028 -FD05:000000000205051E14100844423C0000 +FD05:000000000205051E1410084442423C00 FD06:000000000205051E14100844423C0028 -FD07:000000080205051E14100844423C0000 +FD07:000000080205051E1410084442423C00 FD08:000000080205051E14100844423C0028 FD09:000004000A00255A407E20404840221C FD0A:000004000A00255A407E20404040221C @@ -55491,25 +55544,25 @@ FD0D:00000004000A00152A20202020408000 FD0E:00000000000000152A20202020408000 FD0F:0000000002050D162424202020408000 FD10:0000000802050D162424202020408000 -FD11:000000000808080E090E4944423C0000 +FD11:000000000808080E090E494442423C00 FD12:000000000808080E090E4944423C0028 -FD13:000000000000000205064944423C0000 +FD13:00000000000000020506494442423C00 FD14:000000000000000205064944423C0028 -FD15:000000000004000205064944423C0000 +FD15:00000000000400020506494442423C00 FD16:000000000004000205064944423C0028 -FD17:000000000000000000000000000000000612091248ED440042003C0000000000 -FD18:000000000000000000000000000000000612091248ED440042003C0000002800 -FD19:000000000000001000000028000000000612091248ED440042003C0000000000 -FD1A:000000000000001000000028000000000612091248ED440042003C0000002800 -FD1B:000000000000000000000000000000000670090C08FF440042003C0000000000 -FD1C:000000000000000000000000000000000670090C08FF440042003C0000002800 -FD1D:000000000000000000000000000000000670090C08FF440042203C0000000000 -FD1E:000000000000000000000000000000000670090C08FF440042203C0000002800 -FD1F:000000000000000000000000004000000670090C08FF440042003C0000000000 -FD20:000000000000000000000000002000000670090C08FF440042003C0000002800 -FD21:0000000000040A0A3E29209088700000 +FD17:000000000000000000000000000000000612491248ED4400420042003C000000 +FD18:000000000000000000000000000000000612491248ED440042003C0000002800 +FD19:000000000000001000000028000000000612491248ED4400420042003C000000 +FD1A:000000000000001000000028000000000612491248ED440042003C0000002800 +FD1B:000000000000000000000000000000000670490C48FF4400420042003C000000 +FD1C:000000000000000000000000000000000670490C48FF440042003C0000002800 +FD1D:000000000000000000000000000000000670490C48FF4400422042003C000000 +FD1E:000000000000000000000000000000000670490C48FF440042203C0000002800 +FD1F:000000000000000000000000004000000670490C48FF4400420042003C000000 +FD20:000000000000000000000000002000000670490C48FF440042003C0000002800 +FD21:0000000000040A0A3E29209088887000 FD22:0000000000040A0A3E29209088700050 -FD23:0000000010040A0A3E29209088700000 +FD23:0000000010040A0A3E29209088887000 FD24:0000000010040A0A3E29209088700050 FD25:000000001000280054AA81FC40904438 FD26:000000001000280054AA81FC40804438 @@ -55540,10 +55593,10 @@ FD3E:0000007E018C023004C00F000A0035806AC035800A000F0004C00230018C007E FD3F:00007E0031800C40032000F0005001AC035601AC005000F003200C4031807E00 FD40:0000092419242924192406C40000000010C0302451F232820DA4001800000000 FD41:092019242924192406C410043234504033E80C000038064449F9480244243818 -FD42:092419242924192446C450004D0C545038F807020038064449F9480244243818 -FD43:092419242924192406C410000D0C145038F8E7028038864409F9480244243818 -FD44:092419242924192446C450004D0C545058F837021038064449F9480244243818 -FD45:092419242924192406C010064C880A2E9CF093026038064449F9480244243818 +FD42:092419242924192446C450004D4C545038B807020038064449F9480244243818 +FD43:092419242924192406C410000D4C145038B8E7028038864409F9480244243818 +FD44:092419242924192446C450004D4C545058B837021038064449F9480244243818 +FD45:092419242924192406C010064CA80A2E9CD093026038064449F9480244243818 FD46:2AA06AA0AAAA6A2D145680C080287FC80009202A5FD78004024A024632424C4C FD47:0000018000C0090A490A282A1AAA17D26000082018202826192806DE00000280 FD48:0000018000CA090A490A282A1AB217C26010001006126A543FAE4A0046A00000 @@ -55564,11 +55617,11 @@ FD56:0000000000000000000000000028200050040804FFFC02800100000000000000 FD57:0000000000000000000000000028200050040804FFFC02802100000000000000 FD58:000000000000000000000000000020085014080217FF21404088400024001800 FD59:0000000000000000000000000000201050280804FFFC02800110000000000000 -FD5A:000000000000000000000000000000084814540253FF48A04440380000002800 -FD5B:000000000000000000000000000000084814540253FF48A04440380000000000 +FD5A:000000000000000000000000000000080814540253FF48A04440380000002800 +FD5B:000000000000000000000000000000080814540253FF48A04440440038000000 FD5C:0000000000000000000000000000210052950855FFFF00002000000000000000 FD5D:0000000000000000000000000000210052950855FFFF00000100000000000000 -FD5E:000000000000000000000000000001009295A855A7FF90008900700000000000 +FD5E:000000000000000000000000000001001295A855A7FF90008900880070000000 FD5F:00000000000000000000000000004000A02A102A2FFF45008200800048003000 FD60:00000000000000000000000000002000502A082AFFFE02800100000000000000 FD61:00000000000000000000000000002000502A082AFFFE02802100000000000000 @@ -55579,32 +55632,32 @@ FD65:0000000000000000000000000000210252950855FFEE00000000000000000000 FD66:00000000000000000000000000002004502A082A7FD742804100400040000000 FD67:00000000000000000008000000144200A52A10AAFFFF80008000800080000000 FD68:00000000000000000008000000140200052A00AAFFFE28001000000000000000 -FD69:000000000000000000040000000A01009295A855A7FF90008900700000005000 +FD69:000000000000000000040000000A01001295A855A7FF90008900700000005000 FD6A:00000000000000000008200000142000502A082A17FF22804100400024001800 FD6B:00000000000000000008200000142000502A082AFFFE02800100000000000000 FD6C:00000000000000000008000000142000502A082A7FFF42804100400040000000 FD6D:00000000000000000008000000140000002A002AFFFE2A801100000000000000 -FD6E:000000000000000000000002000001029295A855A7EB90008800700000000000 +FD6E:000000000000000000000002000001021295A855A7EB90008800880070000000 FD6F:00000000000000000000000400004204A52A10AAFFD780008000800080000000 FD70:00000000000000000000020400000204052A00AAFFD428001000000000000000 FD71:00000000000000000000002000202020502C083217FF22804100400024001800 FD72:00000000000000000000002000202020502C0832FFFC02800100000000000000 FD73:00000000000000000000002000200020002C0032FFFC2A801100000000000000 -FD74:00000000000000000000002000200020902CA832A7FF92808900700000005000 +FD74:00000000000000000000002000200020102CA832A7FF92808900700000005000 FD75:0000000000000000000000000000211E5292084C7FF340004100400040000000 FD76:0000000000000000000000000000101E2812040C3FF321402080200020000000 FD77:00000000000000000000000000000000000C0010FFFE52802100000000000000 -FD78:0000000000000000000000000000001E9012A80CA7F391408880700000000000 +FD78:0000000000000000000000000000001E1012A80CA7F391408880880070000000 FD79:0000000000000000000000080000101E2812040C3FF321402080200020000000 -FD7A:0000000000000000000000080000001E9012A80CA7F391408880700000005000 -FD7B:0000000000000000000000080000001E9012A80CA7F391408880700000000000 +FD7A:0000000000000000000000080000001E1012A80CA7F391408880700000005000 +FD7B:0000000000000000000000080000001E1012A80CA7F391408880880070000000 FD7C:00000000000000000000010800002108529408547FEF40004000400040000000 FD7D:00000000000000000008010000080114028C0044FFFC28001000000000000000 FD7E:00000000000000000000000A00002004500A080A17F721404080400024001800 FD7F:00000000000000000000001400002008501408147FEF42804100400040000000 FD80:0000000000000000000000020002084214A202121FFD10001000100010000000 -FD81:0000000000000000000000020002004224A22A1229FD240022001C0000001400 -FD82:0000000000000000000000020002004224A22A1229FD240022001C0000000000 +FD81:0000000000000000000000020002004204A22A1229FD240022001C0000001400 +FD82:0000000000000000000000020002004204A22A1229FD2400220022001C000000 FD83:0000000000000000000000080008210852880848FFF000002100000000000000 FD84:000000000000000000000002000220825142082217FD20004880400024001800 FD85:00000000000000000000008200022082514208227FFD40004000400040000000 @@ -55613,65 +55666,74 @@ FD87:00000000000000000000000200021002280204020BFD10A02040200012000C00 FD88:0000000000000000000000080008200850080808FFF002800100000000000000 FD89:0000000000000000000000000000210052800848FFF400142008000000000000 FD8A:0000000000000000000000000000020005000088FFF450142008000000000000 -FD8B:000000000000000000000000000001009280A840A7FF90148808700000005000 +FD8B:000000000000000000000000000001001280A840A7FF90148808700000005000 FD8C:0000000000000000000000000000210052800848FFF400140108000000000000 FD8D:0000000000000000000000000000010002800048FFF428141108000000000000 FD8E:0000000000000000000001000000210052800848FFF400142008000000000000 FD8F:0000000000000000000001000000010002800048FFF428141008000000000000 +FD90:0924192429241EC4000010C0302451F232820DAC20206026A1287EDE00000280 +FD91:0924192429241EC4000010C0302451F232824DAC402046264AA83F5E0A0006A0 FD92:0000000000000000000020000000210052800848FFF400140108000000000000 FD93:00000000000000000000001800042012502A082AFFDC02802100000000000000 FD94:00000000000000000000001800040012002A002AFFDC2A801100000000000000 FD95:0000000000000000000000000008010002880048FFF028001000000000000000 -FD96:000000000000000000000000000400804944542453FB48004400380000000000 +FD96:000000000000000000000000000400800944542453FB48004400440038000000 FD97:00000000000000000000000000042080514408247FFB40004080400040000000 FD98:0000000000000000000000000008010002880048FFF028001100000000000000 -FD99:000000000000000000000000000400809144A824A7FB90008880700000000000 -FD9A:000000000000000000000000000400004804540453FB48A04440380000002800 -FD9B:000000000000000000000000000400004804540453FB48A04440380000000000 +FD99:000000000000000000000000000400801144A824A7FB90008880880070000000 +FD9A:000000000000000000000000000400000804540453FB48A04440380000002800 +FD9B:000000000000000000000000000400000804540453FB48A04440440038000000 FD9C:00000000000000000000000000000800140402041FFB10A0104A100010000000 FD9D:0000000000000000000000000000000000020002FFFC29401094000000000000 -FD9E:000000000000000000000080000000809142A822A7FD90008804700000005000 -FD9F:000000000000000000000000000A00809142A822A7FD90008840700000005000 -FDA0:000000000000000000000000000A00809142A822A7FD90008880700000000000 -FDA1:000000000000000000000080000A00809142A822A7FD90008800700000005000 -FDA2:000000000000000000000080000A00809142A822A7FD90008800700000000000 -FDA3:000000000000000000000000000A00004802540253FD48A04440380000002800 -FDA4:000000000000000000000000000A00004802540253FD48A04440380000000000 -FDA5:000000000000000000000000000000089014A802A7FF91408888700000005000 -FDA6:000000000000000000000000000001089294A842A7FF90008808700000000000 -FDA7:000000000000000000000000000000089014A802A7FF91408888700000000000 -FDA8:000000000000000000000100000001009295A855A7FF90008800700000000000 -FDA9:000000000000000000000000000001029295A855A7EF90008800700000005000 -FDAA:000000000000000000040000000A01009295A855A7FF90008800700000005000 -FDAB:000000000000000000000002000001029295A855A7FF90008800700000005000 -FDAC:000000000000000000000004000400844944542453FB48004480380000002800 -FDAD:000000000000000000000004000400044804540453FB48A04440380000002800 -FDAE:000000000000000000000000000000804944542453FB4800440A380000002800 -FDAF:000000000000000000000000000000804944542453FB4800448A380000002800 -FDB0:000000000000000000000000000000004804540453FB48A0444A380000002800 -FDB1:000000000000000000000000000000004800540053FF48AA4444380000002800 -FDB2:00000000000000000000000A00000004480A540A53F748A04440380000002800 -FDB3:000000000000000000000000000400804944542453FB48004400380000002800 +FD9E:000000000000000000000080000000801142A822A7FD90008804700000005000 +FD9F:000000000000000000000000000A00801142A822A7FD90008840700000005000 +FDA0:000000000000000000000000000A00801142A822A7FD90008880880070000000 +FDA1:000000000000000000000080000A00801142A822A7FD90008800700000005000 +FDA2:000000000000000000000080000A00801142A822A7FD90008800880070000000 +FDA3:000000000000000000000000000A00000802540253FD48A04440380000002800 +FDA4:000000000000000000000000000A00000802540253FD48A04440440038000000 +FDA5:000000000000000000000000000000081014A802A7FF91408888700000005000 +FDA6:000000000000000000000000000001081294A842A7FF90008808880070000000 +FDA7:000000000000000000000000000000081014A802A7FF91408888880070000000 +FDA8:000000000000000000000100000001001295A855A7FF90008800880070000000 +FDA9:000000000000000000000000000001021295A855A7EF90008800700000005000 +FDAA:000000000000000000040000000A01001295A855A7FF90008800700000005000 +FDAB:000000000000000000000002000001021295A855A7FF90008800700000005000 +FDAC:000000000000000000000004000400840944542453FB48004480380000002800 +FDAD:000000000000000000000004000400040804540453FB48A04440380000002800 +FDAE:000000000000000000000000000000800944542453FB4800440A380000002800 +FDAF:000000000000000000000000000000800944542453FB4800448A380000002800 +FDB0:000000000000000000000000000000000804540453FB48A0444A380000002800 +FDB1:000000000000000000000000000000000800540053FF48AA4444380000002800 +FDB2:00000000000000000000000A00000004080A540A53F748A04440380000002800 +FDB3:000000000000000000000000000400800944542453FB48004400380000002800 FDB4:00000000000000000014000000082014500C0804FFFC02800100000000000000 FDB5:0000000000000000000000080008010802880048FFF828001000000000000000 -FDB6:0000000000000000000000000000001E9012A80CA7F391408880700000005000 -FDB7:000000000000000000000006001800209018A80EA7F192808900700000005000 +FDB6:0000000000000000000000000000001E1012A80CA7F391408880700000005000 +FDB7:000000000000000000000006001800201018A80EA7F192808900700000005000 FDB8:0000000000000000000000000008210052880848FFF800000100000000000000 -FDB9:000000000000000000000080000000809140A820A7FF900A8804700000005000 +FDB9:000000000000000000000080000000801140A820A7FF900A8804700000005000 FDBA:0000000000000000000000080008010802880048FFF828001100000000000000 FDBB:000000000000000000000006001820205018080E7FF142804100400040000000 FDBC:00000000000000000000000400042084514408247FFB40004080400040000000 FDBD:0000000000000000000000000002104028A204120BFD10002040200012000C00 -FDBE:000000000000000000000000000001089294A842A7FF90008808700000005000 -FDBF:000000000000000000000000000001089294A842A7FF90008900700000005000 -FDC0:000000000000000000000000000000809140A820A7FF900A8844700000005000 -FDC1:00000000000000000000000400000004480A540A53F748A04440380000002800 -FDC2:000000000000000000000000000000809142A822A7FF90008804700000005000 +FDBE:000000000000000000000000000001081294A842A7FF90008808700000005000 +FDBF:000000000000000000000000000001081294A842A7FF90008900700000005000 +FDC0:000000000000000000000000000000801140A820A7FF900A8844700000005000 +FDC1:00000000000000000000000400000004080A540A53F748A04440380000002800 +FDC2:000000000000000000000000000000801142A822A7FF90008804700000005000 FDC3:000000000000000000000003000C001000080004FFF829401080000000000000 FDC4:0000000000000000000000000000010002860048FFFF28001100000000000000 FDC5:00000000000000000000000000000004002A002AFFDC55002200000000000000 -FDC6:000000000000000000000100000001009295A855A7FF90008800700000005000 -FDC7:000000000000000000000000000400809144A824A7FB90008880700000005000 +FDC6:000000000000000000000100000001001295A855A7FF90008800700000005000 +FDC7:000000000000000000000000000400801144A824A7FB90008880700000005000 +FDC8:0924192429241EC4000010C0302451F232820D9C00000A0A0A600A22B9DC6000 +FDC9:00A41CA4634408002B482940668980357869022211CC3000514630480FBE0000 +FDCA:00A41CA4634408002B482940668980357869022251CC4C005546384807BE0000 +FDCB:00A41CA4634408002B482940668980357869022251CC4C005546584837BE1000 +FDCC:2AA06AAAAA357446212028C43004784580D6766F0200240520155DB5C0888100 +FDCD:2A8E6AAC142200BE0A400A159AC0727E01C0640692220F3C606A290AF9FA0302 +FDCE:00002A846A88AA906A8C14A2003E0C2012C02C00C1C4106A31E655023D4C0200 FDCF:00000040024001412CD55CBE81000000402048204026492836DE000002800000 FDD0:FFFFFFFFE18FEFB7E3B7EFB7EF8FFFFFFFFFE3CFEDB7EDB7EDB7E3CFFFFFFFFF FDD1:FFFFFFFFE18FEFB7E3B7EFB7EF8FFFFFFFFFE3DFED9FEDDFEDDFE38FFFFFFFFF @@ -55705,19 +55767,19 @@ FDEC:FFFFFFFFE18FEFB7E3B7EFB7EF8FFFFFFFFFE1CFEFB7E3BFEFB7E1CFFFFFFFFF FDED:FFFFFFFFE18FEFB7E3B7EFB7EF8FFFFFFFFFE18FEFB7E3B7EFB7E18FFFFFFFFF FDEE:FFFFFFFFE18FEFB7E3B7EFB7EF8FFFFFFFFFE187EFBFE38FEFBFE187FFFFFFFF FDEF:FFFFFFFFE18FEFB7E3B7EFB7EF8FFFFFFFFFE187EFBFE38FEFBFE1BFFFFFFFFF -FDF0:00000000040004000400040C049204A20B7C3020400040003FF0000000000000 -FDF1:0000000002500200022002500230021005E01800200020001FF8000000000000 +FDF0:0000000000000000040004000400040C049204A20B7C3020400040003FF00000 +FDF1:000000000000000002500200022002500230021005E01800200020001FF80000 FDF2:020002000240014205820602009208921892289218920F600000000000000000 FDF3:0000000C003000C40104010400C412241E14121411E424004000000000000000 -FDF4:06081814010815140A60000001880614003808C0090005FC24181A6001800060 +FDF4:00000000000000080014003808C0090005FC24181A6001800060000000000000 FDF5:00000000040004000400240C549234A22B7C4020380014002800200020000000 -FDF6:0000000010001000100010009254955563A901020E1C00000000000000000000 -FDF7:000000000020002010203020502633280CDE0000050000000000000000000000 +FDF6:000000000000000010001000100010009254955563A901020E1C000000000000 +FDF7:00000000000000000020002010203020502633280CDE00000500000000000000 FDF8:00000000100010001000100012A412AA2D464002300428185000400040000000 FDF9:00000000040004000400040C049204A20B7C082050004C004200240018000000 -FDFA:2AA06AA0AAAA6A2D145680C480287FC82029602ABFD7440204553D035351A0A6 -FDFB:000008000804480A480137FF000002A412A032A452AA32210CDF000000040000 -FDFC:0000028002800280028002A002A0224222021CA2000C00000000000000000000 +FDFA:2AA06AA0AAAA6A2D145680C080287FC80009202A5FD7840204553D035351A0A6 +FDFB:000002A012A032A452AA32210CDF000008040810082848044FFC300000100000 +FDFC:0000000000000000028002800280028002A002A0224222021CA2000C00000000 FDFD:70A95FFF7000C5D5145515D5557D75C0C03B50295FFF7000758554957F9DC030 FDFE:0040004013C04E0440AA4C0E44423B8C00000A0122555AFE828002F002400190 FDFF:00002030004808400FFC0800100064000400040004C4242A47EE4402388C0000 @@ -55845,10 +55907,10 @@ FE85:00000C100C10000C12121E0204483000 FE86:00000C100C10000C12121F0204483000 FE87:08080808080808080808000C100E1000 FE88:08080808080808080733403840000000 -FE89:00000000304030400046484846423C00 -FE8A:000000003040304000404342423C0000 -FE8B:0000000C100C10000404F80000000000 -FE8C:0000000C100C10000404FB0000000000 +FE89:0000000030403040044A484442423C00 +FE8A:00000000003040304000434442423C00 +FE8B:00000018201820080804F80000000000 +FE8C:00000018201820080804FB0000000000 FE8D:00000008080808080808080000000000 FE8E:08080808080808080F07000000000000 FE8F:0000000000818181FF7E001800000000 @@ -55961,7 +56023,7 @@ FEF9:0000020222120A040C141C000C100C10 FEFA:000000020222120A0E0A13600C100C10 FEFB:000000020222120A040C141C00000000 FEFC:000000020222120A0E0A136000000000 -FEFF:AAAA0001F4511458A55546D2F4510001F1DE4A10F19E4851F390000180005555 +FEFF:AAAA0001F452145BA55646D3F4520001F1DC4A13F19C4851F390000180005555 FF01:000003C003C003C003C003C003C003C003C00000000003C003C0000000000000 FF02:00003C3C3C3C3C3C000000000000000000000000000000000000000000000000 FF03:000000001E781E781E787FFE1E781E781E787FFE1E781E781E78000000000000 @@ -56543,15 +56605,15 @@ FFFD:0000007E665A5A7A76767E76767E0000 10191:000000000000000000FE000000000000 10192:000000000E101010101010103E610000 10193:000000003C4242020C304042423C0000 -10194:000000003C4242020CFF2042423C0000 +10194:000000001C222202047F1022221C0000 10195:00000000000000482412121224480000 -10196:000000004242242418FF242442420000 -10197:000000000000000008200820082004401FF00440028002800100010000000000 -10198:0000000000000000213C214221422140FFFF210C210221422142213C00000000 -10199:000000000000000004200420042004201FF80420042004200420042000000000 +10196:0000000022221414087F141422220000 +10197:00000000414141227F22141408080000 +10198:00000000525555547F52515555520000 +10199:00000000222222227F22222222220000 1019A:00000000020204087E10102040400000 1019B:0000000040300C020408102040800000 -1019C:0000000488506090C8E4E27178302000 +1019C:0000000244283048647271383C181000 101A0:000000000E1212121C107E1010100000 101D0:0000000001C002200520224011800E700248024403C002400440082000000000 101D1:00000280029005A003C803D0042C095004500420042003400140018000000000 @@ -57988,6 +58050,32 @@ FFFD:0000007E665A5A7A76767E76767E0000 10938:000000080402023A4408101008060000 10939:000000081C2A2A494908080808080000 1093F:0000000000000E3242320E0000000000 +10940:00000000081020403008040408300000 +10941:00000000102040824428102844820000 +10942:00000000424224140808101020200000 +10943:00000000040818244224181020400000 +10944:00000000828244442828101010100000 +10945:00000000201008041820404020180000 +10946:00000000828244442828444482820000 +10947:000000001010FE122224244442420000 +10948:00000000929292927C10101010100000 +10949:00000000040810204040201008040000 +1094A:000000007E0202020202020202020000 +1094B:000000006212121222424242221E0000 +1094C:000000003C42424242424242423C0000 +1094D:00000000101010101010101010100000 +1094E:0000000042626252524A4A4646420000 +1094F:00000000001008040A120A0408100000 +10950:00000000424448504844424448500000 +10951:00000000103854921010101010100000 +10952:000000004246464A4A52526262420000 +10953:00000000424224241818242442420000 +10954:00000000102828284444448282820000 +10955:00000000442810201804020204180000 +10956:000000007C424242427C404040400000 +10957:00000000402010080404081020400000 +10958:000000007E0408100804020408100000 +10959:00000000424224548808101020200000 10980:00000000204020A010A01FF80114009200A200A206A209C010C07FE000000000 10981:00000018244448584442424E70404000 10982:000000001080114009400FE002500248014800C800C00140024006C000000000 @@ -58511,7 +58599,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 10C44:00000000001028440010284400000000 10C45:0000000000404040404C546444440000 10C46:0000000000444C546444040404040000 -10C47:00000000001418384482828282440000 +10C47:000000000044241C1038448282440000 10C48:000000000082C6AAAA92AAAAC6820000 10C80:000000020E32427E0202020202020000 10C81:000000020E3242320E02020202020000 @@ -58821,6 +58909,20 @@ FFFD:0000007E665A5A7A76767E76767E0000 10EC2:000000000000080402427C0010001000 10EC3:000000202020202C32227C0008000800 10EC4:000000020A120A2242423C0008000800 +10EC5:00000000000000001020407F00280000 +10EC6:00000000001000000808760000000000 +10EC7:000000000000000C5248443800280028 +10ED0:00000000001C22414141221C007F0000 +10ED1:21A8A7ABA02B6AA15F468000140A4D4AA5AAE5720A025020402649283ADE0C00 +10ED2:21A8A7ABA02B6AA15F468000140A4D4AA5AAE5720A021020002634A87D5E4600 +10ED3:21A8A7ABA02B6AA15F468000140A4D4AA5AAE5720A02501040125A543EAE0300 +10ED4:00001248324852483D880002312A49FC7900030A00002A86BC46912261FC0000 +10ED5:000010000C02152A39FCE1008200A400981402002A8CBC4A9026922263FC0000 +10ED6:400050004C02552A59FC310012000400181402002A8CBC4A9026922263FC0000 +10ED7:000021021902290A714AC5728440A44099940000504C012A512691227E7C0000 +10ED8:092419242924192406C4000009824555A4DBEF9000241081094109FE90406180 +10EFA:00000000000000000000000024241212 +10EFB:00000000000000000000001004122418 10EFC:00000000010608100000000000000000 10EFD:000000000000000000000000000000000000000000000000144000806C5593BE 10EFE:00000000000000000000000000000000000000000000000000CC052A1FC6E07C @@ -60801,6 +60903,14 @@ FFFD:0000007E665A5A7A76767E76767E0000 11B07:00000000000000001F0011001100110811081108109008600400020000000000 11B08:000000000000000020602090210821082108210812080C080004000200000000 11B09:000000000000000007E004200420042004200420024001800000000000000000 +11B60:0000010001000100000000000000000000000000000000000000000000000000 +11B61:0000000400040004001F00040004000000000000000000000000000000000000 +11B62:000000000000000000000000000000000000000000000000000010000C0C03F0 +11B63:0000000000000000000000000000000000000000000010000C0C23F0180C07F0 +11B64:0000030000800040000000000000000000000000000000000000000000000000 +11B65:0000003000080004001F00040004000000000000000000000000000000000000 +11B66:10000C0C03F00000000000000000000000000000000000000000000000000000 +11B67:00800041003E0000001F00040004000000000000000000000000000000000000 11BC0:00000000827E2222222222227E820000 11BC1:00000000384402020202122A443A0000 11BC2:00000000080808083E080808083E0000 @@ -61148,6 +61258,60 @@ FFFD:0000007E665A5A7A76767E76767E0000 11DA7:00000000000000000F800040002003A004600820082004400380000000000000 11DA8:00000000000000001FF006380148014806300C00120012000C00000000000000 11DA9:0000000000000000030004800700040003800040074008880770000000000000 +11DB0:0000000038242222227C202020200000 +11DB1:00000000315151310A0A0A0A04040000 +11DB2:000000003048080A3418244444380000 +11DB3:00000000304A0C081828484848300000 +11DB4:000000003C4242420202020202020000 +11DB5:000000007E1212121212121212120000 +11DB6:00000000244242424242424224180000 +11DB7:000000002649494741414141221C0000 +11DB8:000000003249497141414141221C0000 +11DB9:000000002255556341414141221C0000 +11DBA:00000000324949714141494949360000 +11DBB:000000001C2241414141714949320000 +11DBC:000000001C2241414141635555220000 +11DBD:0000000002110909090929594D320000 +11DBE:00000000022515131111315159260000 +11DBF:00000000225555654545454545390000 +11DC0:000000001C2645454F45454545260000 +11DC1:000000001C2645454F45655555260000 +11DC2:000000001C3251517951515151320000 +11DC3:000000001C3251517951535555320000 +11DC4:00000000225555352525252525190000 +11DC5:000000001C22415D4949515151220000 +11DC6:000000001C22415D4949535555220000 +11DC7:000000001C22414141414949592A0000 +11DC8:000000001C2241414141535555320000 +11DC9:00000000364949494141714949320000 +11DCA:00000000264949494949494949320000 +11DCB:000000004E5151515151535555220000 +11DCC:00000000224141414141494949360000 +11DCD:00000000264949474141494949360000 +11DCE:00000000394545454545655555220000 +11DCF:000000000408101C02020202423C0000 +11DD0:0000000008102225492911292A100000 +11DD1:000000004C5262626C424242524C0000 +11DD2:000000003E5151515651515155320000 +11DD3:000000000E1111111109394949320000 +11DD4:000000002245454549495D41221C0000 +11DD5:00000000405C626262424E52524C0000 +11DD6:00000000364949494141414141220000 +11DD7:000000004C52523C08040222221C0000 +11DD8:000000005255552E04020111110E0000 +11DD9:00000000001818000000001818000000 +11DDA:00000000080808080808080808080000 +11DDB:0000000065151D153555555555220000 +11DE0:00000000182424242424242424180000 +11DE1:00000000081808080808080808080000 +11DE2:00000000182424182020202424180000 +11DE3:00000000182424202020182424180000 +11DE4:00000000182424040404182424180000 +11DE5:00000000242A2A1C0808080A0A040000 +11DE6:00000000182420281414282024180000 +11DE7:00000000182020202020382424180000 +11DE8:000000001804040404041C2424180000 +11DE9:00000000182424382020202020180000 11EE0:00000000000000000000000003800640046004C00E9019301060000000000000 11EE1:00000000000000000000000006C00D6019300000038006400C20000000000000 11EE2:0000000000000000000000000000000007000C801AB0026001C0000000000000 @@ -61420,6 +61584,35 @@ FFFD:0000007E665A5A7A76767E76767E0000 13436:AAAA0001800000018180018181800FF18FF00181818001818000000180005555 13437:AAAA000180400081808001018100010181000101810000818080004180005555 13438:AAAA000182000101810000818080008180800081808001018100020180005555 +13439:AAAA000180003FFDBFFC300DB3CC33CDB3CC33CDB00C3FFDBFFC000180005555 +1343A:AAAA0001800033CDB3CC33CDB3CC300DB00C3FFDBFFC3FFDBFFC000180005555 +1343B:AAAA000180003FFDBFFC3FFDBFFC300DB00C33CDB3CC33CDB3CC000180005555 +1343C:AAAA00019FF8100190001021901013F9901010219000100190001FF980005555 +1343D:AAAA00019FF800098008040988081FC9880804098008000980081FF980005555 +1343E:AAAA06619FF8100190001021901013F9901010219000100190001FF986605555 +1343F:AAAA06619FF800098008040988081FC9880804098008000980081FF986605555 +13440:AAAA0001800000018000042188101FF988100421800000018000000180005555 +13441:AAAA00018000000180003E79A0442045BC782045A04420798000000180005555 +13442:AAAA00018000000180002279A2442245BE782245A24422798000000180005555 +13443:000000003FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC00000000 +13444:00000000000000000FF00FF00FF00FF00FF00FF00FF00FF00000000000000000 +13445:00000FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00000 +13446:00000000000000007FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE0000000000000000 +13447:AAAA0001BF003F01BF003F01BF003F0180000001800000018000000180005555 +13448:AAAA0001800000018000000180000001BF003F01BF003F01BF003F0180005555 +13449:AAAA0001BF003F01BF003F01BF003F01BF003F01BF003F01BF003F0180005555 +1344A:AAAA000180FC00FD80FC00FD80FC00FD80000001800000018000000180005555 +1344B:AAAA0001BFFC3FFDBFFC3FFDBFFC3FFD80000001800000018000000180005555 +1344C:AAAA000180FC00FD80FC00FD80FC00FDBF003F01BF003F01BF003F0180005555 +1344D:AAAA0001BFFC3FFDBFFC3FFDBFFC3FFDBF003F01BF003F01BF003F0180005555 +1344E:AAAA000180000001800000018000000180FC00FD80FC00FD80FC00FD80005555 +1344F:AAAA0001BF003F01BF003F01BF003F0180FC00FD80FC00FD80FC00FD80005555 +13450:AAAA0001800000018000000180000001BFFC3FFDBFFC3FFDBFFC3FFD80005555 +13451:AAAA0001BF003F01BF003F01BF003F01BFFC3FFDBFFC3FFDBFFC3FFD80005555 +13452:AAAA000180FC00FD80FC00FD80FC00FD80FC00FD80FC00FD80FC00FD80005555 +13453:AAAA0001BFFC3FFDBFFC3FFDBFFC3FFD80FC00FD80FC00FD80FC00FD80005555 +13454:AAAA000180FC00FD80FC00FD80FC00FDBFFC3FFDBFFC3FFDBFFC3FFD80005555 +13455:AAAA0001BFFC3FFDBFFC3FFDBFFC3FFDBFFC3FFDBFFC3FFDBFFC3FFD80005555 16100:00000000000000000000FFFF00100F9000702050205010900F10000000000000 16101:00000000000000000000FFFF010001000FE01110111011100E10000000000000 16102:00000000000000000000FFFF021002100F901250125012500C50000000000000 @@ -61922,6 +62115,56 @@ FFFD:0000007E665A5A7A76767E76767E0000 16E98:00000000000000000000000000482412 16E99:00000000000000000000000022102528452845284528452842103DEC00000000 16E9A:0000000000000000404040407C003030 +16EA0:0000000000007C442828101028284444 +16EA1:0000000000009292927C442828101010 +16EA2:0000000000003E22220202020242423C +16EA3:0000000000003C42404040403808081C +16EA4:0000000000003E42828292928282423E +16EA5:00000000000038444444442810385410 +16EA6:0000000000007E424242424242424242 +16EA7:000000000000488888889868081C083E +16EA8:00000000000046A4A4A4A4A46424548C +16EA9:0000000000003810101C02020202423C +16EAA:0000000000003810101010101010107C +16EAB:00000000000006081028242240404040 +16EAC:0000000000007C101010107C9292927C +16EAD:000000000000784444487C424242041E +16EAE:0000000000001C101028282844444466 +16EAF:000000000000083E0814141422222266 +16EB0:0000000000009292927C44282810107C +16EB1:000000000000109292FE10101010107C +16EB2:000000000000109292FE1010101010E0 +16EB3:0000000000003E08083E080808080870 +16EB4:0000000000003E08083E08083E080870 +16EB5:0000000000002222141408081010203E +16EB6:000000000000E02020203C222222223C +16EB7:0000000000009292925454543838107C +16EB8:0000000000001C2222143E081422221C +16EBB:0000000000003E221408081422220000 +16EBC:0000000000001E0202023E4242420000 +16EBD:0000000000007E4242020202027C0000 +16EBE:0000000000003C4240403C08103C0000 +16EBF:0000000000007C0202020202027C0000 +16EC0:0000000000001C222214081C2A080000 +16EC1:0000000000007E424242424242420000 +16EC2:00000000000010101028262048800000 +16EC3:00000000000044AAAAAAAA44AA100000 +16EC4:000000000000081038040242423C0000 +16EC5:000000000000080808080808083E0000 +16EC6:00000000000006081028244040400000 +16EC7:0000000000007C10107C9292927C0000 +16EC8:000000000000784444784442525C0000 +16EC9:0000000000007840407C4242525C0000 +16ECA:00000000000008081414142222660000 +16ECB:00000000000078080878888888FE0000 +16ECC:00000000000092929292929292FE0000 +16ECD:000000000000929292FE101010E00000 +16ECE:0000000000003E08083E080808700000 +16ECF:0000000000003E08083E083E08700000 +16ED0:000000000000222214140808101E0000 +16ED1:000000000000E020203C2222223C0000 +16ED2:00000000000010D63810102828C60000 +16ED3:000000000000182424781E2424180000 16F00:00000000000000000200020002000200020002000200020002007E0000000000 16F01:000000000000000002000200020006000A000A000600020002007E0000000000 16F02:00000000000000000800080008000800080008000800080008007E0000000000 @@ -62078,6 +62321,267 @@ FFFD:0000007E665A5A7A76767E76767E0000 16FE4:AAAA0001800049CFD210618DD0424B9D800003C1820043818200020180005555 16FF0:002000200020003E004200540090011000100010001000100010001000100010 16FF1:0000000000020002000400040008000800100008000800040004000200020000 +16FF2:0000000000000000000000000880088008800880088008801080109020904070 +16FF3:00000000000000000000040039E020203DE0202020203FE00880088010906070 +16FF4:000000000820082008200820082008200820082008200820FFFE000000000000 +16FF5:000000001110111011101110111011101110111011101110FFFE000000000000 +16FF6:00000000004000401080090005000200030004C008601020FFFE000000000000 +18800:0000000000FE7F00000000000000000000000000000000000000000000000000 +18801:00010101010101010101010101010100 +18802:0000000000000000000000100020004001800600180000000000000000000000 +18803:000001C006400040004000400040004000400040004000800080008001000000 +18804:0000000001C0064000800080010002C007400040008000800100060000000000 +18805:000001C006400080010002C007400080010002C0074000400080010006000000 +18806:0000040004000400040004000400040004000400040004400440046003C00000 +18807:0000200020002000200020002000200020002000200020082008200C1FF80000 +18808:0000000000400080010002000400040002400240028001800100010000000000 +18809:0000000000400080010002000400020002000100010000800080004000000000 +1880A:0000000000F81F00000000FC3F00000000000000000000000000000000000000 +1880B:000000FC3F000000100010001000100010001000100010001000200020000000 +1880C:000000C007000000010001000100010001000100010001000100010001000000 +1880D:000000FE7F000008000800080008000800080008000800080008000800080000 +1880E:0000010001000100010001E00F00010001000100010001000100010001000000 +1880F:000000C007000000038000800080008000800080008000800080008000800000 +18810:0000024002400240024002400240024002400240024002400240044004400000 +18811:0000040004000400040004C00740044004400440044004400440044004400000 +18812:000001C006400440044004400440044004400440044004400440044004400000 +18813:000003000D000900090009000900090009000900090009200920093008E00000 +18814:000006003A002200220022002200220022002200220022082208220C21F80000 +18815:0000008000800100020005000100010001000100010001000100010001000000 +18816:0000010001000140018007000100010001000100010001000100010001000000 +18817:00000100010002800C60701C0000000000000000000000000000000000000000 +18818:0000000000000000000000000040044002800280010001800280024004400000 +18819:00000100010001FC3E0000000000000000000000000000000000000000000000 +1881A:0000000008100420004001800600180000000000000000000000000000000000 +1881B:000001F01E10002000FC3F000000000000000000000000000000000000000000 +1881C:000001C006400080010002000500010001000100010001000100010001000000 +1881D:000001C00680010002C007400080010006000100010001000100010001000000 +1881E:00000100010001C007400180030005C007400140018007000100010001000000 +1881F:000001C00680010006E00F4001800EE003400080016003A00040008003000000 +18820:000001C006400080010002C00740008001000640008003000140008000800000 +18821:000001C00640008000800100028007E001200120022002400440054008800000 +18822:0000040004000400040004400480050006000400040004400440046003C00000 +18823:0000004001800600024001800100000001C00640004000800080010006000000 +18824:0000004001800600024001800100000007C00080010006400280010001000000 +18825:0000004001800600024001800100004000800100060002400280010001000000 +18826:000001FC3E0000FE7F0000002000200020002000200020002000200020000000 +18827:000000C007000000000000C00700010001000100010001000100010001000000 +18828:000001C007000100010001C00700010001000100010001000100010001000000 +18829:000001000100010001C007000100010001C00700010001000100010001000000 +1882A:00000C007000000000000C00700010001000100010001004100410060FFC0000 +1882B:000000F81F00010001FC3E000000000000000000000000000000000000000000 +1882C:0000081008107FFE042004200000000000000000000000000000000000000000 +1882D:000000800080008000E00F800080028002800280028002800480048008800000 +1882E:000001C00600000001C006400440044004400440044004400440044004400000 +1882F:000000FE7F00000000F81F081008100810081008100810081008100810080000 +18830:000001C00E000180068004800480048004800480048004A004A004B004600000 +18831:000000400040004000781FC00040014006401840084008400540064004400000 +18832:000001000100010001C007000100010001400180030005000100010001000000 +18833:000001E00E0001C0064000800100028007E00120012002400240054008800000 +18834:000000C007000000040004000440048005000600040004400440046003C00000 +18835:000002000200020002C003000200020002C00300020002000200020002000000 +18836:0000040004E007000400040004C0074004400440044004400440044004400000 +18837:0000040004C00700040004000580068004800480048004A004A004B004600000 +18838:0000000000000000000000000000054005400540054005400540054001000000 +18839:000000C00740044004400440044004E00F400440044004400440044004400000 +1883A:000000C00740044004400440044004F01F400440044004480448044C04380000 +1883B:00000000000000000000000000C0074005400540054005400540054001000000 +1883C:000001000100010001C007400540054005400540054005400100010001000000 +1883D:0000010005000500050009E00F20012001200120012001200100010001000000 +1883E:000003000D000900092009200940098009000900090009200920093008E00000 +1883F:000000000000000000E00720042005A004A004A004A004A004A004A004A00000 +18840:0000004000800140024005400140014001400140014001400140024002400000 +18841:0000008000800100020004800100020005000100010001000100010001000000 +18842:000000400040008001000200044000800100022004400080010002000C000000 +18843:00000020004000800100020004200A2001400140008001400140022004200000 +18844:00000400040008000800100012002A00040004000A00090010801060201C0000 +18845:0000000000800100064001800660381C00000000000000000000000000000000 +18846:00000040008003000C0004000440048005000600040004400440046003C00000 +18847:0000010001000280044008201010002000200020002000200020002000200000 +18848:00000100010001F01E0000000800080008000800080008000800100010000000 +18849:00000100010001C0060001000100010001000100010001000100010001000000 +1884A:0000042002401FF8000000000000000000000000000000000000000000000000 +1884B:0000044002400080010006000100010001000100010001000100010001000000 +1884C:00000000010009200540018003000D0001000100000000000000000000000000 +1884D:0000000022081130000000000000000000000000000000000000000000000000 +1884E:000001F00E2000E00F0000FE7F00000000000000000000000000000000000000 +1884F:000003800C800080008000E00780008000E00780008000800080008000800000 +18850:000003E41C4801D01E2000400180060038000000000000000000000000000000 +18851:000001E00E20004001C00E0001E006400080016007A000400080010006000000 +18852:000000E00720004000C0070000E0074000800100022001400140008000800000 +18853:00000100010001F81F6003800DFE7F0000000000000000000000000000000000 +18854:000001C006400080014002400540014001400140014001400140024002400000 +18855:00000100010001C0074001800340058003000D00010001000100010001000000 +18856:000000E00720004000800100022004200A400140008000C00140012002200000 +18857:000001C00680010002C00740008003000C000100010007C00100010001000000 +18858:000001C00680010002C00740008003000C800280028002800280048004800000 +18859:000003800C8001000100020005000FC002400250045004A008A00A8011000000 +1885A:000001F81E6003880D7C3F840100010001000100010001000100010001000000 +1885B:000001F81E6003880CFC3F840000000000000000000000000000000000000000 +1885C:000000400440044008781FC00040014006401840084008400540064004400000 +1885D:0000008001000200051008F81F08000000000000000000000000000000000000 +1885E:000004000400048004400400048005000E000400040004400440046003C00000 +1885F:00000C3C31C414080810086001801E0000000400040004000400040004000000 +18860:000001C006000100010001C00700010001C00700010001000100010001000000 +18861:00000100010001C00700010001C00700010001E00F0001000100010001000000 +18862:000000C00300000000E007400240024002400240024002400240044004400000 +18863:00001FF808203FFC042000000000000000000000000000000000000000000000 +18864:000001C0060001C0060001C00640044004400440044004400440044004400000 +18865:000001C00E0001C00E0001800680048004800480048004A004A004B004600000 +18866:000001C00E0001C00E0001C00E800100028007E0012002200440094000800000 +18867:000001C00600000001C00E000400044004800500060004400440046003C00000 +18868:000000C00700040004C00F000400044004800500060004400440046003C00000 +18869:00001110111011FC7F1009200920092000000000000000000000000000000000 +1886A:0000000000000000000000000000000000000000111011FC7F10092009200000 +1886B:000000E0070000C003400240024002E007400240024002400240024002400000 +1886C:000001C00E00018006800480048005C00E800480048004A004A004B004600000 +1886D:000001C00E0001800690049004A004C004800480048004A004A004B004600000 +1886E:000000E00700000000E00720042005A004A004A004A004A004A004A004A00000 +1886F:000000E007000400040004E00720062005400540048004C00540052002200000 +18870:000000E007000080008001000220042002400140008000C00140012002200000 +18871:000000E00700000000E007200040008001200220054000800140022004200000 +18872:000001E00E0001C0064000800100028007E00128012802500250054008800000 +18873:000001F81E0001F81E6003880CFC3F0400000000000000000000000000000000 +18874:00000200020002E00F00022002100240028003000E0002200220023001E00000 +18875:0000040004E0070004E0070004C0074004400440044004400440044004400000 +18876:00000480048004E00700040004C0074004400440044004400440044004400000 +18877:0000040004E00700040004C007400440044004F01F4004400440044004400000 +18878:000001000160058005000500056005A005200520052005200520092009200000 +18879:000000C007400440044004C007400440044004C0074004400440044004400000 +1887A:0000018006800480048005800680048004800580068004A004A004B004600000 +1887B:000000E003200220022002E00F200220022002E00F2002200220022002200000 +1887C:0000018006800480048005800E800480048005800E8004900490049804700000 +1887D:000001800E800880088009E00E800880088009E00E8008800880088008800000 +1887E:000001800E800880088009E00E800880088009E00E8008900890089808700000 +1887F:000001C006400440044005E00E400440044005E00E4004400440044004400000 +18880:0000018006800480048005C00E800480048005C00E8004900490049804700000 +18881:0000018006800480048005C00E80048004800580068004900490049804700000 +18882:0000000000F00F1008500850089009100A1008500890010002000C0000000000 +18883:000004000400047007901C2004500490052004A00440046004A0049005100000 +18884:0000004001800700010001C00700010001C00700010001000100010001000000 +18885:000001000100010001E00F00010001E00100010001E001000100010001000000 +18886:000000200040008003000CC007400440044004F01F4004400440044004400000 +18887:000000200040008003000C0001800680048005E01E8004A004A004B004600000 +18888:0000008000800100020004800140024005400140014001400140014001400000 +18889:000000A000A00120022004A00120022005200120012001200120012001200000 +1888A:000000400080012006400180066003A002200220022002200220022002200000 +1888B:0000004000800100020004400080010002000440004000800180024004400000 +1888C:0000004000400080010002400440008001200220054000800140022004200000 +1888D:00000200020004000800120022000400090011002A0004000B0010E0201C0000 +1888E:00000080014006801920064019800660181C0000000000000000000000000000 +1888F:0000024002400480048009000100024002400480028001000280044008200000 +18890:00000100020004400280010006C0183001000100010001000100010001000000 +18891:000000900090011001100250025004900A900110011002900290045008500000 +18892:0000004000400080010002400420020001400140008001400140022004200000 +18893:000000800100064001800660181801C00680010002C007400080010006000000 +18894:00000100020004400280010006C0183000800100060002400280010001000000 +18895:0000004001800E000480044004000480050006000C0004400440046003C00000 +18896:000004000800100064002200200024002800300060002004200420061FFC0000 +18897:00000100010002800C60701C0000101010101010101010101010101010100000 +18898:0000010001000100010003800000000003800100010001000100010001000000 +18899:00000100010001E00E0000C00700000007000100010001000100010001000000 +1889A:00000100010001E00E00000001C0064004400440044004400440044004400000 +1889B:0000080008000E00700000000C00340024002400240024042404240623FC0000 +1889C:00000100010001E00E0001C00680010003800080010006400280010001000000 +1889D:00000100010001E00E0001C00E800100028007E0012002200440094000800000 +1889E:00000100010001E00E0004000440048005000600040004400440046003C00000 +1889F:00000100010001E00E4001800600024001800100000007C00080010006000000 +188A0:00000420024000FE7F0000002000200020002000200020002000200020000000 +188A1:000000400440028001E00E000100010001000100010001000100010001000000 +188A2:000001200920054001E00F000100010001000100010001000100010001000000 +188A3:000001000910052001C00F0001FC3F0000000000000000000000000000000000 +188A4:0000044002400080014002400540014001400140014001400140024002400000 +188A5:0000044002400080010006C00340024002400240024002400240024002400000 +188A6:000044002400080010006C003400240024002400240024042404240623FC0000 +188A7:0000010009200540018003000D6001A001200120012001200120012001000000 +188A8:0000010009200540018003000D00010003000500190009000B00050005000000 +188A9:0000010009200540018003400D200140018003000D0001000100010001000000 +188AA:00000420024000800100020004200A2001400140008001400140022004200000 +188AB:00000420024001F00E2000FC3F00000000000000000000000000000000000000 +188AC:000000400440028001C0064000800100028007E0012001200240054008800000 +188AD:000004200240008003000DC000800100028007E000A001200240054008800000 +188AE:000003880C9003A01C4000FE7F0002000C007000000000000000000000000000 +188AF:00000100010001C00740014001E00F000140018003000D000100010001000000 +188B0:000001C0064000800780000001C0064004400440044004400440044004400000 +188B1:000003800C8001000F00000003000D0009000900090009400940096008C00000 +188B2:00000E00320004003C0000000C00340024002400240024042404240623FC0000 +188B3:000001C006400080008001E00E00004004400280010002800280044008400000 +188B4:000001F81E08001000F81F0000F81F0800107FFE000000000000000000000000 +188B5:000000E00720004007C0000007C00080014003E000A001200240054008800000 +188B6:000001C00E40008001800E000400044004800500060004400440046003C00000 +188B7:000001E00E40008001000600190001E00F00010001E00F000100010001000000 +188B8:000007E0085008903FFC04200420000000000000000000000000000000000000 +188B9:000001C006400080014002400540014001E00740014001400140024002400000 +188BA:00000100010001E0072001400180073001C00100013001C00100010001000000 +188BB:00000240024002F81F6003C00EFE7F0000000000000000000000000000000000 +188BC:000000E00320004000A0012006A000A002A002A002A002A002A004A004A00000 +188BD:000003A00CA0012002A004A00AA002A002A002A002A002A002A004A004A00000 +188BE:000001C006400080010002000C0000C00740044004E00F400440044004400000 +188BF:00000100010001E00F200140018003000D6003A0052019200B20052005200000 +188C0:000001C006400080010002400440008001200220054000800140022004200000 +188C1:000001C00680010002C0074000800100060001000380010007C0010001000000 +188C2:000001C00680010002C007400080014006400140054005400540054009400000 +188C3:000001C00E800100028007E0012002400D40008001C006400440044004400000 +188C4:000001C0064000800110031000A002C00AA004A00A9000900080028001000000 +188C5:0000010001E00F400180030005E00F00016003A0052019200B20052005200000 +188C6:000001F01E60018003100DF81F08010005000900310011001500090009000000 +188C7:000000800280048008F00F8000B000D002900490189008900A90049004900000 +188C8:00000400040004C00700040004C00700040004C0070004200420043003E00000 +188C9:0000200020002600380020002600380020002600380020082008200C1FF80000 +188CA:000001000100013005C00900316011A011201520092009200920012001200000 +188CB:000004400880311014A0084009B0060C38000000000000000000000000000000 +188CC:000001000100010001E00F0001E00F0001E00F0001E00F000100010001000000 +188CD:00003FF8000011107FFC09200920000000000000000000000000000000000000 +188CE:000000C0070000C0070000C007400440044004E00F4004400440044004400000 +188CF:000000C00700010001C0070001C0074005400540054005400540054001000000 +188D0:00000100010001C0070001C0070001C007400540054005400540054001000000 +188D1:000000C00700000000E00F000080010002400440028001000280044008400000 +188D2:000000C00700020002E00F00022002100240028003000E200220023001E00000 +188D3:0000020002C00700020002E00F0002400220028003000E200220023001E00000 +188D4:0000008000C00380008000800380008003800080038000800080008000800000 +188D5:000000E00F000000080008600B800880088008E00B8008800880088008800000 +188D6:000000E00F000080088008E00B80088008E00B80088008800880088008800000 +188D7:000000000000000000000000000000000000000011107FFC092000001FF00000 +188D8:00001290129012FC7F900AA00AA00AA000000000000000000000000000000000 +188D9:000000F00F000020082008400840089009100AA008A0084008A009100A100000 +188DA:000001E00E00000000C00740044004C00740044004C007400440044004400000 +188DB:00000F007000000006003A00220026003A00220026003A042204220621FC0000 +188DC:000001E00E00000001C00640044005C00E40044005C00E400440044004400000 +188DD:000001E00E00000000C00740044004F00740044004F007400440044004400000 +188DE:000001E00E0001800680048005C00680048005C0068004A004A004B004600000 +188DF:000001E00E00000000C00740044004E00F40044004E00F400440044004400000 +188E0:000001E00E00000000C00740044004E00F40044004C007400440044004400000 +188E1:000001E00E0001800680048005C00E8004800580068004A004A004B004600000 +188E2:00000E003000000006003A00220027007A00220026003A042204220621FC0000 +188E3:000000F0070000000470059004200440048005F0041004A0044004A005100000 +188E4:0000007007800040014001400280048001200220014000800140022004200000 +188E5:000000F00F000090009001100110025004500A90029001100290045008500000 +188E6:000000E007000100020004400280010006C01930010001000100010001000000 +188E7:000000E00700010006400180066019D80680010002C007400080010006000000 +188E8:000000E0070000400440028001C00E800100028007E0012002400D4000800000 +188E9:000000E00700000000E00720004007C0000001C0064004400440044004400000 +188EA:000001C0060001C0064000800100068000E00380008000E00380008000800000 +188EB:000000E0030000E00320004000A0012006A002A002A002A002A004A004A00000 +188EC:000000E0070000E0074000800100064000800100022005400080014006200000 +188ED:000001C0060001C00E80010002400C200480050006000C400440046003C00000 +188EE:000001C00E00040004C0070004C00700040004C0070004400440046003C00000 +188EF:000000F00F0000200020024004401890091008A00AA0044004A0049001100000 +188F0:000008E00B00080008600B800880088008E00B80088008800880088008800000 +188F1:000008E00B000880088008E00B80088008E00B80088008800880088008800000 +188F2:000004400440047005C00440047005C00440047005C004400440084008400000 +188F3:0000040004E0070004E0070004C007400440044004F01F400440044004400000 +188F4:0000080009C00E00080009800E80088009E00E8009E00E800880088008800000 +188F5:0000080009C00E00080009800E8009E00E8009E00E8008A008A008B008600000 +188F6:0000040004E00700040004C00740044004F01F4004F01F400440044004400000 +188F7:0000040004E00700040004C0074004F01F4004F01F4004500450045804300000 +188F8:00000180068004B004C0048004B004C0048004B004C004900490049804700000 +188F9:000000C00740044004E0074004E00740044004E0074004400440044004400000 +188FA:000001800E80088009C01E8009800E80088009800E8008900890089808700000 +188FB:000003000D00090009200B200D40098009000B000D0009200920093008E00000 +188FC:000003000D00090009200B200D40098009400B200D0009200920093008E00000 +188FD:000001E00E2008A008A0092009200A200A600C600AA009200280044008200000 +188FE:0000004001800700010001C0070001C00700010001E00F000100010001000000 +188FF:00000040018006400240024002F00F40024002F00F4002400240044004400000 18B00:0000000000000000018000400000000003000080004000000000000000000000 18B01:000000000000000000000000000010F80F080000000000000000000000000000 18B02:00000000000000F81F8000800080008000800080028001800080000000000000 @@ -62536,7 +63040,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 18CC7:0000000000000080028007F001C001C002A002A0049005900888000000000000 18CC8:000000000000028004F00F80008000E000100010001000A000C0000000000000 18CC9:000000000000028004F00F80008000E0001001D01E1000A000C0000000000000 -18CCA:0000000000000200020007E008400080008001C0012002100C10000000000000 +18CCA:0000000000000200020007E000400080008001C0012002100C10000000000000 18CCB:000000000000010001000100020003C000400040008002800300000000000000 18CCC:0000000000000000000002000200042004F00F10000000000000000000000000 18CCD:000000000000000000000200024004C00F800110027807880000000000000000 @@ -63655,6 +64159,9 @@ FFFD:0000007E665A5A7A76767E76767E0000 1CCF7:000000FF81FD050A0A0A141414141C00 1CCF8:0000003C42BDA5BD42BDA5A5BD423C00 1CCF9:0000003C42BDA5BD413D05057A447800 +1CCFA:000000000070F0142A2A2A2A2A110000 +1CCFB:00000000003C4242FFFF3C4200000000 +1CCFC:00000000000018242424244266180000 1CD00:00000000F0F0F0F00000000000000000 1CD01:0F0F0F0FF0F0F0F00000000000000000 1CD02:FFFFFFFFF0F0F0F00000000000000000 @@ -64091,6 +64598,46 @@ FFFD:0000007E665A5A7A76767E76767E0000 1CEB1:000000001C22222214142222417F0000 1CEB2:000000001C3E3636363E5D556B1C0000 1CEB3:0000000000000000000000000080F0FE +1CEBA:00000000FE8282827C101010107C0000 +1CEBB:000000FE82AA82D682AA829292FE0000 +1CEBC:000000387CFEFE543818181818180000 +1CEBD:000000000006086CFEFEFEFE7C380000 +1CEBE:0000000006081010202070F8F8700000 +1CEBF:000000030408086CD6AAD6AA6C100000 +1CEC0:000000007FFC2008101010102008200810100FE0010001000FE0010001000000 +1CEC1:0000000007C0082010102008244822884FE442844444400440047FFC00000000 +1CEC2:00000000000000E0013032480A48063002000260028003003FE0020002000000 +1CEC3:00000000044002800FE002800440000000001FF02448492424481FF000000000 +1CEC4:00000000044002800FE002800440010002800440044004400280010002800440 +1CEC5:00000100028002803EF811100FE001000920054003801FF00380054009200100 +1CEC6:0000044002800FE002800440410422881C700820082008200440038001000100 +1CEC7:000011000A003F800A00110000000E0E111010A0708228444038200020001000 +1CEC8:00000540038001000380054000001C7022882108101008200440028001000000 +1CEC9:0000044002800FE002800440000000F0010802041C04200420043FFC00000000 +1CECA:0000000000C6002838104410422001C000005400380010003800540000000000 +1CECB:00000100010001000FE00100010001000920054003801FF00380054009200100 +1CECC:044002800FE00280044007C009201930254823883FF8238825481930092007C0 +1CECD:00000038004000800EE01110200845444384410443844544400431180EE00000 +1CECE:0000020007000A900230025002900310021006100A54123822FE423882540000 +1CECF:0000000000000240018007E02184524A4812442243C22004181807E000000000 +1CED0:000000007F004106429844404FEE444043984006400040004000400000000000 +1CEE0:00666600006666000066660000666600 +1CEE1:00666600006666000066660000181800 +1CEE2:00666600006666000018180000666600 +1CEE3:00666600006666000018180000181800 +1CEE4:00666600001818000066660000666600 +1CEE5:00666600001818000066660000181800 +1CEE6:00666600001818000018180000666600 +1CEE7:00666600001818000018180000181800 +1CEE8:00181800006666000066660000666600 +1CEE9:00181800006666000066660000181800 +1CEEA:00181800006666000018180000666600 +1CEEB:00181800006666000018180000181800 +1CEEC:00181800001818000066660000666600 +1CEED:00181800001818000066660000181800 +1CEEE:00181800001818000018180000666600 +1CEEF:00181800001818000018180000181800 +1CEF0:0000000000000000003844FE44380000 1CF00:780040004000400040000000A0004000A0000000000000000000000000000000 1CF01:480048007800480048000000A0004000A0000000000000000000000000000000 1CF02:9000900090009400F80010002000000000000000000000000000000000000000 @@ -64552,15 +65099,15 @@ FFFD:0000007E665A5A7A76767E76767E0000 1D11B:FFFF00000000FFFF00000000FFFF00000000FFFF00000000FFFF00000000FFFF 1D11C:0000FFFF92499249FFFF92499249FFFF92499249FFFF92499249FFFF00000000 1D11D:00001FF8124812481FF8124812481FF8124812481FF8124812481FF800000000 -1D11E:081414141408182E5555453E021A1A0C -1D11F:0814081408141408182E5555453E020C -1D120:08141408182E5555453E020C14081408 +1D11E:010002800280028002800100030005C00AA00AA008A007C00040034003400180 +1D11F:01000280010002800100028002800100030005C00AA00AA008A007C000400180 +1D120:0100028002800100030005C00AA00AA008A007C0004001800280010002800100 1D121:34E03530359835983418343034C0350034C03430341835983598353034E00000 1D122:000000000F8010E0206438703C701870006400C0008001000600180000000000 1D123:020005000200050002000F8010E0206438703C701870006400C0008003001C00 1D124:0F8010E0206438703C701870006400C000800100060019000280010002800100 -1D125:00242424242424242424242424240000 -1D126:003C24242424242424242424243C0000 +1D125:0000024002400240024002400240024002400240024002400240024000000000 +1D126:000003C00240024002400240024002400240024002400240024003C000000000 1D129:0000000000004001400140017FFF7FFF7FFF7FFF400140014001000000000000 1D12A:00000000000036360836360000000000 1D12B:00000000208020802080208020802EB833CC238C2288249028A030C000000000 @@ -64702,23 +65249,23 @@ FFFD:0000007E665A5A7A76767E76767E0000 1D1B3:00000000000003C0042008100FF0000000000000000000000000000000000000 1D1B4:00000000001C2A497F492A1C00000000 1D1B5:00000000000007C008201390254829282FE8292825481390082007C000000000 -1D1B6:000200020002000200020002000200028002FFFE80028002FFFE800200000000 +1D1B6:0002000200020002000200020002000240027FFE400240027FFE400200000000 1D1B7:0008000800080008000800080008000810081FF8100810081FF8100800000000 1D1B8:0000000000000000000000000000000010081FF8100810081FF8100800000000 -1D1B9:00000000000000000000000814080000 -1D1BA:0000000000000000000000081C080000 -1D1BB:00000000080808080808080814080000 -1D1BC:0000000008080808080808081C080000 -1D1BD:00000000080C0A0A0808080814080000 -1D1BE:00000000080C0A0A080808081C080000 -1D1BF:00000000080C0A0E0A0A080814080000 -1D1C0:00000000080C0A0E0A0A08081C080000 +1D1B9:00000000000000000000001028100000 +1D1BA:00000000000000000000001038100000 +1D1BB:00000000101010101010101028100000 +1D1BC:00000000101010101010101038100000 +1D1BD:00000000101814141010101028100000 +1D1BE:00000000101814141010101038100000 +1D1BF:000000001018141C1414101028100000 +1D1C0:000000001018141C1414101038100000 1D1C1:10101010101010101010101010101000 1D1C2:10101010101010101010000000000000 1D1C3:10101010100000000000000000000000 1D1C4:10101000000000000000000000000000 1D1C5:10101000000000000000000000000000 -1D1C6:1C101000000000000000000000000000 +1D1C6:38202000000000000000000000000000 1D1C7:00000000000007C008201010200820082108200820081010082007C000000000 1D1C8:00000000000007C008201010200820082008200820081010082007C000000000 1D1C9:00000100010007C009201110210821082108210821081110092007C001000100 @@ -64742,17 +65289,17 @@ FFFD:0000007E665A5A7A76767E76767E0000 1D1DB:000001C001C001C01D381D381D3805001D001D001D0001000100010000000000 1D1DC:0000000000000000101C181C1C1C1E04170413C411F4707C701C700400000000 1D1DD:00000000000000000000000000001C001C001C8005C01C901C381C1000000000 -1D1DE:00000000000000003C003C003C0004000400040004000E001F000E0004000000 -1D1DF:00001C0020004400440048002800280010001000280028002400240018000000 -1D1E0:0000080008007800780078000800080008007800780078000800080000000000 +1D1DE:000000003C3C3C040404040E1F0E0400 +1D1DF:001C2044444828281010282824241800 +1D1E0:0004043C3C3C0404043C3C3C04040000 1D1E1:000000000000500A500A5FFA5FFA500A500A500A5FFA5FFA500A500A00000000 -1D1E2:0000000000000000100038007C0038001000100038007C003800100000000000 -1D1E3:00000600060006003E003E003E00060006000600060006000600060000000000 -1D1E4:00003E003E003E00060006000600060006000600060006000600060000000000 -1D1E5:000006000600060006000600060006000600060006003E003E003E0000000000 -1D1E6:000000007000700070001E001E001E0006000600060006000600060000000000 -1D1E7:00006600660066006600360036001E000E00060006003E003E003E0000000000 -1D1E8:0000000000001000100020002000400040004400440044002400280010000000 +1D1E2:0000000010387C381010387C38100000 +1D1E3:000C0C0C7C7C7C0C0C0C0C0C0C0C0000 +1D1E4:007C7C7C0C0C0C0C0C0C0C0C0C0C0000 +1D1E5:000C0C0C0C0C0C0C0C0C0C7C7C7C0000 +1D1E6:00007070701E1E1E0606060606060000 +1D1E7:006666666636361E0E06063E3E3E0000 +1D1E8:00000010102020404044444424281000 1D1E9:0000000014741C1615161C7414000000 1D1EA:00000000605846586040404040000000 1D200:000000000000000000000000000011F012081C0800081C08120811F000000000 @@ -65921,8 +66468,8 @@ FFFD:0000007E665A5A7A76767E76767E0000 1D7C7:0000000000000000006000C003F006D806D806D80DB00DB00DB007E003000600 1D7C8:00000000000000000000000003E00630063006300FE00C000C00078000C00000 1D7C9:00000000000000000000000007F80330061806180DB00DB00DB007E000000000 -1D7CA:000000007F6360607C6C606060600000 -1D7CB:000000000000007C6660607860606060 +1D7CA:000000007F6060607E66666060600000 +1D7CB:0000000000007F6060607E6666606060 1D7CE:000000001C36636363636363361C0000 1D7CF:000000001838781818181818187E0000 1D7D0:000000003E6363030E183060607F0000 @@ -66885,65 +67432,65 @@ FFFD:0000007E665A5A7A76767E76767E0000 1E2AC:00000000000042427E42424200100804 1E2AD:00000000000008081414222200000000 1E2AE:08102000000000000000000000000000 -1E2C0:00000000000002000500050803F0041004100820104020802490186000000000 -1E2C1:00000000000002000500050803F00410059009A0104020802490186000000000 -1E2C2:000000000000007000880110012002400280030006000A40112020C000000000 -1E2C3:00000000000000F0010801600110029002600400040004002800100000000000 -1E2C4:000000000000030004A0052003C002000400040008000A000900060000000000 -1E2C5:000000000000010002800240020004000400040008C00920082007C000000000 -1E2C6:00000000000000C000A0010001000200020004C00520090008800FC000000000 -1E2C7:00000000000007C009201290129011101010101010101010082007C000000000 -1E2C8:000000000000040004000A000200010001000080008000500050002000000000 -1E2C9:000000000000010003800200040004000800080010001FF8000400F800000000 -1E2CA:000000000000008001400140024002800480048008980924110411F800000000 -1E2CB:00000000000002C00120007C0F80100012001500150011000A00040000000000 -1E2CC:000000000000019802A002A001C0008000800080008000802680198000000000 -1E2CD:000000000000010002800040002000101FFC0010002000400280010000000000 -1E2CE:000000000000024004A004A003C0008000800100010007100A90046000000000 -1E2CF:000000000000024004A004A003C0008000B00130010007100A90046000000000 -1E2D0:000000000080014000200FF00800080004000400040002000A00040000000000 -1E2D1:000000000080014000200FF00800080004C004C0040002000A00040000000000 -1E2D2:00000000000006C0092011101110210821082008200820081010082000000000 -1E2D3:000000000000016002500250029001E00080010001000A0012000C0000000000 -1E2D4:00000000000007C008200820082008200820082008200A280A28041000000000 -1E2D5:00000000000001C002200E201C20022002200420002000280028003000000000 -1E2D6:00000000000001C002200EA01CA0022002200420002000280028003000000000 -1E2D7:00000000000000F80108010800C80008000800080008000800E80F1800000000 -1E2D8:00000000000001E0061808200B40074000400080009000A80088007000000000 -1E2D9:00000000000000800080014001400120022C0210023014282428181800000000 -1E2DA:000000000000078008400B40074000400F4010C0104000480048003000000000 -1E2DB:000000000000078008400B400740004000400040004040F04748383000000000 -1E2DC:0000000000000FF810100E10002000200040004000800080011000E000000000 -1E2DD:00000000000000F001080100011800A4007800200040008011000E0000000000 -1E2DE:0000000000001800240004000430024802440144013401040084007800000000 -1E2DF:000000000000018602480248024804900490049009200920292010C000000000 -1E2E0:00000000000008001400120003E00110011000E0018002500450032000000000 -1E2E1:00000000000001F00210021001900010019001900010001001D01E3000000000 -1E2E2:000000000000003803D00C2001E006500888070800080388041003E000000000 -1E2E3:00000000000001F00200040004000400040004E005100610061019E000000000 -1E2E4:00000000000001F00200040004C004C0040004E005100610061019E000000000 -1E2E5:00000000000003C004200910089004900310001000100010082007C000000000 -1E2E6:0000000000000C0012001200010001000480068005C0044012280E3000000000 -1E2E7:000000000000078008400B4007400040004003F8044004400240018000000000 -1E2E8:00000000000000703C8023800170010C027003801C0024002800180000000000 -1E2E9:00000000000010702088189007E000800080008000BC00A20084007800000000 -1E2EA:0000000000000C0012001260026001000118012400B400840048003000000000 -1E2EB:0000000000000020005000500088008801240124021812002400180000000000 -1E2EC:0180018000000000000000000000000000000000000000000000000000000000 -1E2ED:0660066000000000000000000000000000000000000000000000000000000000 -1E2EE:0040008000000000000000000000000000000000000000000000000000000000 -1E2EF:0130024000000000000000000000000000000000000000000000000000000000 -1E2F0:00000000000003C004200810081008100810081008100810042003C000000000 -1E2F1:0000000000000300048002800080008000800080008000A0009000E000000000 -1E2F2:00000000000003D00430081008100810043003D000100810042003C000000000 -1E2F3:0000000000000780084010200020002000200020002010240864079800000000 -1E2F4:000000000000003800C800100010002000200640084008800880070000000000 -1E2F5:00000000000000C000B0008000800080008003C004A008A008A004C000000000 -1E2F6:00000000000003C0002000200020002003C00200020002000200020000000000 -1E2F7:0000000000000E10021002200220024002400280028003000300020000000000 -1E2F8:000000000000004000A000A0008000801FF80880048002800180008000000000 -1E2F9:0000000000000300008001000118022007C008A001200120012000C000000000 -1E2FF:00000078008401000118012400C4007800803FFC010012002400180000000000 +1E2C0:000000006092927C2424484890900000 +1E2C1:000000006092927C2434784890900000 +1E2C2:0000000038489090A0A0ACC2C2BC0000 +1E2C3:000000000C12202652524C8080800000 +1E2C4:000000001824281E1020405048300000 +1E2C5:000000101020204040408C82827C0000 +1E2C6:0000000010102020404C529088FC0000 +1E2C7:0000003854AAAA928282828244380000 +1E2C8:0000000062A292947808040402020000 +1E2C9:000000000404080810102020407E0000 +1E2CA:000000001010303050505090929C0000 +1E2CB:000000009864020C3040809090600000 +1E2CC:0000000038484A3C08080808A8580000 +1E2CD:000000000020100804FE040810200000 +1E2CE:00000000040A4A3C08081070A8460000 +1E2CF:00000000040A4A3C080A1270A8460000 +1E2D0:000000003844027E2020201010100000 +1E2D1:000000003844027E2024241010100000 +1E2D2:000000006C9292929282828282440000 +1E2D3:000000008C8A92523C20404080800000 +1E2D4:000000003C4242424242424242420000 +1E2D5:000000001C2222620202020202020000 +1E2D6:000000001C222A6A0202020202020000 +1E2D7:000000003C424232020202024E320000 +1E2D8:000000003E44482808101412120C0000 +1E2D9:00000000081414142223264545420000 +1E2DA:000000003C42423202023A4606020000 +1E2DB:00000000708888680808080C9A640000 +1E2DC:000000007E02040408081010221C0000 +1E2DD:000000003C42404C523C101010600000 +1E2DE:00000000204C5252524A424224180000 +1E2DF:000000006292929292929292928C0000 +1E2E0:00000000784422221418284844440000 +1E2E1:000000003C424232021212024E320000 +1E2E2:000000000E72043448340202423C0000 +1E2E3:000000001E204040404C526222DC0000 +1E2E4:000000001E204848404C526222DC0000 +1E2E5:000000003C4242423202020244380000 +1E2E6:0000000062A292947808E49C46420000 +1E2E7:000000007088886808083E4848300000 +1E2E8:000000008848281018147EA0A0400000 +1E2E9:000000004C92927C10101412120C0000 +1E2EA:00000000409CA2AAAAA2928244380000 +1E2EB:000000000202040408789492A2620000 +1E2EC:00101000000000000000000000000000 +1E2ED:00242400000000000000000000000000 +1E2EE:00182000000000000000000000000000 +1E2EF:00264800000000000000000000000000 +1E2F0:00000000182442424242424224180000 +1E2F1:00000000182424040404040404040000 +1E2F2:00000000324A84844C34048448300000 +1E2F3:00000000304804040404040448360000 +1E2F4:00000000061A02040404284848300000 +1E2F5:0000000010101010107C9292521C0000 +1E2F6:000000003C420202023C202020200000 +1E2F7:00000000721212141414181818100000 +1E2F8:000000000808FE484828281818080000 +1E2F9:00000000300810207A040A12120C0000 +1E2FF:000000003C42404C523C107E10600000 1E4D0:000000003C4242021C020242423C0000 1E4D1:0000000022222222FEA2622202020000 1E4D2:000000003C4242424242424242420000 @@ -67030,6 +67577,61 @@ FFFD:0000007E665A5A7A76767E76767E0000 1E5F9:00000000000007F00820004001800200040008E0091008D0042003C000000000 1E5FA:00000000000003C00420081008100810043003D0001000200040018000000000 1E5FF:000000000000000003C0042004200420042003C0000000000000000000000000 +1E6C0:0000000000000000038004400400020002F00108010000800080030000000000 +1E6C1:0000000000000000038004400420020001C0020002000100008001C002000000 +1E6C2:00000000000000000F0010802080209020882088208420841044083800000000 +1E6C3:00000000000000001E0021002100109010880888084404442444183800000000 +1E6C4:000000000000000038E045104210221020102010101010081008600600000000 +1E6C5:00000000000000001C0023801060081004081804200418180400080000000000 +1E6C6:00000000000000003FF000080384044404240214020801000100060000000000 +1E6C7:00000000020001001D0023802170110812080810081030200020001800000000 +1E6C8:00000000000000003FF8204410440848387020501048084404440C7800000000 +1E6C9:000000000000000000E0011000201E4021E02098208410640818180000000000 +1E6CA:00000000000000003000480044003FE0020001003FF840444824301800000000 +1E6CB:000000000000000003C00C30100820002000203820C411040A1807E000000000 +1E6CC:00000000000000000F80107020082004203C1044108408840888307000000000 +1E6CD:000000E0001000100020004000201E1021101108108808840884307800000000 +1E6CE:0000000000000000004000200010200818040E04098404780400180000000000 +1E6CF:00001C0022002000200018000780007800041FC8203810240824301800000000 +1E6D0:0000000000001C002200200010000FE0001000081C0423842064101800000000 +1E6D1:00000000000020001C0003F0000800081E1021F0204810440824181800000000 +1E6D2:00000000000000001E0821C42038100010000BE00C1810041004200800000000 +1E6D3:000000000000000001F0000800041E04218820701F88000830300FC000000000 +1E6D4:0000000000000030000803D0042003F0000803C8042803F010080FF000000000 +1E6D5:00000000000000000000010C1A1027081CD004201CD027081A10010C00000000 +1E6D6:000000001C002200200010780F8400041C382210110808840884307800000000 +1E6D7:000000000000000003C00420042002000100008000400020012000C000000000 +1E6D8:00000000000000000780086008100408440842102210211211120E0C00000000 +1E6D9:00000000000000001E0021C02020101010100820082004220422181C00000000 +1E6DA:00000000000000001C1C222222221A1006080388427042004400380000000000 +1E6DB:00000000000000001E0021802040104808443C84208410840884307800000000 +1E6DC:0000000000000000040002000100010000800080004000400440038000000000 +1E6DD:00000000000000001E0021002100200017801848108408840878300000000000 +1E6DE:00000000000007C0082006000100078008000F00108008400448183000000000 +1E6E0:00000000000000000FE010102008200820081008101010100810302000000000 +1E6E1:00000000000007000880080004000FE011101088087004000200060000000000 +1E6E2:0000000001000080004000400040002000200020004001800000000000000000 +1E6E3:0000001000080004000400180000000000000000000000000000000000000000 +1E6E4:00000000000000000E000180004000400080010000800040062001C000000000 +1E6E5:0000000000000000104008200410041002080208020802080410186000000000 +1E6E6:0000007C00820000000000000000000000000000000000000000000000000000 +1E6E7:0000020001000080038004000300008001000200030000800040038000000000 +1E6E8:000000000000000000001020101010081008080408040404020401F800000000 +1E6E9:000000000000000000000100008000801E4001F0004C00800080010000000000 +1E6EA:000000000000000002000100010000800080004000400420022001C000000000 +1E6EB:00000000000000000F8010401000080004001F0020C020200820301C00000000 +1E6EC:000000000000000007C01820241020102008200810081008081007E000000000 +1E6ED:000000000000000000780084008400400040182008200410021001E000000000 +1E6EE:000000080008003E000800080000000000000000000000000000000000000000 +1E6EF:000C0010000C0010000E00040002000000000000000000000000000000000000 +1E6F0:0000000000000C0012000838044403F8004007F8084408380400180000000000 +1E6F1:00000000000000000F0410C4103810000800040007E00810081007E000000000 +1E6F2:00000000000000001E1821202120102017FC0822041004101810006000000000 +1E6F3:0000000000000000010002001FF022082FC4312421241FC40108060000000000 +1E6F4:000000001C0020C021001F800170010801081D08238821701200300000000000 +1E6F5:000007C008380806000000000000000000000000000000000000000000000000 +1E6FE:000000000000000007C00820139014501450145014501390082007C000000000 +1E6FF:0000000000001C1823842048103008480448388820881110091030E000000000 1E7E0:0000000018300FE001800180018007E00DB00DB0199819981998199800000000 1E7E1:0000000030601FC00600060006001F8036C036C0667E66666660666000000000 1E7E2:0000000030601FC00600060006001F8036C036C0666066606666667E00000000 @@ -67271,40 +67873,40 @@ FFFD:0000007E665A5A7A76767E76767E0000 1E8D4:0000000000000000000000000000000000000000055005500000008004800300 1E8D5:00000000000000000000000000000000000000000AA80AA80000008004800300 1E8D6:0000000000000000000000000000000000000000155415540000008004800300 -1E900:00000000404040425C44444444380000 +1E900:000000007C4040584E44444444380000 1E901:000000004242424242320E02027E0000 1E902:0000000062929292961A121212F20000 -1E903:000000007A8682929272121212F20000 +1E903:000000003C42424220180402027E0000 1E904:000000009C929292D2BC9090909E0000 -1E905:000000004949494949494B35017F0000 +1E905:000000009E82929292929292926C0000 1E906:000000007C42424242424244447E0000 -1E907:000000007E8082824222160A0AF20000 +1E907:000000003E4042423E222222224E0000 1E908:000000004242424242645840407E0000 1E909:000000003E41414142444A51615E0000 1E90A:000000007E4040405C62424242420202 -1E90B:000000004242424242424242423C0000 +1E90B:000000004262524242424242423C0000 1E90C:000000003C42424240404040207E0000 1E90D:000000004F41415D63414141231D0000 1E90E:000000001008043E40404040207E0000 1E90F:00000000FE84848484F4848484840000 1E910:000000003C4202023C4042424A320000 1E911:000000007E020212127E121212720000 -1E912:0000000062921212661A121212E20000 -1E913:00000000669292969A9292A2827C0000 -1E914:00000000609C92929292121212F40000 -1E915:000000004E4242423A464242423A0000 -1E916:000000004040403C02020202027C0000 -1E917:00000000729292927E12121212F20000 +1E912:00000000384404043804040404780000 +1E913:00000000724A46464A524242423C0000 +1E914:00000000609C92929292928282BE0000 +1E915:000000007E0202423A464242423A0000 +1E916:00000000027A040202020202027C0000 +1E917:00000000324A42423C404040403E0000 1E918:000000005E42424478040202027E0000 1E919:000000003C42402038444242423A0000 -1E91A:000000006C92929292929294909E0000 -1E91B:000000007C92123C50929292905E0000 +1E91A:000000006C92929292929290909E0000 +1E91B:00000000FC92123C50909090905E0000 1E91C:00000000FE848484849C848484840000 1E91D:00000000FE809090FC909090909E0000 -1E91E:00000000FC028282848890F0908E0000 -1E91F:00000000E29292929E929292829C0000 -1E920:000000001C224242524C4040407E0000 -1E921:000000009E82828292929E9292620000 +1E91E:000000007C0242427C44444444720000 +1E91F:00000000EC12929292F29090909E0000 +1E920:000000007C4242425A424244407E0000 +1E921:00000000FA82829292F29292928C0000 1E922:00000000000040404E44444444380000 1E923:000000000000024242320E02027E0000 1E924:0000000000003C4242424202027E0000 @@ -67316,29 +67918,29 @@ FFFD:0000007E665A5A7A76767E76767E0000 1E92A:000000000000404242426458407E0000 1E92B:0000000000003E4141424649715E0000 1E92C:0000000000007E40405C6242424C4040 -1E92D:000000000000424242424242423C0000 -1E92E:0000000000003C4242404040207E0000 -1E92F:00000000000002425A664242261A0000 +1E92D:000000000000426252424242423C0000 +1E92E:0000000000001C224242424222720202 +1E92F:000000000000027A46424242265A0000 1E930:000000000000027C10202020201E0000 1E931:0000000000003A46427A424242420000 1E932:0000000000007C02021C2040403E0000 -1E933:000000000000007E02123E1212720000 +1E933:0000000000007E0212123E1212720000 1E934:0000000000003C42023C0202027C0000 -1E935:0000000000006292969A9292A27C0000 +1E935:000000000000724A46464A42423C0000 1E936:000000000000304E4949494949490101 -1E937:0000000000003608142242423E040000 -1E938:00000000000010203C020202027C0000 -1E939:000000000000026292967A1212F20000 +1E937:00000000000036081422424232040000 +1E938:000000000000027A04020202027C0000 +1E939:000000000000324A423C4040403E0000 1E93A:000000000000404E423C0402027E0000 1E93B:0000000000003C4240304C42423A0000 -1E93C:0000000000006C9292929294909E8080 +1E93C:00000000000062969A92A2A0A09E0000 1E93D:0000000000003C52127C9090905E0000 -1E93E:0000000000003A4642424E4242420000 +1E93E:0000000000002C3222222E2222420202 1E93F:000000000000FE809090FC90909E0000 1E940:00000000000040300C42625C407E0000 1E941:00000000000036494949490808770000 1E942:0000000000005C624242524C407E0000 -1E943:000000000000008092929E9292620000 +1E943:000000000000F28292929292926C0000 1E944:7A0C0800000000000000000000000000 1E945:38403E00000000000000000000000000 1E946:7E000000000000000000000000000000 @@ -67348,12 +67950,12 @@ FFFD:0000007E665A5A7A76767E76767E0000 1E94A:18180000000000000000000000000000 1E94B:00000010101000000000000000000000 1E950:00000000182442424202020224180000 -1E951:00000000080808080808080808080000 +1E951:000000003C2020101010080808300000 1E952:00000000081018240404040404040000 1E953:00000000424242423C083040403E0000 1E954:000000001010121418204040403E0000 1E955:000000000814224122140911221C0000 -1E956:000000007C82021C6282929292620000 +1E956:000000007C02020C30484844443A0000 1E957:00000000384482824428102844820000 1E958:00000000824428102844828244380000 1E959:000000003C4242422C10204040200000 @@ -68891,14 +69493,14 @@ FFFD:0000007E665A5A7A76767E76767E0000 1F5FF:07800FE01860303035983DF8211C231C205C309C2F9C373C303C3038183807D8 1F600:000003E00C181004200226324631400140014FF92AAA26B213E40C1803E00000 1F601:000003E00C181004200226324949400140014FF92AAA26B213E40C1803E00000 -1F602:000003E00C1810042632294A4001500560034FF92AAA26B213E40C1803E00000 +1F602:000003E00C18100420022632594D680B48094FF93AAE26B213E40C1803E00000 1F603:000003E00C181004200226324631400140014FF9280A241213E40C1803E00000 1F604:000003E00C181004200226324949400140014FF9280A241213E40C1803E00000 -1F605:000003E00C981244200226324949400140014FF9280A241213E40C1803E00000 -1F606:000003E00C181004241222224411400140014FF9280A241213E40C1803E00000 -1F607:0FF8100423E22C1A1C1C23E22002463146314001280A241213E40C1803E00000 +1F605:000003E40C1A1009200926364949400140014FF9280A241213E40C1803E00000 +1F606:000003E00C18100420022C1A43614C1940014FF9280A241213E40C1803E00000 +1F607:07F0380E43E1380E27F226324949400140014001241223E210040C1803E00000 1F608:400263C66C36700E642622444662466240024812242423C410080C3003C00000 -1F609:000003E00C181004201226224611400140014FF9280A241213E40C1803E00000 +1F609:000003E00C181004200226324649400140014001241223E210040C1803E00000 1F60A:000003E00C181004200226324949400140014809241223E210040C1803E00000 1F60B:000003E00C181004200226324949400140014809241223E211240CD803E00000 1F60C:000003E00C1810042002294A4631400140014809241223E210040C1803E00000 @@ -69105,6 +69707,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 1F6D5:000001C001C001000380044004400820092013901390139013901FF000000000 1F6D6:0000000003C00DB01248252445224FF2300C11881248124812481FF800000000 1F6D7:000009002440020000001FC012401240125012401250124012401FC000000000 +1F6D8:00000000000000000130024818481C8C01146224F242F4426882110100000000 1F6DC:00003FFC400243C24C32500A43C244224812418242424002418240023FFC0000 1F6DD:00003F0078802C80344026402E20352025102C90348F24412C3E341224122010 1F6DE:1FF03FF87FFCF11EE10EF39EEC6EE44EE44EE44EEBAEF01E7FFC3FF81FF00000 @@ -69254,6 +69857,10 @@ FFFD:0000007E665A5A7A76767E76767E0000 1F774:0000000000000000000007C0082014501290111012901450082007C000000000 1F775:00000000000000000000001000200040008001000E001F001F000E0000000000 1F776:000000000000007000F800F800700080010002001C003E003E001C0000000000 +1F777:000000000000000000001C702288210801001FF01010101010101FF000000000 +1F778:000000000FE011102108711C2108010007C00100038004400440038000000000 +1F779:00000000004400281CFE22284144010002000C0011C022202420184000800000 +1F77A:000000000000600C9FF21550254845444544454445447FFC20081FF000000000 1F77B:000000000000018002400240018000003FFC081009900A501248118820040000 1F77C:000000000000000000003FF841049932A54A9932410401000100010000000000 1F77D:000000000000044004407FFE044004407FFE0040305C406241A23E1C00000000 @@ -69524,6 +70131,15 @@ FFFD:0000007E665A5A7A76767E76767E0000 1F8BB:000000000008044A5060780000000000 1F8C0:0404042444FC4424040404150E040000 1F8C1:20202024223F2224202020A870200000 +1F8D0:00000000000000040002FFFF00020004000020004000FFFF4000200000000000 +1F8D1:00000000000000000000000000040002FFFF0000FFFF40002000000000000000 +1F8D2:00000000000000000000000000040002FFFF00000FF004000200000000000000 +1F8D3:000000000000000000000000004000200FF00000FFFF40002000000000000000 +1F8D4:00000000000000000000000020004000FFFF00000FF000200040000000000000 +1F8D5:000000000000000000000000020004000FF00000FFFF00020004000000000000 +1F8D6:000000000000000000000000084004840302FFFF030204840840000000000000 +1F8D7:000000000000000000000000009001240242FFFF090212042400000000000000 +1F8D8:0000000000000000000020044002FFFF424224240420042003C0000000000000 1F900:000007C01FF03FF8638C6BACE10EF93EFFFEF93EE10E6BAC638C3FF81FF007C0 1F901:000007C01FF03FF8638C6BACE10EF93EFFFEF93EE10E638C638C3FF81FF007C0 1F902:000007C01FF03FF8638C638CE10EF93EFFFEF93EE10E638C638C3FF81FF007C0 @@ -69559,7 +70175,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 1F920:03600490080810041004FFFF2002463146314001241223E210040C1803E00000 1F921:000003E02C1A700776377637700761C341C14C192BEA2C1A13E40C1803E00000 1F922:000003E00C18100420022632463140014001422121C2222210040C1803E00000 -1F923:00000034522465744524422400000000FFFE854287C240042008183007C00000 +1F923:000003EC0C121122215C2192402A5C6A449A495253342CE44B88483037C00000 1F924:000003E00C181224241226324631400140014FF927F2202A102C0C1803E00000 1F925:000003E00C18100426322D6A49494631400140FD20FE200211C40C1803E00000 1F926:000000A80F54115621552D014D0141014082404423C423C410440FC400440000 @@ -69864,6 +70480,10 @@ FFFD:0000007E665A5A7A76767E76767E0000 1FA51:0000008009C81C9C08C823E277F72DFA1FF83FFC3E7C18FC01FC03FC00000000 1FA52:0000000000C003E007F00DF81FF83FFC3E7C18FC03FE03FE03FE037600000000 1FA53:0000000000C003E007F00DF81FF83FFC3E7C18FC01FC004003B8040400000000 +1FA54:000000000FE010102448228821082288244810100FE0101020083FF800000000 +1FA55:0000000007F018082004444440844884488458482430E410241027F020001800 +1FA56:000000000FE01FF03BB83D783EF83D783BB81FF00FE01FF03FF83FF800000000 +1FA57:0000000007F01FF83FFC7BBC7F7C777C777C67882FF0DBF023F023F020001800 1FA60:3FFC40029041BC41A5F9A549BD49A149BD49A549A559BC41A441800140023FFC 1FA61:3FFC400284418441884188419BF9A841884188418841884189F1800140023FFC 1FA62:3FFC400284F984899F8984F984898E8995F9A489848984F98489800140023FFC @@ -69901,6 +70521,8 @@ FFFD:0000007E665A5A7A76767E76767E0000 1FA87:0000000000F801FC39047DFCE704CEF8596032601F60036001E000C000600000 1FA88:0000000000380044008401040248041009201040248041007200740038000000 1FA89:000000003E006BC02AB02AAC2AAC2AA82AB02AE02BC02F007C00700000000000 +1FA8A:0000000000783DCC678C66AC635833B01EE004C00980130026001C0000000000 +1FA8E:00000000060009800C60031800C406340ECC3FFC2244224422443FFC00000000 1FA8F:0000000007C004400380010001000100010001000FE008200820044003800000 1FA90:000000000000000003C007E0EFF047F630070FFC000007C00380000000000000 1FA91:0000060C07FC060C060C07FC060C07FC0C1C183C3FFC3FEC3060306030600000 @@ -69957,6 +70579,8 @@ FFFD:0000007E665A5A7A76767E76767E0000 1FAC4:0000006000900108010801080090006001F003F807F80FF80FF807F803F80000 1FAC5:0000000001000AA0145011101FF00820129010101450139010100C6003800000 1FAC6:000000000000000007E01B982DEC511257CA6D667AB65B56565A5A6A00000000 +1FAC8:000003800480044003C007C01C603670249805C806E0067006201E4000000000 +1FACD:000000000000001000700FE01BF060787F8C004C003C003800F0002000200000 1FACE:00000000200C6C6C6C6C36D83EF807C008200AA008200AA00AA0044003800000 1FACF:000000000206030A02B601EC0638702081A0E020E01070180860058002000000 1FAD0:00000000030007800FC00FC00780030018003C307E787EFC3CFC187800300000 @@ -69973,7 +70597,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 1FADB:000000000000000000000000401E7FE649263E7C1FF800000000000000000000 1FADC:000000000A4006800380010007C038384004400430180E600180010002000000 1FADF:000021C0523021C000000CC0132011180824105C2040263019CC0012000C0000 -1FAE0:000003C00C3010082004266446624002420261C4200640018802961C61E00000 +1FAE0:000003E00C18100420022602463140314001640123C2C0018C39722701900070 1FAE1:000001F0064C1982E201459959996801480148F188018402030C00F000000000 1FAE2:000003E00C181004200226324631400140E12112231212140F18011000900090 1FAE3:00000760181820044E4651BAB1A9A1B1B1825184498829881948094809480000 @@ -69983,6 +70607,8 @@ FFFD:0000007E665A5A7A76767E76767E0000 1FAE7:0000000000180C2412242918290012000C700088013401440104008800700000 1FAE8:000000000000000000003EF84384B5DAB5DA84428EE28EE243843EF800000000 1FAE9:00000000000007E008101668266420042E74200413C8081007E0000000000000 +1FAEA:000000000FF010082004381C4422542A4422381C200423C410080FF000000000 +1FAEF:00000002101448242380045C0C6412A4232A2312153448C8108811724E040000 1FAF0:0000000014002A002A001200140027002AC02AA020A020201040084008400000 1FAF1:0000000001800640088011F0600801FC000201FC000401F870100FE000000000 1FAF2:000000000180026001100F8810463FB040003F8020001F80080E07F000000000 @@ -70242,12 +70868,13 @@ FFFD:0000007E665A5A7A76767E76767E0000 1FBF7:0000003E5D6363410001030301000000 1FBF8:0000003E5D63635D3E5D63635D3E0000 1FBF9:0000003E5D63635D3E1D03031D3E0000 +1FBFA:000000183C7E7E7E7E7EFFFF18180000 20000:0000FFFE008000800080008000803F802000200020002000200020003FFC0000 20001:0100010002000200FFFE0400040008000FF00010001000100010001000A00040 20002:00000000FFFC000000003FE0002000400180060008001000200820081FF80000 20003:00001FF0101010101010101010101010101010101010101010101010FFFE0000 20004:000000007FFC0104010801100100010001000100010001000100FFFE00000000 -20005:00007FFE084008401040108020803FFC01040204020404040804102820100000 +20005:00007FFE000010801080108020803FFC01040204020404040804102820100000 20006:01000100011001F83F000100010001000100FFFE010001000100010001000100 20007:00001FF0101010101010101010101FF0101010101010101010101010FFFE0000 20008:001000781F801000100010001FF01020104010F81008100810081008FFFE0000 @@ -70390,7 +71017,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20091:000001C00E00080008200A20092008A0082009E00E2000400040008001000600 20092:0100010001001100110011003FF82100410081000100010001000100FFFE0000 20093:0000010001000240044008801120222004400880112002100C081FFC08040000 -20094:00000000010001783F802100210021003FFC0304050409041114610801000100 +20094:0100010001783F802100210021003FFC03040504090411146108010001000100 20095:0000001000F83F00010001003FF801000100FFFE01000280044008203018C006 20096:01000100013003C03D0001007FFC0100013003C03D0C01700780790001000100 20097:22102210221023D02250245024502A503150209020902112210A420A44068802 @@ -70453,7 +71080,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 200D0:00000000FEFE040408081010202020204040404080808282828282827E7E0000 200D1:00002000200020002000200020003FF800080008000800080010001000100010 200D2:00001040104010401040FFFE104010401040104010401000100010000FFC0000 -200D3:00001FF8003000C003000C001FFC012402240444184400840104060438280010 +200D3:00003FC000800100020004000FFC01240224044418446084010402080C503020 200D4:0020082008201040104020407F8020800180018002800280048208821082607E 200D5:101010901090111011101210125014D01750105010901092210A220A44068002 200D6:008000800080FE8010801080108010801080108010801E84F0844084007C0000 @@ -70545,7 +71172,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2012C:01000100FFFE01003FF821082388254809203018C0060FE0000000007FFC0000 2012D:00007FFC020004001FF0101012101110FFFE10101210111020504020FFFE0000 2012E:00007FFC1020102020402448448878F008101020142822447EFC0204FFFE0000 -2012F:00107C100010001001FFFE102038203840547C540492057D0410041028101010 +2012F:002000207C20002003FE0020FE70207020A840A87D2406FA0420042028201020 20130:00003FF800000000FFFE00003FF8210829282548218822482C2820083FF82008 20131:00003FF800000000FFFE000027FC2440244027F82408240827F82440244027FC 20132:3FF802003FF004100410FFFE00001FF011101FF011101FF01112010200FE0000 @@ -70616,7 +71243,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20173:200010F810880088FEF8400041FC410441FC410441FC410441FC40887D040202 20174:02000100FFFE00007DF044507DD044707C5048945C94650C01003FF80100FFFE 20175:02000100FFFE00000440247C24A83D50042804487DFE24882448244844088418 -20176:10200820FF2024203CFC24243C2424A4FF6481243C34082D0845084528831101 +20176:20401040FE4044407DF844487C484448FEC882687C581088108A110A52062402 20177:020001007FFC10101FF000003FF820083FF800001FF010101FF00100FFFE0100 20178:02000100FFFE00001FF010107FFC41049FE801107FFC010006701F84640403FC 20179:1000087EFF0800083C1024103C240024FF7881083C1008100824084228FE1042 @@ -70660,13 +71287,13 @@ FFFD:0000007E665A5A7A76767E76767E0000 2019F:01007FFC3AB821083AB821087FFE40229FE400201FF00100069839E00690398C 201A0:0100FFFE00006FEC4BA4682C4BA44AA4FFFE84021FF0125014901FF024484224 201A1:0100FFFE00006FEC4BA4682C4BA44AA4FFFE88223EF81C702AA8000024484224 -201A2:0000000000000080008001400220041008081004600300000000000000000000 +201A2:0000000000000100010002800440082010102008C00600000000000000000000 201A3:0000FFFE0000010001000100010001000280028004400440082010102008C006 201A4:0100010002800440082010102108C10601000100010001000100010005000200 201A5:02000200020002000200021002100410042004200A400940108021404230840E 201A6:000000800080208021402140222024102808300620002FFC200020003FFE0000 201A7:0840084008401040104030403040504090A010A010A011101110120814041802 -201A8:08000BFC08041008101030203020502090201020102010201020102010A01040 +201A8:080008000BFC1004100830103020502090201020102010201020102010A01040 201A9:100013F012102210221063106290A250225022102210221222122412240E2800 201AA:0100010002800440082010102008D116112011C0170011001104110410FC0000 201AB:081008100810101013FE30303030505090501090109011101210101010501020 @@ -70733,7 +71360,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 201E8:01000280044008203118C286044008203018CFE6010001007FFC010001000100 201E9:10001100163C24A424A464A464A4A4A424A425A426B424A82120212022202420 201EA:08000900090011FE12203420302051FC90201020102013FE1020102010201020 -201EB:0800082008201050108831043623502091FC10201020102013FE102010201020 +201EB:0840084008A0111012083446304053FC9040104017FE10401040104010401040 201EC:00003FFC000011101110122014401000FFFE010001000280044008203018C006 201ED:01000280044008203018CFE6010001001FF0111011101FF00100010001000100 201EE:01000280044008203018C0061FF001003FF82108228824482828200820282010 @@ -70764,7 +71391,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20207:08000BFE08201020102033FE322252229252124A128A13021202120213FE1202 20208:08200820084013FE12023202328A525292221252128A12021202120213FE1202 20209:0BFC0A040A04120413FC32043000512491241248124814901248124811241124 -2020A:0808083C0BC01200120032FE32925292929212FE12801280128114811481187F +2020A:1008103C17C02400240065FC6524A524252425FC2500250025022902290230FE 2020B:082808240824102017FE302031245124912417A8112811101212122A14461082 2020C:0820082008201420125022484084810408200820082014501250228841048202 2020D:0900090009F8131014A0304031B0560E904017FE108811081090106011981604 @@ -70789,12 +71416,12 @@ FFFD:0000007E665A5A7A76767E76767E0000 20220:0900090009FE12201420302031FC51209120112017FE10201020102010201020 20221:09F00910091011121212340E300057FC904017FC144414441454144810401040 20222:01000280044008203018C0063FF810001EF8228852880AA8049008841084607C -20223:08000820282028203E204820882008207F5014501448148824842501440183FF +20223:0820482048207E20482088200850FE4824482484248425002402440243FE8000 20224:1040104011502248244460806080AFFE21082210261021A02060209023082C04 20225:08000BF80A08120813C83248324857FC94041404140414041404140414141408 20226:084008400A481248124833F83080508090F81108131014A0104010A013181C06 20227:100017BC14A424A424A464E46404A404200027FC2208211020A0204021B02E0E -20228:09000900090011FE124032403440507C904010401040107C10401040104017FF +20228:09000900090013FE12803480308050F890801080108010FC10801080100017FE 20229:1008103C17C02400240067FC6420A42025FC2524252425242524292C28203020 2022A:0A0809080910100013FC30403040504097FE1040104010A010A0111012081406 2022B:084008400A481150104033FC3040504097FE1040104010A010A0111012081406 @@ -70991,7 +71618,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 202EA:084008200BFE1202140433FC3220522093F81208120813F81220122013FC1000 202EB:090009780908120812FE36403A40527C9290121012FE12101228122812441282 202EC:08000BFC0A0413FC120433FC320453FC9050104817FE104010A0111012081C06 -202ED:084008200FFE1200120033F83000524892481449184713FC1204120413FC1204 +202ED:088008400BFE1080110833FC30045248924A1446100013FC1204120413FC1204 202EE:08400BFE08901110137C3510311051FE9100102013FE122212521282120A1204 202EF:083C0BC008441224112831003040539C92041204139C12041204120413FC1204 202F0:110C110A17C821082FFE62886288AACA2AAA2AAA32AC228C248A248A2A963122 @@ -71311,7 +71938,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2042A:11101FFE111027BC24A467BC6000AFFE220823F8220823F82208227E2F882008 2042B:121013DE15282084220063F86408A7F020102FFE280A277C222823182C082018 2042C:11801E3E12042FC8221E67126A92B25E2F92249E251225D2245E2840295430A2 -2042D:12401FF0124020002FC86228653EA948229C2C8821FE22C02CA0209822862100 +2042D:11101FFE111020002FC86228653EA948229C2C8821FE22C02CA0209822862100 2042E:12A0144C14A4260C24A4664C64A4AFFE280223F02020204027FC204021402080 2042F:11DC195415DC251220EE60486DFEA448244825FE2448248425022A0031FE2000 20430:010002800C603118C10609F009007FFC000010102828444492925C5C5050FEFE @@ -71531,7 +72158,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20506:0440082010102008DFF60010001000101FF01000100010002000200040008000 20507:0440082010102008C006006003801C0010001000100010001000280047FE8000 20508:0440092011102108C1063FF821082108210821083FF821080100010001000100 -20509:000009201110210801003FF8010001000100FFFE01000280044008203018C006 +20509:010021081108091009203FF8010001000100FFFE02800440082010102008C006 2050A:002000F01F00100010001FF8108010801080FFFE082008201010101020084004 2050B:0440082010102008C0063FF82008282824482288210822882448282820083FF8 2050C:08400820101020084440082010102008C0061FF010101010101010101FF01010 @@ -71587,7 +72214,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2053E:020004001FF010101010101010101010FFFE1010101010102010201040508020 2053F:00007FFC40044104410441044104428442444444442448245024400440144008 20540:00007FFC400440044FC440444844448442844104428444444844400440044004 -20541:0000000000007FFC444444444444444444447FFC444444444444444440144008 +20541:00003FF8244824482448244824483FF824482448244824482448240820282010 20542:00007FFC000000001FF0101010101FF010101010FFFE10101010101010501020 20543:00007FFC40044204410440045FF4440444044404440447E44004400440144008 20544:00007FFC400440044004400447C444444444444444444444444444447C7C4004 @@ -71816,7 +72443,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20623:003C47C02244212807FC04A417FC10082788E4FE278824A82798250825A80690 20624:493E2E0209142708287E4F8AD22C4FA8455E088020001108799009603518C206 20625:07BC44A427BC200007FE14001590149E27D42564E5D4255425D425682BC81054 -20626:004043F8224823F800440FFE111017FC2554E7FC21522FFE200027FC24A40FFE +20626:001847E0215021F0004817FC111027FCE55427FC21522FFE00003FF82448FFFE 20627:00000FE0082008200820082008200820082008201020102020202020401E8000 20628:00003FF02010201020102010201020102010201020102012200A400A40068002 20629:00002000207023803C08200820081FF800000FE008200820082010222022C01E @@ -71957,15 +72584,15 @@ FFFD:0000007E665A5A7A76767E76767E0000 206B0:1004100410041044FE4422442244224442442444144408041404220442148008 206B1:100010FC10241E241024102410247E240424084410442094410A40023FFE0000 206B2:00000C0071FC1044104410441044FE4410441044104410842084210442288410 -206B3:0402020202023FC22012201220122012201220122012201220024002400A8004 -206B4:00020002248224822492491249129212921249124912249224822482000A0004 -206B5:00027F82108211021112121213D21052105220922892251242024502888A3044 +206B3:0804040404043F84202420242024202420242024202420242004400440148008 +206B4:000400042484248424A449244924922492244924492424A42484248400140008 +206B5:00047F84108411041124122413A410A410A420A4292425244204450488943088 206B6:1004100410041044FE441044104412441C443044D04410041004100450142008 206B7:080408040804FFA4082408247F2449244924492449244D244A04080408140808 206B8:2004200420043F2441244124912411242124292445247D24050401040A140408 206B9:00021F0211021102111220D240123F920092011211120A1204020A02310AC084 206BA:0804080408042A24292428A448A44824892409240A240224040408043014C008 -206BB:1004100420043F244024802400247F2401240524092411242104410405140208 +206BB:1004100420043F24402480243F240124012405241924E124410401040A140408 206BC:0004140412041224212421244024BE241224122412241224220422044A148408 206BD:080408040804FFA4082408247F24012442242224142408241404220441148008 206BE:00047F84020422242224222442247FA406240A2412242224420482040A140408 @@ -72022,7 +72649,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 206F1:24842484490424A424A4002410241FA420A430A4492485240204040418146008 206F2:0804080414041224212440A4BE2408240A240A240E24082408040F8478142008 206F3:1000080008FCFF240824102422247C24092412242424C82414442244C0940108 -206F4:100410043F042224542408243624C1A40824082408242A244904888428141008 +206F4:100410043F042224542408243624C1A4082408242A2429244904890428141008 206F5:00047E04420442447E44424442447E4440446244544448044404520462140008 206F6:000424042204412491240824FF24022422241424142408241404220442148008 206F7:08020BC208021002101237D230125212911210521092111217021102110A1104 @@ -72065,8 +72692,8 @@ FFFD:0000007E665A5A7A76767E76767E0000 2071C:0704F80488048824FFA48824A424C2A481A47EA442244224420442047E144208 2071D:3F820402040204027FD2001201923E12201220123FD2221222024202420A8204 2071E:0000147C144415442644247C4044BE441244127C12441244224422444AFE8400 -2071F:0002FFC2804284428452F4D295529652A552A4D2C452945288428042FFCA8044 -20720:0004FF84888488A488A4FFA488A498A49CA4AAA4C8A488A488848084FF948088 +2071F:00027FE240224222422A7A6A4AAA4B2A52AA526A622A4A2A442240227FEA4024 +20720:00027FC24442445244527FD244524C524E52555265524452444240427FCA4044 20721:02000100FFFE24402820345023802C603FF800007FFC02040404080410286010 20722:0402020202023FD220122292225222522F9222122212221225024482488A9004 20723:0604780408440844FF441C442A4449048814080800007FF80408080810506020 @@ -72076,7 +72703,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20727:10003E0044FE88227F2241227F22402254225422542255425642548291142208 20728:1000080008FEFF120812105222527C52089212122412C82214222242C08A0104 20729:040204022482248A248A248AFFEA248A248A248A3C8AE7EA44020422042A03E4 -2072A:0000100410041F042124422484243FA424A424A424A43FA424A4248424843F94 +2072A:100410041F042124422484243FA424A424A424A43FA424A4248424843F940008 2072B:02040F04780408240824FFA408242A24492488A408242A244904888408140808 2072C:0800080013F8320853F8920813F8100017FC100000007FF80408080810506020 2072D:7FF80408080810506020000010401040FBFC12441CA8F0A011221222541E2800 @@ -72109,7 +72736,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20748:060078FC404444445A94610800003FF821083FF821083FF8210A410A41068102 20749:0804490449047F24102410A423242C2460A46324AC2420A423042C0420941F88 2074A:0200FFFE04000FF0122021C0C630380C00007F8412241224FFA4120422144208 -2074B:3F8020BE20923F92201220122F92201220123FD222122A924A525252822A0244 +2074B:00003FBE209220923F9220122F92201220123FD222122A924A5252528A2A0444 2074C:00047E04020434240824FFA40824092449242A241C242A24C904090428141008 2074D:02040F0478040824FF2408242A242A24EBA42A242A246A248984080408140808 2074E:20003C7C444488443E7C224422443E7C220422043E0420042004200420142008 @@ -72123,7 +72750,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20756:12001200127E7F1212121212FF9200123F12211221123F12211221223F2A2144 20757:7FFC0404080410286010000011FC1104190455FC5104510491FC1000100017FE 20758:080208021F82209251120E123192C0523F92249224923F92248224823F8A2084 -20759:02040204FA0413D4125414545454589450945114511452945A84F44408540028 +20759:02040204FA0413D4145414545454589450945094511451145A84F24404540848 2075A:220422047F0422242224FFA4082408247F241C242A2429244904880408140808 2075B:080408047F040824FFA420244124FFA400A47F244124412441047F0441140008 2075C:08040804FF8408247F240824FFA400247F2441247F2441247F04410445144208 @@ -72141,12 +72768,12 @@ FFFD:0000007E665A5A7A76767E76767E0000 20768:10041444228441149294145421146114A7D42114259425542944210425142208 20769:08040804FF8408247F241024FFA422244124BEA4222422243E04220422143E08 2076A:40044704750495145554555428D450148FD400147F944094408440847F944088 -2076B:41042204FF84082408247F2408240824FFA400240824FFA4080414042214C188 +2076B:41042204FF84082408247F2408240824FFA400240824FFA4080412042114C108 2076C:10040804FF8488A429244A24142422244124BEA4022434240804140422144008 2076D:3FC2204220423FD22012285224922FD2249224923FD2249224824482488A9084 2076E:410422040004FFA4102430A448A4952426244E24952424A44484840414140808 2076F:03043C2404247FA40E2415046494040808001FFC224442440484088411280210 -20770:100410043F0421244224BFA420242F24292429242D242A24280449044A148C08 +20770:101010103F502150427CBF9020102F1029FE29102D282A28282849444A448C82 20771:08040804FF8408245524222449240824FFA41C242A2429244884880408140808 20772:0704780408040824FFA42A24492488A47F24412441247F24410441047F144108 20773:10040804FF8480A400247F2400247F2441247F2441247F2400040F04F0144008 @@ -72276,7 +72903,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 207EF:08040804FF840824EBA4AAA4EBA4AAA4EBA4AAA4EBA408241404220441148088 207F0:08040804FF840824EBA4AAA4EBA4AAA4EBA4AAA4EBA408241404220441148088 207F1:080408047F040924FFA409247F242A244924FFA449247F2449047F040014FF88 -207F2:08027FC242425C5255527FD24E5255527FD20012FFD220123FC20042028A0104 +207F2:08027FC24442555244527FD24E5255520012FFD220123FD200420042028A0104 207F3:200023DE214AA94AAA52FAD6AC20ABDEA908F908AFBEA908A908F9088A080408 207F4:08040804FF8449244924AAA414242224492488A449242A244904888428141008 207F5:00043F0408047FA448A47E2448247F2440247FA4482455244A04B7040A943608 @@ -72290,30 +72917,100 @@ FFFD:0000007E665A5A7A76767E76767E0000 207FD:2204FF8422040824FFA488A47F2408247F240824FFA408247F0441047F144108 207FE:49049204490400246B2449246B2449247F240824FFA41C242A04490488140808 207FF:49009200497C00246B2449246B2449247F240824FFA41C242A44494488940908 +20800:42047BC4A50412041FA4F024142408A437A4D2241FA4F024140408843494C388 +20801:00027F8240827F9240927F9221124A52739221124A527BD200025242492A8924 +20802:10023F0221027F120212FFD2181264921F12E6921A52EC123F822A822BCA7E04 20803:110211022A822A424412FFD20A127BD20A123B920A127BD20A020FC2F80A4004 +20804:108212A211C2788A13EA122AFBEA122A122A53EA5A2A522252AA724450008FFE +20805:0804FF8408047F2449247F243E24C9A40824FFA408247F2449047F043E14C988 +20806:04020A02318AC06A1F0A000A7BCA4A4A4A4A7BCA000AFFEA00025242492A8924 20807:080233C2215229523A526AD200127FD2091239D2205239C209020BC27C0E0000 +20808:2082FBE224920A1211122E92C0721F9210921F9210921F9210022F82488A0F84 +20809:100211E210427E8A53EA552A512A7DEA452A45EA552A492A49E29402254A0224 +2080A:7FC44A547FD4445455445FCC00007FFC00003FF820083FF820083FF80000FFFE +2080B:08000F7C28047F44A1281610F86C3F8420A43FA420A43FA420A43F8411142088 +2080C:24824902248200127F9252924C9252927F9200123F9235922E822EA255AA8464 +2080D:1402640227C2F95222527452A15224920A12111264D215120E021502248A0C04 +2080E:044202023FC225122F9225123FD222122F922A922F922A924F824502888A1044 +2080F:00023FE228823FEA288A2F8A2A8A2F8A2A8A2F8A220A3FEA52A257A290AA1064 +20810:08FE7F1208123E120012FF9200B27F320852FF9200127F120112EFA2A52AE346 +20811:41027DF251428A22000A7DEA452A7D2A452A7D2A512A496A55026502410A0004 +20812:02027FF248427FF24C6A5ADA694A40EA4F0A410A4FCA410A5FE24102450A8204 +20813:2082AAA2B2C22492515251528A3204120A12111264D215120E021502248A0C04 +20814:087EFF9208127F120012FF929492FF9241127F1241127F1241127F22222A4144 +20815:2202FFC2220200127F9212127F9252927F9200127F920012FFC24482944A0804 +20816:04027FE24A22914200123F9204127FD220923F9220923F9220823F82110A2084 +20817:24824902248200127F9252924C9252927F9249126D1249126D42494248CA6C44 +20818:040204027FC2041275D2249275D2555275D2555275D20A120A021102208AC064 +20819:04027FE24022844A7FCA0A0A514A3F8AD16A1F0A110A1F0A04022482444A1C04 +2081A:0402240227822412FFD2121252926D9240927F92529252926D8240827F8A0084 +2081B:3FE202027FFA420A9AD2020A1ACA090A1FEA310A5FCA910A1FC211021FEA1004 +2081C:104255529A6228AA451A7FEA402A904A1F0A240A040AFFEA040244427FCA0044 2081D:7FE24442598248827DEA488A5DCA6AAA488A420A4BCA4A0A4A024AE2BF0A1004 +2081E:10023F0221027F120212FFD27C921F12E6921A52EC127FD244427FC204EAFF24 +2081F:04027FC211020A127FD249127FD24A125F924A927FD24A925F824A025B0AAA84 +20820:087EFF9208127F120012FF9294B2FFB241527F1241127F1241127F22222A4144 +20821:3F8220823F82208A7FCA514A7FCA200A7FEA882A7F2A492A7F2208A2FFAA4044 +20822:3FFC41007FFE810239740100397000003BB82AA83BB800003FF8040808083030 +20823:00027FE2484248427FF258CA6D6A4A5A444A4F8A430A4C4A5FE24A925242860E +20824:1F8221027F82A08A3F8A222A3BCA222A1FEA210A7F8AA48A3F820A42328AC304 +20825:1F8221027F82A08A3F8A222A3BCA222A1FEA208A7FCAA44A3FC20B2232AAC1E4 +20826:0080F8BE0080FABE8AA28AA2FABE0280FABEAAAAAAAAFABEAAAAA8AAFABE8922 +20827:24C248425F427BC2554A5B4A7FCA404AFFEA040A248A250A44020A02318AC064 +20828:7FE210821F82108A1F8A10FAFF8A008A7DFA28AA38EA28AA38E22CB2FBE2082E +20829:7C8454447C4855FE7C0021E23D22452AA9EA112A292AC7EA7D2A45227D2A4564 +2082A:21084FD2F03C23884812FBBE0280ABAA00007FFC020402040204040408147008 +2082B:7BC200027BC24A4A6B4A4A4A040A3FCA290A3FCA294A3FCA31225DC2512A9CE4 +2082C:20823CF251428A22040A0A0A318ACE6A000A7BCA4A4A4A4A7BC22082514A8A24 +2082D:1000FDFE08123422D84A158417BC152827BC235A65AEA3FC220423FC220423FC +2082E:7FE240227FE248825FCA420A4F8A420A7FEA56AA7FFA484A5CE248427FF2904E +2082F:3F8224823F82248A7FCA554A7FCA554AFFEAA0AA3F8A208A3F8A208223EAFC04 +20830:3FE202027FFA420A9AD2020A1ACA28AA7DFAD34A79EA514A79E251427DF2410E +20831:3FE202027FFA420A9AD2020A1ACA000A777A555A777A000A3FE212422AAA7FF4 +20832:00800080088008800FFE10821082208240820102010202020202042208141008 +20833:08400840484048404BFE4842484248424842588268824882090209020A140C08 +20834:1010101010101010FEFE1212121212121212121212121212222222224A4A8484 +20835:2040204020402040FDF824482448244824482488248825082632440243FE8000 +20836:1010101020103F7E401280127F1202120412081210122012402241223F4A0084 +20837:484048404840484089F888488848FC4814481488148815082632240243FE8000 2083A:00203E20002000FC00247E241424142414241444144414842519240143FF0000 20895:08207F20087E7E4408A4FF2810101E282244468281003FFC0204040408283010 208B9:021002103FD025102FFF25113FD122112F912A912F912A914FA1452118CE0000 +208FE:100010001FFC22044BF4940423E44A2413E4322453E4110413E4152410D41728 +20930:00007FFC40004040424042204490488851064100422044104FF840087FFE0000 2097C:00100410041004103F90041004100410001F03F07C1000100010001000100000 2099D:008000801FFC00800FF808080FF8080808080FF800803FFE0080008000800000 +209AA:010001007FFC01000820FFFE082002007FFC044009203118CFE6010001000100 +209AB:7E10421042107E100010FF1042FE7E1042107E1042104F10F210021002100210 209DA:0100010001FE010001003FF8200821082108210822882248244820083FF82008 +209E9:204020403F404040BE40226032502A48FF44224452404A407F40024014400840 +20AB1:3FFE2000230C3C7024103F7E24102E3835542412200024844442444A840803F8 20AD3:000000800080008000807FFF01000100012002100208041C09E23E0200000000 +20B15:0040004079F848484888488A490A4A26482048207BFE48200020002000200020 20B1D:00000FF808080808087808000FF80A080A080910091008A0084008B00B0C0000 +20B56:04000E00F0FC22449244444410441028FE28102810107C10442844487C844502 20B9F:0080008000807C804480448E44F047804480448044807C8100810081007F0000 +20BB5:004000407840484048404840487C48404840784048400040004000400FFE0000 20BD7:00000FFEF0409040904097FC9444944494449444F44494540448004000400040 +20BD8:0008003C7BC04A004A004A004BF84A884A884A887A504A500220045004880906 +20BE5:00800080F3F09090909091129112924E94409040F7FE90400040004000400040 20C41:00000E10E210A212A2D4A458A458A494A892A912E850A8200802080207FE0000 20C53:01000100F3F8920894109BFE920092F892889288F2A8929002820482047E0800 +20C5B:00007FF804080808105060203FF82448282837D82448244827C8200820282010 20C78:000001FE7D204520452045FC45044504450445047DFC45200120012001FE0000 20C8E:01200128F12492249220963E9BE0922492249228F22892100212022A02460282 20C96:00800040F04097FE908090809140914493489530F92091100108014401820100 +20CAD:10401040108013FCFE04120432F43A9456945294929412F41204120412141208 20CBF:00400040F7FE9040904097FC9444944497FC9040F0E0915002480C4600400040 +20CC3:000001FC782048204BFE4800482048224BB248B478A849280124022400A20040 20CCF:02100210F21092109F909210925E925093509E50F2509250025002500AFE0400 20CD0:0100011EE112AFD2A114A114A7D8A114A112AFD2E112A11A0214021004100810 20CD4:0100017EF14092409240967C96449A4492449244F27C924002400240027E0200 20CD5:02100210E210A210AF54A252A292A210A390AE14E204A208020802100A2004C0 20D15:02100210E210A210BF54A552A552A590A910A514E204A50804880890102000C0 +20D1F:00A800A87BAE48A848A8482049FC4820482048207BFE48200020002000200020 +20D2B:0100010071DC51145114511457D4501451145114758855480948011405140222 +20D30:0110011079D84A544A524D50489049404A3E4C0079F849080108010801F80108 20D45:008800887FFF48884800489048904912491C4B104D10791001110111010F0000 20D5D:010807FEF108900097FE901092109210941097FEF05090900110021004500020 20D71:02400220E220A5FEA440AC40ACA0B4A2A5A4A698E490A488048804A404C20480 @@ -72321,6 +73018,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20D7F:04100410E410A4FEBE92A494A490A4FCA6A4BCA4E4A8A4A80490052816440982 20DA7:004000207BFE4A004A204A204A3E4A204A204AFC7A844A840284048404FC0884 20DE1:1FFC01000FF808080FF808080FF803600C1877F700000FF8080808080FF80000 +20DFA:0110011077D05110513E57D25452501253925092711251D20F120122052A0244 20E01:0008041CE2E0A280A88CA4B0A4A8A2AAA2ACA4A8ECA8A4A804A4052405320220 20E0E:020007BC72945294510852B65480503C57C0504077FC50400FFE004001400080 20E0F:01080108F7FE910891089200920097DE92529252F25292520252045E05520880 @@ -72334,6 +73032,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 20EA2:00800040F7FC9404900093F890809144966890B0F128966800A4012206A00040 20ED7:004000207BFE480049544924495449FC48204BFE7A424A9202FA020A02020206 20ED8:002001247922492A4A32486049904FFE492049FC792049FC0120012001FE0100 +20EF3:0108010877C85110511E57E45554555457D45114739455480948011401140122 20EF9:040002FCE220A820A5FEA448A084A122A220A420ECA0A4B4052A042A04A00040 20EFA:020002FEF22892289F2892EE9282928293829E82F2EE9228022802280AFE0400 20F2D:00100810E810AF10B47CA410A438BF38A454A492F510B57C1710191000100010 @@ -72373,17 +73072,22 @@ FFFD:0000007E665A5A7A76767E76767E0000 21336:11081088109010007BFE109010901492149212941A9462940090009007FF0000 21344:100013FE120212027BFE1210121013FF121012101AFE64820482088200FE0000 2134C:10481044105E11E01028FC12106A11961048105E11E01C24E0284012006A0186 +2136A:2008203C21E020202020FBFE202020A0232E222222223BAEE222422203FE0202 21377:2100213C21002100F9BC25642524253C252421242124393CE1244100017E0100 2139A:2040202023FE2202FA0223FE2200220023FE235225523DFEE552455209520106 213C4:00003E7C0044007C7F44087C08442A4449FF480000801FFC008000807FFF0000 213CB:40482FFE004087FC544417FCE44427FC2444244C010001003FF801000100FFFE 21413:2040202027FE2420FDFC242427FE242425FC242025623CB4E9284A2610A00040 +21428:000027882088FABE210877D8695CA12A21482508220801003FF801000100FFFE 2144D:208822AA22DC24882154FA22200023FE2242244423FC3844E044408401140208 2146D:10201050118C16FB780013FE12AA127213FE100019FC610401FC010401FC0000 2146E:1020102013FE12027A8A11FC108811FC108817FF1884632205FD002003FE0000 +21483:04003FF82008292825482FE8254829280200FFFE08203118CFE601000100FFFE 21484:102013FE100011FC1104FD7411541174110411FC10001DFCE00043FE01240262 215D7:010001003FFC01001FF802007FFE082010102008C00600000000000000000000 +215DC:0100010001000100FFFE0100410421041288129004400440082010102008C006 21647:00100E10781008FE7F122A122A127F122AFF2A287F28084408440E8271010000 +21681:082049202A3E7F4849485DA86B1049284D444A820100FFFE028004401830E00E 216A6:02000200020002000400FFFE042008200A201140184006800180066018106008 216B4:00801084108410841FFC010001007FFF0208040808101F2000E003183C040000 216DF:1028102410241020FDFE25202524252425244928292811682992451A84260042 @@ -72393,19 +73097,31 @@ FFFD:0000007E665A5A7A76767E76767E0000 21757:200021FC20442044FBFE4844484449FC8880488031FC12842884488480FC0084 2176D:100011FE110211FEFD0225FE240024FC248448FC288410FC2884448480940088 217D3:2040202023FE2000F9FC49044904490489FC4852309411882A8848A480C20080 +217DA:200023F821082110F91C4AE44AA44A548CA8490033FC12942A944A9487FE0000 2180D:04000FFC1124224404887FFC04403FF824483FF80400FFFE08201E4003C03C38 21883:200023DE225223DEFA524BDE4A024AFA4A8A92FA528A22FA328A4A024A0A8204 218BD:080009FE08200BFF7E2112AD122122AC240025FE79220DFE1322212241FE0000 2197C:0040FC4004F80908121011FC150419FC3104D1FC110411FC1000108851042202 +219BC:0200010001007FFE40028104010001000100028002800440082010102008C006 219C3:008000803FFE200220020FF8000000007FFF0080008000800080008003800000 +219F3:020001007FFE400280043FF8044004403FF8244824482848303820083FF82008 +21A25:020001007FFE404280443E40007800907F10145014201450148A250A240243FE +21A4B:020001007FFE41029494142823E801003FF821083FF82108FFFE200820282010 +21B36:3FF000101FF000103FF000007CF810881CAAE1060020FFFE0820042004A00040 21C2A:00001FFC1004100410041FFC10001000100017FC140424042404440487FC0404 +21C52:00003FFC200420043FFC221022102FFC2210221022103FFE2000421044088804 21C56:00001FFE10021FFE1140114013FC144010401FFF1150215022484C4600400000 21CA2:00003FFC200420043FFC200021202FFC212022002FBC22A442A444A44ABC9124 21CDE:1FFC100410041FFC1248115017FC12481444121013BC24902AD0217E42108C10 21D2D:100011FC1004100854105420544054805480550055007D0101010081007F0000 21D45:00801084108410841FFC00001004108410841084108410842084208440040000 +21D49:010001002108210821083FF800000000FFFE044004400840084010422042C03E +21D53:104010401040104055FE5440544054505490549054A05D286544024400FE0042 +21D59:10001040119E1112551255125512551255125512555A5D946510001000100010 21D62:0080108410841FFC010001007FFF010003F806081A08611000E001B81E070000 21D78:100010FE108210825482548254FE54885488548854887D040104020204010000 +21D84:1080108011FC1104560455F455145514551455F455045D286512010200FE0000 +21D90:108010801080108E55EA54AA54AA54AA54AA54AA54AA5CAA64AA012E01AA0240 21D92:1048104811FE104A544A55FE5548554855FF544954497C89008B010802080000 21D9C:101C11E01100110055FF5510551055105570551C55137E100210041000100000 21DA1:1020122211221124542057FE54205420542057FF54207C200020002000200000 @@ -72416,41 +73132,68 @@ FFFD:0000007E665A5A7A76767E76767E0000 21E33:1020102010FC102054A4548457FF54845484540055FE7C480048008903070000 21E34:1020105010881104560355FC542055FC5524552455FC7C500088010406030000 21E8E:210021F022102420ABFCAA44AA44ABFCA8A0A922AE1EB8C0C830018000600010 +21EEF:2020202023FE2020AAAAA924AAAAA820AAAAA924AAAAB850C850008801040602 21F0F:000023DE225223DE2252ABDEAA02AAFAAA8AAAFAAA8AAAFABA8ACA02020A0204 21F1E:008020823FFE040004803FBE04A205227FE408221FA170A11FA110A61FA00000 +21F3E:1020105010881174560255FC552455AC552455FC54005CF8648800F8008800F8 21F76:1010102010FC108454FC548455FE552255FE552255FE7C4803FF008803080000 +21FB2:2088208823FE2088A890A908ABBEAA94AA88ABBEAA08BBC8CA5C024803C80248 21FFA:08881110222011100A8804003FFC202422242144208423442C2420043FFC0000 +21FFF:00480044FFFE00403E4022403E4400447F240028492849129212492A49460002 22016:00003FF0002000400080010006E01818E00600003FF80100010001000100FFFE 220C7:100011FC11247D2455FC5524552455FC5420542055FC5C201020102013FE1000 2217B:1129114A13EF7D5A55EF554A55EF554A55EF54005FFE1084107810CC13030000 221A1:07A0F9204A207F20022007A2FC2244220C1E10003FFC00801FF810807FFE0080 +221C7:0810102022447CF80810102024487EFC02040440444444447C7C044408407040 +221F7:010000803FFE2080209020882FFE210021FC2284228824502420485051888606 22218:008000803FFF212021203FFE212221223FFE2120233045284924112201200000 2231E:00007DFE09021102217A794A094A097A4942494A294A113A2906240043FF0000 +22342:020004001FF010101FF010101FF010101FF008200820FFFE0820082010202020 22399:7FE0002020A020403FF80008002800107FE0002020A020403FF8000800280010 +223A8:00003FF80108010801081FF81100110021003FFC0304050409143108C1000100 223AD:00107C10041004FF04913C91209120913C910491049104930410041038100000 +22488:11001104110411087F90112211021104FFC81110112211021104210821104160 22489:0018006003981C60038C1C3003C03C0000001FF810081FF810081FF810087FFE 224DC:1080108021F84208951010A0204060A0A3182C0623F822082208220823F82208 +22504:08400840107E20404BFC0A0413FC320453FC9244104017FE1040104010401040 2251B:0840084013FC204048400BFE111030A057FC9040104017FE1040104010401040 +225B3:100011FC1020102018205420502053FE90201020102010201020102010A01040 +2260D:04403FF8044804481FF8144024403FFC084410542048414008844892481287F0 22650:20202020202023FE32422844A0A0A0A0A1A222A424982090208820A420C22080 +2265D:10201120112011FC1A205420502053FE9090109010901090111211121212140E +226C1:24043FA44424FFA404243FA424A4248425940408010008844892481287F00000 226F3:008000807FFF00801FFC122412241FFC00003FFE008014441402220941F80000 +2272D:2000229E225222523552A912A292A252A4322BD2225A22542250225023D02250 +2275D:1FF010101FF010101FF010101FF00000FFFE09201110200801002888482407E0 22775:7FE4002808247212120EFFC012481250222A421E0000010008844892481287F0 227B5:00047FE808247212120EFFD0122A2222421E011008A0484449828E121810E7F0 +22835:2108210825482390211EB7E4AC54A754A55425542554274824482454255424A2 +22838:3EF822883EF800001FF011101FF011101FF00100FFFE010001004884481287F2 2285B:208817FF008847FF202013FE02220AAA12AA22FA420600801442240943F80000 +2289E:0800FF7808487F4849867F0049787F480828FF9049287F4401004884481287F2 228AB:08200BFE7C2009FC08481BFF1C8429FE4A8508FC088408FC2082244943F80000 2298F:0840084808447F4408400840FFFE0040004400440028002A0012002A00460082 +22A6A:100011FC10041008FC1010201020142018203020D02010201020102050A02040 +22A73:1020102010201020FD2411241124152419243124D1241124112411FC50042000 +22A83:2000220022FCF224222423A42E2422243224E22422A4232422442044A0944108 +22A98:044008203018CFE6042018A0604000E01F0001003FF801007FFC010005000200 22AB1:10801080108010FCFD5412541054149418943124D22410441044108451282010 22AB8:08000F7E1142694E06400441183F77F000801FFC00807FFF0080008003800000 22ACF:100013FE12021202FC241020102018203222D222122212221222122253FE2002 22AD5:10401020101011E0FC22103413B810B018A830A8D12811241224142250A02040 22AE6:100013FE10201020FC4011FC11041504190431FCD10411041104110451FC2104 22AEC:1004118810501020FC501088112414201BFE3020D0A810A41122122250A02040 +22B02:10201010101011FEFD00111011101510197C3110D11011101110121052FE2400 +22B38:101C13E012201220FFFE12201290130A1A0631FAD10811081108110851F82108 22B43:100011FE10001000FCFC10841084148418FC3000D08410441048100051FE2000 22B46:103813E0102013FF78A811241222140119F87048104E108210821102321C0000 22B4F:1020102013FE102079FC102013FE1040184477FF1084112416141004301C0000 22B50:12421122112410087BFF1201122110201BFE70421042108210821102321C0000 +22BA5:20802090210823FCF880208027FE29103248EC462248224424422842A1404080 22BA6:102010201050118C7EFB102013FE12221A2273FE102010501088110436030000 22BCA:10881088110813DEFE521262124212521BCA324AD2421242124213C252542008 22BED:1020112410A811FCF84013FE11081A243422D1FC112411241134112850202020 +22BF9:1088108813FE1088FCF8102011FC1524192431FCD02013FE1020102050202020 22BFE:200027FE240225FAF40225FA2402200033FCE20423FC220423FC2204A3FC4204 22C1D:1088108817FF108878AC102213FF12101A127212120C14081415186531820000 22C24:1020102013FE11047884108817FF100219F271121112111211F21002300E0000 @@ -72459,6 +73202,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 22C51:2080204027FC2404F9102208203C2BD03250E2502250224822482444A4444842 22C55:1020102011FE1050FC88110413FE148818F83088D0F81088109E13E850082008 22C62:2020202023FE2020FBFE2242248C21F03020E04423FE202221282224A4A44040 +22C63:2040224821502248FCA4211826062BF83208E3F8220823F822082208A2284210 22C64:1044102412281100F97C101010101B7E3110D1101128112411441280547E2000 22CB4:3F0821083F7E20082F4820285FA8440895282C9000F83F000100FFFE01000300 22CB8:10201020103E1020F82013FE12021B26328AD25213261252128A132653FE2202 @@ -72469,21 +73213,33 @@ FFFD:0000007E665A5A7A76767E76767E0000 22D4C:204427242528257EFD102630254A2D1A352CE54C251A262A24482408A4284410 22D67:23DE225223DE2252FBDE220222FA2A8A328AE2FA228A228A22FA2202A20A4204 22D80:100013FC12941294FBFC100010901B9C3090D090139C10901090179E50902090 +22D92:204020A023182DF6F00027FC255424E437FCE00023F8220823F82208A3F84208 22DE1:100017DF110417DF7D55155516DB14511C53702017FF10A81124162330200000 +22DEC:204027FC204023FCF84027FE20422BF83248E3F8204027FE200827FEA4A84798 +22E84:2FBE28A22FBE28A2FFBE29122AAA29123AAAEBBA28A22AAA2BBA28A2A92A4A24 22EB3:244424E42A0A2EEEF4042AEA2E0E20E03AAAEAEA204027FC244427FCA0444FFE 22F0C:201020107E10421E82107A104AFC4A447A4442444A284428411041283F440082 22F1B:101010101E10221E6210141008FC144422444144BE282228221022283E442282 22F42:1040102011F81D08110811F8FD08050805F84944294811302910454881860100 22F7E:511029102A10001EFF908090017C7E24042408240F28F8280810082828441082 +22FBA:00107F904A104A207BBE4A444A247BA44A244A287BA84A104A284A287FC40082 23073:08081C88704810481008FE881048104810087C0E45F84408440844087C084408 23074:1008108828482448420880887C48004800087C0E45F8440844087C0844080008 +230DA:204010200000FDFC200020003CF02490249024902490249244925512890E0200 +23119:208010FE110002FCFC8420FC20843CFC2420252424A827FE245044505492890E +23138:00007CFC1084108450F4509450947DFE1102117A294A294A2B7A4D02490A8104 +23143:004000407C4044404440446044507C4844444444444044407C40444000400040 231B6:08000F3E0922112222227FA224BE24A224A23FA20A220A3E1200220141FF0000 231C3:0888048804901FFC014001407FFF022004101CFC648704FC0484048404FC0000 231C4:00001FFC10041FFC10041FFC080C08F07E8008FF08880E887888090818080000 231F5:00001FF810081FF810081FF800007C7E4442447E7C42447E44427C82010E0000 23236:020002FEF2209220932092BCF6449A54924C928492A4F2189208020802FE0200 +232DE:011007FCF110904093F8904097FCF080911093F8900093F8F2A892A80FFE0000 23350:4010402840447EBAAA002AFE2A924AD64A9292FE1200227C2244427C9444087C 23372:00003FFE244025FC24843C8427FF242024203FFF2444248825F044284DC40000 +23397:00203C4025FC2524257C3D8C2554252425543DFC2420241025544542554A8A38 +233B6:0100010001007FFC0380054005400920111021084104810201000000FFFE0000 +233B7:1000100013FC1008FC1010203040388054805100910012021202120211FE1000 233D0:0820082008207E7F084108811D011AC21822281428084810082008C00B000000 233D2:1040104010407C4013F8104838483548354850C8104810A81089110912070000 233D3:100011FE10407C4013FF10803880348031FE5102100210021004100410380000 @@ -72498,115 +73254,174 @@ FFFD:0000007E665A5A7A76767E76767E0000 23451:0810081009FF7F01090108FE1C041A181A1029FF281048100810081008300000 23465:0822082209FC7E24082408281BFF1C201A4028FE2B1048100810081008700000 234E4:0810081008FE7E100892088219FF1C821A82280029FE4848084908890B070000 +23519:201020902710243EFC222444279075106D10A510A52825282528294429443082 2355A:088808880BFF7C88089C081219FF1D101B1229122914490809190A250AC20000 23594:13FF120012FEFE8212FE128232FE3A0036FE520C521017FF1410181010700000 +235BE:2088208823FE2088F88827FE208071FC6B24A5FCA12421FC212421242124210C 235C4:0844084409FF7E44081009FF1C801A80187E280028A448A408A409250A230000 235CB:2020212420A82020FBFE2202300029FC69046104A1FC2050205020922112220E 23638:100011FE11227DFE1122112239FE342031FE502053FF10001152124912490000 23639:0810081009FF7F01097D08101CFE1A921A9228FE2892489208FE084409830000 2363A:0880088008FF7D440A7C0844187C1C441A4429FF2901497D0945097D09030000 +2363B:1088108813FE1088FCA81050308839745622542091FC102010A8112412A21040 23647:1084108813FF7D1011FE111011FE1D1061FF00807FFF02A00C98708700800000 +2365C:1040102013FE1202FCA0109039FE3520532055FC912011FC1120112011FE1100 236BA:101411FE7D1011D41148FD4A129639FC3524551453FE9144122413FE1004101C 236EE:2028202423FE2220FA2423A4229874906DAAA846A3FA22A822A822A82FFE2000 2370C:1060118E11027DEE110211FE1000392235B2556A51B2116A112211FA13230000 2371C:1088108813FF7C8811FE112239FE352235FE502053FF12211229123512C70000 +2372C:203C23C020442224F90827FE244272A46A8AA47AA08020F8210822902060279E 2373F:108813FF10887D2413FF1124393C350035FE502053FE10A81124162310200000 +23749:2144214425542364F95E27E430047234694CA7E4A08423E4208420E427142008 23763:00803FFF02A00C983FFE62233FFE21043F04217F3F0420243F1420043F0C0000 23764:1020112211227DFE12241128317E38C8347E5748517E1148117E1280147F0000 237E7:0A08090808BE7E2A093E08881C7F1BA218BE28A228BE48A208BE09410A3F0000 237FF:104813FF10487C2012FD118630FC398636FD502053FF10A81124162310200000 23824:1200123E17E2793E112217E2327E3AA237E25CBE57D4149417D5149517E30000 2383D:13FF104813FF7E49127911403BEF354935CF53E952A913EF108913E910930000 +23942:010001000100090409041104110821084110012000400080010002000C007000 23965:088008882E9028E028842E84F07C000000E01F00010001007FFC010001000100 23A3C:00A800A8FBFE20A820A838004BFE4A22682099FC092411241134212840208020 +23A81:052807BEF94827BE23183DAA49464BFC6A049BFC0A0413FC120423FC41088204 +23A8F:00007E7802483E4802487E8601007EFC42447E4442287E28421042284A444582 23A98:0800107C7E4442447E44428742007EFE0042404246247828401842243EC30000 +23AA0:10007E7810487E4852487E8652007EFC1044FF4410285228521052287E440282 23B02:2080208820B03EC0208020842684387C00003FF801000100FFFE010001000100 23B20:08001CF07090109010901C907090109010901C90F114120C100010020FFE0000 23B36:08001DF87148114811481DF87108110011001D04F10410FC100010020FFE0000 23B72:0008FC1C04E068201020FE3C92E09220FE20923E93E0FE20922292229222861E 23B88:3FFC20043FFC208028882FF8408050849FFC01F03E0003F03E0003FA7E0201FE +23BAB:3EF822083EF820003EF820483E3020CE000001F03E0003F03E0003FA7E0201FE +23C28:1004080EFF7081107E10521C94707E10C2107E1E42F07E1042127E122412420E 23C5D:20003FFC40009FF000007FF004107FD0081014103F900412248A444A14060802 +23C76:0040204010401040804040604850084810441044E04020402040204020400040 23C7C:0000200013FC1044804440444044104410442044E04420842084210422280410 23C7F:200011E008200020402020201020002000200850085010881104220244010000 23C97:00402040104017FE8040404043FC1040104027FEE0422042204A204420400040 23C98:000023FC104010408040404047FE104010A020A0E0A0212021222222241E0800 23CA9:0000100009FC0924412421242524052409FC0900710011001102110210FE0000 +23CAA:000023FC104010408440444047FE104010A020A0E0A0212021222222241E0800 23CB7:000011FE09020902417A210A254A052A09320912712A112A114A110211FE0102 23CFE:0888048804901FFC014001407FFF0410188C6C8B039000E002B00C8C31830000 23D00:200013FC0844004440842104121800000FDF0A49124912492451245149A60000 23D0E:041002203FFE00801FFC00807FFF000000803E8302CC04B01898608703800000 +23D13:0110211011501250827C465056901A10121022FEE21022102210221022100210 23D40:200011FC090401FC4104210411FC000000000BFE082010201020202047FF0000 +23D5A:000023FC1040104087FE40A04110120814462040E24822442442284221400080 23D66:0080108008FE0902410222FA20AA04AA08FA08AA70AA10FA108A100210140008 +23D7A:001047902490253E05288648452A54AE14BA24EAE6AE2528242A24222422041E 23DD3:20C01700091F011147F121111111039103510B310D1115111911211F41000000 23DF9:201C13E00840004047FF2090110C062300220BA408B410A81124222340600000 23DFA:200017DF0945024944D321451659000001FC088408841048103020CC43030000 +23E0E:8200420043C0023C82145FD45554155435545FD4D548554855545454515410A2 23E23:0040204017FC104082484FFE4208100017FC2404E4442444244420B0230C0C02 23E24:000023FC12941294829443FC4080104017FE2080E0F820882108210822280410 +23E8C:00105F902910291089144F52495209922F1029144904CB885D08411041204140 +23EF5:000043F8220823F8000087BC44A457BC10002FFEE10021F82008200820500020 23EF8:0020112408A80BFE420220F82488048808F8082071FC11241124113411280020 23F0E:002021241122112A8232406049900BFE152011FCE12021FC2120212021FE0100 +23F7D:042084205FFC0420956855AA652600002FF84808CFF848084FF8480848280810 23F7E:202010200BFE008847FF200011FC010409FC090411FC110421FC208947070000 24096:27C114420FC4045847C121011FE2000407D8044017C111012542292443180000 240D2:007C204017FE144287F0444447FE1524165224F8E58C26FA248828F8288810F8 +240EB:01104FFE211027FC04A487FC40004FFE180227FCE22027A82AB0212222220C1E 24103:27DF14510FDF045147DF2401150D04B10411167D1511143D24A52525463D0000 +24182:010001001108110811102120428002800440082010102008C0060000FFFE0000 +2418A:0840084008400A404A404C504848884408420842144012402240204040408040 241A2:2040204020A020A0A910B208A406A11021202140218021005104490440FC8000 241AC:002000F83F00010001F83F00010001FC7F020102010200FE0000244422224222 241B5:1000100011FC1124552459245124912411FC1100110029002502450240FE8000 241C6:080008FF08810A812A812AF9488948890889088914F914812281228140FF0000 241FE:08202AA42CA84920145022887FFE400280040000000000000000000000000000 2420E:10401040108014FE5902520251F29112111211F21112291225F2400240148008 -24295:100011FC104414445BFE5044504491FC1080108011FC2A842484448440FC8084 +24226:100011FC1104110455FC5900510C9170111C1170111E29F0251046124212840E +24259:100011FC104414445BFE5044504491FC1080108011FC12842884248444FC8084 242B6:1082108213E21482588A53EA52AA92AA13EA108A11CA2AAA24A24482408A8084 +242B9:2110211027D02110A93EB7D2A452A01223922092211221D257124922412A8344 +242BB:100011FE1102157A5902517A5102900010FC108410FC288424FC448440FC8084 +242BF:1008103C11E01420582053FE502090A0112C1124112429AC2524412441FC8104 +242EE:00007F7C484448447F44417C41407F40484248427FBE00002488224442448004 2430D:1040104013FE12A2549059FE5110931015FE1110111029FE2510451041FE8100 24319:100011FC110415FC590451FC5000900013DE10421252114A2A522442414A8084 24352:112412481124140059FC512451FC912411FC102013FE287024A8452442228020 24364:102011FC108814505BFE500051FC910411FC110411FC282027FE442040208020 243BC:04147F92007F3F1021183F28052914A964C700840888314802200C1870070000 +243F6:202023FE225023FEAA52B3FEA294A2D8229222CE2200228452984CE24482887E 24419:20102008278824BEAC80B494A788A47E2408278826BE268856884B884A889008 +24423:21F8210821F8250AADFAB50AA5FAA402279E209020902F9E54924C9244928892 24430:108813FE10A8149059FE532051FC912011FC112011FE290027FC44884070838E 244D3:200023FE22522252ABFEB108A154A25E27B4211E225427DE50144D54455E8010 24605:00007EFC040424082410242044207E200DFE1420142024204420842014A00840 24629:00003F7E010211220A1404081A14616308800FFC108000803FFF008000800000 +2462F:084008404840487C7E844888892008200E20F850485008500888088809040A02 246A5:0810082812442682797D010008FE28043E04480808FE7F820882088208FE0000 +246DB:1120113C514452A87A1056A892C612BC1AA432BCD2A412BC122412241224122C +246DF:1090109057FE5090790051FC920415F4195431F4D15411F41154115411341008 +2473B:00104510291011122912491489D80910191029104910891209520992510E2000 +2474C:000045FC2800100028004BFE88900890189028904890889209120912520E2400 2479A:0020452428A410A8282049FC8904090419FC2904490489FC0904090451142108 +2479E:0110890852042444504090A011101208340653F89208120812081208A3F84208 247A4:000045FE2848114A28CC484889FE0900190029004900890009000A0052002400 247B6:000097FE540229146208A40423F820406040A04027FC204020402040A0404040 +247E4:000047FE2A2210202BFE482089FC092419FC292449FC88200BFE082050202020 247EF:000097FE5040208053FC9294129412F43294529492F4129412941294A3FC4204 247F1:0480448029FF120010FE288248FE088218FE2840487E0B820844103863C70000 +24822:102010287C24542454207DFE10207C20542054507C50505014481E88E2844102 +24873:021092105FD022206FBEAAC42FA42AA46FA4A22827282A9032682228A2444282 24896:040044F8288810F810002BDE4A520A521BDE28204FFF08A80924162360200000 -248E9:00000000FE001000100010007C0010001000100010001E00F000400000000000 +248E9:00001FF0010001000100010001000FE00100010001000100013001C01E000800 +24950:00200020FC2013FE102010207DFC1000100011FC11041D04E104410401FC0104 +2496D:00200020FDFE102011FC11247D2411FC1124112411FC1C20E3FE402000200020 249DB:00400020FDFC10001088105013FE7A22102411FC112411241D34E12840200020 +249DF:00400020FBFE200021FC210421FCF80023FE220221FC20203820E02040A00040 24A01:000003FCF89022942198209027FEF80021F82108210821F83908E10801F80108 +24A0F:00920124FA4821242092200021FCF90421FC210421FC3904E1FC408801040202 24A4D:001077102210777C221077100810141022FE5D1000283F280244048209010000 24A7D:01080108F7CC210A210827DE2448F6C8254827C8255427D43D54E554045404E2 -24AC9:01240174F9842375250E21742104F17422DA2471200021FC3888C070018C0603 +24AC9:024802E8F30826EA2A1C22E82208F2E825B428E2200023FC3110C0E003180C06 +24B01:00087E1C4AE84AA87EA84AA84AA87EA808A8FFA418A42CA42AA24B2889340A24 24B56:00007F3E2020203E20203E3E2220222032FF2A202A24224A26F13A0161FF0000 24B62:2000100001FEFE40004044784448AA4810681098FE981088108A10AA10CA1086 24B6F:00107E2020FE208220FE3E8222FE221133D22A5C2A54229227313A0161FF0000 24BE5:080008007F7E114221421A4204421A7E6100000008801FFC20800FF800803FFE +24C00:FF108810AA929492AA9294FEA210FF104210777C92105A102F10221042FE8200 24C16:000003FC7D045504550454887C8854885450545054207C500088010406030000 +24C1C:002000207C2054205420542054407C4054405440544854847C8445FE00820002 +24C48:102008200820FFA0002000307F284924492249227F204920492049207F204120 +24C4A:081008101020102024487EFC224400003FF8210821083FF8210821083FF82008 24C59:00200020F820A820ABFEA870A8A8F8A8A924A924AA22A8F8F820882000200020 24C8D:00200020F820ABFEA820A820F924A924A924AAAAF82020502050208821042202 24D14:00000FFC00100020004004400440047C0440044004400440044E04F01F000000 +24D25:008000401FFE1000900057F85030104030805100920014002402240243FE8000 +24D2F:008000401FFE10009080508057F01090329051109190125022122412480E8000 +24D52:008000401FFE1000908050405FFE12083208511090A0104020A0211042088C06 24D80:008000401FFE1080904057FC5000111032085414911010A0204020A043188C06 24D83:010000803FFE21202120A9246528213021206330A5282924222042224422881E 24DB8:008000401FFE100097DE5152515417D83154515297D2125A2254245045508890 24DEA:008000401FFE100093F85010502017FC30405140908013F822A822A842A88FFE 24E01:010000803FFE220023F8A40867F020103FFE6300AD88225024E0595042489D86 24E0E:008000801FFE500033F8120813F8120833F8510013FE2E4222A243F2000C0000 +24E2A:01003FFE22002FBEA2126F9222123FA66240A7FC204027FC20405FFE404081C0 24E31:010000803FFE20802FFCA0807FFE220024086FFCA0002FFC49244924BFFE0000 24E37:004000401FFE50843FFF108417FC110033FE5E0213FE204027FE444204460000 24E6A:004000401FFE500037FF1400147C1444347C540015EF252925EF440007FF0000 24E85:010000803FFE22002A80AFBC72543FD420146F94A0143FD442084A8892540622 24E8B:004000401FFE5108310C1FD2112117C4355857C2154427D921024FC401380000 +24EA5:008000401FFE121093DE5528584010A0311052E89C0613F82208220843F88208 24EA7:008000401FFE1108909057FE554A14D237FE500093FC120423FC220443FC8204 24EAA:010000803FFE211027FCA04063F8204027FC6150AFFE200023F84208420883F8 +24EBA:008000401FFE10409FFE500057FC151435F4540497FC120823F822084FFE8000 24ECA:00803FFE20002300BCFE64103F7C2E447554A4542E542A542A1053285244A082 +24F42:100011FC20207C2044204420442047FE7C2044204420442044207C2044200020 2504A:010001007FFF010003F802080610192060C003300C0F1FFC124412447FFF0000 25055:00000FF808880888088809480A280C180FF800001FFC1224122412247FFF0000 +25081:1080108010FE7D0012FC10841C84E0FC00003FF82448244824482448FFFE0000 25122:00207820482048204FFF7870487048A848A8792449244A224C21782000200000 25128:000003F8F88888888888F88888888BF8F908890889088908F908890807FE0000 2512B:000007F8F10891109110F120913C9104F104928892889250F420945008880306 25148:0080F04090409000F7FC90009008F208920891109110F110912000200FFE0000 +25160:0008001C79E04900490079FE49004900797C49444944494479444A7C02440400 +25161:000003FE78204820484079FC4954495479544954495449547954494401140108 2517E:002000107C1045FE45007D10451045107D7C4510451045107D10451002FE0400 251A7:0200017CF504940495F4F44494449444F5F4944494449444F5F4940404140408 251A9:0000793E492249224922793E492249224922793E4800489048917911060F0000 @@ -72614,6 +73429,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 251D2:01000102F11C9FD09210F210951E97D4F114911491D49F14F514912401240144 251E5:00207850488849044EFB78204BFE4A224A227BFE482048504888790406030000 2521E:008878884BFE488848887FFF48204BFE4A227AAA4AAA4AAA4AFA7A02020E0000 +25242:008800887BFE48A848107BFE4880488078FC480048A848A878A848AA012A0206 2524C:008878884FFF488848207850488849044EFB780049FC49044904790401FC0000 25273:004003BEFA128A928A52FAAA8B248840FBFE8A228A228BFEFA228A2203FE0202 2531A:00400FFEF04097FC9000F7FC94A497FCF20893F8920893F8F20893F801100208 @@ -72623,21 +73439,38 @@ FFFD:0000007E665A5A7A76767E76767E0000 2546E:00200020FC20102013FE20203C20642065FCA504250425043D04250421FC0104 2548E:002800243FFE0820082011FE1E20122033FF5210121412081E19006501820000 254D9:041004107F7F1414163425524491041000007FFF02000FFC780408040FFC0000 +25500:00800080FCFE1102124221FA3C0265F26402A5F2240225F23D1225F220140008 2550E:002000207DFE1084104410483FFF240465E42524252425243DE40004001C0000 25532:000003DEFA52225223DE400079FCC800CBFE4880490049FC7804480400280010 2554D:002001FCF92423FE212441FC782049FCC92449FC48404FFE788849D00070038C -25562:00500050FBFF205023FE42527BFECA52CBFE480049FC490479FC490401FC0104 +25562:00500050FBFE205023FE42527BFECA52CBFE480049FC490479FC490401FC0104 25584:01040088FBFE202021FC40207BFE4800C8204A3E4942481479104A2800440082 255A7:000800107E7E1242127E12C23B7E2A402A7F6A402AFF29812855389501020000 255A8:01FC0104F90421FC200043DE7A52CA52CBDE48204BFE487078A8492402220020 255FD:0790051EF7A8248427BE452A77BED00053F8520853F8520873F850A00124061C -25771:060078FE080208447E28081009FF1C111A122A14281048100810081008700000 +25609:2000100011FCF844084410441044384454449444104410841084110412281410 +2560E:1008080808107C200440088808081C102A204A44888408080810082008400980 +25611:201010101010F81009FE10101010381055109490109010101010101010501020 +2561E:202010201050F8500888114412223820540095FC100410081008101010101020 +2562F:202010201020FBFE08201020102039FC547094A810A811241124122210201020 +25635:2000100011FCF9040904110411FC39045504950411FC11041000100013FE1000 +2563D:202010201124F8A408A8102011FC38205420942013FE10201020102010201020 +2564A:00803E9002A424481450082010102FE8C00600007FFC01001110210845040200 +2567F:200010501048F8840924102010503888550694F8108810881088108810F81088 +2574C:0010003801C00100010001007FFC038005400540092011102108C10601000100 +25767:08001DFCF12411241124FD24112431FC39045500550091001102110210FE1000 +25771:08001DF8F00810501020FC1013FE382234245420502090201020102010A01040 257A9:0D047084108813FE7C88108810883BFF34885488508811081108120814080000 257B4:0C107090109010FE7D101110101031FF380054FE508210821082108210FE0000 257C7:08281C24F024102011FEFC20112030B238B4546854A891241222102010A01040 +2591A:008037FCE40427BC20A0F6BE22A277B66AAAA6B6A2A22FBE22A026A2207E2492 25977:020001007FFE4822901400007FFC00001FF0101010101FF0000008200440FFFE +25997:020001007FFE4822901420081FF0101010101FF0010008844892481287F00000 259C4:008000803FFE22227FFF08880FF808881FFC10841FFC10841FFD0081007F0000 259D4:00803FFE222224227C1F07F0080037F800000FF8092805483FF9054619320000 +25A0D:01007FFE482292140BFC140023F84A0813F8320853F8910013F8151010E0171E +25A0E:01007FFE482290143FF804403FF824483FF810101FF010101FF00100FFFE0100 +25A10:01007FFE4822901400003F8404147FD420943F9420943F9420943F8411142088 25AD7:104010401F7E2890248844088000000000000000000000000000000000000000 25AE3:102010201F7F24884204020003F0020007F000103FFE00100020002001C00000 25AE4:102010201F7F248842041FF8000807F804000FFC080400040008000800700000 @@ -72647,8 +73480,13 @@ FFFD:0000007E665A5A7A76767E76767E0000 25BE5:20403F7E4890840801F83F000100FFFE01000D00317821083D7821083FF82008 25BE8:10403F7E4890850800001FF0111011101FF0111011101FF001004884481287F2 25C14:20403F7E4890850800001FF0101010101FF000007EFC4284428442847EFC4284 +25C2D:20403E7E48908408082004407FFC01003FF80200FFFE080017F820805FFE8000 25C4B:10203F7F4488120409FE202218E2023A0C42308C00807FFF02A00C9870870000 25C64:10203F7F4488088408FF11841648343054CC171314E4141814E2100C11F00000 +25CBB:20403F7E489085081FF0149012501FF00200FFFE08203FD8C8460FC0080807F8 +25CC7:20403F7E4890850813FC240043F88A0813F8320853F8910013F8151010E0171E +25CD4:20403F7E4890850800407BFC488049F8522055FC488848F8688850F840884098 +25CE0:20403F7E48908548207C104017FC0444747817C4143C140014F01490291447FE 25D0A:20403F7E4890850800007C200420FF3E22443EA422283E282390FE2842440282 25DA1:102010203F7F448812147C2810447D83547C7C0054FE7CAA10FE7CAA10AA0000 25E2E:008000800FF8008000803FFE00000888048804907FFF02A00C98708700800000 @@ -72658,47 +73496,72 @@ FFFD:0000007E665A5A7A76767E76767E0000 25E65:10201122552254A458A810207DFE10023802340255FE50021002100211FE0000 25E86:100011FC95045504590411FCFC00300039FC5420542091FC1020102013FE1000 25EC2:1010101055FF541059FF11117D551139391135FF545450541092131110100000 -25ED7:1010101095FF543858541092FD1130FE388254FE548290FE1082100011FF1000 +25EC5:100013FE940055FC59041104FDFC30003BFE5622522293FE1222122213FE1202 +25ED7:1020102095FC547058A81124FE2231FC390455FC550491FC1104100013FE1000 25ED8:49292A2908297F522A522AA44948214831A45FA4555235521FA9212941290000 25EE8:1020102057FF5420582013FE7E42129239A4344E57F1502010A8132610200000 25EF5:201020102710AD7C75102510FDFE270875086DFEAD0825482728200820282010 25F23:1080108054FF55AA5AAA10AA7FFF10AA38AA34AA55FF50001152112912290000 25F5C:0820083E2A202BFF2D2109FC7F21097F19521D7E2B52297E4A1008AA091D0000 +25FBA:11101110211029104910F110111021104910FAA80A680228AA44A44484840902 +25FCA:1008101C21E025004500F90011FE21104910FD30051801145512561082100410 25FD4:0810101022FE14100810121026FF7944094428282A2849104828084409830000 25FE0:08201020202015FF08401050269079FE09922A922C924A924A96081008100000 25FFB:084010462278144008411241263F7900097E28422A42497E49420842087E0000 2600C:08401040224F15E908A912A926A97929092929292DC94A694899090F0A000000 26017:08101010227E14100810121027FF792809AA28AA2D294A294A48084808980000 26060:1000100F25E969291129152F25E97B290929292F2DE94A114A11082108430000 +2608C:08087E0808FEFE0808487E2808080F28F45008801F0002103FF8010815202210 +260B3:7E4048407E7C42807EA049107E1004201FC0018006103FF80108112025104208 +260C2:7F2044205F3E51405F5044887F0804201FC0018006103FF80108112025104208 +260C4:100013FE22282A284AEEF228122822EE4A28FA280AEE0228AA28AA2883FE0000 260ED:0820104022FC148408FC128426FC798008FF28802CFE4A42495209F2080C0000 +261E7:200027FE449247FE9000E7FE248046A2948AF54A062A148AAEAAA482894A1224 26221:100011FC202023FE4A22F9AC102021AC4000FBFE402001FC1954E1544154010C +26222:0800080010001FF8210041000100FFFE0100210021F02100210021003FFC2000 +26246:402040207BFEA07020A82124FA2221FC2104A9FCA904A9FCB904C80003FE0000 2624E:402042227BFEA090208821FEFB10251021FEA910A910A9FEB910C91001FE0100 26258:412440A87BFEA20220F82088F8F8200021FCA810A910A9FEB850C89003100030 2626C:00003FF82448244824483FF800000000FFFE0100010001000100010005000200 26270:00000000000000003FFE24122212222220422FFA2002200E0000000000000000 +26279:7FFC444444447FFC100010001FF8200840088808040802080208000800500020 26286:00003FFE222222223FFE00800080088008FC088008800880088008807FFF0000 26293:3FF82448244824483FF8010002800C603218C1061FE000200040068001800040 +262B1:7FFC410442844444482401003FF801000100FFFE000001003FF801000100FFFE +262C6:00007FFC444444447FFC00007C1C09F011501D503148D14811441254525A2468 +2633D:7FFC44447FFC10102828C4C61010FEFE00007C7C00007C7C00007C7C44447C7C 2634C:04100210021000203FFE00800080008000801FFC00800080008000807FFF0000 +26351:0820042004407FFC010001003FF802000200FFFE048004A0089010922082C07E 26393:4420241029FEFC20104810847DFE100210A8FCA810A810A820AA212A41268200 263F4:00007EFC22441224060C1A3462C402041FF0010001007FFC0100010005000200 26402:00147B9408920890089F19F06A92089208921894298C4A88089508A539C20000 -2648D:08007F772211FF1100117F5549337F1149117F3308557F1108110F11F0550022 +2640A:0004EE1E22F02290AA906690229022FE26906A90B2902288228A22AAAAC64482 +26483:0820FFFE08207FFC44447FFC0000FFFE80027EFC224412240A1412246AD40408 +2648D:200011DE7C422842FE42014A7CC654427C4254C67D4A12527C4210421D4AE084 +26548:0040FC404840494879444A424A427C48484848484C107810C820084008800B00 265D2:0100FC9E4BD248127BD44A544BD878144BD248524C9278DACB9408900A900910 +26634:00083C3C25C0244024403C402440247E27C03C402440244224424442543E8800 26676:00203C202420242025FE3C202420242025FC3D04250425042504450455FC8904 +26678:00003DFC2524252425243DFC2524252425243DFC252425242524452455048A0C 2667E:00003DFE2482248424483C3024CC270324103C1024FE2410241044104DFF0000 266B0:00003DFC2444244424843C842518240027FF3D2925292529252946314CC60000 266E8:008878884BFE4888480079FE49024A24482079FC482448444844488449289A10 26706:000079FC480848104A227AAA4A724A224A727AAA4B264AA24A424A024BFE9802 2671D:00203C2027FF250424883C7024D8270725043DFC250425FC250446044C040000 2677C:0020792448A848204BFE78A849244A0248407BFE488849084990486049989A04 +26782:008878884BFE488848207850488849044AFA7800480049FC4904490449FC9904 +267A6:004078404BFE4AA24C9079FE49104B104DFE7910491049FE4910491049FE9900 267CC:00007BFC4A044A044BFC7A484A484AFC4A487A484BFE4AA44AA84A904AC89C86 267EA:001078104AFE4910497C7854487C4B54497C791049FE491049104A904C7E9800 +267EE:008878884BFE488848247BFE4850488849047A8A48884BFE4888488849089A08 2683F:000079FC482048204BFE7850488849044A5279DC485049DC485049DC48509BFE 2688A:01FC3D0425FC250425FC3C8825FC248827FE3C88252426AA247044A855248860 268DD:00003FFE20802080248024FC24042404240424FC24802080208020803FFE0000 +268DE:00003FFC20802080208027F8240824082408240827F82080208020803FFC0000 268EA:00407E4048FE4900487C7E444244427C42007EFE48AA48AA48AA7EAA01FF0000 2690E:02001FF010101FF010101FF010101FF001007FFC03800D603118CFE601000100 26951:000002001C3C10041004100410041E3C100410041004100410041E3C10040000 +26954:01000100050039782108210821083D782108210821083FF82108010001000100 2696F:0000010002001D5C10841D5C10041D5C108411443FFE20022002000000000000 269DD:0C0430381388108811087D2813AE10A812A83AA829282928293E2AC03C3F0000 269F2:08001DFC712411FC1124FDFC104010887DF04420444447FE44227D2446220060 @@ -72706,42 +73569,71 @@ FFFD:0000007E665A5A7A76767E76767E0000 26A1E:0800107C3E0022002A002A0022FE7F2822282A282A282A282A49424946870000 26A29:10902088788848806BFE58A048A0F8A448A44928692859324A224A624C9E9800 26A2D:101020107C1045FE651255145510FDFC45446544552855284510452855448A82 -26A58:081010103EFF22812A812A7E22107F1022902A9E2A902A902AD04330460F0000 +26A58:102020107CFE44826504540054FEFC1044106490549E5490449044D0553E8A00 +26A77:108820887FFE448865FC548857FEFC2045FC652455FC552447FE450455148908 26A8C:081010103EFF22812A912A7E22287F4622002AFF2A022A722A52427246060000 +26AAD:10102210797C481068FE58444B28F9FE4910497C691059FE491049104AFE9C00 26AB7:08FE10923ED622BA2AFE2A1022FE7E1023FF2AAA2B252A102BFE421047FF0000 26ABD:111020907BDE48106A5E59824BDEF8104BDE4A506BDE5A504BDE4A504A529ACE +26AF8:08200820FFFE082008200100010001000100028002800440082010102008C006 26AFF:041004107FFF0410041000001FFC000404080210012000C003600C1870070000 +26B01:08200820FFFE08200820004000407FFC00C00140024004401840604001400080 +26B38:08200820FFFE08200100012001107FFC03800540092011102108C10601000100 +26B3A:04400440FFFE044000003FF82008200820083FF804400440084010422042C03E 26B4C:08200820FFFE08200A20020003F802000200FFFE020002C00230020802000200 26B5C:000008200820FFFE082000001FF010101010101010101FF01010082010102008 +26BB4:04400440FFFE044010001FFC208040801FF810801080FFFE0080008000800080 +26BBC:08200820FFFE082000003FF000103FF0200420041FFC010008844892481287F0 26C21:08200820FFFE082000007E7C124812487E5012487E441244226822504A408440 -26C29:02201FFC022000000FF8088808880FF800800FF800801FFC01400630380E0000 +26C29:0820FFFE08200FE000003FF821083FF801003FF80100FFFE028004401830E00E +26C4C:08200820FFFE082000007FFC482444445FF441044924492449244FE440144008 +26C54:08200820FFFE082000007A204A204A247A284BB04A207A204A204AA24B229A1E 26C73:080804107FFF000024222422294A252A22122212252A26B6286620023FFE0000 26CDD:04107FFF04100FF808080FF808080FF800007FFF04000FFE1112622204460000 +26D4F:0820FFFE082000007FFC08401F48625014621842E03E02007FFC04401830E00E +26D78:0820FFFE08200000FF2024243CA424A83D20242024502F50F488050406020400 26D9F:0820FFFE08201040104011F8FC4810C81C48F0AA10AA51062202488844448444 26E05:0820FFFE0A2001007FFE402280243EF800487E90145014201452248A43FE8000 +26E08:08200820FFFE082000000C1C70E810A8FEA810A810A87CA844A445547D744612 26E40:041004107FFF1410100024FE68921292269279FE08922A92299248FE08000000 26E57:04400440FFFE044001FEFC2010FC108478FC948494FC648404FC080010486084 26E65:041004107FFF04103EFE228022FC248024FC228023FF22922C8A20E423830000 +26E87:08200820FFFE0820204017FC104083F840405FFE12882FFEE42827FC20082030 26ED8:08200820FFFE082008203EF808207EFC145022885FF410101FF010101FF01010 +26F09:0820FFFE0820000008207FFC092010801FFC30805FF890801FF810801FFC1000 +26F4A:08200820FFFE082000003EFC22043E7400047F74555455547F74550455144308 +26F4F:0820FFFE092002001FF010101FF010101FFC10001FFC5244892C1FE01022601E 26F94:041004107FFF04500FFC38400FF808400FF808400FFE120413FC120413FC0000 +26FAE:04400440FFFE044008107E2808443E9222103EFE22103E3808547E9209120810 26FF6:04107FFF051400887FFF0B400AD23B5222C2224E38200BFE082208C2330C0000 26FF7:041004107FFF0410007844902BFC11242BFE4A221BFE2A220BFE1021601F0000 26FF8:04107FFF041C7EF0101E3C9005FF28001FFF20801FFC10841FFC00847FFB0000 270F0:0440FFFE110013DC52545BD4525C53D05A52E3CE3FF8240ACFE614400380FC7E 270F4:04107FFF0410101011FE25026942147F2C907ABE09A22CBE4AA24AA208BE0000 +270FD:08107FFE08903FFE224824FE2D9034FC249024FC249024FE44805244920A21F8 2710D:04107FFF041008003EEE08227F6622AA7722226677AA00227F66120161FF0000 27139:04107FFF0490388A07F97A2901483FFF00083BEA022A3BEC2A252BED38120000 +2718C:0820FFFE0920FFFE02887D7025484D66A0083FF822882EE822884EE842888FE8 +27248:1000100011FE7C1054105420542054687CA45122102214201E20E22040200020 2725F:1020102010207C405448548455FE54827C0050FC108414841C84E48440FC0084 +2726A:100010007E7C1244124422444A7C844401001FF0111011101FF001087FFC2004 +2727E:010001007FFC01003FF80200FFFE082011102FE8C92609200FE001087FFC2004 27285:200021FC2104F904A904A9FCA840A840FBFCA044204428843884E90442280410 +272E5:100011FC11047D04550455FC542054207D20513C152015201EA0E260443E0800 27304:2040208027FEF910AA48AC46ABF8AA48FA48A3F822482A483BF8C8424042003E +2733D:1020112410A47CA8542055FC552455247D7451AC112415241D24E50441140108 +27359:0820FFFE082011F8490821280912710210FE11003FF821083FF801087FFC0004 27371:1040102011FE7D02560455FC544054887DFC5024102015FC1C20E42043FE0000 273DA:08007F3C08243E2400247F4741005D7E08223E222A143E140A080F1471630000 273DB:00043E04007F7F0400443E2400243E84228C3FFC10841FFC0084009E7FE10000 273FE:00003FFE22102FFC22903FFE2C083FFE00801FFC10841FFC0084009E7FE10000 27410:1010101011FF7C1054FE541055FF54827CFE108214FE14821CFE624401830000 +27431:11102110CAA814443240D27C154014FE080001003FF821083FF80104FFFE0002 27449:01000FF808080FF808080FF808080FF808083F3F29293F3F0A0A0E0E79710000 27486:1088105011FE7C5055FC5554559C55047DFC510411FC14081DFEE48840480018 274BD:200021FC2020FBFEAA22A9ACA820A9ACF800A1FC2124292439FCE924412401FC +274FD:3FFE21102FFE211023F822482FFE28522BFA280A284623F8224843F840448FFE +2759A:01007FFC1110FFFE90021FF821007FFC1110FFFE4924BEFA2AA83EF809247FFC 27614:080009FF08107E1002100210041808141D122A10491008100810081008100000 27615:0810081008107E1002100210041E08101D102A10491008100810081008FF0000 27631:1110111011107D11051205DC091009101B10351053101110111111D1170F0000 @@ -72750,32 +73642,801 @@ FFFD:0000007E665A5A7A76767E76767E0000 2770E:112210A210947DFE044804840B1B08E01A1035FC521013FF1010101010700000 27723:1020104011FC7D0405FC050409FC09001BFF350053FE100212AA12A6140C0000 27741:200013FE0252FA520BFE100013DE34425A52954A10C6135A10421042114A1084 +2774E:202011FC0088F8500BFE100011FC352459FC952415FC102011FC102013FE1000 27752:108813FE10887CF8040007FE082009FC1B2435FC5324112411FC108813060000 +2776C:49202A3E7F4849485DA86B104928414442820100FFFE04880C503420C5180606 +277A4:208813FE00A8FC9009FE132011FC352059FC952015FE110013FC10881070138E 277F0:400040FE40287E28AAFE2AAA2AAA4AFE4A1092FE1224224422284210942808C6 278B2:0400040007F0082010403FF85108118812481528198812481428280820284010 -27985:00003EFE00807F8400843EA400943E88008800943E9222A222C022803EFF0000 -279A0:200013FE0200FA0002F87A8802887A8802887AA84A904A824A827A82447E0800 -279A7:2080108000FEFD0002207920012C797403A47924493449284922790248FE0000 +27900:204020207BFE480090007DFC550455047D0455FC54207CA85524562244A28C40 +27901:202020207CFC442088207DFE544854847D22547C54847D485450542044508D8E +27902:104010407C7C10841108FEFE2892449292FE3C924492A4FE28921112290AC604 +27903:200021FC7924492491FC7D24552455FC7C00540057FE7C885488548844888D08 +27904:2020202078A848A890A87D74562254207FFE549054907C9255125512460E8C00 +27905:00507FFC00403E4822503E2000547E8C10043FE04020BFF821083FF821084118 +27906:201023907890489E90A27DAA554C55087D08552C55AA7CCA5488548844A88D90 +27907:204020207BFE482090407C8855FC54247C2057FE54207C7054A8552446228C20 +27908:208820887BFE488890887C8854F854207C2057FE54207C7054A8552446228C20 +27909:2000217C79444944917C7D0055FE54007CFC548454FC7C8454FC548444948C88 +2790A:24043FA44424FFA404247F84449455883FE04020BFF821083FF821083FF84108 +2790B:2108214A7A524B9C91087E5257DE54427C88548857FE7C885488548844888D08 +2790C:202020207BFE488891247E4254FC57087CB054D0573E7CC25524541844608D80 +2790D:2040202079FC480090887C5055FE55227C2055FC55247D245534552844208C20 +2790E:204020207BFE4A0290007DFC540055FC7D0455FC55047DFC5504540047FE8C00 +2790F:100010F83C88248848F8BE002BFE2A883EF82A882AF83E882A9E4BE842088608 +27910:200020F87888488890E87CA854A855FC7D04557455547D545554557445548D0C +27911:3C7820083C7820083FF80400FFFE10102808CFF610203FF811081FF811082118 +27912:208820887BFE488890F87C20542055FC7D24552455FC7C20542057FE44208C20 +27913:204020407BFE488090FC7D1056FE54007CFC548454FC7C8454FC548444948C88 +27914:201023D47848494A90847D0456FA54887C88550454F87C885450542044508D8C +27915:2088204878504BFE90507C5055FC55547D54558C55047DFC5504550445FC8D04 +27916:200021FC7924492491FC7D24552455FC7C0057FE55207D225514554845848D02 +27917:202021247924492491FC7C0057FE54207C4055FC55547D545554555445548D0C +27918:00203E3822483E90227C3E54007CFF54087C08542F542844288C58004FFE8000 +27919:0720782208A4FF201C502A8849048FC210803FF861083FF821083FF821084118 +2791A:2040202078204BFE90007DFC550455FC7D0455FC54207CA85524562244A28C40 +2791B:202020207BFE482091FC7C4057FE54887D3456E254207DFC547054AC47228C20 +2791C:200021FC780048F890887CF8540055FC7D04555455247DFC5524552445248D0C +2791D:202021DE790A494A912A7D52559654207DFC552455247DFC5524552445FC8D04 +2791E:2020201079FE480090847C4855FE55227C1055FE54407C7C5444548444948D08 +2791F:2080208078FC490092F87C0055F854487D6854C855F87C4A54EA555A44468C42 +27920:2104210479DE4A4491547C9E550456247C2457FE54707CA85524562244208C20 +27921:200820087BE84888911E7D5457E454947C9455D454947C8854E8571444148C22 +27922:20403CF84508FEFC4AA47EFC4AA47EFC4AA4870C00003FF00410041C08043018 +27923:208820887BFE488890007DFC550455FC7D0455FC54207C2057FE542044208C20 +27924:2050204878FE499092FC7C9054FC54907CFE548055F87C48544E5482448A8D04 +27925:2020203C782049FE91227D3855E4551C7D20551055FE7D445528551045288EC6 +27926:2020202079FC484090F87D48547854007DFC550455747D545554557445548D0C +27927:2020203C782049FE91227D3855E4551C7D00557C55447D86557C554445388EC6 +27928:200021FC790449FC91047DFC542055FE7D22544055FE7C845448543044488D84 +27929:200021FC7954495491547DFC542054A87CA4552454207CA854A4552444208C20 +2792A:2050384848FEFD9056FC7C9054FC7C9054FE8C8000003FF00410041C08043018 +2792B:2008203C79D0491C91107D7E5552555C7D705552554E7D405548554845548EA2 +2792C:2040208079FC4B0491FC7D00550254FE7C0057FE54807DFC5554555445548D0C +2792D:0200FBBEAC92A912AFE6AD40FD5487DE8564854487DE8544854488C27FFE0000 +2792E:204020407BFE488090FC7D84568454FC7C4057FE54807CFC5584568444FC8C84 +2792F:200021FE791A491691FE7D1255EA55AA7DAA55EA550E7D6A559A552645FE8D02 +27930:200423E4781449CC91447D54554C55447DC6543C55447D44548454E447848C04 +27931:208820887BFE488890407C2055FC54887C5057FE54207C2055FC542044208C20 +27932:200021FE7820485090927D34545854947D32545254907D505420540045548E2A +27933:208423E478844BEE90A47FF454AC57EC7C94549457E47D445544548445548E28 +27934:08007F7808483E8600787F4849307F4850869FE020207FFC21043FFC2104411C +27935:200021EE794A49EA912A7DE45544554A7DEA540054207DFC5420542047FE8C00 +27936:200021FE7820485290B47D5854B455547C92553254007C2055145542464A8C38 +27937:201E21E07822491290847C0055FE54207C5254B455587CB45554549245528C20 +27938:2020204079FE4902917A7D4A5532554A7DFE548455427CFC5548543044488D86 +27939:211023FEFA2027FC3A20E3FC2220A3FE50001FE020207FF821083FF821084118 +2793A:202020207BFE488891247E2255FC54287FFE544055FC7E8454FC548444FC8C84 +2793B:208823FE7888480091FC7CA854A857FE7CA854A855FC7C20542055FC44208C20 +2793C:200021FE790049A891487DFE554255547D50555855F87D485554555445548EA2 +2793D:200021DC795449DC91547DDC550455747D54557455547D74555455B445048D0C +2793E:21F8205078204BFC90A47D2856A054407DFC5554558C7D745554557445048D0C +2793F:208822A87AAE4AA892A07FFC541455D47C1457F454947C8855C856B444948DA2 +27940:0050FFFE22403E4800283E1223AA7E4610823FE04020BFF821083FF821084118 +27941:20003EFC4424BE542A983E502AFC3E102BFE461010007FFC40045FF450145FF4 +27942:200021DC7844495490CC7D54544454207C50548857467C405554554A464A8CC0 +27943:202221D279544940917E7D905558556A7D4C555855AC7D1A552A554845288D10 +27944:200821EC792A492A91E87C0857FE55287DE8552A55EA7D2A557C57AA44368C22 +27945:2020212479FC484890FE7D9056FC54907CFC549054FE7C0055F8544E44828D0E +27946:0810FF1008FE7F100010FF7CA1543E544254FF7C49107F3849547F9249108B10 +27947:20202124792449FC90407DFC552455FC7D2455FC54447C4A54AE54A045228E1E +27948:200821E8794849EE91287DF4554255E27C0055FC55547D545554555447FE8C00 +27949:202023FE780049FC91047DFC540055FE7D0254FC54427DA4545855B444528DB0 +2794A:200023E87AA84AAE93EA7C12548854887DC856A854887DD456B4549444A28CA2 +2794B:200021DC7844495490CC7D54540054487CFE559056FC7C9054FC549044FE8C80 +2794C:2020201079FE4928917C7D2855FE55107D7C5554557C7D54557C550045448E82 +2794D:2040202079FE494891FE7D4A55FE55007D4A556C55487D6A5546550045548EAA +2794E:20F821087BFE494A90FC7C8454FC54847CFC5420543E7C2055FC548444788D86 +2794F:2050208879FE4A9090FC7C9054FC54907CFE548055FE7D4A55FE554A457A8D06 +27950:208823FE782049FC90407FFE548855247EFA548854F87C8854FA549444A88CC4 +27951:0044FFFE21203F1E0000F1F80908FFFE54003FE04020BFFC21043FFC2104410C +27952:20F0211079FC492491FC7C6054AA553E7CF0551055FC7D2455FC546044AA8D1E +27953:20F0211079FC490491FC7D1055D855127CFE551055FC7D2455FC546044AA8D1E +27954:04FEFFAAA9FEAA40AFFEAAA2FAFA8FAA8AAA8AFA8FA28AFA8A8491827FFE0000 +27955:209422D87A924BCE90007DFC555455DC7C5055DC55547DDC555455DC44528C3E +27956:21CE200079CE494A91CE7D6A541055FE7D4855FE554A7DFE554A556C454A8E76 +27957:23FE20887BFE4AAA93767C22541055FE7D4855FE554A7DFE554A556C454A8E76 +27958:3C4844FEBF902AFC3E902AFE46803FF824483FF810003FFC49240FE401143FF4 +27959:01487FC841085CCE95487FC8411E5D4294C27F1481147F8848887F94489489A2 +2795A:02887F8E42087EBE43147A88ADB6B8A0023C7FC4423E7EAA433E7AAAADBEB8CA +2795B:02000100FFFE000000003FF8000000003FF8000000003FF82008200820082008 +2795C:02000100FFFE000000003FF8000000003FF8000000002008200820083FF82008 +2795D:00003FFC020401047FF400043FE400043FE400043FE4202420243FE420140008 +2795E:08040404FFC4000400047F84000400047F84000400047F84408440847F844084 +2795F:100008FC0004FF0400047E0400047E0400047E044204420442047E0442140008 +27960:2020201021FEFC00240024FC2400240024FC2400240025FC2684448440FC8084 +27961:00400020FBFE080011FC100021FC780009FC0904490431FC11042C0043FE8000 +27962:020002007FFC044008203218C1063FF800001FF000001FF000001FF010101FF0 +27963:2000100010FCFE8400847C8400847C8400847C844484448444847CFC44840000 +27964:200010FC1084FE8400847C8400FC7C8400807C804480448045007D0042000400 +27965:088811102220111008880100FFFE00003FF800003FF800003FF820083FF82008 +27966:200010FC1020FE2000207DFE00407C4000807CFC4404440444047C0444280010 +27967:02000FF0342003C03E000100FFFE00003FF800003FF800003FF820083FF82008 +27968:208810881088FE8800887DFE00887C8800887C884488448844807C8044FC0000 +27969:204010401040FE4001FE7C5000507C5000507C504490449044927D12450E0200 +2796A:200010FC1010FE9000907C9001107DFE00107C104410441044107C1044100000 +2796B:202010201020FE3C01E07C2000207C3E01E07C204420442244227C22441E0000 +2796C:204010400080FDF00110791001107910011079104910491249127A124A0E0400 +2796D:200011FC1040FE4000407DF800487C4800487C484448444A448A7C8A45060200 +2796E:200011FE1020FE2000207C3C00447C4400447C8444FC440844087C0845FE0000 +2796F:200010FC1010FE9000907C9001107DFE00107C1044D0443044187C1444100010 +27970:208010FC00A4FD2401247B280528792E01227922492249424942794249940108 +27971:202010200020FC2001FC78200020782003FE7820485048504888788849040202 +27972:08001FF822484488095012200100FFFE00003FF800003FF800003FF820083FF8 +27973:202010201124FD240124792401247924012479FC49244820482078204BFE0000 +27974:20001040119EFD12011279120112791201127912495A49944910781048100010 +27975:2000100010FCFE8400847C8400847CFC00847C844484448444847CFC44840000 +27976:200011FC1020FE2000207C2000207DFC00207C204420442044207C2043FE0000 +27977:20401040107EFE8001007C7800007C0000F87C0844084408440A7C0A44060002 +27978:2020102000A0FCA001FC79200220782000207BFE482048204820782048200020 +27979:202010200020FDFC00207820002079FC0020782048204BFE4820782048200020 +2797A:204010401040FEFC00847D0402847C4400447C144424444445847C0444280010 +2797B:20003FFC40049FC400043FE402047FF400043FE400043FE400043FE420243FEC +2797C:2000100010FCFE0000007C0001FE7C2000207C404440448844847DFE44820000 +2797D:00003FF800007FFC08203118DFF600001FF000001FF000001FF010101FF01010 +2797E:202010281024FE2400207C3E01E07C2400247C284428441044327C4A44860102 +2797F:01107DA009401120621C0100FFFE00003FF800003FF800003FF820083FF82008 +27980:200011FC1004FE8800507C2000507D8800007DFC4404448844507C2044D80306 +27981:204010201010FE2800487C8401047C4000207C204450445044887C8845040202 +27982:0100FFFE00003FF800003FF800002FF028102FF020003FF80108FFFE06C0F83E +27983:200011F81008FE5000207C1003FE7C2200247C204420442044207C2044A00040 +27984:2004101E11F0FF1001107D1001107DFE01107D1045104508450A7D4A45860102 +27985:200011FE1100FF0401447D2801287D1001107D284528454445847D0045FE0000 +27986:200011F80008FC8802527A5202227A2202527A524A8A4B0A4A027BFE4A020000 +27987:2040202023FE3C00240065FC5400CC0025FC1800080011FC1104210441FC8104 +27988:202010101010FEFE00827C8200827CFE00827C804480448044807D0045000200 +27989:200013FE1020FE2001207D3E01207D2001207DFE4402440244027C0244140008 +2798A:3FF820083FF820083FF80100FFFE00003FF800003FF800003FF820083FF82008 +2798B:202010200020FC2403A878B000B078B000A8792849244A244C22782048A00040 +2798C:2008103C01E0FC20002079FC0020782000207BFE482048204820782048A00040 +2798D:208010800080FCFC01547A5400547894009479244A2448444844788449280010 +2798E:200410041008FE1000207C4001807C0001FC7D044504450445047D0445FC0104 +2798F:202010200020FDFE0020782001FC7924012479244934492848227822481E0000 +27990:2008101C01F0FD500150795001507950015079484948494849447A444A420400 +27991:204010200020FEFC00007C0000F87C8800887C884488448A448A7D0A45060200 +27992:200011FC1004FE0400FC7C8001007DFC00047C044404442844107C0043FE0000 +27993:209010901090FE9000907CFE00807C8000807CF84488448844887D0841080208 +27994:0FC008401044E03C00001020FE2000207DFC00207C2000207C2044207C204420 +27995:1020FE2000207C2001FC7C2000207C2044207C2000000FC008401044E03C0000 +27996:2008101C01E0FC2001247924012479240124792449FC492048227822481E0000 +27997:00403C2027FE240024003DFC2400240025FC3C00240025FC2504450455FC8904 +27998:200011FE1102FF02017A7D0A010A7D5201327D12452A452A45427D02450A0104 +27999:2FE8244823882C683FF80100FFFE00003FF800003FF800003FF820083FF82008 +2799A:200011FE1020FE2000407C4000847DFC00087C104420444444827DFE44820000 +2799B:204010401040FEFC00847D0402F47C1400947C544424445444947D0444280010 +2799C:202010200050FC50008879040222782000A878A4492449224A22782048A00040 +2799D:2008103C03E0FC20012478A400A8782003FE7820482048204820782048A00040 +2799E:2040104003FEFC800080792001207BFC05247924492449244934792848200020 +2799F:2008103C01C0FC000040782003FC78040008781048204840488079404A3E0000 +279A0:200011FE0100FD00017C79440144794401447944495449484A407A424442083E +279A1:200011FE0100FD00017C791001107910011079FE4910491049107A104A100410 +279A2:200011F80108FD08010879F800007BFE0080790049F848084808780848500020 +279A3:2040102003FEFC000040784003FE784800887888491048D04820785048880304 +279A4:210011000100FD1E03D279520152795201527952495249524A527A5E45520880 +279A5:1FF81108FFFE20883FF802280110FFFE00003FF800003FF800003FF820083FF8 +279A6:2020102001FCFF2401247D2401FC7D2401247D2447FE450445047D0445140108 +279A7:2080108000FEFD2002207920012C797403A479244934492A4922790248FE0000 +279A8:211011100110FDD001507A5802547A52055278D048904890491079104A100410 +279A9:200011FE1110FF50015C7D7401D47D5401547D5C45504544453C7D0045FE0000 +279AA:00207DFC10241C4462940108FFFE00003FF800003FF800003FF820083FF82008 +279AB:200011F80108FD080108790801F87900010079FC490449044904790449FC0104 +279AC:7CF0109010901D14620C0100FFFE00003FF800003FF800003FF820083FF82008 +279AD:209010900090FD50015C7B7405D4795401547954495C495049527942493E0100 +279AE:200011FC1004FE0400FC7C8001007DFC00047D044488445044207C5044880306 +279AF:200013FC0080FC8000FC795402547894009479244A2448444844788449280010 +279B0:202010100010FE0001FE7C0000047C8400847C484448444844107C1045FE0000 +279B1:020001007FFE4822921401007FFC00003FF800003FF800003FF820083FF82008 +279B2:10007EFC1284228446FC0100FFFE00003FF800003FF800003FF820083FF82008 +279B3:2000100003FEFC2000207840004078FC01847A844C8448844884788448FC0084 +279B4:00907EA00444282812102108DFF600003FF800003FF800003FF820083FF82008 +279B5:200011FC1124FF2401247D2401247DFC01247D244524452445247D2445FC0104 +279B6:2008101C01E0FC0000007BFE0000780001FC790449044904490479FC49040000 +279B7:208010801080FEFE01027D02028A7C5201227D52458A450245FA7C0244140008 +279B8:3FF80100FFFE01007FFC420441045FF440044FE440044FE440044FE448244FEC +279B9:202010200020FC2003FE78200070787000A878A849244AFA4820782048200020 +279BA:2008101C10E0FE8000807C8000807CFE00887C884488448844887C8845FE0000 +279BB:2008101C01E0FC00008879040202780003FE7880490049FC4804780448280010 +279BC:2008103C03D0FE9002907A9002907A9002907A884A884AC84AA47AD444920800 +279BD:204010400040FCFE008279240220782000A878A4492449224A22782048A00040 +279BE:2020102011FCFE2400247DFE00207C2001FC7C044488445044207C5044880306 +279BF:200013FE0020FC2000207BFE02227A2202527A4A4A8A4B024A027A024A0A0204 +279C0:200011FC1080FE8000807CF800887C8801487D284528450845087D4A458A0106 +279C1:20F83E88449AA882327EC1007FFC00003FF800003FF800003FF820083FF82008 +279C2:208010800080FCFE012079200220782000A878A4492449224A22782048A00040 +279C3:00207F1044FE440044005F7C51005100517C51005F00447C444444447F7C0044 +279C4:2040102003FEFD000100790001FC784000407BFE488849084990786049980204 +279C5:2020102011FEFE2000207DFC01247D2401FC7C20452044A044407CA045180206 +279C6:2020104011F8FF0801087D0801F87D0001007DFC4504450445047D0445FC0104 +279C7:200011FC0044FC48008E7882010A7A2400207BFE4820487048A879244A220020 +279C8:202010201048FE8801F07C2000407C8801FC7C24442044A845247E2244A00040 +279C9:2020101011FEFF00010C7D7001107D10011E7D704510451045127D12420E0400 +279CA:201C11E00100FD0001FE79000100797C014479444954494849427A424A3E0400 +279CB:200213E20102FD0A01EA792A012A792A02AA7A4A484A484A48827882490A0204 +279CC:202010201020FE3C00207C2003FE7C2000207CA844A4452445227E2244A00040 +279CD:200013FE1050FE5000507DFC01547D5401547D54459C450445047D0445FC0104 +279CE:20201020103EFE2000207DFE00007C0001FE7C204428442444227C2044200020 +279CF:10007EFC2484188466FC0100FFFE00003FF800003FF800003FF820083FF82008 +279D0:202810240024FC2003FE7A2002247A2403E47A284A284A104A127C2A44460882 +279D1:010000807FFE081004203FFC20402FFE200027FC200027FC200047FC440487FC +279D2:2020102011FCFE2000207DFC01247D2401247D344528447044A87F2644200020 +279D3:202010201040FDFC01547954015479540154795449544954495479544BFE0000 +279D4:2020104001F8FD080148792801287BFE010879484928492849087A084A280410 +279D5:2040102001FEFD02020478F80008781000207BFE482048204820782048A00040 +279D6:20001040019CFF0401047D0401047DDC01047D044504450445047DFC45040000 +279D7:200010881154FF2401547D8C01047DFC00507C504450445044907C924512020E +279D8:204010401078FE8801107DFC01247D2401247DFC4500450045027D0244FE0000 +279D9:20003EFC5244AA44144478440844FF2800287E2800107E1000287E2842447E82 +279DA:400027FC2554FD5405547554055475540FFE7554555455545554754455140408 +279DB:200010FC1084FE8400847DCE00847C8400847DCE4484448444847C8444940088 +279DC:200013FC0204FE0402047B6C02947A9402947A944B6C4A044A047A044A140208 +279DD:200011FE0100FD00017E792401247944017E79144914492449247A444A940408 +279DE:02000F7CF004894452440844FF4400287E2800287E1000107E2842287E444282 +279DF:2090109403F2FC9200907BFE001078120012781448144808481A786649820000 +279E0:21FC10041004FEFC00047C0401FC7C0001FC7C04440444FC44047C0445FC0004 +279E1:200010501048FE8401247C2000507C8801247E224440444844847DFC44840000 +279E2:2040102003FCFD000100790001F8780000A878A848A848A84928792A4A0A0406 +279E3:204010200020FBFE00007A0402947A5402247A244A544A944A047A044BFC0004 +279E4:208810481050FE0001FC7C2000207C2003FE7C204450445044887C8845040202 +279E5:205010501050FE5001FC7D5401547D5401547DFC4554455445547D5445FC0104 +279E6:2040108003FCFE0402047AF402947A9402947A944A944AF44A047A044A140208 +279E7:3FF820082AA824482AA820080100FFFE00003FF800003FF800003FF820083FF8 +279E8:200010F80088FC880088788801067A2001FE7820487048A849247A2248200020 +279E9:204010200020FDFE004878480048794C014A794A4A4A48484888788849280210 +279EA:2020102001FCFC2403FE782401FC7820002079FC482048204BFE782048200020 +279EB:200011FC0104FD04010479FC01007900017C7910491049104A107A1044FE0800 +279EC:082008287F240820FFFC0820FFA400247F2400287F2800107F12412A7F464182 +279ED:2080108000FCFD080290786001987A26002079FC48204A204BFE782048200020 +279EE:2040102003FEFD000100790001FC7800009279244A484C904A48792448920000 +279EF:202010201124FEA400A87C2003FE7C9000907C904490449245127D12420E0400 +279F0:200011FE1120FF2001207DFC01047D0401047D0445FC452045207D2045FE0000 +279F1:21FC10041004FEFC00047C0401FC7C0000207D244524452445247D2445FC0104 +279F2:2008103C01E0FC20002079FC0020782003FE789048904890491279124A12040E +279F3:2020102001FCFC20005078880326782001FC782049204A204BFE782048200020 +279F4:200012200220FE5002887B0402007BFC0040782048A44A824A8A7C8848780000 +279F5:2020102003FEFC200228792401247AAA02AA7850485048884888790449040202 +279F6:202010200050FC8801047AFA0020782003FE782048A848A449227A2248A00040 +279F7:202810240024FC2003FE7820012078B200B4786848A849244A22782048A00040 +279F8:200413C40244FE5402547BD40114791407D4795449544A544A447C4445540888 +279F9:17FC140417FC2208248460406FFEA00027FC200027FC200027FC240427FC2404 +279FA:211011100114FDD8011079120152798E0020782049FC48204820782043FE0000 +279FB:209010900120FD3E03507B500590791E011079104910491E4910491079104910 +279FC:2020101001FEFD020204788000F878880088794849284910481078104BFE0000 +279FD:2040104010FCFE8801507C2000D87D2600F87C2044F8442047FE7C2044200020 +279FE:200011FC1104FF0401FC7D0401047DFC01047D0445FC440044887C8445020202 +279FF:82206C1011FE6C0082006CFC10006C0082FC7E00040008FCFE84088428FC1084 +27A00:202010200124FD240124792402AA7A720020782049FC4820482078204BFE0000 +27A01:04407FFC01003FF80200FFFE08803FFCC0001FF800001FF800001FF810081FF8 +27A02:208010FE0104FD0403747B540554795401547954497449544904790449140108 +27A03:2020102001FCFC200020782003FE78480048794C494A4A4A4888788849280210 +27A04:2088108803FEFC88000079FC0000780003FE7880490049FC4804780448280010 +27A05:1010FFFE11103FF801007FFC0100FFFE00003FF800003FF800003FF820083FF8 +27A06:2040102003FCFC400090790803FC780401507950495049504A507A524452080E +27A07:200011FE0102FD0201FE7910011079FE0110793849384A544A547A9244100010 +27A08:7FFC0920155023887FFC0100FFFE00003FF800003FF800003FF820083FF82008 +27A09:2040102003FEFD00010079FC0000781C01E07820482049FC482078204BFE0000 +27A0A:200011FC0110FD100120793E016079A0013C79204920493C49207A204A200420 +27A0B:200013FC0204FE0403FC7A2402247ABC02A47AA44AA44BFC4A047A044A140208 +27A0C:208810880088FC8803FE7888008878880154795449544A224A2278004BFE0000 +27A0D:0BF8120833F8511012080100FFFE00003FF800003FF800003FF820083FF82008 +27A0E:2040102001FEFD02020478F80000780003FE789048904890491279124A0E0400 +27A0F:200011FE1102FE0400007CF800887C8800F87C88448844F844887C8843FE0000 +27A10:2040102003FEFD0400D8782000D87B4600407BFE488849084990786049980204 +27A11:2040102003FEFC0001F87908010879F800007BFC480848304820782048A00040 +27A12:200013FE0020FE2001FC7D2401247DFC01247D2445FC452044A07C4044B0030E +27A13:2000103C03A4FCA400A47924023C7BA400A47AA44AA4493C49247A80447E0800 +27A14:2088108803FEFC880000784000207BFE01007900490049004900790049FC0000 +27A15:2080108000F8FD0802107BFC02447A4402447BFC48A048A0492279224A1E0400 +27A16:20401040107CFE8401087CFE00927C9200FE7C92449244FE44927D12450A0204 +27A17:200011FC0020FC2003FE782000207800002078A448A449284850788849040202 +27A18:200213E20144FD480150794201427BE4014879504942494249447A484A500460 +27A19:202010200124FD2401247BAE0124792401247924492449AE4A2078224822001E +27A1A:200011FC1104FF0401FC7D0401047DFC00207C2045FC442044207C2043FE0000 +27A1B:200011FC0104FDFC010479FC010479FC00007900491C49E04902790248FE0000 +27A1C:200010F81088FE8800F87C0001FC7D0401047DFC4504450445FC7D0445140108 +27A1D:200013FE1202FE52028A7B0602027AFA028A7A8A4A8A4AFA4A8A7A024A0A0204 +27A1E:2004103E03C0FC44022479280100782000207BFE482048504850788849040202 +27A1F:01007FFC00003FF800003FF820083FF80100FFFE00003FF800003FF820083FF8 +27A20:2040102003FEFA0200887904020279FC0004788848504820485078884B060000 +27A21:200011FC0044FC4403FE7844004479FC0080788049FC4A844C84788448FC0084 +27A22:20881088038EFC880088780001FC7820002078204BFE48204820782048200020 +27A23:02007FFC44444FE4545447C441045FF440044FE440044FE440044FE448244FEC +27A24:200011FC1104FF0401FC7D0401047DFC00007C0045FC442044207C2043FE0000 +27A25:201C11E01120FF1001107D4801867C0001FC7D04450445FC45047D0445FC0104 +27A26:205010500088FD040202780001FC780001FC795449544954495479544BFE0000 +27A27:00407BFE4880517C521064FE50204BFE480049FC680051FC400041FC410441FC +27A28:204010280090FDA402C2788A01887A7800007820492449244924792449FC0104 +27A29:200011FC1020FE2001FE7C5000507C8801247E22442444B244AA7D2A44A00040 +27A2A:2020103E0020FDFC00887870038E780001FC790449FC490449FC790449140108 +27A2B:2020102003FEFC200050788803067888005079FC482048204BFE782048200020 +27A2C:200011FC1124FF2401FC7D2401247DFC00007C0047FE448844887C8845080208 +27A2D:7E2048207E5042507E884904FFFE00003FF800003FF800003FF820083FF82008 +27A2E:2020104001FCFF0401047DFC01007DFC01047D0445FC442047FE7C2044200020 +27A2F:2040102003FEFC400088790403FE782200207BFE487048A849247A2248200020 +27A30:208210820282FBEA048A788A07FA788A03EA7AAA4AAA4AAA4AA27AE2488A0084 +27A31:2040102003FEFE00021C7AF002907A9002FE7A904A904A904AAA7ACA44A60812 +27A32:11107FFC40045FF410101FF00100FFFE00003FF800003FF800003FF820083FF8 +27A33:20201020103EFE2001FC7D0401FC7D0401FC7D24442047FE44207C2044200020 +27A34:2020102003FEFC2001FC792401FC782001FC78244BFE482449FC782048A00040 +27A35:200013FE0200FE40027C7A5002907A1002FE7A104A924A924A927AFE44020800 +27A36:2088108803FEFC880000781C01E0782000207BFE482048504850788849040202 +27A37:20201020113CFD2001207BFE000079FC010479FC490449FC4904790449140108 +27A38:205010500050FDFC01547954015479FC0154795449544BFE4800788849040202 +27A39:200011F80008FC0801F8780800087BFE00207A22497448A849247A2248A00040 +27A3A:08207F2822241420FFFC0820FFA400247F2400287F2800107F12412A7F464182 +27A3B:091013F8311057FC12081504FFFE00003FF800003FF800003FF820083FF82008 +27A3C:20201020103EFE2000207DFE01227D3A014A7DAA4512452A45C67D0245FE0102 +27A3D:402427242524FD44057E75C40644755405547554554455445644744454540448 27A3E:200013FE0202FA52008879040020782003FE7820487048A849247A2248200020 -27A3F:200011FC0020FC2000207BFE0020784001FC7904490449FC4904790449FC0104 +27A3F:200011FC0020FC2000207BFE0040788001FC7904490449FC4904790449FC0104 +27A40:20901090009EFD2201547B08051079640108791E492249424914790849100160 +27A41:1208110817C81008D46A5BAC502850285BAC542A542A93C81288128853A82290 +27A42:2040102003FEFC80008079FE01427A2205FA788248F24892491279524A2A0004 +27A43:208813FE1088FE0000887C5000207C50018C7C004488445044207C5044880306 +27A44:200013FE0000FC880088795401547A2200007BFE48204820482078204BFE0000 +27A45:2040102003FEFE40025C7A6003C07A44023C7A404A7C4A844B487A3044480986 +27A46:200011FC0100FDF80108790801F8790001FC7820482049FC482078204BFE0000 +27A47:2040102402A2FA8A0488787800007BF800887890489C494449287A104A2804C6 +27A48:2040102003FCFE0402047BFC02007A2802247BFE4A204A504A507A8845040A02 +27A49:2040102003FEFE2002FC7A2402247BFE02247A244AFC4A204A507A5044880906 +27A4A:2020102003FEFC200154788801047AFA00007BFE4880490049FC780448280010 +27A4B:1010FEFE38385454929210100100FFFE00003FF800003FF800003FF820083FF8 +27A4C:200011FC1008FC1003FE782000A0784001FC795449544954495479544BFE0000 +27A4D:200011FC0104FDFC010479FC002079FC002478244BFE48204850788849040202 +27A4E:200011F80108FD0801F87908010879F8008079FC4A544C9449247A4448940108 +27A4F:08001FF020205FFE128814449FFE500037FC100037FC500097FC240427FC4404 +27A50:20201020003EFC2001FE7922013879E00122791E4900491049107A284A440482 +27A51:200010FC0284FA8402FC7A0003FE780001FC790449FC490449FC790449140108 +27A52:203811C00038FDC0001C7BE0000079F8014879284FFE4A484A287BFC48080018 +27A53:2080108000FCFD54025478A401247A4400947948482048A44A8A7A8A44780000 +27A54:2020101001FEFD00014479240128797C01107910491049FE49107A104A100410 +27A55:2080104003FCFC000108789007FE784000407BFE488849084890786049980604 +27A56:21FC10240024FDFC0044784403FE780001FC7824482449FC484478444BFE0000 +27A57:200011FC0020FC2003FE780001FE7920012079FE4928492849487A4A4A8A0506 +27A58:200013DE0042FCC6014A7A5200C6794A025278C6494A4A5248427842494A0084 +27A59:2000103C03A4FCA400A4793C02247BA400A47ABC4AA44900497E7A80447E0800 +27A5A:2020102003FEFC500088790402227820012478A8487048A849247A2248A00040 +27A5B:210011FC0204FDF4011479F4011479F4002878104BFE488049FC780448280010 +27A5C:2088108803FEFC88008878F80020782003FE7820487048A849247A2248200020 +27A5D:408021DE2712F912011277DE0112711207D2711E5112511251127222522A0444 +27A5E:7F7C22443E4422283E1023287EC602000100FFFE00003FF800003FF820083FF8 +27A5F:205010500088FCA801247A42008879FC0044782048A44A824A8A7A8A44780000 +27A60:200013FC0204FBFC02447AF402947A9402947AF44A944A944A947AF444960802 +27A61:2020112400A4FEA800207DFC01047D0401747D544554455445747D0445140108 +27A62:2090109202D4FE9802907A9002927AD2070E780048004BFC4800780047FE0000 27A63:209211240248FD240092784000807BFE02027A8A4A524A224A527A8A4BFE0202 -27A84:00403C5E00407EBF00803D9E02803C9E008000803C9E2492249224923C9E0000 -27B2A:400024FE0292F27C0010707C0654727C0254727C521052FE5210751048FE0000 +27A64:200017FE0040FC8003FC7A9402947AF402947A944AF44A944A947A944BFC0204 +27A65:08203E7E08A47F281C102A284944FFFE00003FF800003FF800003FF820083FF8 +27A66:200013FC0008FC1000207BAE02A27AAA02A47AA44BAA483248A078404BFE0000 +27A67:2040102003FEFE4802487BFE02487A7802007AFC4A444A484A287A1044680986 +27A68:208010BC0084FD04017E7B000520793C01507910497E49104928792841440182 +27A69:2080108001FCFD0402087BFE02007A8002FC7B204A204BFE4A207A5044880B06 +27A6A:2080108000FCFD5402D478B4012C7A4400947908484048A44AAA7A8A44780000 +27A6B:202013FE0050FC8801047A4200FC7B0800B078D04F3E48C24B24781848600380 +27A6C:200011FE1010FE2000FC7C8400847CFC00847CFC4484448444FC7C4844840102 +27A6D:2040104003FEFC8001FC7A2005FE780001FC790449FC490449FC790449140108 +27A6E:2040102003FEFA2200A479280050788801047AFA488848884850782048D80306 +27A6F:2020101011FEFF0001447D2801FE7D1001547D544554457C45147D2042400080 +27A70:2040102003FEFA52008879040020781001FC78084810482048C079204A1E0000 +27A71:200013FC0204FE0403FC7A0002847A4802FC7A484A484BFE4A487A4844880908 +27A72:2082108203F2FC82008A7BEA02AA7AAA03EA788A49CA4AAA4CA27882488A0084 +27A73:2088108803FEFC880000788000FC79400240787848404840487C784048400040 +27A74:200011FE0102FDFE0100794E01707942013E791049FE491049387A544A920410 +27A75:209010880080FCFE00807ABC02807ABC048078BC48A448A44924793C4A240000 +27A76:4100213C27D4F9140394711407D47124014C704057FE504050A0711052080C06 +27A77:410021DE2252FA52055A709400907112020E7440502452A2528A748850780000 +27A78:202010500088FD0402FA780001FC7904010479FC488848884BFE788849080208 +27A79:421021102110F83E07A87248022A73AE02BA72EA52AE52A852AA74A254A2099E +27A7A:4100217C2244FA44057C71440244727C06507252525452485254726452420000 +27A7B:2040104007FCF84003F8708007FC7110020875F6584053F8504070A051100208 +27A7C:4008200827C8FA10021E74A407D47114011477D45114510851C87E1454140022 +27A7D:2040102003FEFC8800F8788800F8788801FC780848104BFE4820782048A00040 +27A7E:7E2048207E7E42907E084900FFFE00003FF800003FF800003FF820083FF82008 +27A7F:23DE104203DEFE1003DE784200427A94010878004BFE48004888788449020202 +27A80:23FC100401F4FC4400447BFC00047BFC02007AF84A204A204BFC7A004BFE0000 +27A81:20201220017EFD4000907854075C797401D47954495C49504942793E4A80047E +27A82:210011FC0204FDF4011479F4011479F4000C79F8480848104BFE782048A00040 +27A83:204010200050FC880346782003FE780001FC780049FC480049FC790449FC0104 +27A84:209010880080FD7E01007B3C0500793C0100793C492449244924793C49240000 +27A85:4100213E27C2FAA2029474940288711402A27400502452A2528A748850780000 +27A86:2088108803FEFC8800007BFE000479F401147914491449F44914780448140008 +27A87:2020102013FEFC500088790403FE788800F8788848F84888489E7BE848080008 +27A88:210810880090FBFE00007BC402547A5403D47A544A544BD44A547A444A5402C8 +27A89:2020102003FEFC50008879040242782003FE7820484448A849907A8848A400C2 +27A8A:202010200020FC3E0020782001FC79040104790449FC480048007954492A022A +27A8B:2088108803FEFC88008878000040782400A87A904AA44CC2488279884A780000 +27A8C:20201020003EFC2001FC780401FC780401FC78204920493E49207AA04A7E0400 +27A8D:200011F80108FD0801F87908010879F800007BFC4A944A944A947A9447FE0000 +27A8E:200011FC0104FD0401FC782000207BFE02227A224BFE4820482478224BFE0002 +27A8F:200011FC0124FD2401FC7924012479FC00007BFE492049224914794849840102 +27A90:2088108803FEFC88008879FC0020792400A478A848204BFE4820782048200020 +27A91:201C11E00020FC2003FE78A801247A2201FC7904490449FC4904790449FC0104 +27A92:2040108001FCFD0401FC790401FC782000327BB448A8492849247A2448A20040 +27A93:21FC11240124FDFC0124792401FC782000207BFE4A224A2A4AFA7A0A4A020206 +27A94:7FFC44447FFC00007C7C24244D4CFFFE00003FF800003FF800003FF820083FF8 +27A95:200013DE0242FE4202427BDE02007A3E03D27A124A144BD44A087A144A240242 +27A96:201010140012FC1003FE781001D0789400947BF448144948492A7A1A40260042 +27A97:2008103C01E0FC2000207BFE002078A802AA7AAA4AAA4B764A227A224BFE0202 +27A98:208810480050FDFC002078F800407BFE0080790049FC4A204C2078204BFE0000 +27A99:202011240124FDFC000078620382788A03EA788A49CA49AA4AAA7A82488A0084 +27A9A:202011240124FD2401FC780003FE780001FC7904490449FC488878504BFE0000 +27A9B:2040108001FCFD04010479FC010079FE010079FE48024AAA4AAA7A0248140008 +27A9C:4440225E2292F81207D2711E05527552055277DE5152511252127222542A0844 +27A9D:403823C00040FBFC01507154075871540354754C50E051505248744450420040 +27A9E:2020102010FCFE2000207DFE00407C8401FE7C0245FC455445547D5443FE0000 +27A9F:200011FC0154FD54015479FC002078A801247A22482048A849247A2248200020 +27AA0:2020101001FEFD0001207920053C7B5001907B104DFE491049287A2842440482 +27AA1:2040104401F8FC5003FE784000F87982027E7C0049FC490449FC790449FC0104 +27AA2:2100110003FCFC0001F8780003F8788802A879C84FF8488A49CA7AAA48860082 +27AA3:200011FC0008FC1003A278B400A8792802247CA248404BFC48007954492A022A +27AA4:2040107C0040FBFE02427A7803C47A3C02407A404AFE4A884B507A2044580986 +27AA5:4004201E03F0FA1E021072FE0292729802F2728E528052BE5288748854880918 +27AA6:200011FC0104FDFC010479FC00007BDE00427A52494A48C6494A7A52484200C6 +27AA7:200011DC0154FD5401DC7850005079DC0104790449DC4850485078504BFE0000 +27AA8:200011FE0120FDFC012079FC0120792001FE78024AAA4AAA4AAA7A0248140008 +27AA9:2020104001FCFD0401FC790401FC790401FC7840482048A44A8A7A8A44780000 +27AAA:2020102001FCFD2401247BFE0050788801047A0249FC4954495479544BFE0000 +27AAB:2020104011FCFF0401547D2401547D0401FC7C00451245D445187D524592010E +27AAC:10101E102224544428F810102820FF4400FE7E1200507E5400927F1242507E20 +27AAD:204013BE0212FE9202527AAA0324784003FE7A224A224BFE4A227A224BFE0202 +27AAE:208813FE0088FC2003FE785000887B0600F878004BFE488049FC780448280010 +27AAF:2020102001FCFD2401FC782003FE780001FC790449FC490049FC790449FC0104 +27AB0:08203FF80200FFFE08001FF820805FFC0100FFFE00003FF800003FF820083FF8 +27AB1:210011FC0204FDF4011479F4011479F401087A044DFA488049F8780848280010 +27AB2:20101220017CFD440044787C07407940017C79444944497C49447A80447E0000 +27AB3:2020104001FCFD04015479240154790401FC7800482048904A947A824A8A0078 +27AB4:400824AA02AAF92A02BE7480008070BE0188728854BE508850887088553E0200 +27AB5:10202010FEFE9200927CFE00927C9200FE7C10442A442D7C4F44480287FE0000 +27AB6:2210121002FEFA10071076FE0A827200027C7208521052FE5210721052500220 +27AB7:4100FF865538492055207F20083EFFA400247F2400247F2400247F2441247F44 +27AB8:2088108803FEFC8803FE788800F8782001FC792449FC49244BFE790449140108 +27AB9:2040102003FEFA42002079FC0088785003FE7820482049FC4820782048200020 +27ABA:202010200050FC8801047AFA00007AAA02AA7BFE4AAA4AAA4BFE7AAA4AAA02AA +27ABB:221011080108FBDE0000784202527A5202527A524A544894488478C8471E0200 +27ABC:200010FC0084FE8400FC7C0001FE7D0201FE7D0245FE450245FE7C4844840102 +27ABD:200013FC0090FA940198789007FE780001F87908490849F84908790849F80108 +27ABE:200617780110F9200244727803107224067E7A12521052545252729252500620 +27ABF:2088108803FEFCA801FC78A803FE782001FC792449FC49244BFE790449140108 +27AC0:2040102003FEFC00008879240252788801047A4248A849904A887CA448C20080 +27AC1:2020102001FCFC2003FE780001FC7904010479FC4852489449887EA448C20080 +27AC2:4100213E2102F7C4010877C8054877FE054877C85108510857C8710851280110 +27AC3:08203FF80820FFFE12102AA8CA5616500100FFFE00003FFC00003FFC20043FFC +27AC4:400223E22204FA0803D07202020273C40208721057E25102524477E442280010 +27AC5:2040107C0040FDFC0144797801C4793C010479784910497C4A107AFE44100030 +27AC6:2020112400A8FC2003FE7A02000079FC0104790449FC4850485078924912020E +27AC7:209211240248FD240092780001FC790401FC790449FC490449FC788849040202 +27AC8:0800FF7C00447E7C00447E7C42447E94410806C01830E7CE00001FF010101FF0 +27AC9:2020102001FCFC2003FE782001FC782003FE7800484048244AA27A8A44880078 +27ACA:051004880400FF7E0500063CE400AD3CA600A43CECA4032432A4C6BC19A40080 +27ACB:227CFFC4497C49447F7C08441100FFFE00007FF800003FF800003FF820083FF8 +27ACC:2020113C0120FD2003FE780003C47A5402547BD44A544A544BD47A444A5402C8 +27ACD:2020104001FCFD0401FC790401FC790401FC780049FC482049FC78204BFE0000 +27ACE:2020112000BEFC4200947B10012879440082782048944A924A82788848780000 +27ACF:02003FF821083FF821083FFA0292FC7E0100FFFE00003FF800003FF820083FF8 +27AD0:2040108401FCFC20013C792002FE7C0001FC790449FC490449FC790449140108 +27AD1:211011DE02A8FC4400007BF8008878880090789C4944494849287A104A2804C6 +27AD2:2040102003FEFA020242782003FE7888008879544A2248204BFE782048200020 +27AD3:20201020003EFC2000207BFE02027B26028A7A524B264A524A8A7B264BFE0202 +27AD4:205013DE0050FC5001DC785000507BDE00507820482049FC482078204BFE0000 +27AD5:4100211023DCFA5405547288010872F40402700053FC50405150724855440080 +27AD6:200011FC0124FDFC012479FC0040788801F0782048444BFE482279244A220060 +27AD7:2020102003FEFC2002AA792402AA782002AA79244AAA48504850788849040202 +27AD8:20201010FEFE00007C7C00007C7C00007C7C44447C7C28282A282C4A488A8306 +27AD9:2040102001FCFC8800507BFE000079FC010479FC490449FC489078924912060E +27ADA:2154115403FEFD5401547A7200007BFE0222782049FC492449247924492C0020 +27ADB:2104108803FEFC2001FC782003FE7820001078E048224BB448A879244AA20040 +27ADC:7EFE42107E9042FE7E30485044527A8E0100FFFE00003FF800003FF820083FF8 +27ADD:2040108003FCFE9402647A9403FC789001087A844CFA49084A90786049980606 +27ADE:200013FE0202FE0203FE7A0002FE7A1002FE7A924ADA4AB64ADA7AB644920886 +27ADF:2020109000FCF99002FC789002FC7A9002FE7A004BE048204BFE785048880306 +27AE0:2088108803FEFC8800F8788800F8788803FE788849244AFA482078204BFE0000 +27AE1:2040102003FEFA8A01047BFE0040788801FC7824482049FC482078204BFE0000 +27AE2:210E108A03EEFD0A010E790A01D6780001FC7820482048F8482078204BFE0000 +27AE3:0820FFA0083E7F4449A87F102A2849460100FFFE00003FF800003FF820083FF8 +27AE4:200011FC0124FDFC012479FC00A878A803FE78A848A849FC48207BFE48200020 +27AE5:2020101001FEFD1001FE792801447992017C7954497C4954497C7A104A12040E +27AE6:7E7850485E4868867E78544862307ECC0100FFFE00003FF800003FF820083FF8 +27AE7:202010500088FD2402FA781000207BFE005079FC4954498C490479FC490401FC +27AE8:2020101001FEFD1001547954017C7910017C7944497C4944497C7A444A7C0444 +27AE9:2088108803FEFC88008878F800207BFE02227B324AAA4B764A227A224A2A0224 +27AEA:2040107C0040FBFE02427A7803C47A3C02007A284AC84A884AE87A9444F40822 +27AEB:4000279C0094FB94009477940026778004BC77945494579454887488549405A2 +27AEC:08207F7E28A43E281C102A2849443FFE20402FFE200027FC200047FC440487FC +27AED:2088108803DEFC8801547A2200007BFE000079FC4904490449FC7904490401FC +27AEE:200011FE0102FD0201FE79000122794401EE7944494449EE49447A444A440484 +27AEF:04407C7C04407D7C00803FFC20402FFE20803FFC20002FF820004FF848088FF8 +27AF0:2040102003FEFE1002FE7A10027C7A1402FE7A144A7C4A104A9E7A90457E0A00 +27AF1:202011FC0088FC5003FE780001FC790401FC790449FC48204BFE782048200020 +27AF2:808040404FFEE8020802EFFE0800EAAA0AAAEBFEAAAAAAAAABFEEAAA92AA2202 +27AF3:200C100A0008FBFE02087A48026A7A4A03FA7A4C4A4C4AEC4B5A7A4A44D60822 +27AF4:2088108803FEFC88000079FC0124792401FC78204BFE482049FC78204BFE0000 +27AF5:2020112400A8FDFC00407BFE0088792402FA782048A848884BFE788849080208 +27AF6:202011240124FDFC0020785000887974020279FC4954495449FC79544954010C +27AF7:0820FFBE08427F9449107F282C444A820100FFFE00003FF800003FF820083FF8 +27AF8:2110111003FEFAA80444782001FE7922012079FC4944494449287A104A2804C6 +27AF9:20103E104210FFA8512864D47F8A40085F7C40045F0840285F1051105F089108 +27AFA:212010BE0042FC9400907B2801247942000079FC49544954495479544BFE0000 +27AFB:2010101002FEFD100110787C00547B54017C791049384954499279104A90047E +27AFC:2020101003FEFE4802487A4803FE7A48026C7ADC4ADA4B6A4A487A484A480448 +27AFD:2040102001FEFD00014479FE0144797C01007910495249544AA87A2844440882 +27AFE:4214211207D2F810007E7790049074900790712855A855685928714A554A0286 +27AFF:200011FC0004FCFC000479FC000079DC00947BDC48084BFE4908788848280010 +27B00:2040108801FCFD0802527BDE0040788801F0782048444BFE482279244AA20040 +27B01:204011FC0104FDFC010479FC010479FC0020792448A8492448207BFE48200020 +27B02:2100110003DEFD5202527ADE000079FC010479FC490449FC490479FC48880104 +27B03:20201020013CFD2001207BFE0000788400847A944AD64A944A947AD44F3E0000 +27B04:2090111003DEFE6803C87A4803C87A7E02487FC848C849484A547C54495400A2 +27B05:200013FC0204FE0403FC7A2202FC7A2803FE7A204AFC4B844AFC7A8444FC0884 +27B06:2088105003FEFC2001FC782003FE792400A87BFE480049FC4904790449FC0104 +27B07:202013FE0020FDFC00007BFE020279FC000079FC490449FC490478884BFE0000 +27B08:204010A00118F6E6000073F8020873F8000077BC508454A4529474A452940108 +27B09:1FF010101FF010101FF021083FF841047FFC0A203118DFF600000FE008200FE0 +27B0A:21047FB821203F3E21243F2421247FA42144FFFE00003FF800003FF820083FF8 +27B0B:202417A80292FD1401087A0405BA78A800C67B804A3C4B8448A878904AA80144 +27B0C:200011FC0104FDFC00007BAE02AA7AAA02AA7BAE482049244924792449FC0004 +27B0D:2040102001FCFC8800507BFE0222782001FC7924492C482049FC790449FC0104 +27B0E:200013FE0200FE2402D87A4803FE7A48026C7ADC4ADA4B6A4A487A484A480448 +27B0F:2088108803FEFC8800247BFE0050788801047A8A48884BFE4888788849080208 +27B10:200013FE0020FDFC015479540154790C00007BFE482049FC495479544954010C +27B11:00FC7F10112829445510292845443FFE20803FFC20002FF820004FF848088FF8 +27B12:21FC110401FCFD0401FC780003FE7A5203FE78204BFE488048FC788449140208 +27B13:10007F7822285578BEA8087A7F2608220080FFFE00003FF800003FF820083FF8 +27B14:2088108803FEFC8800F8788800F8782003FE788849244A2249FC787048A80124 +27B15:2020102003FEFC2001FC790401FC782001FC788848504BFE482079FC48200020 +27B16:2088108803FEFC8800007BD4005A7A9401087A4648204BFE4888787048880306 +27B17:2088108803FEFC8800F8788800F8788803FE788849244A2249FC787048A80124 +27B18:200013DE0252FFDE02527BDE02027AFA028A7AFA4A8A4AFA4A8A7A024A0A0204 +27B19:2040102003FEFA0201FC780001FC790401FC78004BFE4A224BFE7A224BFE0202 +27B1A:4100211E07D2FD5207D4755407D87214011277D2521253DA5254745055500890 +27B1B:208010F80108FBFE0512792201FE784000A27B5448984B34485478924B500020 +27B1C:42802282029CF7D002907390029E73940294729457D450145294745450240044 +27B1D:2088108803FEFC8800007BD4005A7A9401087A4448FA49084AD078204850038C +27B1E:200011FC0020FBFE022279AC002079AC000079FC48004BFE4840788849FC0084 +27B1F:2090129202D4FE9802D27B0E000079FC012479FC492449FC48207BFE48200020 +27B20:201C11E00020FDFE00A879240252788801247A22492448A849247A2248A00040 +27B21:2000103C01E0FCA800A87974022278A800A879744A2249FC482078204BFE0000 +27B22:208810880154FA220088788801547A2201FC7904490449FC4904790449FC0104 +27B23:08207F282224FFFE41207F2041247F240824FFA800287F1000127F2A41267F42 +27B24:202011FC0088FC5003FE780001FC792401FC792449FC482049FC78204BFE0000 +27B25:2100111E03B2FD3201527BF40094791203D27E524A524BDA4A547A504BD00250 +27B26:4420242007BCF4A4094877BC029472940FFE7294529457BC521072104A500420 +27B27:2088108803FEFC8800007BD4005A7A9401087A0648F848204BFE785048880104 +27B28:2020113C0120FBFE0010781403FE7A1003F07A544AD44B544A687A4A44960922 +27B29:200011FC0020FBFE0050788801047A5201DC785049DC485049DC78504BFE0000 +27B2A:200014FE0292FA7C0010787C0754797C0154797C491049FE49107A90447E0000 +27B2B:2104108803FEFC0003C47A5403D47A5403D47A444A544AC848007954492A022A +27B2C:205012520154FC5003FE788800507BFE002079FC48204BFE48A879244A220020 +27B2D:200013FE0008FBBE02887AA802BE7B8800087BFE4A8A4A524BFE7A224A2A0224 +27B2E:200013DE0252FFDE02527BDE02527BDE002078204BFE48204850788849040202 +27B2F:2040102003FEFA5201FC785001FC785003FE788849044AFA488878F84884007C +27B30:110023DE7A5213D42A527BDA129423500100FFFE00003FF800003FF820083FF8 +27B31:479E2492079EFC92079E740207FE740A05EA752A552A55EA550A742A54120406 +27B32:200013FE0202FFFE02107A9202547A9202007A924A924AFE4A107A92449208FE +27B33:200011FC0154FD5401FC782003FE788801047A8A485049FC48207BFE48200020 +27B34:23FE1222028AFE5203267A5202AA7BFE000079FC490449FC490479FC4904010C +27B35:2040102003FEFA520088794400207BFE0088788849544A2248207BFE48200020 +27B36:23DE10C6014AFAD6014A7AD6014A7A12002078D84B2648D0482479C8483003C0 +27B37:2040107C0040FBFE02427A7803C47A3C02007BFE4A404BA44A587BB4445209B0 +27B38:4248215023F8F88007FC7110024877FC080273F8500053F8500073F8520803F8 +27B39:209013FC0294FBFC02947BFC00007BFC00007BFC4A044BFC4908789047FE0000 +27B3A:208813FE0088FC2001FC788800507BFE0202782049FC49244924792C48200020 +27B3B:20101210017CFD1000FE7844072879FE0110797C491049FE491079104AFE0400 +27B3C:200017E0025EFFD202527BD202727BDE00407BFE482049FC482078204BFE0000 +27B3D:400027FC2484FDF4051475F4051475F4050475F4550455F45414755449561032 +27B3E:21044FE88010F7DE200447C89452F7DE1102FFFE00003FF800003FF820083FF8 +27B3F:2008103C01E0FC2000207BFE002078A802AA7B764AAA4AAA4B767A224BFE0202 +27B40:211011DE02A8FC4400007BE2022A7A2A03EA788A4BEA48AA48AA7922492A0264 +27B41:082049207F3E084449A87F10222855460100FFFE00003FF800003FF820083FF8 +27B42:4080204007FEF402022473BC04A472A8051072E854045BFA50407248544400C0 +27B43:08203EF808207EFC14506A8C1FE020407FFEA488284427F8200047F8440887F8 +27B44:212412480124FC80032E7A2203AE7A2203FE78204BFE487048A8792446220020 +27B45:23EE128A03EEFE2A03EE7A8A03D6780001FC7820482048F8482078204BFE0000 +27B46:202010500088FD0402FA780001DC795401DC780049FC495449FC79544954010C +27B47:204011FC0104FDFC010479FC00207BFE028A79244BFE488048FC788449140208 +27B48:2040102003FEFA220154794A023A780001FC79544BFE480049FC782048A00040 +27B49:200013FE0124FA2207FE7A2203767AAA03767A224B764AAA4B767A224A2A0204 +27B4A:411027FC0110F7FC040473F8000077FC0080714456A8517056A8712656A00040 +27B4B:240012FE0282FCFE0090788806BE7A9402887ABE4A884ABE4B087A08450008FE +27B4C:400027BE2110FA1007D0755C0554755404D4711C511457E4512472A454760822 +27B4D:47E0225C23C4FA5403C8726807D47064003C77C05144526850D0714856460040 +27B4E:212811AA016CFA2802FE7A4406287AFE02107A7C4A104AFE4A107A284A440282 +27B4F:202013FE0020FDFC000079FC01047BFE020279FC488849FC482079FC482003FE +27B50:48F8705044203DFC20247CB890A07D7E2900FFFE00003FF800003FF820083FF8 +27B51:200013DE0252FFDE02527BDE02527BDE0000780649F84948494879644954026A +27B52:2FEC48244BA4682C4BA46AAC4BA4FFFE81027FFC00003FF800003FF820083FF8 +27B53:208812AA02DCFC8801547A2203FE7A0201FC7820482049FC482878244BFE0000 +27B54:13DC215478CC4954682058504888FB4648204BFE680059FC480049FC490499FC +27B55:41D02E3E0240F54802BE702A0FEA722E02087400578850BE50AA70AA552E0208 +27B56:208813AE00A8FDFC00207BFE00007854019278904BFE489048D47B8A489601A2 +27B57:200813E80288FBEE02287BF402827BE2000079FC49544954495479544BFE0000 +27B58:2110108803DEFC0002527A52019478C8031E780049F8490849F8790849F80108 +27B59:44A422A801B0F7FC040473F8000077FC0080714456A8517056A8712656A00040 +27B5A:444422240028F780007C77440044777C002877285528552A552A774A55460080 +27B5B:210810840000FBDE00007BDE00007BDE00007BDE4A524A524A527BDE4A520000 +27B5C:4020203E2020F7FE042275F8042275FE052475FC552455FC54207554494A123A +27B5D:2088108803FEFC88011079DE02527954028879744A0249FC482079244A220060 +27B5E:212412480124FC0003FC7A9402647A9403FC7A484B684A484B6A7A4A4A460362 +27B5F:400024FE2282FAFE008076AA029C72AA028072A852BE52C852BE7288550808FE +27B60:202013FE0202FC40019C790401DC790401FC79004BFE4C024AAA7AAA4A140008 +27B61:200013FE0228FEFE02287AFE02927AFE02927AFE4A104AFE4A927ABA4A8A0484 +27B62:212410A803FEFA0200F8788801FC790401FC790449FC490449FC780048880104 +27B63:41D02E10209EFA90057E7452015C71700FD2714E5940555C5154755452940126 +27B64:21FC110401FCFD0401FC788803FE788807FE788849244AAA4C7078A849240060 +27B65:212411740258FEDA03FE795402DA7BFE00A278204BFE487048A879244A220020 +27B66:210011F80208FFFE02227A5201FC792401FC7820483C482049FC78884870038E +27B67:4020241022FEFA8000A476A402FE72A402A472BC528052AA532A720055FE0000 +27B68:00FC7F10112829445510292845443FFC20803FFE20402FFE200047FC440487FC +27B69:208813FE0088FCF8002079FC012479FC0222797448A849244AFA78204BFE0000 +27B6A:2088108801FCFC8800887BFE0000788801547A22488849544A22788848880088 +27B6B:202013FE0088FCF8000079FC0104790401FC78504BDE485049FC78204BFE0020 +27B6C:200013DE0252FFDE02527BDE02527BDE00207BFE488849044A8A788848880108 +27B6D:00001FFE529054FE5D9074FC149014FEF02053FE500051FC900021FC210441FC +27B6E:204011FC0124FD94014C792401FC782003FE7A8A49244BFE488078FC4904020C +27B6F:201E13E00124FD2402AA792401247AAA00407BFE4880497C49107A104AFE0000 +27B70:2020101003FEFE4402FE7A4403FE7A1002FE7A924AFE4A924AFE7A004A440482 +27B71:200014FE0228FAFE00AA78FE06107BFE02447AFE4B444A7C4A427A3E4A0005FE +27B72:21FC102003FEFC0001FC792401AC797401FC782049FC48204BFE78004954022A +27B73:7FFC10901F900030FEFE545474740C0C0100FFFE00003FF800003FF820083FF8 +27B74:200011FC0154FDFC002079FC00207BFE000079FC490449FC4850788A4BA400C2 +27B75:4108220807C8FD5C054877C8057E754807DC722A534855A855E8750248FE0800 +27B76:400A200807FEF40805E8740805E8752A05EA748A554C54AC55E8748A4AD615A2 +27B77:208010F80108FDFC012479FC012479FC01547A2A49FC490449FC790449FC0104 +27B78:208010DE0282FBD4054878940322785003DE78504BDE48504BDE78504BFE0000 +27B79:087E2E10287EFF42287E4A420C7E72240100FFFE00003FF800003FF820083FF8 +27B7A:202013FE0088FCF8000079FC0144792401FC78504BDE485049FC78204BFE0020 +27B7B:2014FBFE021073F4020873CA535675D20000FFFE00003FF800003FF820083FF8 +27B7C:4200213C27A4F82404BC732407A4713C07A47124553C559059587128552A0246 +27B7D:410827FE2108F5D2051477DE002077FE000073FC500053FC500073FC520403FC +27B7E:20A0112C0124FDAC012479FC008879FC030679FC490449FC490479FC48880104 +27B7F:7FFC44447FFC00007C7C24245454FEFE00007C7C00007C7C00007C7C44447C7C +27B80:7FFC44447FFC10102828C4C61010FEFE00007C7C00007C7C00007C7C44447C7C +27B81:208813FE0088FD0401D87B76008C7B3001FC78804BFE488048FC792449180266 +27B82:4108252827BEF90807BE731805AA754603F87208520853F85208720853F80208 +27B83:4110211007FCF91001F072080EEA72AC02A876EA5A065040524474A851100E0E +27B84:2020122203FEFC9001FE7B1005FE791001FE791049FE49004BDE7A524A720206 +27B85:44FE22AA02FEF80001FE70000EFC728402FC725252CC53485264720055FE0000 +27B86:23DE125203DEFE5203DE7A5203DE798C025278404FFE48884990786048D80304 +27B87:244412FE0244FCFE009278FE06927AFE02107AFE4A924ABA4A8A7A864A0005FE +27B88:404027FE2492FBFC009073FC009077FE010873FC550A51F85240727C554008FE +27B89:208813FE0088FC1E03E0792402AA792402AA79FC48004BFE488079FC48040018 +27B8A:4108220407C0FD7E07C0755C07C0721C0280735C53D453145554755C54D40800 +27B8B:2020122203FEFC9001FE7B1005FE791001FE791049FE49004BFE7A524AFA0226 +27B8C:21084FD2F03C23884812FBBE0280ABAA10003FFC4004BFE4202C3FE020021FFE +27B8D:23DE125203DEFE5203DE7A2202FA7A5203FE7A024AFA4A8A4AFA7A8A4AFA0206 +27B8E:202013FE028AFDFC008879FC00887BFE01247AFA480048F8480078F8488800F8 +27B8F:21DC110401DCFD0401FC784001FC79540124795449FC48204BFE7A524AFA0206 +27B90:79FC48A851FC50204BFE6880555449F20100FFFE00003FF800003FF820083FF8 +27B91:479E2492279EFC9207FE750A05FA750A05FA740257BA548A56AA759A56AA059A +27B92:23EE128A03EAFE5003EE7A4A02A47BFE005079FC4954498C4974790449FC0104 +27B93:822844240FBEEAE80AA8EFBE0AA8EAA80FBEE428A6A8AB3EABA0EA0291FE1000 +27B94:21FC110401FCFD0401FC78A800F8792401FC78804BFE49244AAA79FC48A80124 +27B95:23DE125203DEFE5203DE7A0202FA7AA202FA7AA24AFA4AA24AFA7A0A4AAA02AA +27B96:4108252827BEF90807BE731805AA75460090709053FC5090509077FE51080204 +27B97:0100FFFE00003FF820083FF81010FEFE00007C7C44447C7C0100508450128FF2 +27B98:23FE122201FCFD2401FC792403FE782003FE7A2249FC492449FC79244BFE0020 27B99:55781448FF4822867F7808486B2849107F2CFFFE00001FF000001FF010101FF0 +27B9A:208813FE0088FDFC012479FC01247BFE022A7AFA4A2649FC492479FC482203FE +27B9B:4214211227D0FABE055476D4045E77D4011477DE5554555455D4745E55500490 +27B9C:23DE125203DEFC0003FE7A0003EE7AAA035A7A4A4BFA4A4A4AE47AA444EA08AA +27B9D:423E2B888A3E5FA2223EEAA2233E2C140122FFFE00003FF800003FF820083FF8 +27B9E:23DE125203DEFE5203DE78A001FE7B2001FC792049FE480049FC78884870038E +27B9F:04403FF801001FF00100FFFE2084FBDE00007BDE00007BDE00007BDE4A527BDE +27BA0:402027FE2488FFFE05DC76AA049C75E0042077FE54A855FC568A74F8548808F8 +27BA1:202013FE028AFD2403FE782003FE7A5203FE790449FC490449FC790449FC0088 +27BA2:21FC112401FCFD2403FE7AAA03FE7AAA03FE788849F048444BFE79244A220060 +27BA3:7EFC42847EFC42847EFC42847EFC24481010FEFE00007C7C00007C7C44447C7C +27BA4:4790251E27A8FC8407BE752A07BE700003F8720853F8520853F870A05124061C +27BA5:7BBC4AA47BBC040478781010FEFE10107C7C4544FFFE00003FF820083FF82008 +27BA6:1010FEFE00007C7C00007C7C44447C7C1010FEFE00007C7C00007C7C44447C7C +27BA7:208813FE0088FBDE02527BDE02527BDE02227BFE4AAA4AFA4A227A724AAA0224 +27BA8:202013FE0000FBDE02527BDE00007BD2004C7BD24A0C4BD2482078D44B480066 +27BA9:2448F6EE54A8F7FE020276EE54A856AE0100FFFE00003FF800003FF820083FF8 27BAA:0020202010201020003E0020F020102011FC1104110411041504190411FC0104 -27BB3:142214222222417F0822082214222222413E3E2222222222222222223E3E0000 -27BBE:03147C14012249414A08200808143E220841083E7F22082214222222403E0000 -27BC7:1410141022FE4144082808FF140022FE41923EFE2292229222FE22113E0F0000 +27BAB:010002C0043009083104C282044008203018C0061FF01010101010101FF01010 +27BAC:000029F82448444890482848444881F87C48444844484448444A7C4A44460042 +27BAD:004028402440444091F82848444880487D4844C8444844AA44AA7D0A45060200 +27BAE:0008281C25E0442090202820442083FE7C2044204420442044207C2044200020 +27BAF:0800085008487E84112410202050288849044AFA9088108824887E8822F80088 +27BB0:002028202450445090882888454482227C0045FC4404440844087C1044100020 +27BB1:001028502450445090882888450482FA78484848484848884888790849280210 +27BB2:010001FC01007FFE40028824111022880C603018C0061FF0101010101FF01010 +27BB3:008828882488448893FE2888448882887C8844F84488448844887C8844F80088 +27BB4:002028202420442093FE28204420822079FC4904490449044904790449FC0104 +27BB5:002028202450448891042A0244F88200780049FC490449044904790449FC0104 +27BB6:0008281C25E04500910029FE45008300797C49444944494449447A7C4A440400 +27BB7:000029F82408448892A82AA846A883E878884AA84AA84AA84BEA78AA49060202 +27BB8:10001F00107C7F8440845F444A4451284A28512860905F10512851285F449182 +27BB9:0020282025FC452491FC292445FC82007DFE4440448044FC44047C0444280010 +27BBA:00482844245E45E090282812446A83967C48445E45E0442444287C12446A0186 +27BBB:000029FC2524452491742924452483FC79044974495449544974790449140208 +27BBC:02000100FFFE0440238824483FF800007FFC492452944C6477DC444447C4400C +27BBD:0020283E242045FE9122293845E08322791E49004978494849487A4A4A4A0486 +27BBE:0E00F050224892844524105010887D04120210F8FE8810882888248842F88088 +27BBF:002028202450448891042AFA442080207BFE4820482049FC4904790449FC0104 +27BC0:0088288827FE4488902029FC4524812479244BFE48204850488879044A020000 +27BC1:008028BC25044508937E2B004540817C7990491049FE49104928792849440182 +27BC2:008028F82488451093FE29004540837C7990491049FE491049287A284A440482 +27BC3:0008500C480A8BFE220852088AE8020A7A0A4AEC4AAC4AA84AEA7A1A4A260442 +27BC4:040078501048FE8411243850548891047E0244F844887C88448844887CF84488 +27BC5:001C29E02420442093FE28A84524822279FC4904490449FC4904790449FC0104 +27BC6:0020241022FE4A828810147C2210417CBC1024FE2410247C24443C44247C0044 +27BC7:0040282025FC448890502BFE440081FC7924492449FC4924492479FC4822001E +27BC8:002028A824A44524900029FC450481FC790449FC4820492449227A2248A00040 +27BC9:20001050FE4882842924442082502888450482FA7C884488448844887CF84488 +27BCA:002028A824A4452A903029C0440081FC790449FC490449FC482079244A220060 +27BCB:000053DE4A528BDE225253DE8A0202FA7A124A924AFA4A324A527A924A2A0204 +27BCC:002029FC250445FC910429FC450481FC7820492448A8492448207BFE48200020 +27BCD:008852AA4ADC888821545222880003FE7242504053FC50445044708451140208 +27BCE:000053DE4A528BDE225253DE8A0202FA7A8A4AFA4A8A4AFA4A8A7B1A4A020206 +27BCF:3FFE21042E3822102FBC27182AB4315222482CA623182C0623F8420843F88208 +27BD0:000049F8450895F8110829F8440083FC7A944BFC48004BFC488078F849080218 +27BD1:000053DE4A528BDE225253DE8A0202FA7A8A4A8A4AFA4A8A4A8A7AFA4A8A0206 +27BD2:00882848245045FC912429AC457483247DFC440044F8448844F87C8844F80088 +27BD3:000053DE4A528BDE225253DE8A0203FE7A0A4AEA4AAA4AEA4A8A7A2A4A120206 +27BD4:004029FC250445FC910429FC440083FE7A224BFE4A224BFE48207A204BFE0020 +27BD5:0040287C244047FE920229FC44A881547A8849FC4A8A48F8488878F8488800F8 +27BD6:0020503C48208BFE220252FC8A4802B4724852FC534A52785248747854480878 +27BD7:01FC50204BFE8A2221AC50388BC40124789848F0484849FC48247BFE4850018C +27BD8:079E54924F9E8492279E54028DA204BE77EA556A55EA555255D2756A57EA0446 +27BD9:53F8484087FC2444235850408B5800007EEE5AAA5EEE500057FC724855540FFE +27BDA:0440082010102008C0063FF8000000001FF0101010101FF008200440FFFE0000 +27BDB:0100210821083FF8010000007FFC00001FF0101010101FF008200440FFFE0000 +27BDC:020001007FFE400280043FF800001FF0101010101FF0000008200440FFFE0000 +27BDD:0008FE1C00E000207C2044204420443E7DE00020442028202E22F022401E0000 +27BDE:0008FE1C00E000807C80448044FE44887C880088448828882E88F10841080208 +27BDF:01001FF001007FFC04401830E00E1FF000001FF010101FF008200440FFFE0000 +27BE0:0040FE40008000FC7D04460444F444947C940094449428F42E94F00440140008 +27BE1:10001EF8228854980882307EC0003FF800001FF010101FF008200440FFFE0000 +27BE2:3FE000447D88055009203518C2063FF800001FF010101FF008200440FFFE0000 +27BE3:01003FF80100FFFE08203018C0063FF800001FF010101FF008200440FFFE0000 +27BE4:0080FE80008000FE7D4045404640447C7C4000404440287C2E40F04040400040 +27BE5:082008287F240820FFFE0020FFA000247F2441287F280210241217AAF8464082 +27BE6:111009203FF80200FFFE08203018C0063FF800001FF010101FF008200440FFFE +27BE7:10FE10807E8010FC10801E80F0FE00003FF800001FF010101FF008200440FFFE +27BE8:0020FE20007C00847D484430442044507D9E0022446428942E08F01040600180 +27BE9:0000FEFE008200827C82448244FE44107C100090449E28902E90F0D0413E0200 +27BEA:0108FE88009001FC7C24442445FC45207D2001FE446228A22D2AF22444200020 +27BEB:0500727E1288510821085E8880883F08210821083F0822081408078878282010 +27BEC:0000FDFE0000009279244A4849244892780001FE8820482050201C20E3FE4000 +27BED:100011FE1E0022FC5284AAFC1484084831FEC00008200820FFFE082010202020 +27BEE:1010FEFE10107C7C1010FEFE101000007FFC00001FF010101FF008200440FFFE +27BEF:0088FC8803FE0088788848F84888488878F8008888884BFE50001C88E1044202 +27BF0:0040FE40007C00847C884500442044CE7C82008244EE28822E82F0FE40820000 +27BF1:0014FC12001003FE781048104BD24A527A5202548BD4480C506A1B8AE1164022 +27BF2:0020FC20002003FE78204924492449247AAA007088A848A851241D24E2224020 +27BF3:01007FFC50041EF8228854980884107C60003FF800001FF010101FF00820FFFE +27BF4:082008207EFC08201C702AA8482400003FF800001FF010101FF00820FFFE0000 +27BF5:0020FC2001FC002079FC48404BFE48887924022288F8482053FE1C20E0204020 +27BF6:100092FE9204FE040004FEF400947C94449444947CF4449428040E04F0144008 +27BF7:0820FFFE08201FC400887D5009203518C2063FF800001FF010101FF00820FFFE +27BF8:1000FE7810487C480048FE8682007C7C00447C4444287C28441028280E44F182 +27BF9:200011FE7C00000044FC2884FE8400847CFC440044847C44444844107DFE4400 +27BFA:202011240124FD2401FC280045FC820009FC4904290411FC2888485083FE0000 +27BFB:100011FEFE10102010687CA401227C20440044FC7C84448428840E84F0FC4084 +27BFC:100011FCFF2411247D7401247DFC45047D7401544554257429540F04F1144208 +27BFD:04402EE824482EE824482EE824483FF800007FFC00001FF010101FF00440FFFE +27BFE:10101010FEFE10107C1000FE7C9244FE7C9200FE4410243828540E92F0104010 +27BFF:10201040FEFE10927C9200FE7C9244A27CFE00484488250828FE0E08F0084008 +27C49:0040FC40104023FE608094903890511299523554569092281428104450842102 +27C53:0048FE44084011FE30504A549C5828524C549A582A924894889A0912292E1240 27CB8:0420182064201220043F182064200C2012FE66820A8212826282048218FE0000 +27D03:10802080D48E0BE8508823E8D2AE1BEA2AAACBEA188A2BEAC88A0892509220A2 +27D10:10202050D488092456FA2050D124195429FCC8201BFE2A42CA920AFA520A2206 +27D65:0040784048FC49047A0849FE4900797C494449447954014851424A428A3E0400 27DA0:00803FFE00800FF800001FFC122414141FFC08080FF808080FF80410380E0000 27E10:000A3C0927FF24083DE8240827F83D2825E8252825E83D2815E522A543120000 +27E18:002078204850488879044AFA4800780049DC4954795401DC5088488889540222 +27E89:080008FC08047E0408480828FE100810282828282E442884290058004FFE8000 27EAF:0808084808287E0808880848FF08080E28F828082E082808280858084FFE8000 +27EDE:100013F810887C9010BC1104FD141248104053FC5CE051505248744450408FFE 27EF4:1080104013F87A0813F81208FBF81280124452285A1052885304720450008FFE +27F34:1020112411247DFC100013FEFC4011FC115451545D5451545154710C50008FFE 27FB7:00007F004100410041007F004900080008004F004800480048004F00F0004000 27FC1:00007C0045FC449044907C90109010905C905090509050925D12E112020E0400 +27FD2:00207C20442045FE45227D24102010205C505050505050505C90E0920112020E 27FEC:00207C20442047FE44207D241124112411245DFC5024502050225C22E01E0000 27FF3:0090789048904BFC4894789413FC129012905BFE50925092511A5D14E2100410 27FF9:000000FC7C8444A4449444847C8413FE11045D445124510451FE5C04E0280010 +2805D:00207C2045FE442044207DFE1102100410F85C10502051FE50205C20E0A00040 2808A:00003DFE25022522257A3D220922097A2D02297A294A294A297A2E02720E0000 280BB:000E3EF02200229122913E4A0800089F2E912891289F289128912E91709F0000 280BE:002078204BFE482048207BFE128A125212FA5A22522252FA52225E22E22A0204 @@ -72783,14 +74444,20 @@ FFFD:0000007E665A5A7A76767E76767E0000 280C5:008079DE4B084908491E7BC81108111E51085BC8513E51085908E10802080408 280E9:00207C1045FE450245027DFE110011EE5D2251AA516651225D66E2AA02220066 280F0:00887C50440045FE44507DFC105413FE10545DFC505050D851545A52E0500050 +2810C:00007DDE4442455244CA7D52104210205CFC5084508450FC5C84E08400FC0084 28154:00007BDE48884AA84BFE798812DA14A611F85D08510851F851085D08E1F80108 2815D:01247CA847FE460244F87C8810F810005DFC5010511051FE5C50E09003100030 28207:0790F51E97A8948497BEF52A27BE2000A3F8BA08A3F8A208A3F8B0A0C124061C 28277:081010103DFF25013D45248225113C28244425837C0014FE248244820CFE0000 28282:080011FE3D2225AA3D72252225FE3C2025FE24207FFF1400255245290E290000 +282BB:100010FC1048FE4810487C4854487DFE54487C481048FE481048108810881108 +282CC:01007FFC01001FF011101FF01110FFFE01003EF8028822881450082034D8C306 282CD:104010401080FC8811047FFE54027C9054907C901090FC9011121112120E1400 282E2:104010201020FE0011FE7C0054047C8454847C481048FE481050101013FE1000 +282F0:201020102210F93E2122F844A810F890A890FB102128F9282128214420442082 282F3:100011FF7F0111117D11557D7D11551155117D2911297F451101110111FF0000 +28325:01000100F13E27C8210827C82548F7C8257E27C8210837C8C108017E01000100 +2834F:1040102011FEFD4811487DFE55487D7855007DFC1144FD4811281210122814C6 2837D:1040102013FEFC8811247E4254907DF854087C4410A8FD90128814A410C21080 2838A:1040102013FEFC8811047EFA54887C8854F87C4410A8FD90128814A410C21080 283CD:110415557D55128A7C5154007DFE550254207FFF10A87CA41122122110200000 @@ -72798,18 +74465,29 @@ FFFD:0000007E665A5A7A76767E76767E0000 2840C:008000803FFE0410021002207FFF008000801FFC008000803FFE008000800000 28455:000043FE22021202020202020202720212021202120213FE1000280047FF0000 28468:000023FC1204120402040204F3FC120412041204120413FC1204280047FE0000 +28473:0010207813C0104000400040F3F8104010401040104017FC1000280047FE0000 +28482:0010207813C0104000400240F278124012401240124017FC1000280047FE0000 28487:000023F81248124803F80248F24813F810401040104010401040280047FE0000 +28523:0480448024802E8E05EA04AAEEAA35AA24AA24AA24AE24AA256050008FFE0000 2856B:01080108410827BF10A900A9013F712913A91569113F11081108290847FF0000 28595:7FFC03000D70710C000047F8211000A0E7FC244427FC244427FC2444544C8FFE 285C8:21FC110409FC410421FC102007FF700011FC110411FC102011242A6247FF0000 285C9:204017FE04924F1F200017FE00C0776210A41738106811A4162328C047FF0000 +2860C:080044F820881EE802A804A8EDFC37042574255425742504250C50008FFE0000 28678:100010FC1084FE88108810B0FC88048804844884288410C828B0448080800080 +2868D:8400843E842284248424F7A88424842484228422842294B4A528C62084200020 +28693:1200121E12127F92129412947F98521452127FD21252125A2354229042108210 28695:107E104220444244FF580044244424422442FF42246424582440444044408440 +286B2:0800083E0822FFA4102410282F2421246222A2223FA22234222822202A202420 286D7:00003E7E224222423E4400447F484944494449427F424042414C41403F400000 +286F3:2400247C2444FF4824482450FFC800487E44424442447E68425042407E404240 286FA:1100113F7FA111211F22112211241F22112211217FE10821112620A040200000 +28712:20002F3CF524252475282528F5302928232408240824FFB414282220412080A0 +28714:0800107C7F4441487F4841507F4800487F44084408443E6808500F40F8404040 287AA:0800FFBE08227F240024FFA800A47F240822FFA20022FFB40128EFA0A920E320 287E0:773E55227724552477285524772422227FA2A4223F3424283F2024203FA02020 28891:0088F850200023FEF850A9FCA854ABFED85489FC8850F8D889548A52F8508850 +288E7:0040F82023FE2088F852AFACAAAAAAA8DDAC88008904F9FC890489FCF9048A04 28946:08201420123C20247E44084408847E0808084A102A1828240E42188161010000 28948:100011F8280824084008B808100811F8FD0811009500590051021D02E0FE4000 28949:08101410121020107E92089208927E9208924A922A9228920E92189260FE0000 @@ -72836,6 +74514,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 28BC1:12002B3C22844F147288123E162A7FBE16AA5ABE5AAA32AA16A61B40623F0000 28BEF:08101410127C21547D7C081008FE7F44097C4B442D7C29440D7C1A82647F0000 28C3E:100011F83C0820084088BC88108810FEFC021002100211FA1402180210140008 +28C44:102010203D2421244124BD2411FC1020FC201124112411241524192411FC0004 28C47:102810243C24202043FEBC20112010B2FCB4106810A810A415221A2010A00040 28C4D:2100209E3BD2225242547BD4A2582254FBD222122292225A2AD4335022100010 28C4E:102010503C88210442FABC0011E2112AFD2A11EA112A112A15EA1922112A0164 @@ -72856,20 +74535,31 @@ FFFD:0000007E665A5A7A76767E76767E0000 28E39:00007DFE44104810482050204868486444A24522442068205020400043FE4000 28E89:000E7CF444A24492491151014811481045FF4410443858544092411140100000 28E99:00007C40459C4904490451DC4904490445FC445044506850505040924112420E +28EAD:001C79E04820482053FE602050A848A849744A22682052224222422243FE4002 28EE7:0040FBBE8A1292929252A2AA932490408BFE8A228A22D3FEA222822283FE8202 28EEB:00207C2045FC4488485053FE480049FC452445FC4524592441FC4021401F0000 28EF6:00207CA845244A2A483050C049FC490445FC450445FC682050A8412442A24040 28F32:00447DFF44444410482850FC4B43487C4440447C444059FF4044409A41E10000 +28F4D:00207BFE482051FC500063FE52524BFE490449FC690451FC410441FC40884104 +28F7B:40204C2070FC422443FE3E2400FC7C200124FEA8107054A85324922250A02040 28FF8:071278120124497F2AC82048087E3E48084808487F7E084814482248407F0000 +290D9:3FF801007FFE41029D7400003FF821083FF821083FF80200FFFE04401830E00E +29166:3FF801007FFE41029D7400003EF822883FF811101FF011101FF00100FFFE0100 +291EF:04407C7C04403C7804407C7C044004401FF0111011101FF01010100410040FFC 2925C:280029F0FD102910391011107D10551055107D101110FD1211121212120E1400 +29299:28902894FC9229123910137E7D10551055107D281128FD281128114411441182 292A0:141014927F9214541C5408103E102AFF2A283E2808287F480849088909070000 292B1:288028807DFE2A0038FC10847CA4549457FF7D0411247D1411FF100810380000 +2935C:280029FCFD5429FC382011FC7C2057FE54887C5011FCFC2013FE102010201020 +2937F:508853FEF888541272FE2010FCFEAA92AAFEF89221FEFA92260422FE2244222C 2945D:000020FEDE10922092FC9284928492FC928492FC9A84D48490FC104810841102 2947E:04000EFEF010902090FC9084FC8490FC908490FC908488848AFCC64892840902 29490:00007F7F1010107E1242227E2D427942087E08427F42087E08100F2470C30000 294BA:140012FEFE10102010FEFE82928292FEFE82928292FEFE82928292FE92448682 +294D0:100010FEFE10102010FCFE84828404FC788408FC10841E84F0FC104850842102 294E5:04000E7E701040207F7E44424442447EFF42007E08424942497E49007F240142 295CF:7FFF02203FFE22223FFE00001FFC10741784108417F4149427F420954FEA0000 +295D7:00007F7C41444D44717C51447D7C55447D44517C55007D2845444082807E0000 2967F:080008001400120029007E00A2003E0022003E0020003E00200020003E002000 296A8:0808081C1460124029407E40A2403E7E22483E482048284824482A4832FE2000 296AC:1020101028FE24825282FCFE44807C8044BC7C844488509048A055226522421E @@ -72878,14 +74568,639 @@ FFFD:0000007E665A5A7A76767E76767E0000 29704:100011FE284824485048FDCE45027D0245027DCE444850484848544865FE4000 29719:08100810147C2A1068543E4423FF3E4422443E0020FE22482649398961070000 29730:100011FE280024FC5084FC8444FC7C0045FE7D22452251FE4922552265FE4102 +2974E:108010F02910262051FCFD2445247DFC44507C92430E5060481054C064204010 29750:0842142212242DFF20487E4822923F2222B43E4820483E9220B63FD921110000 29751:104010202BFE26025404FDFC44007DFC45047DFC410451FC4904540063FE4000 2980C:2022201221143C8044BE4808A00821BE208820882094209228A23140223E0000 2980D:2210211021103FBE4A40520083BE228A228822A822AE22A82AA835A8245E0880 29810:10842108421021081084FFFE020004003FF820083FF820083FF820083FF82008 +29869:00007C1050907C9050907C90509050907C900490548854885488850415040A02 +298B0:00907C9450927D1251107F7E511051107D100528552855285528854415440982 298C6:00423F222424247E3F10241024103F7E241024103F1001FF5510551042100000 +298E1:00107E1048FE7E1048107EFE488248007E7C0208AA10AAFEAA10821014500820 +29944:00107E1048FE7E10487C7E44487C48447E7C0244AA7CAA44AAFE822814440882 +29949:00207D2451247D2451FC7C0053FE50007DFC0504550455FC5488845017FE0800 29A02:0088F848085049FC4904490449047DFC042004101C54E5424542054A2A381000 -29A72:00003E7E22422E7E2A427F42417E3E20227F3E9123913EA922C522F926060000 +29A2C:00207C10441075FE5420FE2082447C8445F87C1044207C44448245FE54824800 +29A38:00107C10449274925492FE9282FE7C1044107C9244927C924492449254FE4802 +29A70:01107D1245D475185552FF92832E7C4045FC7D0445047DFC4504450455FC4904 +29A71:00007DDC454475445544FFDC83007D0045DC7D1445147DD44508450855144922 +29A72:00007CFC448474FC5484FEFC82407CFE45127C9244AA7C8244FA440254144808 +29A73:00087C3C45E0742055FEFE2083FC7D2445FC7D2445FC7C2045FC442057FE4800 +29A74:000C7C0A440874FE5488FE8882FA7C8A448A7CEC44AC7CAC44EA448A54964922 +29A75:00807CBC4484750855FEFF2083207D7C45907D1045FE7D104528452855444982 +29A76:00207C204450744854A4FFFA82887CF844887CF844A27C94448844A454C44880 +29A77:00207C1044FE74445428FEFE82887C9044A47C8844907CA24484448855104860 +29A78:00887C8845FE748854F8FE2083FC7D2445247DFC44207FFE4420442054204820 +29A79:01FC7C2045FC75245554FF04832C7C20443C7C2045F87C884450442054D84B06 +29A7A:00407C8045FC750455FCFF0483FC7C2044327FB444A87D284524462454A24840 +29A7B:00087C1C44F074905490FEFE82907CBC44A47CBC44A47CBC44A44524553C4A24 +29A7C:001C7CE0441C74E0541CFEE082447CFE44027CFC44847CFC448444FC5484488C +29A7D:00207C3C4444740854FEFE9082907C9E44A87C8844BE7C884488451455144A22 +29A7E:00207C1044FE748254FEFE8082BC7C8044FE7C8044BC7CA444BC452055224A1E +29A7F:00207C1045FE74005484FE4883FE7C0044FC7C8444847CFC4484448454FC4884 +29A8B:08207E20087EFEC410281E1022285FF690101F901090FFFE90121FF010101030 +29AA0:00803FFE225024FC2D9036FC249024FC248023F822482FFE4A0A43F882080218 +29AA1:7E7842487E4854867E7854487E3094CE7FF011107FFC50141FF010101FF01030 +29AA2:01007C8847C87408555EFEA283C47C0045C87D4845487DC84554455455D44822 +29AA3:00407C2045FC74885450FFFE82007CF844887CF844887CF844004554554A4A3A +29AA4:00507D5244D4745055FEFE8882507DFE44207CFC44207DFE44A8452456224820 +29AA5:00007CF8442075FC5524FEA882207CA844507CA845147CF84408441054604810 +29AA6:00087DC8457E7550555EFFA4835E7D4045487D7E45507D9E45244544553E4900 +29AA7:00107DC8457E75405562FFD483007D3E45C87D48477E7D48454845C855484908 +29AA8:2A103E1E49107FFC04447F2810101E2822465FF011107FFC50141FF010101030 +29AB0:00007CF8442075FC5524FEA882207CA844007DFC44207DFC455445545554490C +29AB1:001C7DE0442075FE5420FFFE82AA7E7247FE7C2045FC7C2045FE440055544A2A +29AB2:00207CA044BC74A055FEFE5083547DAC45047DFC45547D5445AC450455FC4804 +29AB3:000C7CF04454745454BAFE5482547CBA44107DFE44407C7C44904490551048FE +29AB4:00887DFC442075FC5440FFFE82887D2446FA7C8844F87C8844FA449454A848C4 +29AB5:00447DF4455477F8555EFFF2824A7DFA454A7DFA448A7FF4451445A4546A4D92 +29AB6:01087D0845EE76945442FE0083EE7D2A45EA7D2A45EA7D0A454E45A855084C08 +29AB7:00007C0845DE7548556EFF54838E7D40454E7D6A45AE7D2A452E452A55204D5E +29AB8:00007DFE4512756C5524FFFE83247D6E45B47D2445107D50455C455055504AFE +29AB9:00AC7D2445AC752455ACFE50838E7CF844887CF844887CF8448844F854504888 +29ABA:01FC7D0445FC750455FEFE2083FE7E2245AC7C2045FC7C0047FE4440548849FC +29ABB:00887C8844EE755454FEFEAA82AA7CFE44547C5E44B07D924494448A549648A2 +29ABC:00887FFE448875DC5554FFDC82A07C9045FE7D2047FC7D2045FC452055FE4900 +29ABD:00007A424A5C7CB04A50FC9086DE78144FF47A544CB47A544C944ED448145FE4 +29ABE:21084B92F03C23884812FBBE0280ABAA00001FF011107FFC50141FF010101030 +29ABF:20401040FE4000407DF844487C480048FEC88248BA68AA5AAA4ABA8A82868F02 +29AC0:01007FFC08200FE000007FFC48244FE4400C10001F0001007FFC02800C60F01E +29AC1:2008103CFEE000207C20443C7CE00020FE20823EBBE0AA20AA22BA228222861E +29AC2:01007FFC08200FE000007FFC48244FE4400C3E80048008800E8078840884187C +29AC3:01007FFC08200FE000007FFC48244FE440047FFC00001FF000207FFC01000300 +29AC4:20081008FE4800287C0844887C480008FE0E83F8BA08AA08AA08BA0882088608 +29AC5:20201028FE2400247C20443E7DE00024FE248228BA28AA10AA32BA4A82868702 +29AC6:20081028FEC800487C4844487C4801FEFE488248BA48AA48AA88BA8883088608 +29AC7:00007FFC010003600D187104000001007FFC08200FE000007FFC48244FE4400C +29AC8:20201028FE2400247C2045FC7C200020FE208250BA50AA50AA88BA8883048602 +29AC9:00007EFC1224122412242A54448801007FFC08200FE000007FFC48244FE4400C +29ACA:01007FFC08200FE000007FFC48244FE4400C04401830E10E0FE0010001007FFC +29ACB:20101010FE1000FE7C9244947C9000FCFEA482A4BAA8AAA8AA90BB2882448682 +29ACC:01007FFC08200FE000007FFC48244FE4400C00007FFC40044FE448244FE4400C +29ACD:01007FFC08200FE000007FFC48244FE4400C11001FF821005FF00100FFFE0000 +29ACE:01007FFC08207FFC444447CC0000FFFE020007E0384000801FF0711011300100 +29ACF:01007FFC08200FE000007FFC48244FE440047FFC08200FE001007FFC01000100 +29AD0:4220241000FE7E00247C2444247C2400FEFE248224BA24AA24AA44BA44828486 +29AD1:20421024FE0000FE7C2444247C240024FEFE8224BA24AA24AA24BA4482448684 +29AD2:01007FFC08200FE000007FFC48244FE4400C0000FFFE2480CFF8188868980080 +29AD3:01007FFC08200FE000007FFC48244FE4400C0000FFFE08401F4C62701442F83E +29AD4:2008101CFEF000107C1044107CFE0010FE108290BA9CAA90AA90BA9083FE8600 +29AD5:01007FFC08200FE000007FFC48244FE4400C1FF00600192006C039B0068C7980 +29AD6:01007FFC08200FE000007FFC48244FE440047FFC08204FE441047FFC01000100 +29AD7:01007FFC08200FE000007FFC48244FEC40003FF828282FE820083FF801000100 +29AD8:2000107CFE4400447C7C44007CFE0082FE8282FEBA82AA82AAFEBA82828A8684 +29AD9:20201040FEF800887CF8448A7CFA008CFE8883F8BA18AA28AA48BB8882288610 +29ADA:01007FFC08207FFC444447EC08200FC00080FFFE02000FF030400FF878880898 +29ADB:20201010FEFE00007C4444447CAA0010FE008210BAFEAA10AA10BA1082108610 +29ADC:200010FEFE9200927CFE44927C9200FEFE008244BA44AAFEAA44BA4482448684 +29ADD:20201040FEFE00927C9244FE7C920092FEFE8228BA48ABFEAA08BA0882088608 +29ADE:01007FFC08207FFC444447EC08200FC000407FFC0600192006C039B0068C3980 +29ADF:20001104FD0401DE7E4445547C9E0104FE248224BA20AAF8AA20BA2083FE8600 +29AE0:1020FE2044207CFC0024FE24AA24BA2483FEFE2044507C501088FE8811041202 +29AE1:1000FEFE44007C00007CFE44AA44AA7CBA448644107CFE443400520092FE1000 +29AE2:200010FCFE1000107DFE44007CFC0084FEFC8284BAFCAA84AAFCBA0082488684 +29AE3:200010FCFE8400847CFC44007CFC0084FEFC8284BAFCAA84AAFCBA0082488684 +29AE4:21041104FDDE02447D54449E7D040224FE2483FCBA60AAB0AB28BA2682208620 +29AE5:49209210497E0000FE7C9244FE7C9200FEFE1082FEBA18AA34AA52BA92821086 +29AE6:20101020FE4400FE7C4444AA7CEE0010FE288254BAAAAA50AA24BA4882108660 +29AE7:1000FEFC44007C0000F8FE88AA88BAF88288FE8844F87C881000FE0011FC1000 +29AE8:1018FE1444147DFE0110FF10A510BDD48154FF5445487DC8115AFF16112612C2 +29AE9:1000FE7C44447C44007CFE00AAFEBA928292FE9244FE7C801080FE821082107E +29AEA:1020FE4044FE7C920092FEFEAA92BA9286FE7C2844487DFE1008FE0810081008 +29AEB:1020FE4044FE7C920092FEFEAA92BA9282FEFE2844487DFE1008FE0810081008 +29AEC:2020107CFE44007C7C44447C7C0000FEFE9282FEBA92AAFEAA00BBFE82448684 +29AED:1020FE2245FA7C240028FFFEAA20BA4082FCFF8444847CFC1084FE8410FC1084 +29AEE:1020FE4044FE7C920092FEFEAA92BA9282FEFE2844487DFE9208FE0810081008 +29AEF:1028FE2445FE7C2001FCFF24A5FCBD2481FCFF2444087DFE1088FE4810481018 +29AF0:1020FFFC45247DFE0124FFFCA520BDFC8124FFFC44407DFE1088FFD01070118C +29AF1:1010FFFE45107D7C0114FFFEA514BD7C8110FF7C45547D7C1154FF7C1154124C +29AF2:01007FFC08200FE000007FFC48244FE4410C07C015507FFC54547C7C1212FEFE +29AF3:F7DE9212F7DE0440F7DE9452F39E04400100FFFE10101FF00000FFFE88228FE6 +29AF4:3E0420183E6020043E182062FF0422187F6002003FE00420042008203022C01E +29AF5:3E0420183E6020043E182062FF0422187F6000000080044008203018C0060000 +29AF6:3E0420183E6020043E182062FF0422187F6000001FF8001000E0008002800100 +29AF7:3E0420183E6020043E182062FF0422187F6004000410046007803C02040203FE +29AF8:3E0420183E6020043E182062FF0424187E6001003FFC01040204040418146008 +29AF9:3E0420183E6020043E182062FF0424187E6001003FF821082108212821100100 +29AFA:3E0420183E6020043E182062FF0424187E60010021082108210821083FF80008 +29AFB:3E0420183E6020043E182062FF0422187F6000003FF800083FF8200020041FFC +29AFC:3E0420183E6020043E182062FF0422187F6000000FE008200A2009221122601E +29AFD:3E0420183E6020043E182062FF0422187F60000001003FF801000100FFFE0000 +29AFE:3E0420183E6020043E182062FF0422187F60100C0C3002400080008000800080 +29AFF:3E0420183E6020043E182062FF0422187F6000007FFC01003FF8210821180100 +29B00:3E0420183E6020043E182062FF0422187F60000001003FF82108228824482018 +29B01:3F0820303EC42018FF62220C7F70000000F03F00210020803FFC20402824301C +29B02:00083E3020C420183C62200C3C7020102010FE5C105020504450FEB0029E0100 +29B03:3F0820303EC42018FF62220C7F7018100660018006601818624401800E70F00E +29B04:3E0420183E6020043E182062FF0422187F600100110011F81100290047FE8000 +29B05:3F0820303EC42018FF62220C7F7000001FF012101110FFFE1010201040508020 +29B06:3F0820303EC42018FF62220C7F7000007FFC010011F821003FFC000400140008 +29B07:3E0420183E6020043E182062FF0422187F6001200110FFFE028004401830E00E +29B08:3E0420183E6020043E182062FF0422187F6000002080208C3EF020822682387E +29B09:3F0820303EC42018FF62220C7F700000044008203018DFE60420082010A02040 +29B0A:3E0420183E6020043E182062FF0422187F6000000100111022A004401830E00E +29B0B:3F0820303EC42018FF62220C7F7000003FF0082007C01830E10E1FF001000100 +29B0C:3F0820303EC42018FF62220C7F700400082010103FF80448044008441044603C +29B0D:3F0820303EC42018FF62220C7F7000001FF01110FFFE221022103FFC00100060 +29B0E:3E0420183E6020043E182062FF0422187F6000F83F000100FFFE010001003FF8 +29B0F:3F0820303EC42018FF62220C7F7000001FF010101FF010101FF0101010501020 +29B10:3E0420183E6020043E182062FF0422187F60000000781FA01120111021084004 +29B11:3E0420183E6020043E182062FF0422187F600000010001FC01003FF820083FF8 +29B12:3E0420183E6020043E182062FF0422187F6000007FFC41041FF0111011300100 +29B13:3E0420183E6020043E182062FF0422187F6020003FFC41009FF0111011300100 +29B14:3E0420183E6020043E182062FF0422187F60010006C01930EFEE004006800100 +29B15:3F0820303EC42018FF62220C7F7000A000903FFE2080208820524022405A8186 +29B16:3F0820303EC42018FF62220C7F70028004401930E64E1990062018C007003800 +29B17:3F0820303EC42018FF62220C7F701020102024FC7C240824102424447E540288 +29B18:3F0820303EC42018FF62220C7F70000008001FFC210441080920111025080200 +29B19:3F0820303EC42018FF62220C7F700810081013FE301051101090101010501020 +29B1A:3E0420183E6020043E182062FF0422187F6000001010FFFE10101FF010101FF0 +29B1B:3E0420183E6020043E182062FF0422187F6000007CF8108810881C8AF10A0206 +29B1C:3F0820303EC42018FF62220C7F7000003FF820083FF821002FE0412042229C1E +29B1D:3F0820303EC42018FF62220C7F7000007FFC01003FF821082288244828082018 +29B1E:3F0820303EC42018FF62220C7F7000001FF010101FF010101FF010101FF01010 +29B1F:3F0820303EC42018FF62220C7F7008000FF8140027F04400040007F804000400 +29B20:3F0820303EC42018FF62220C7F700400080010103FF800081FF010101FF01010 +29B21:3E0420183E6020043E182062FF0422187F6000301FC010001FF810401040FFFE +29B22:3E0420183E6020043E182062FF0422187F600000111011101FF0410441047FFC +29B23:3F0820303EC42018FF62220C7F7000003FF8002003C01C38EFE601000100FFFE +29B24:3E0420183E6020043E182062FF0422187F600420FFFE0910116021844F0480FC +29B25:3E0420183E6020043E182062FF0422187F6000001E781248FFFE124826884118 +29B26:3E0420183E6020043E182062FF0422187F60020001003FF808200440FFFE0000 +29B27:3E0420183E6020043E182062FF0422187F6000007FFC010011F81100FFFE0000 +29B28:3F0820303EC42018FF62220C7F70000001003FF80100FFFE040008201FF00810 +29B29:3E0420183E6020043E182062FF0422187F6000000100FFFE01001FF010101FF0 +29B2A:3F0820303EC42018FF62220C7F70000001F03E0001007FF8006003801C00E3FE +29B2B:3E0420183E6020043E182062FF0422187F6000003FF820083FF8101020084004 +29B2C:00047C08403041C47C0840307DC440084030FDC0200021FC4954FD5447FE0000 +29B2D:3F0820303EC42018FF62220C7F7008001FF0210001007FFC02800C603018C006 +29B2E:3F0820303EC42018FF62220C7F7000001FF811081FF811081FF8110811282110 +29B2F:3E0420183E6020043E182062FF0422187F60010006C01930E54E092015100200 +29B30:3E0420183E6020043E182062FF0422187F6000007CF8108810C81CAAF10A0206 +29B31:3F0820303EC42018FF62220C7F700000244814500C601450644808421042603E +29B32:3F0820303EC42018FF62220C7F7001003FF821083FF821083FF800A203C27C3E +29B33:3E0420183E6020043E182062FF0422187F60000001003FF82288244821082298 +29B34:3F0820303EC42018FF62220C7F7000007FFC03000D70710C00000100FFFE0100 +29B35:3F0820303EC42018FF62220C7F7000000C0070FC40847C8440844C9470880080 +29B36:3F0820303EC42018FF62220C7F7001001FF00110FFFE01101FF00100FFFE0100 +29B37:3E0420183E6020043E182062FF0422187F60111022201110410441047FFC0004 +29B38:3E0420183E6020043E182062FF0422187F60082004407FFC11101FF002000C00 +29B39:3F0820303EC42018FF62220C7F7000003FFE2FFC208027F820802FFC20003FFE +29B3A:3F0820303EC42018FF62220C7F70000020F03F0420041FFC10081FF810081FF8 +29B3B:3F0820303EC42018FF62220C7F7000000FE01020601C0100FFFE05401930E10E +29B3C:3F0820303EC42018FF62220C7F7000003FF8220827C82A882108228824483FF8 +29B3D:3F0820303EC42018FF62220C7F7000003FE0044002800100FFFE05401930E10E +29B3E:3E0420183E6020043E182062FF0422187F6000007FFC0440244814500440FFFE +29B3F:3E0420183E6020043E182062FF0422187F600100FFFE04880C503420C5180606 +29B40:3F042018FF62220C7F7004007FFC08001FF028104FF088100FF0081008500820 +29B41:3E0420183E6020043E182062FF0422187F6000002A542A542A542A544A548A94 +29B42:3E0420183E6020043E182062FF0422187F60000011100920FFFE04401842E03E +29B43:3E0420183E6020043E182062FF0422187F6001003FF821083FF801087FFC0004 +29B44:3E0420183E6020043E182062FF0422187F600000111009207FFC05401930E10E +29B45:00003E0420183E6020043E182062FF0422187F6000007EFC22441A3462C4060C +29B46:3F0820303EC42018FF62220C7F700000010006C01830E7CE00001FF010101FF0 +29B47:3F0820303EC42018FF62220C7F701FF011101FF011101FF001003FF80100FFFE +29B48:00003F042018FF62220C7F7000007FFC02001FF010101FF010101FF010101FF0 +29B49:3F042018FF62220C7F7030100CE003000CC03230FFFE11003FF0D11011300100 +29B4A:3F042018FF62220C7F7000003FF820083FF820003FFC20042FE448244FE48008 +29B4B:3F0820303EC42018FF62220C7F7000003FF821082FE823882548292820083FF8 +29B4C:3F0820303EC42018FF62220C7F7001007FFC092009201550228804401830E00E +29B4D:3F0820303EC42018FF62220C7F7000007FFC03000D70710C01001FF010101FF0 +29B4E:3F0820303EC42018FF62220C7F70010011101FF002007FFC040007F008103030 +29B4F:3F0820303EC42018FF62220C7F7000F87F00221011200200FFFE082007C07838 +29B50:3F0820303EC42018FF62220C7F7000007FFC06003B0804B019C062A00C987306 +29B51:3F0820303EC42018FF62220C7F70000001003FF80100FFFE0440444889441080 +29B52:3F0820303EC42018FF62220C7F700420FFFE056009900960119021644F8480FC +29B53:3F0820303EC42018FF62220C7F700000FFFE04403FF82848303827C820083FF8 +29B54:3E0420183E6020043E182062FF0422187F60081011FE2420083C184428940908 +29B55:3F0820303EC42018FF62220C7F7001007FFE4202844408201FF004440844703C +29B56:3E0420183E6020043E182062FF0422187F6001007FFC09203118CFE608200FE0 +29B57:3F0820303EC42018FF62220C7F7001107FFC01003FF821083FF821083FF82108 +29B58:3E0420183E6020043E182062FF0422187F6008087EFE18082C484A2888080818 +29B59:3F0820303EC42018FF62220C7F7000007FFC1110222011103FF801000100FFFE +29B5A:3F0820303EC42018FF62220C7F7000001FF010101FF001007FFC05401930E10E +29B5B:3F0820303EC42018FF62220C7F700FC010803FF851081FF811081FF811082118 +29B5C:3F0820303EC42018FF62220C7F700000008078FC49044A48484078B0030C0C02 +29B5D:3F0820303EC42018FF62220C7F70000002403C500848FFFE08507E240854198C +29B5E:3F042018FF62220C7F7001003FF00110FFFE01103FF0111009A005401930E30E +29B5F:3F042018FF62220C7F70010001FC01003FF820083FF820083FF80100FFFE0100 +29B60:3F042018FF62220C7F7000801FFC10041FFC140817F8240827F8440884280410 +29B61:3F0820303EC42018FF62220C7F70000004403FF80440FFFE10101FF010101FF0 +29B62:3F042018FF62220C7F70010021083FF800003FFC20002FF820805FFC40808080 +29B63:3F0820303EC42018FF62220C7F7001007D1809603318DFF610101FF010101FF0 +29B64:3F0820303EC42018FF62220C7F70044008203218C4460FE001204884489287F2 +29B65:3F0820303EC42018FF62220C7F7008000FE0102022401C7810081E7810081FF8 +29B66:3F042018FF62220C7F70000000F83F0001007FFC1110FFFE11107FFC01003FF8 +29B67:3F0820303EC42018FF62220C7F7004003FF821083FF822083FF80880FFFE0080 +29B68:3F0820303EC42018FF62220C7F7000000FF008000FF00800FFFE111014E0181C +29B69:3F042018FF62220C7F700100FFFE01003FF821083FF821083FF803801D70E10E +29B6A:3F0820303EC42018FF62220C7F7000003FF820083FF82080249047F048888FF8 +29B6B:3F0820303EC42018FF62220C7F7000003FF801007FFC4104514449245554410C +29B6C:3F0820303EC42018FF62220C7F7010A023F848A813F832A053FC10A411341228 +29B6D:3F042018FF62220C7F7000001FF810081FF810081FF820803E8C20F22682387E +29B6E:3F0820303EC42018FF62220C7F7002800C603118CFE6002000404904489287F2 +29B6F:3F0820303EC42018FF62220C7F7000007FFC04403C78200820083C780440FFFE +29B70:3F0820303EC42018FF62220C7F7001007FFC09203118CFE608200FE008200FE0 +29B71:3F042018FF62220C7F700100FFFE21083FFA010200FE3FF820083FF820083FF8 +29B72:3F0820303EC42018FF62220C7F701040207C7E84430442447E24420442287E10 +29B73:3F0820303EC42018FF62220C7F7008001FF864880908362801104884489287F2 +29B74:3E0420183E6020043E182062FF0422187F6001007FFC482417D0210801007FFC +29B75:3F042018FF62220C7F70020001007FFE40029FE410201FE010001FF010101FF0 +29B76:3F0820303EC42018FF62220C7F701020082041FC2124052409FC7124112411FC +29B77:3F0820303EC42018FF62220C7F70000001007FFC09201550238805401930E10E +29B78:3F0820303EC42018FF62220C7F70020001007FFC09203118CFE608200FE00820 +29B79:3F042018FF62220C7F7008201FF00210FFFE08A03318CC4603801C3001C03E00 +29B7A:3F0820303EC42018FF62220C7F7000007FFC10101FF03FF821083FF821083FF8 +29B7B:3F0820303EC42018FF62220C7F7001007FFC044028281FF02828CFE608200FE0 +29B7C:3F0820303EC42018FF62220C7F70000013F8120823F86040AFFE215022482C46 +29B7D:3F042018FF62220C7F70020001007FFE44028FE4144003801C70EFEE08200FE0 +29B7E:3F0820303EC42018FF62220C7F7000207E20247E18A4FF2829104A2888441982 +29B7F:3F042018FF62220C7F7004447C780442FC3E1FF010101FF010101FF010101030 +29B80:3F042018FF62220C7F7008001FF82A4844480A88110822A800104904489287F2 +29B81:3F042018FF62220C7F7008007F7C08243E2408447F5408880200FFFE0860701C +29B82:3F042018FF62220C7F7000001FF010101FF010101FF008001FFC628414541FE8 +29B83:3F042018FF62220C7F70020001007FFE4912912406E03818DFF4082007C0F83E +29B84:3F0820303EC42018FF62220C7F700000061838E0083C7EE0083C1DE22A22481E +29B85:3F042018FF62220C7F700400FFFE1210EFEE14C00700388003F81D3001C03E00 +29B86:3F042018FF62220C7F7000003F0421243F2421243F2421243F24120421144088 +29B87:3F0820303EC42018FF62220C7F700100FFFE921221085FF4020003E004201860 +29B88:3F0820303EC42018FF62220C7F700820FFFE04403FF82848303827C820083FF8 +29B89:3F042018FF62220C7F7000000FF028102FF028102FF028103FFC042003C07C3E +29B8A:00043E1820E2200C3CF020003CFE209220AAFE7C1054207C4454FE7C02560092 +29B8B:3F0820303EC42018FF62220C7F70020001003FF80440FFFE10101FF010101FF0 +29B8C:3F0820303EC42018FF62220C7F70000008FC7E8418FC2C844AFC888408FC0884 +29B8D:3F0820303EC42018FF62220C7F70018006601FF8E8160FF008100FF408680C1C +29B8E:3F0820303EC42018FF62220C7F7001007FF809203118CFE608200FE00820FFFE +29B8F:3F0820303EC42018FF62220C7F7000203FFE20202FA420242FA848924FAA8046 +29B90:3F0820303EC42018FF62220C7F7000000FE009200FE009203FF821482FE82438 +29B91:3F0820303EC42018FF62220C7F7000001FF010101F9010907FFC444447C4400C +29B92:3F042018FF62220C7F7000007FFC44447FFC0100FFFE08000FF810082028C010 +29B93:3F042018FF62220C7F7000001FF0111012903FF821083FF821083FF8210A4106 +29B94:3F042018FF62220C7F7000007FFC41043FF801001FF011101FF01110FFFE0100 +29B95:3F042018FF62220C7F70000013F8100821F8200867FEA40221F020902060239C +29B96:3F0820303EC42018FF62220C7F70010041047FFC00007FFC10101FF00820FFFE +29B97:3F0820303EC42018FF62220C7F7020201010FEFE00004444242428280EFEF000 +29B98:3F042018FF62220C7F700100FFFE10101FF000007FFC40044FE448244FE4400C +29B99:3F0820303EC42018FF62220C7F700440FFFE04407FFC08200FE0083EFFE00020 +29B9A:3F042018FF62220C7F7000007FF01210092007C0F93E1FF011101FF001087FFC +29B9B:3F042018FF62220C7F700100FFFE01007FFC440408801F0002103FF811102308 +29B9C:3F042018FF62220C7F7000003F8420943F9420943F9410143FD44954124424CC +29B9D:3F042018FF62220C7F70020001007FFE41029FF401003FF801001FF010101FF0 +29B9E:3F0820303EC42018FF62220C7F7045FC292411FC2924D9FC2820C9FC082033FE +29B9F:3F0820303EC42018FF62220C7F7000003FF80100FFFE01007FFC492455547FFC +29BA0:3F0820303EC42018FF62220C7F7001007FFE4922929404401FF0E82E0FE00820 +29BA1:3F0820303EC42018FF62220C7F7000007FFE40029FF40600192006C038A00318 +29BA2:3F0820303EC42018FF62220C7F7000003FF81C7014501C7005403FF80100FFFE +29BA3:3F042018FF62220C7F70010009E009007FFC04001FF012101110FFFE12102130 +29BA4:3F0820303EC42018FF62220C7F7000287E2424FE1820FF3C29544A4888941922 +29BA5:3F0820303EC42018FF62220C7F7001007FFC044028281110E92E054009201310 +29BA6:3F0820303EC42018FF62220C7F70199806601FF8E8160FF008100FF008100830 +29BA7:3F042018FF62220C7FF0044003800C407EFC22441C3862440100FFFE0920711C +29BA8:3F042018FF62220C7F7001003FF801007FFC080010103FF800003FF82448FFFE +29BA9:3F042018FF62220C7F70010006C01A30E10E1FF010101FF010101FF82808CFF8 +29BAA:3F0820303EC42018FF62220C7F7000003FF82448FFFE24483FF84904489287F2 +29BAB:3F042018FF62220C7F7000002278144808481486227808487F2808102A285946 +29BAC:3F042018FF62220C7F70044008203218C4460FE000207EFC12240A141224264C +29BAD:3F0820303EC42018FF62220C7F70100023FE7C2045FC7D2441247D3445287C20 +29BAE:3F0820303EC42018FF62220C7F70000002001FF010101FFC10001FFC5244892C +29BAF:3F042018FF62220C7F7008207F20083E3E4408A4FF2810281E1022284A448482 +29BB0:3F042018FF62220C7F7004003FF8220827E82A48218826483FF84904489287F2 +29BB1:3F042018FF62220C7F7001007FFC01003FF80200FFFE0EE018302FE8C8260FE0 +29BB2:3F042018FF62220C7F7000803FFC041002203FFE24802FFC308047F840809FFE +29BB3:3F042018FF62220C7F7000007FFC04403FF824483FF80000FFFE111025080200 +29BB4:3F042018FF62220C7F70010021083FF808801FFC30805FF890801FF810801FFC +29BB5:7F7848485E8664785F284A1051287F4400003F0820303EC42018FF62220C7F70 +29BB6:3F042018FF62220C7F700820FFA0083E7F4249947F101C102A28492888440882 +29BB7:3F042018FF62220C7F70120067DC444447C4444457DC6000044004420842703E +29BB8:3F042018FF62220C7F700820FFA0083E7F4449A47F281C282A10492888440882 +29BB9:3F042018FF62220C7F701FF011101FF011101FF008201FC002103FF809201310 +29BBA:3F042018FF62220C7F701FF010101FF010107FFC44447FFC01001FF802083C18 +29BBB:3F042018FF62220C7F7000003FF8210822882448000029482528294A25263182 +29BBC:3F042018FF62220C7F70000000407EFC15440838FE441AA22CFC4844A8941108 +29BBD:3F042018FF62220C7F7008207FFC08200FE001003FF821087FFC010006C0F83E +29BBE:3F0820303EC42018FF62220C7F7000007F7848485E8664785F284A1051287F44 +29BBF:3F0820303EC42018FF62220C7F7008207E2008F8FF2814287F6A082AFF560882 +29BC0:3F042018FF62220C7F700000204017FC104003F8724813F811501248284047FE +29BC1:3F042018FF62220C7F7001003FF82108FFFE11101FF00400FFFE082007C07838 +29BC2:3F042018FF62220C7F7000007DFC44207D2045207DFE4050505048925512620E +29BC3:3F042018FF62220C7F7004407FF804483FF824403FFC10141FF810101FF00820 +29BC4:3F042018FF62220C7F700440FFFE04403FF824482BA83FF80020FFFE08200460 +29BC5:3F042018FF62220C7F7001007FFC40043FF810101FF03FF821083FF821083FF8 +29BC6:3F042018FF62220C7F7001003FF80100FFFE08203EF808207FFC04401842E03E +29BC7:3F042018FF62220C7F70000000907EA004442BA810102FE8C8260FE004407FFC +29BC8:3F0820303EC42018FF62220C7F7008007F2822241420FFFE22283E10222A3EC6 +29BC9:3F042018FF62220C7F7000001FF010101FF01010FFFE22003E7C23A47E180266 +29BCA:3F042018FF62220C7F7001003FF8044028281FF02828CFE608200FE011102308 +29BCB:3F042018FF62220C7F7008287F2408203EFE22203E2422283E12082A7F460882 +29BCC:3F042018FF62220C7F700454282810103EF8C2961F0820F03E90026014900908 +29BCD:3F042018FF62220C7F700820FFFE0820FFFE22003EFC22443E282390FE2802C6 +29BCE:3F042018FF62220C7F7000A000903FFC20803E5022244A54848C3FF82448FFFE +29BCF:3F042018FF62220C7F7012900AA03FF804407FFC01001FF00100FFFE0440783C +29BD0:3F042018FF62220C7F7008207FFC0920FFFE3FF801021FFE10101FF010101FF0 +29BD1:3F042018FF62220C7F7008201FF0102025487EFC04401930E10E115025280200 +29BD2:3F042018FF62220C7F7008103E7C08107EFE142822445FF21010111006C03830 +29BD3:3F042018FF62220C7F701084210810841FF0111012903FF821083FF8210A4106 +29BD4:3F042018FF62220C7F7001007FFE40029FF411101FF0141017F027F0241047F0 +29BD5:3F042018FF62220C7F7000107DFE0420184851FE5C0250A85CA8712AC22A0406 +29BD6:3F042018FF62220C7F70000010401020FDFE1102327C380055FE502091241262 +29BD7:3F0820303EC42018FF62220C7F7000003FF8292825483FF80100FFFE24484224 +29BD8:3F0820303EC42018FF62220C7F7000001FF00200FFFE08203FF8D29613901030 +29BD9:3F0820303EC42018FF62220C7F7002003FF824483FF80600192006C038A00318 +29BDA:3F042018FF62220C7F7000407BFE489049FE528448FC488468FC508440944088 +29BDB:3F042018FF62220C7F7010207E20523E4A447EA41028FF2820103E2842448682 +29BDC:3F042018FF62220C7F7001FC01003FFE210221F02F0420FC20804FF841088618 +29BDD:3E042018FE62220C7F700820FFFE08201FF010101FF008003FFCD1041FE40018 +29BDE:3F042018FF62220C7F700E0028787F28A110162838C4D11009207FFC05403938 +29BDF:3F042018FF62220C7F7000001FF010107FFC44447C7C01007FFC05401930E10E +29BE0:3F042018FF62220C7F7002001FF0111012101FF00100FFFE90122FE848240FE0 +29BE1:3F042018FF62220C7F70060038F820083CF820083FF808402528294A25263182 +29BE2:3F042078FF14227E7F2410520820FFFE02003FF820083FF820083FF820083FF8 +29BE3:3F0820303EC42018FF62220C7F7005402BA825483FF814102FE8144003807C78 +29BE4:3F042018FF62220C7F700100FFFE00003FF827C824483FF810101FF01010FFFE +29BE5:3F042018FF62220C7F7001007FFC0200FFFE08201FF02828CFE6082024884244 +29BE6:3F042018FF62220C7F7001007FFC0100FFFE3FF20100FFFE00107DFC44907C30 +29BE7:3F042018FF62220C7F7000007F0814087F7E55087F483E2800087F082A285910 +29BE8:3F042018FF62220C7F7000007FFC21087FFCB55A292835582108355829283558 +29BE9:3F042018FF62220C7F7000241FFE502057A4752417A8F4A85792951217AA2046 +29BEA:3F042018FF62220C7F701040202045FC790410F824887CF8008054FC548480FC +29BEB:00047C1841E2400C7DF040207DFE410240FCFC9420FC20A448BCFCA444BC0142 +29BEC:3F042018FF62220C7F703000CBFC2D2431FCC92415FC64200DFC3420C5FE1800 +29BED:3F042018FF62220C7F7001007FFE4002BFFC21083FF828082FF848084FF88410 +29BEE:3F042018FF62220C7F70011047FC211081F0404017FC1664E55426EC2444244C +29BEF:3F042018FF62220C7FF010403FF051101FF01C426FFE10203FF851081FFA787E +29BF0:3F042018FF62220C7F7008002A28492414203F2E6470BF2424283F12242A3F46 +29BF1:3F042018FF62220C7F7000001FF010101FF010103FF808207FFC292845C41B30 +29BF2:3F042018FF62220C7F7001007FFC0200FFFE0CE01FF0E82E0FE00100489487F2 +29BF3:3F042018FF62220C7F7008107E7C0810FEFE142822445FF2149012501FF00820 +29BF4:3F042018FF62220C7F703FF824483FF81FF001007FFC10101FF004901C60671C +29BF5:3F042018FF62220C7F700EE0F11E3FF80820FFFE121011101FF04904489287F2 +29BF6:3F042018FF62220C7F7004283F240420FFAE127073A412287392121A17A6F842 +29BF7:79204228F9245224F9200A3E10E09224FE2424287F28C8107E32484A7F864102 +29BF8:3F042018FF62220C7F70003C7FC01110292811102928FFFE080037F0C0801FFC +29BF9:3F042018FF62220C7F7000007FFC08001FF068100FF07EFE20407EFCA3443E7C +29BFA:3F042018FF62220C7F7000007FFE5F3C44107F7E4E345552609044F84480BFFE +29BFB:3F042018FF62220C7F701FF0111012907EFC24483C7824483C78264EFDF80408 +29BFC:3F042018FF62220C7F700820FFFE3FF824487FFE50129FF410101FF010101FF0 +29BFD:3F042018FF62220C7F7010F8FD0810FC7C8454FC7C8410FC388454FC90481084 +29BFE:3F042018FF62220C7F7C44447C7C44447FFC240027F028803FFC208048888FF8 +29BFF:3F042018FF62220C7F7C4104729C4C64FFFE10101FF010101FF010101FF00820 +29C00:3F042018FF62220C7F70000008407F7C1440FF7C22043E7C22403E7C2242263E +29C01:3F042018FF62220C7F7011282AA4FFFE14207724142877281412771A1426FF42 +29C02:3F0820303EC42018FF62220C7F7000003FF801007FFE492284143BB82AA83BB8 +29C03:3F042018FF62220C7FF020807FE0A0203FE038E41FFC20407FF0A2103FF4F0FC +29C04:3F042018FF62220C7F70204017FE940243F84150126021FCE3242DFC20882104 +29C05:3F042018FF62220C7F700440FFFE04445FFE57A075201794F494578A951627A2 +29C06:3F042018FF62220C7F70000038382828FEFE44447C7C44447C7C4646FCFC0404 +29C07:3F042018FF62220C7F7042002410FEFE10287E5442FE7E1042FC7E4442387EC6 +29C08:3F042018FF62220C7F70102029FC5420FBFE488879DC48887BFE509059126A0E +29C09:3F042018FF62220C7F7001007FFC1110FFFE92923FF80440FFFE04901C60671C +29C0A:000007F4008403E4008407F40004000400040004000400040004000400040004 +29C0B:00005FC042004F8042005FC04000400040004000400040004000400040004000 +29C0C:00005E7A44225E7A44225E7A440247F2480257C2418242024412441243FA4004 +29C0D:00005E7A44225E7A44225E7A420241025FF241024122411241024102410A4004 +29C0E:00005E7A44225E7A44225E7A40024442442244FA5F02426241824652583A4004 +29C0F:00005E7A44225E7A44225E7A400242424422481257EA4222442248A2504A4004 +29C10:00005E7A44225E7A44225E7A41024282444259324102492251124502420A4004 +29C11:BEFA8822BEFA8822BEFA800282029FF284028FE2942287E2842287E2842A8464 +29C12:00005E7A44225E7A44225E7A40024FF240024FF248124FF2442242425FFA4006 +29C13:BEFA8822BEFA8822BEFA84429FF28442BFFA882297D2A44A87C2842283EA8004 +29C14:BEFA8822BEFA8822BEFA810282828C62B7DA81029FF289228542BFFA80028006 +29C15:04401830E00E5E7A44225E7A44225E7A42024CE24EE248224FE24282449A5874 +29C16:BEFA8822BEFA8822BEFA8006BFBA80229F22913E9F2A802A912A8BAABC2A8046 +29C17:BEFA8822BEFA8822BEFA9FF2892291C28602BFF288128FF288128FF284228816 +29C18:BEFA8822BEFA8822BEFA84028782888297C285428FE289228FE289228F1281F6 +29C19:BEFA8822BEFA8822BEFA810286C2983287C2844287C28EE28AA286628AAA8664 +29C1A:BEFA8822BEFA8822BEFA8006BFBA8A22BBA2A0BEA0AABBAA8A2A8BAABC2A8046 +29C1B:BEFA8822BEFA8822BEFA80028822BE2288FABE2280FABE0AA252BE229452BE8E +29C1C:BEFA8822BEFA8822BEFA8002BEFA9862ACB29452A4928C32891292A2844AB834 +29C1D:BEFA8822BEFA8822BEFA8102BFFAA00A9FF285429FF289528A928FF2842A8814 +29C1E:BEFA8822BEFA8822BEFA80029FF289229FF2B11A9BB295529BB295529BBA9114 +29C1F:BEFA8822BEFA8822BEFA8002BEFA9862AEBA9452A69A8C32891292A2844AB834 +29C20:1000C67CAA14D614AA10C6109250FE5C405040507E50405040504E5070BE0000 +29C21:1010C610AA10D6FEAA92C6929292FEFE409240107E90406040204E5070880106 +29C22:1010C610AAFED610AAFEC6929292FEFE409240107E90406040204E5070880106 +29C23:007C3F80110808907FFE4802B6FC2A4436442A443E2810281E10102816441882 +29C24:20FC3E8048F83E8814F8228040FC25482288292822883FF810001FF010040FFC +29C25:00FC7F0811107FFC44447FFC10006DF854886C887C5020503C2020502C883104 +29C26:01007FFC092031187FFC44447FFC10006DF854886C887C5020203C5020883D04 +29C27:08007F042A0449087F1055227F0244045B0855105B225F0248044F0848108F60 +29C28:00FC7F0811107FFC40047FFC4E084A085F7C55085B485F2848084F0848288F10 +29C29:2108F7DE2288711CAAAA244800007FFE4A0AA4882ABC3F8810281F1810081F18 +29C2A:121C2384351C2384355C27C420047FFE4A12A4A42AC83F9010241F4810101F20 +29C2B:0010FE1000107C1044FE7C100090FE908290AA9092FEFE109210921092108610 +29C2C:0000FFFE00103EF8221022903EFC00107FFC482444445FF44104410441144008 +29C2D:0028FE2400247C20442E7CF00020FE248224AA289228FE109212922A92468682 +29C2E:0008FE8800487C4844087C880048FE488208AA0E92F8FE089208920892088608 +29C2F:0010FE1000107C1044FE7C100010FE10827CAA449244FE4492449244927C8644 +29C30:0000FEFC00047C0844107C280044FE828200AA7C9210FE109210921092FE8600 +29C31:082004407FFC01003FF80100FFFE0100FFFE10101FF000007FFC44444FE4410C +29C32:7EFC02047EFC40807EFC02040A140408FFFE10101FF000007FFC44444FE4410C +29C33:0010FE10007C7C1044107C1000FEFE008210AA10927CFE109210921092FE8600 +29C34:0000FEFE00107C1044207CFE00AAFEAA82AAAAAA92AAFEAA92AA92A2928A8684 +29C35:0000FEFE00007C00447C7C440044FE7C8244AA44927CFE449200920092FE8600 +29C36:0020FE1000107CFE44207C240044FEF88212AA229244FE889210922892448682 +29C37:0000FE4400287C9244AA7CC60082FEFE8228AA289228FE289248924A928A8706 +29C38:00007F7E00023E02227E3E0200027F7E4100557E49027F02497E49024902437E +29C39:0000FEFE00007C5244A47D280094FE4A8200AAFE9210FE109210921093FE8600 +29C3A:0010FE1000207C4444FE7C280044FEA2823CAA449244FEA89210922892448682 +29C3B:0028FE2400247C2045FE7C200120FEB282B4AA6892A8FF249222922092A08640 +29C3C:0010FE1000207C4444FE7C100054FE928210AAFC9244FE289210922892448682 +29C3D:0010FE1044207C4444FE7C284444FEA2AA3C9244BA4492A8FE10922892448682 +29C3E:212017F8812847F8152027FC4124822CFFFE10101FF000007FFC44444FE4410C +29C3F:08203EF808207EFC145022884004FFFE10101FF000007FFC44444FE44104410C +29C40:0440FC7E054001003FF80100FFFE20085FF490121FF000007FFC44444FE4410C +29C41:082004407FFC01003FF80400FFFE10102FE8C0061FF010107FFC44444FE4410C +29C42:0000FE7C00247C2444FC7C440044FEFE8200AA7C9224FE2492FC9244924486FE +29C43:0010F810003C739450FE7094013CF9108BBCD890A8FEFA90A910A980AA7E9C00 +29C44:0000FEFE00107C2044FE7CAA00AAFEAA8286AA109210FEFE9210922892448682 +29C45:280092FEAA00827CFE44287C4400A2FE3C8244AA4492A8FE1092289244928086 +29C46:793C09047FBC42A07ABC09042A941448FFFE10101FF000007FFC44444FE4410C +29C47:0000FEFE00007C7C44447C7C0000FEFE8282AAAA9292FEFE9292929292928686 +29C48:0040FE4000FE7D2244AA7CFA0042FE948348AAFE9322FEAA92FA924292948708 +29C49:0000F8880104728A5050702000D8FB0688F8D820A820FBFEA820A924A8A89BFE +29C4A:0000FEFE00107C2044FE7CAA00AAFEAA8286AA109252FE529294922892448682 +29C4B:04407FFC01003FF80100FFFE24884244FFFE10101FF000007FFC44444FE4410C +29C4C:721C110477DC4110739C110457D42008FFFE10101FF000007FFC44444FE4410C +29C4D:711C110477DC411077DC1444545427C8FFFE10101FF000007FFC44444FE4410C +29C4E:E28E2FE2E2AE8FE8EA8E2FE2A2AA4464FFFE10101FF000007FFC44444FE4410C +29C4F:08207F20087EFF4410A81E10222846C4FFFE10101FF000007FFC44444FE4410C +29C50:0020FE1000FE7C4444287CFE00AAFEAA82C6AA8292BAFEAA92AA92BA92828686 +29C51:2440247C3CA805507C2825FE24484418FFFE10101FF000007FFC44444FE4410C +29C52:0100EFEE210227C22442E7CE80088FE88448E7CE20022FE22AA22FE2A92A4964 +29C53:F7DE1282F39E8290F39E12C2578A2084FFFE10101FF000007FFC44444FE4410C +29C54:3FFE21042E3822102FBC27182AB432522FFE220823F8200027FC44A445F4844C +29C55:28503E7C48900810FEFE1528264A4486FFFE10101FF000007FFC44444FE4410C +29C56:711C17C4711C47D0755C17C453942548FFFE10101FF000007FFC44444FE4410C +29C57:F7DE1282F7DE86D0F45E17C2544A27C4FFFE10101FF000007FFC44444FE4410C +29C58:0014FE1200FE7C1044927C540092FE308220AA1092FEFE28926A92A492248632 +29C59:942059FC1050FC8811FC38A854AA9126FFFE10101FF000007FFC44444FE4410C +29C5A:E10E27C2EFEE8BA8E08E27C2A10A4304FFFE10101FF000007FFC44444FE4410C +29C5B:0020F888025273265252728A0222FBFE8888D944AA7AF888A950A820A8D89B06 +29C5C:77EE140275EE440877EE15A2554A29A4FFFE10101FF000007FFC44444FE4410C +29C5D:0020FE1000FE7C1444FE7C100092FE548292AA309210FEFE9228926A92A48632 +29C5E:713C17C4719C47F0729C17C459142308FFFE10101FF000007FFC44445FF4410C +29C5F:E40E27E2EFCE8548EFEE2542A7CA40C4FFFE10101FF000007FFC44445FF4410C +29C60:0440EEEE35423FE22CC2F75E84388FE88448E7CE20022FE22AA22FE2A92A4964 +29C61:E7EE2622EA2E9BE8E9CE29C2A9CA4AE4FFFE10101FF000007FFC44444FE4410C +29C62:40207DFCFC505488FEFC54A87CAA0D26FFFE10101FF000007FFC44444FE4410C +29C63:E94E27E2E96E87E8E74E3BE2A96A4A44FFFE10101FF000007FFC44444FE4410C +29C64:E04E2DC2E4EE85C8E8EE25E2A44A4BE4FFFE10101FF000007FFC44444FE4410C +29C65:E10E2282E7CE8AA8EFEE27C2A00A4FE4FFFE10101FF000007FFC44444FE4410C +29C66:E40E27E2EBAE8168E50E27E2ABAA4164FFFE10101FF000007FFC44444FE4410C +29C67:E44E2FE2E10E87C8E10E2FE2A00A4AA4FFFE10101FF000007FFC44444FE4410C +29C68:E7EE25C2E7EE8548E9AE2FE2A28A4184FFFE10101FF000007FFC44444FE4410C +29C69:28503E7C4890FEFE1528264A4486FFFE10101FF0FFFE10107FFC44444FE4410C +29C6A:E7CE244227C2E44E9FF8E10E2FE22922AAAA4864FFFE10107FFC44444FE4410C +29C6B:E08E37E2EBEE82A8FBEE29C2AAAA57E4FFFE10101FF000007FFC44444FE4410C +29C6C:244C44446EEC44446EEC55544444FFFE80027FFC1FF010107FFC44444FE4410C +29C6D:E44E2282EFEE8D68EFEE2442A7CA4444FFFE10101FF000007FFC44444FE4410C +29C6E:E9EE2502E9CE85E8E90E2FE2A54A4924FFFE10101FF000007FFC44444FE4410C +29C6F:E48E35E2EE8E9F28E5EE2EC2B5CA4564FFFE10101FF000007FFC44444FE4410C +29C70:E10E27A22142EFEE87C8EA4E23C22D22A54A4B24FFFE10107FFC44444FE4410C +29C71:E88E2FE23E82EA8E8F28FFEE2AC22EC2A2CA4764FFFE10107FFC44444FE4410C +29C72:EEEE2AA22662EAAE87E8EC8E27C2A48A47E4FFFE10101FF07FFC44444FE4410C +29C73:E10E2FE2E6CE8BA8E54E27C2A7CA4844FFFE10101FF000007FFC44444FE4410C +29C74:EFEEA20AEFEE0820EFEEA82AEFEE0440FFFE10101FF000007FFC44444FE4410C +29C75:104895FE58FC10B4FCFC100A38FE54CC90AA1114FFFE10107FFC44444FE4410C +29C76:EFEE21022FE2EDAE8348E7EE2C8227C2A48A47E4FFFE10107FFC44444FE4410C +29C77:E4AE35F22EA2E5FE9F58E5FE2F2235B2A52A4654FFFE10107FFC44444FE4410C +29C78:104895FE58FC10B4FCFC380A54FE90CC112AEFEE27C2E44E8FE8EAAE2FE26966 +29C79:081010107F104910497E7F12491249127F1210221A222D4A2F844800480287FE +29C7A:080010007F3E492249227F22492249227F22102A1A242CA02FA04820480287FE +29C7B:080010207F20492049207F30492849247F2210221A202CA02FA04820480287FE +29C7C:020002003FE0042008223222C41E1FF011101FF012101FF004A808BA3082C07E +29C7D:0020FC4029FC292429FC292429FC284028A828B4293C29222A1E480247FE8000 +29C7E:10203840E1FC2124212421FC21243D24E1FC204020A820B42D3C31222222041E +29C7F:02000100FFFE100010001FF802001FF011101FF012101FF004A808BA3082C07E +29C80:101020107E10521052927E92529252927E9210921A922DFE2F024800480287FE +29C81:102020207E20523E52227E42526252927E0C10041A082D102F2048C0480287FE +29C82:080010007F7E494249427F52494A494A7F4210421A542D482F404840480287FE +29C83:080010107F10491E49227F42490249127F0A100A1A022C822F944808480287FE +29C84:2020204021FC2124FDFC292429FC284028A828B4293C29222A1E480247FE8000 +29C85:080010087F084908497E7F08490849487F2810281A082C882FA84810480287FE +29C86:080410047F08491049247F04490849107F2214021404240824104420440283FE +29C87:0800107C7F04490849107F1049FE49107F1014101410245024204400440283FE +29C88:020004003FF821083FF821083FF8029004A808FA308AC07E0100210821083FF8 +29C89:2020104011FC0124FD2441FC4124412441FC404040A840B47D3C01220222041E +29C8A:1008201C7E705210521C7E705210521E7EF010121A122D122F0E4800480287FE +29C8B:2010102010FEFE92009200FE3C92249224FE24202424255A465E44908092010E +29C8C:2010102010FEFE92209220FE3C92249224FE24202424245A445E54908892010E +29C8D:101020907C9054FE54907D10541055FE7C1010101A102D102F104810480287FE +29C8E:100020107E10521052547E52525252907E1210041A082D102F2048C0480287FE +29C8F:10101020147E24522452647E6752A452247E24102534263A243E20502052208E +29C90:082010207F20497E496A7FAA492A492A7F4A10521A922D222F544808480287FE +29C91:100020007E7C520052007E0052FE52107E2010201A442DFE2F424800480287FE +29C92:104420447E48524852507E4052FE52507E5010481A482D442F624840480287FE +29C93:1000200E7EF0521052107E1053FE52107E2810241A422D822F024800480287FE +29C94:0808101C7F60494849487F48497E49487F4810481A482C882F884800480287FE +29C95:101020107E10525252527E54529052107E2810241A442D422F824800480287FE +29C96:0020044044FC4494449444FC44A477A444FC44204444446A556E66A044A2011E +29C97:101020107E1052FE52107E10527C52107E1010FE1A102D102F104812480287FE +29C98:01081FD001207FFC02000D003200DFF011101FF012101FF004A808BA3082C07E +29C99:101020107E10521052FE7E10523052387E5410521A922D102F104810480287FE +29C9A:0020FC4011FC1124552455FC5524552455FC544054A854B4913C11221222141E +29C9B:7FFE40029FF0062001C01E3804001FF011101FF012101FF004A808BA3082C07E +29C9C:0880109830E057849084127C04001FF011101FF012101FF004A808BA3082C07E +29C9D:100020087E28522452447E425280527C7E2410241A242D442F544888480287FE +29C9E:0800103E7F22492249227F3E492249227F3E10221A222D422F4A4884480287FE +29C9F:102020207E20523E52427E84521052107E1010281A242D422F424880480287FE +29CA0:102020107E1052FE52207E20523C52247E2410441A442D942F084800480287FE +29CA1:2020104011FCF924092411FC1124392455FC944010A810B4113C11221222141E +29CA2:100020107E1052FE52927E94529052FC7E8410A81A902DA82F444800480287FE +29CA3:00207C4055FC552455247DFC5524552455FC7C4054A810B4113C11221222141E +29CA4:100020FE7E22522252227E4A5284527E7E4210421A422D7E2F424800480287FE +29CA5:100020107E10522052447EFE520252007E7C10441A442D7C2F444800480287FE +29CA6:101020107F10491E49107F104910497C7F4410441A442D7C2F444800480287FE +29CA7:7CF81088108A1D0AF206010002001FF011101FF012101FF004A808BA3082C07E +29CA8:088028882EF028842E84F27C04001FF011101FF012101FF004A808BA3082C07E +29CA9:100020107E10522852447E92520852007E7C10041A282D102F084800480287FE +29CAA:102020207E7E524252947E10521052547E5210921A102D502F204800480287FE +29CAB:1020104051FC51247D2491FC11241124FDFC104010A828B4253C41228222041E +29CAC:080010FE7F00492049207F7E49AA492A7F4A10521A922D222F544808480287FE +29CAD:101420127E10521E52F07E10525052507EF0104A1A4A2D462F824800480287FE +29CAE:081010087F7E494249847F20492049247F3810201A222CA22F9E4800480287FE +29CAF:101020947E54525852107EFC521052107EFE10101A102D102F104810480287FE +29CB0:00200040FEFC80948094BCFCA4A4A4A4A4FCA420BC44A46A806EFEA000A2011E +29CB1:081010107F1049FE49107F104910497C7F4410441A442D7C2F444800480287FE +29CB2:0800107C7F44494449447F7C494449447F7C10441A442D442FFE4800480287FE +29CB3:0800107E7F524952497E7F52495249527F7E10101A102D102F104810480287FE +29CB4:100020107E10527C52547E54525452547EFE10101A282D442F824800480287FE +29CB5:101020107E50527C52507E905210527C7E1010101A102DFE2F004800480287FE +29CB6:2020204021FC7D24512491FC1124FD2411FC104010A828B4253C45224222841E +29CB7:1004201E7EF0521052107EFE521052387E3410541A522D902F104810480287FE +29CB8:02001FF010101FF010101FF004001FF011101FF012101FF004A808BA3082C07E +29CB9:081010107F10491C49107F1049FE49107F1010281A242D422F824800480287FE +29CBA:084410287F10492849447F10491049FE7F1010541A922D102F504820480287FE +29CBB:102020107E1052FE52007E44528252287E1010281A442D842F004800480287FE +29CBC:081010107F1E4910497E7F52495449507F5C10701A502D522F4E4880480287FE +29CBD:02001FF011101FF012101FF008AA30BAC07E0000FFFE08200FE0083EFFE00020 +29CBE:10101020FEFE109220923EFE22926292BEFE222022243E5A225E22902A92250E +29CBF:101020547E52529052047E1852E052007EFE10121A222D222F4A4884480287FE +29CC0:0800107E7F10491049247F7E490A49087F3E10081A082D082F7E4800480287FE +29CC1:1020104091FC5524592411FCFD24292429FC28202854285A2A9E4C904912820E +29CC2:1004200E7EF0521052107E7C521052107EFE10281A2A2D2A2F464880480287FE +29CC3:0410442028FE1092289244FE92921092FEFE10205824545A925E12905092210E +29CC4:2810282028FE2892FE92AAFEAA92AA92AAFEFE20AA24AA5AAA5EAA90FE92830E +29CC5:080810287F28493E49487F08497E49187F1C102A1A4A2D082F084800480287FE +29CC6:101020107EFE5210527C7E10521052FE7E1010381A542D922F104810480287FE +29CC7:105C20547C94549455947CA65480549C7C94109434883A945EA250028FFE0000 +29CC8:02001FF010101FF01FF010101FF002001FF011101FF012101FF008AA30BAC07E +29CC9:101020207EFC528452A47E9453FE52847EA410941A842D942F084800480287FE +29CCA:102020207E7E528253447E28521052207E4010FE1A422D422F424842497E8742 +29CCB:081010107F28494449827F7C490049007F7C10441A442D7C2F444800480287FE +29CCC:100020FE7E105210527C7E24522452FE7E00107C1A442D442F7C4800480287FE +29CCD:100021FE7C00549255247C92540054FC7C1010101A102DFE2F004800480287FE +29CCE:100E20F07E22529252547E00527C52087E1010FE1A102D102F504820480287FE +29CCF:0C203040C3FC1524492431FCC924152425FCCC201454245AC49E04902912120E +29CD0:081410127F7E4910497E7F52497E49527F7E10521A522D522F464800480287FE +29CD1:101021107C90563455327C52541054947F04110835103B205EC050028FFE0000 +29CD2:081010107F7C4910497C7F544954497C7F1010381A542D922F104810480287FE +29CD3:0800107E7F524952497E7F524952497E7F10107E1A102D102FFE4800480287FE +29CD4:081008207E7E09520A52FF7E08527E52247E48208F24785A085E08902892110E +29CD5:100E20F07E22529252447E10521052FE7E2410641A182D342FC24800480287FE +29CD6:0800107C7F444944497C7F44497C49447F4410FE1A002D282F444800480287FE +29CD7:08FC10447F28491049287F444910497C7F1010FE1A382D542F924810480287FE +29CD8:104420287E10522852447E00521452127EFE10101A542D922F504820480287FE +29CD9:0020444029FC1124292445FC1924152411FCFC201054585A549E94901112120E +29CDA:102020107EFE528253047E78520052FE7E2810281A4A2D4A2F864800480287FE +29CDB:101020107EFE5210527C7E54527C52547E7C10101AFE2D102F104810480287FE +29CDC:100020FE7E28522852FE7EAA52AA52C67E8210FE1A822DFE2F824800480287FE +29CDD:1FF00200FFFE082037D8C44607C002001FF011101FF012101FF008AA30BAC07E +29CDE:101420127E1052FE52107E92525452387E5410921A102D102F504820480287FE +29CDF:100020FE7E105230524A7E9A522C524C7E9A102A1A4A2D882F284810480287FE +29CE0:00507FFC084012480C5012203E541FFC11141FF012101FF004A808BA3082C07E +29CE1:1004201E7EE05212528A7E4C524052087EFE10081A482D282F084818480287FE +29CE2:102020207DFE545054887D2456FA54A87CF810A81AFA2D222F1E4800480287FE +29CE3:101020107EFE522852447EFE520452747E5410541A742C842F944808480287FE +29CE4:083E10207F3C4920493C7F2049FE49507F5210541A482D442F624840480287FE +29CE5:0010FF2008FE109231924AFE1C92A8924CFEAA201924285A485E88902892110E +29CE6:100020807C8054EE554A7C4A544A55EA7C4A104E1AAA2D902F004800480287FE +29CE7:3FF801007FFE41029D7401001D7002001FF011101FF012101FF008AA30BAC07E +29CE8:1010201E7E10527C52447E44527C52087EFE10081A482D282F084818480287FE +29CE9:101020307CDE546A544A7DFA544A54EA7D5A104A2A522D524F66480287FE0000 +29CEA:100020FE7E8252FE52827EFE520052147EE410241AFE2D242F444884480287FE +29CEB:08FC10447F28491049287F44491049547F3810FE1A382D542F924810480287FE +29CEC:28104420AAFE10922892C6FE00927C9244FE44207C24445A7C5E449044928D0E +29CED:100020FE7E2852FE52AA7EAA52FE52107E2010281A442DFE2F424800480287FE +29CEE:3FF801007FFC514449245554420C1FF011101FF012101FF004A808BA3082C07E +29CEF:10FC20107E9052FE52287E4A5286521C7EE0103C1AE02D3C2FE2481E480287FE +29CF0:1020203C7C2054FE54A27CB854E4549C7C8010902A902D2A4F464A0287FE0000 +29CF1:101020107E50529652927E9252D652927E9210D61A102D102F104810480287FE +29CF2:104820487C8E559254AA7C84548A54B47C8E10921AAA2D842F8848B0480287FE +29CF3:101020107E1052FE52107E54525452547EBA10101A382D542F92481049108710 +29CF4:104820487EE8524852487E4853F8520C7E4A104A14E83A483E48507853C88E88 +29CF5:10FE20827EFE528252FE7E8252FE52147EFE10101A282D442F824800480287FE +29CF6:1410542054FEFE92549254FE5C9240927EFE1020FE24105A385E54909292110E +29CF7:1010207C7E2452FE52007E7C5244527C7E10103C1A502D7E2F104810480287FE +29CF8:100020287EFE522852007EFE529252927EFE10921A922DFE2F824800480287FE +29CF9:1000203E7DC8544854BE7CAA55EA54767C6211A234BE3B405E3E50028FFE0000 +29CFA:00107E2042FE7E9242927EFE0092FE9280FEBC20A424A45ABC5E8090FE92010E +29CFB:100020FE7E9252FE52927EFE521052287E4410AA1A282D482F884800480287FE +29CFC:20101020FEFE829220923CFE4492A89210FE28204424FE5A445E44907C92450E +29CFD:10101020FEFE10927C9220FEFE92249242FEBD202424245A3C5E249024923D0E +29CFE:100020FE7E10522052FE7EAA52BA52AA7EBA10AA1AAA2DFE2F824800480287FE +29CFF:28102A20ECFE28926A92A6FE00927C9244FE7C2044247C5A445E44905492490E 29D00:102020207CFA542454287DFE5420547C7CC4107C2A442D7C4F44480287FE0000 29D01:100C200A7C0854FE54887CFA548A54EC7CAC10EA2A962DA24F40480287FE0000 29D02:101C20707E1052FE52107E7C5254527C7E54107C1A102D7C2F1048FE480287FE @@ -73559,13 +75874,13 @@ FFFD:0000007E665A5A7A76767E76767E0000 29F9E:2040208021FC2104F9FC290429FC290069FE39002BFE2C024AAA42AA8202000C 29F9F:010009201110210845041FF010101FF010101FF010001FFC10001FFC5244892C 29FA0:00400080FDFC050405FC050405FC7D0041FE410041FE44025AAA62AA4202000C -29FA1:101020107F10413C7F2441447F0440247F9440147F840084AA84AA8481280610 +29FA1:104020407C40447C7C8444847D0440447E2440247E040204AA04AA0482280C10 29FA2:2820244024FC20843CFCE08420FC208020FC208020FE200214AA14AA0D02040C 29FA3:108421084210210814841FF010101FF010101FF010001FFC10001FFC5244892C 29FA4:1020104010FC1E8410FC1084FCFC048004FE088010FE200240AA82AA83027E0C 29FA5:10101020207C3F44407C80443E7C0240047C0840107E200242AA42AA3E82000C 29FA6:010000803FFE210027F0241027F0241027F0240027FC240027FC40044AA48AAC -29FA7:100220227F2A412A7F2A412A7F2A402A7FAA402A7FAA00AAAAAAAAAA81420682 +29FA7:100420847CA444A47CA444A47CA440A47EA440A47EA402A4AAA4AAA485041A04 29FA8:00203C4024FC248424FC248434FC2C8024FE248024FE250246AA44AA8102000C 29FA9:100020007CFC44047C0444047C0440FC7C8440807E800280AA82AA82827E0C00 29FAA:020002007FFC044008203018C4061FF010101FF010101FFC10001FFC5244892C @@ -73623,7 +75938,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 29FDE:20102020207C3F44507C5044907C1E40107C1040107E1F0210AA10AA1102100C 29FDF:01003FF80100FFFE04201FF004001FF010101FF010101FFC10001FFC5244892C 29FE0:101420127C1244107CFE44907C9240927C9240947E9402B4AACAAA8A82160C22 -29FE1:100820087F1041107F24417E7F2240007FBC40247FA400A4AAA4AAA4813C0624 +29FE1:102020207C2044407C4844847DFE40827E0040FC7E840284AA84AA8484FC1884 29FE2:2020104000FCFE8410FC108410FC7C8010FC108010FE10021EAAE0AA4102000C 29FE3:1020104010FCFE8410FC108410FC7C8010FC388034FE520290AA10AA1102100C 29FE4:042004207FA00E221522649E02001FF010101FF010101FFC10001FFC5244892C @@ -73664,7 +75979,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2A007:100020FE7C1044107C1044307C3840547E5240907E100210AA10AA0082FE0C00 2A008:40104720757C5544557C5544557CB540957E1740147E1402242A252A4642840C 2A009:0010FFA0027C02447A7C4A444A7C4A404A7E7A404A7E020202AA0AAA0482000C -2A00A:102020207F20417E7F4241827F3A402A7FAA402A7FBA00AAAA82AA8281140608 +2A00A:104020407C8044FC7D0444047CF440947E9440947EF40294AA04AA0484281810 2A00B:04001FF010101FF010101FFC10001FFC00043FE4222C3FE022203FE002000200 2A00C:100020FE7C9244927C9244FE7C9240927E9240FE7E920210AA10AA1082100C10 2A00D:1004201E7CF044907C9044907C9040FE7E9040907E900288AA8AAAAA82D60C8A @@ -73698,9 +76013,9 @@ FFFD:0000007E665A5A7A76767E76767E0000 2A029:202020403CFC448448FCA88410FC28804EFE128024FE540208AA10AA2102C00C 2A02A:0840104037FE51509248144602001FF010101FF010101FFC10001FFC5244892C 2A02B:0040FC8005FC0504FDFC050405FCFD0001FEFD0005FE0402FCAA04AA0502FC0C -2A02C:2020204020FCFE8420FC488448FC8A80AAFE2C8048FE140214AA24AA2282420C +2A02C:2020204020FCFE8420FC288428FC4A805CFE688048FE940292AA22AA4102000C 2A02D:0020FE4082FC8284BAFC828482FCBA80AAFEAA80AAFEBA0282AA82AA8A02840C -2A02E:10FEFE0822FE1C10E2301FF010101FF010101FF010001FFC10001FFC5244892C +2A02E:10F87C08141025FE1810643001001FF010101FF010101FFC10001FFC0004492C 2A02F:1020104091FC550459FC1104FDFC290029FE290029FE28022AAA4CAA4902800C 2A030:0200FFFE048808503B20CC1802061FF010101FF010101FF810001FFC5244892C 2A031:01007FFE4102BFFC02400C30320C1FF010101FF010101FFC10001FFC5244892C @@ -73758,7 +76073,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2A065:0020FE4008FC108430FC4A849CFC28804CFE9A802AFE480288AA08AA2902100C 2A066:1004200E7CF044887C8844BE7C8840BE7E8840BE7EAA02AAAAAAAAAE82880D08 2A067:00207E4040FC40845EFC408440FC7E8050FE50805AFE540252AA90AA9902100C -2A068:02001FF010101FF01FFC5244892C1FF010101FF000003FF821083FF820021FFE +2A068:02001FF010101FF010101FFC5244892C1FF010103FF821083FF8200020021FFE 2A069:10882048785049FC7824482479FC41207D2041FE7C220422546A54A485201820 2A06A:4420424040FCFE8450FC528454FC5A8054FE5A8054FE580270AA52AA93028E0C 2A06B:10102014781248107BFE4810795041547D5443F47D540548554A565A84261842 @@ -73911,13 +76226,22 @@ FFFD:0000007E665A5A7A76767E76767E0000 2A0FE:20201040FEFC828428FC448492FC288044FE82807CFE440244AA44AA7D02440C 2A0FF:0010FF20027C7A444A7C7A44007CFF40027E7A404A7E4A027AAA02AA0A82040C 2A190:120814103FBE64223F3E24223F3E24203FBF04207FBF1601255544D504020000 +2A1BB:20103E20427CFF44517C64447F7C40405F7E40405F7E40025F2A512A5F42910C +2A1D8:0808FF90083C7F24003CFFA400BC7F20083EFFA0003EFF82012AEFAAA902E30C 2A1E1:2210FF202A7C24447F7CC8447F7C48407F7E48407F7E4002FF2A22AA1C82E30C +2A1F0:7F1041207F7C41447F7C22447F7C2240FFFE2240497EAA821C2A2A2A4942180C +2A1F7:21104548F54897DCF1009214F7D48248FA7E83C8FA080BDCAA48AA488BC83208 2A248:088008882E9028E028842E84F07C020004001FE0122011601FFC00047FD40008 2A38A:10201020FE2010287CA410A2FEA221203C2444244828A8081010282040C08300 2A38C:081008107F7E2A102A525DD22A34497F10101E38225454930810160061FF0000 +2A3BD:282028107C1029FE2820FE4810847DFE545254507C50545054527C92288E4500 2A41E:0008FE3C92E0D620BA209220FE20103EFEE010201E20E0220222AA22A81E8000 2A437:00083F88248835FF2E8824923FA204143F940408078A781205122AA54A790000 +2A4A0:0008FB88A888A910FFDEAA94FAA42394FA9423943A94E2C80B88AE94A0A400C2 +2A4A1:0010FA10A97CA814F8FEA814FB7C2192F95421383954E1920930A900A2FE0400 +2A4D0:1410551E3610147EFF52495C2A727F4E4940495C5D546B5C4954495C49944B3E 2A590:10003E2022203E2022203E2000207F2049207F2049207F220022FFA2221E4200 +2A5A8:20207C2044207DFC44207CA800A8FEA89374FE229250FE500088FE8845048602 2A5F1:0400041E1792141214127FDE2A92359220923F9E2A922A92359220923FBF0000 2A602:04003FBF04093F09049107A278FE08807FFF149412A41FFC12A414941FFC0000 2A612:081028102F282844FFA21410557C6B0441087F10557C55446B444F44717C0144 @@ -73939,33 +76263,45 @@ FFFD:0000007E665A5A7A76767E76767E0000 2A838:00100038FBC08A008A208A208A208BFC88208820F92889240222042200A00040 2A83D:0020012278A248A248A448204BFE48024802480279FE48020002000203FE0002 2A8AE:00007FFC4004420441045FF44AA4529441045FF443844564591440047FFC4004 +2A8C8:200021F0211021102110F910220E2400200023F822083A08E208420803F80208 2A8DD:1020104011FC11041104FDFC1104110411FC104010401C7EE3C040420042003E 2A8FB:1020112410A8102013FEF8A811241202104017FE1888E1084190006001980604 2A917:100017BC108414A41294FCA410501188162610C01B10E0644388003000C00700 2A970:20402020202023FEFA024804480048008BFE4820302010202820482080A00040 +2A9F7:010001F80608191000A000C0070038100010FFFE001004100210021000500020 2AA07:0020FDFC292429FC28202BFE280029FC290429242924285028884904440283FE 2AA0A:00003FFC200420043FFC200022102210221022102210252844A848C488441082 2AA30:2050205020502050ABFEAA52AA52AA52AA52ABFEAA52BA52CA52025203FE0202 2AA36:010041047FFC0200FFFE08203018C2063FF8040009003FF801007FFC01000100 2AA58:2108210827CC210AA908AFDEAC48AEC8AD48AFC8AD54BFD4CD540554045404E2 +2AAC6:0000200013FC100480044004480409FC10041004E0042004200423FC20040000 2AB62:1110111011101110FD10111011101510191032A8D26812281444144458842102 2ABB3:1040102013FE1154FD5212521420182031FCD124112411FC1020102253FE2002 +2ABC8:1040104010407C8010FE11081288FC8810881050105028202450448881040202 2AE5A:1040102013FC1508589053FE52029444102013FC108028F82488410841288210 2AED0:01100110F9102110211021102110F910211022A822683A28E444444408841102 2AF94:0BFE104061FC090411246124052409243050C08803043FF824482448FFFE0000 2AFA2:000001FC7D04450445247D24452445247D244554445044907C9045120212040E 2AFD6:00400020F82023FE2040404078884908CBF048204840488879044BFC01040000 +2B006:2080108011FCF9040A0415F411143914551495F4110411281112110210FE1000 2B0D1:108812AA92DC548859541222FC0031FE3902564455FC90441084110412281410 +2B0F5:1020112420A828204BFEF0A8112422024840FBFE08880108A990A86081980604 +2B124:101012102110211048FEF810171021284124F944414201821900E280447E0000 2B125:100013FE200020004BDEFA5212522252435AFAD6425202521A52E252425202D6 2B127:1004100E23B820884888F928112E23A840A8FAA842A8013E1900E280447E0800 2B128:11841068203020C84B04F84013FE20A04120FBFC452401241934E12840200020 2B137:1040102021FC24884450FBFE100021FC4104FDFC410401FC1C20E294428A047A 2B138:101C11E0202023FE4420F9FC11AC217441FCFC2041FC00201BFEE0004154022A 2B1ED:10201020FFFC102001002100110001007FF8020802880448084810082050C020 +2B1F2:08200820FFFE082009200280044008203118C1061FF0010001000100FFFE0000 +2B209:04400440FFFE044010000BF8200827C82448244827C82448244827C820082018 2B241:0820FFFE082000F87F00221011207FFC42041FF004000FF81210212040C01F3C +2B2A5:1020102010207C205420542055FC54207C205020102014201E20E22043FE0000 2B2BB:100011FC10047C0454FC5404540455FC7C08500811FE14881C48E44840080018 2B300:202013FE0020FDFC082013FE100035FC59049524152411241124115410881304 2B328:200020FC20847E8442A444A490A410A454A454A452205250925010925092210E +2B35A:0008203C11E0102000200020F3FE102010201050105014501888108801040202 +2B35D:0040404027FC2080008007E0E120222023FC2020212821242A22342220A00040 2B35F:0080208010FE110002200120F12C117413A41124113411281522190210FE0000 2B362:0080408020BC23C000500024E0D4230C200027FE2090209029123112220E0400 2B363:000043FE2202220202FA0202E20222FA228A228A228A2AFA32022202020A0204 @@ -73981,10 +76317,12 @@ FFFD:0000007E665A5A7A76767E76767E0000 2B4E7:102010203C20202041FCBC2010201020FDFE1020105010501488188811040202 2B4E9:211021103910211041107910A1102110F91022A8226822282C44344428841102 2B4EF:102010203DFC20204020BC2013FE1000FC20102011FC10201420182013FE0000 +2B4F1:2008203C39E0202040207BFEA0502088F904228A208820882888310821080208 2B4F6:100010F83C88208840F8BC0011FC1104FD0411FC1104110415FC190411140108 2B4F9:108810883DFE20884088BCF810881088FCF81088108813FE1400188811040202 2B50D:103C13E03D2420A843FEBCA811241202FDFC1124112411FC1524192411FC0104 2B50E:10FC10283C1021FE4052BC9411501020FCFE10AA10C610BA14AA18BA10820086 +2B52D:200013FC100440044FE44444444444445FF44444444448444844504440144008 2B536:200017FE010242024FE248224FE248224FE248224FE241025FF24542492A4104 2B583:0010FEFE109220FEFE10ABFEAA00BAFEAA82AA92BA92AA92AA92FE2882440082 2B594:1044104411FEFE44104411FE7C4010FE1192FEFE129212FE1A92149210921086 @@ -74024,6 +76362,12 @@ FFFD:0000007E665A5A7A76767E76767E0000 2B737:0800083E7F2208243F2408287FA4122412223FA2222252344A2882200A200420 2B738:008000807C8044844488449044A044C0448044807C80448200820082007E0000 2B739:000000007FF800080008000800083FF800080008000800087FF8000800000000 +2B73A:01002108210821083FF800003FF82108210821083FF82108210821083FF82008 +2B73B:0000FEFE101010107C7C10101010FEFE0000FFFE010001000100010005000200 +2B73C:200023DEA842A94AA884A94AFA5224202000ABDEA852A952A894B948EA540422 +2B73D:0090FC904890491079FE4B104D107938493849544D927910C910091009100910 +2B73E:00007FFE400280043FF800001FF0101010101FF0101010101FF0101020504020 +2B73F:082008207F7C2A241C247F2408241C442A944808010008844892481287F00000 2B740:0000020002000200020002003FF00410041004100410081008100810FFFE0000 2B741:0000FFFE0440044004407FFC4444444444447FFC044408400840104020404040 2B742:0000FFFE00000000224012409240427E44480448044808480888108821084208 @@ -74124,7 +76468,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2B7A1:1088108813FE108854005BFE52029424102013FE107028A824A8452442228020 2B7A2:22081108111000207FFE4002910411001FF8210041000100FFFE010001000100 2B7A3:005044482840105C29E04840885E0BE018442848483088220852088A53062002 -2B7A4:0040904053F82040504097FE10801108331050A0906410A813101D48A1864100 +2B7A4:0040904053F8204057FE90801088110833F05020906410A813101D48A1864100 2B7A5:000001FCFD0411041124112411247D2411241124112410501C48E08441020202 2B7A6:00400020FBFE2104208820502020F8D82306208820883888E088410801080208 2B7A7:00880088FBFE2088200023FEFA022444204023FC20443884E084410402280410 @@ -74192,7 +76536,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2B7E5:2020202023FEFC2041FC510491FCFD0411FC11041DFCF10453FE108811041202 2B7E6:204422242128FC7E40105028934AFD1C1128114C1D1AF12A5148111012FE1400 2B7E7:0000200017FC104000400040F040104010401040104011401080280047FE0000 -2B7E8:0040204013F8104007FC0000F04017FC104011A81690108810C4280047FE0000 +2B7E8:0040204013F8104007FC0000F04017FC108011A8129014C81084280047FE0000 2B7E9:00402248115013F8008007FCF110120815F4101011F0110410FC280047FE0000 2B7EA:008043F8220823F8020803F8E0402FFE2912220825F42912211021F050008FFE 2B7EB:00007FBE402240247FA4482848244F24492249224922493451285520A2200020 @@ -74246,10 +76590,15 @@ FFFD:0000007E665A5A7A76767E76767E0000 2B81B:0800287C2F44287CFF44147C55106B50417C7F905510557C6B104F1071FE0100 2B81C:1000102050CE5E82508250EEFE82008292FE9228AA28C62882488E4AF28A0306 2B81D:49202A3E7F4841485DA855105D284FE610403FF011103FF821083FF8010200FE +2B823:020002007FF8040004007F00110021003FF80100092011102108410405000200 2B8B8:09040888085011FC1124312451FC9124112411FC1020102013FE102010201020 2B8C6:100017FC1444244427FC644464A4A514240427FC204020242522250A290820F8 2B8CA:080E0BF008441224110833FE3242504093FE108010FC11441128121014681186 +2B92D:020004003FF82008244822882108228824482008FFFE00000820101020084004 +2B9C7:2000207023803C08200820081FF800002000203823C03C04200420041FFC0000 2B9EF:010001FC010001001FF0101010101FF001007FFC410442844444484440144008 +2BA4F:0000000000007FFC410441044104410441044104410441047FFC400400000000 +2BA51:0000FFFE0200020004003FF8200820082008200820082008200820083FF82008 2BA5B:01100110F9108910891089108910891089108AA8FA688A280444044408841102 2BA73:01100110F1509230921096FE96129A129212922A9226F2229222024202540288 2BA81:00400040F04097FC90409248914891509FFE90E0F15091500248044408420040 @@ -74261,21 +76610,30 @@ FFFD:0000007E665A5A7A76767E76767E0000 2BB6A:2080208020BC23C02050F82420D4230C200023FE20903890E1124112020E0400 2BB7C:1088108813FE10881000FBFE12021044104013FC1844E0844084010402280410 2BB83:11041088105011FC1124F92411FC1124112411FC10201820E3FE402000200020 +2BBDC:010001007FFC0280044008203118C1061FF01110111011101110115001200100 +2BC06:1000100011FC1008FC1024202440244024804880290011042904450484FC0000 2BC1B:100011FC10081010FC30244824842702240049FC282010202820442083FE0000 2BC21:2090209421142118FB1049324952490E4920902053FE20203020482048208020 2BC30:1020102010501050FC88250426FA240024444824292410A828884410842003FE 2BCA6:0104FC840488081011FC11041504190431FCD0501050109010921112520E2400 +2BCB7:020001007FFE4002810401001FF00100010001007FFC0280044008203018C006 2BD58:3FFC200420043FFC200021002090209022202A282A443244228843088DF80000 2BD77:200023FE22002220AA20AA20AAFCAA24AA24AA24AA44BA44CC84048409281210 2BD7C:010041047FFC0000FFFE01003FF821083FF821083FF821001A00060019C0603E 2BD87:20A820A823FE20A8A8A8A800ABFEAA22A820A9FCA924B924C934012800200020 +2BDAC:00003FF801000100FFFE080008001FF0210001007FFC0280044008203018C006 +2BDC0:1008103C11E07C205420543C55E054205420543E57E05C20102210221022101E 2BDF7:010000803FFE200028202F20303E2E42249424103F1024104428452886440482 2BE29:0000FBFC0A000A080A88FA50825082208220FA500A500A880B080A0053FC2000 +2BE6F:00001FF0010001000100FFFE0100010001000200091049084824482487E00000 +2BE75:00001FF0000000007FFC0440044008441044603C010008844892481287F00000 2BF1D:1080108010F81108FA10102011FC140418043004D1FC10041004100451FC2004 2C029:00400040F04097FE9040904093FCF040904097FE90429042F04A904400400040 2C02A:000001FCF9048904892489248924F9248924895488508890F89089120212040E +2C05F:00003FF8200820083FF8200820083FF800200020FFFE08200420042000A00040 2C081:000079FC484448444BFE7844484449FC4880788049FC4A844C84488448FC9884 2C0A9:10201020102011FCFC20112430A438A8542053FE905010501088108811041202 +2C0AD:10201020104011FCFD0411043174395455545554915411741104110411141108 2C0C0:2200227C22442754FA542254225477546A54A254A21022282528254A284A3086 2C0CA:101C11E011101110FDFE11103110397C55445154915411541154122812441482 2C1D5:0000200013FE10808080408040FC108410842084E10421042204220424280810 @@ -74288,14 +76646,20 @@ FFFD:0000007E665A5A7A76767E76767E0000 2C2A4:11041088105015FC5924512451FC9124112411FC1020282027FE402040208020 2C2B6:104810481148154E5948515450429042100011FC115429542554415447FE8000 2C317:0000FC2008204850488849048A02FDFC1800280029FC49048904090429FC1104 +2C329:00200C400280010002800C8070900188028404841880E0800080008005000200 2C35B:0008001CFDE011001120112011207DFE1020102010A810A41D22E22240A00040 2C361:23F0102080C043FC11242124E24424842928201000007FFC01003FF80120FFFE 2C364:000001FCFC04100410FC100410047DFC1008100813FE10881C48E04840080018 2C386:00880088FBFE2088200023FE2202F80021FC2020202039FCE0204028002403FE +2C3BF:0010101008200420044000803FF82108210821083FF82108210821083FF82008 2C457:010000BEFA828A028A02FAFA8A8A8A8AFAFA8A8A8A8A8AFAFA028A02020A0204 2C488:020821081110102000007FFE40029FF4040008000FF81808680808080FF80808 2C494:00200120FD3C1120112023FE3C0065FC6504A5FC250425FC3D04250421140108 2C497:00900290FA9E12A812C420803DFC65046524A524252425543C5024902112060E +2C4B3:201010101010F9FE09121114111039FC55449544112811281110122812441482 +2C4BD:200011FC1044F8440BFE1044104439FC5480948011FC12841484108410FC1084 +2C4BE:2020102013FEF820082011FC1020382057FE944010A411A81290148810C61080 +2C4E0:08001DF0F11011101110FD1011103110391055105510911211121212120E1400 2C542:20803EFE4910BFF801007FFC00001FF010101110111011101290145008203010 2C58B:080008004AFE2A042C080810FE2018201C402A402A80488288820882087E0800 2C59E:200820082788AC8874FE2488FC8827C874A86CA8AC8824882788248820282010 @@ -74312,12 +76676,14 @@ FFFD:0000007E665A5A7A76767E76767E0000 2C642:1040102023FE26024400F9FC102021FC4124FDFC412401FC1C00E08841040202 2C64A:11FC112421AC252445FCF82011FC202043FEFD54422A00201DFCE02043FE0000 2C64B:102013FE200021DC4954F1DC108823FE4088FBFE408807FE1894E18846A400C2 +2C728:08200820FFFE08200100210821083FF8020007F008103420024001800E00F000 2C72C:08200820FFFE0820200017FC100440044FE44824482448244FE4482440144008 2C72F:08200820FFFE0820FFFE044004407FFC444444444AA451144214400440144008 2C79F:04400440FFFE044009FE28202EFC2884FEA408A428A42AA444A408303048C184 2C7C1:0820FFFE08207F1000203E7C22443E54004C7F40557E49027F7A4902490A4304 2C7FD:202020202020FBFEA840A8A0A8A0A920FBFCA020212829243A22CC2280A00040 2C816:202020202050F888A944AA22A9F8A808F850A02020A42A823A8ACA8A44780000 +2C842:208010400040F820082010201020305054509850144810881088108411041202 2C88A:00007F7C014401447D54015401547D54455445547D1045280128014A0A4A0486 2C8C0:210047CE910027DE6104AFE42124204C0100FFFE00003FF800003FF820083FF8 2C8D9:000021FC1020102000200020F02013FE10201020102014201820102000A00040 @@ -74327,6 +76693,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2C907:000023FE1050105001FC0154F154115411FC1020102015FC1820102003FE0000 2C90A:000021FC1104110401FC0104F10411FC100013FE10201520193C112002A0047E 2C91D:0020402023FE202001FC0124E1FC212421FC202223FE2842302422A2028A0478 +2C94E:3FF00820044003801C70E00E1FF010101FF010101FF010101FF0082010102008 2C9B0:00007BFE48204820484079FC1104110411045DFC5104510451045D04E1FC0104 2C9C0:00907C90449E44A246D47D88109410A410FE5D8452A4509450945C84E0940088 2CA02:1004101E10F0FE902090289048907EFE089008900E90F888488A08AA08C60882 @@ -74334,7 +76701,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2CA7D:00007F3E012201243F24012801247F2402220222FFA222341228122002200620 2CA8D:1000EFBEA4A294A4AAA4C92810247F2441224922492249344928142022204120 2CAA9:0020F820202023FEFA42A844A8A0A8A2D9A48A988C90F888888488A2F8C08880 -2CAD2:1004101E10F0FE902090289048907EFE089008900E90F888488A08AA08C60882 +2CAD2:1020112428A424A84020B9FC10201020FDFE10209450585050881C88E1044202 2CB29:105010483C482040405EBDE010401040FC401040102010221412180A10060002 2CB2B:101011103D1021124112BD1411D81110FD1011101110111215521992110E0000 2CB2D:2040204038A020A041107A08A4062910F9202140218021002904310420FC0000 @@ -74349,7 +76716,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2CB4A:211021103910211047D07910A13C2190F99023502350251029103110217E0000 2CB4E:104010203DFE21024244BC4011FE1040FC501090109010A015241942127E0422 2CB5A:104010203BFE200041FCBD0411FC1000FDFC1008101013FE1420182010A00040 -2CB5B:20102410321042FE48927494A49022FCF2A424A42CA824A82D90252825440282 +2CB5B:20102410321022FE48927494A49022FCF2A424A42CA824A82C90352825440282 2CB63:2040208039FC210441FC7904A1FC2020F83223B420A821282924322424A20040 2CB64:108010BC3C84210841FEBF201120117CFD90111011FE11101528192811440182 2CB69:2090208839042242448879FCA0042000FBDE20422252214A2A523042214A0084 @@ -74359,7 +76726,9 @@ FFFD:0000007E665A5A7A76767E76767E0000 2CB76:100011FC3D2421AC4174BD2411FC1020FDFC102013FE100016A41A5214520000 2CB78:2020212438A823FE40A87924A2222104F90421DE22442554289E310422040404 2CB7C:204422243928207E40107828A34A211CF928214C211A212A2948311022FE0400 +2CBA2:200013FC1004444444444FE4444444445FF44004444448245014400440144008 2CBA4:200017FE00024182424244224BD2500A400247E24422442247E24422400A4004 +2CBA6:200013FC1004444442844FE4410441045FF44284444448245014400440144008 2CBB1:200017FC100440045FF442844FE44AA44FE441044FE441045FF4400440144008 2CBB4:200017FC000441044FE4444442845FF440044FE448244FE448244FE440144008 2CBBF:00207D244524492449FC500049FC4804440445FC450069005102410240FE4000 @@ -74378,9 +76747,9 @@ FFFD:0000007E665A5A7A76767E76767E0000 2CD03:00107C1004FE241024FC241024FE3E1002FE02201A40E2FC43440244147C0844 2CD0A:0020F92408A84BFE48A849244A227D04050405DE3644C554449E05042A041404 2CD10:0088FBFE088849DC495449DC48A07C9005FE07201DFCE52045FC052029FE1100 -2CD88:102010201E20227E24427E82AA7A2A4A3E4A2A4A2A4A3E7A004A0E0270142008 +2CD88:1000107C1E44224424447E7CAA442A443E442A7C2A443E4400440E8470942108 2CD89:204020407C4044FC88907D10541054107DFE541054107C1000101C10E0104010 -2CD8B:102010201E20227E24427E82AA7A2A4A3E4A2A4A2A4A3E7A004A0E0270142008 +2CD8B:104010401E4022FC24847F04AAF42A943E942A942A943EF400940E0470282010 2CD8D:102010101E1022FE24827E84AA402A443E482A502A603E4200420E42703E2000 2CD8F:4040404078FC89041208F9FEA900A97CF944A944A954F94801421A42E23E4400 2CD90:205020503C50455248D4FC58545054587CD4555254507C5000921C92E112420E @@ -74401,12 +76770,37 @@ FFFD:0000007E665A5A7A76767E76767E0000 2CE7C:0810081028102F2828282844FFAA002849284928552863284128474879480188 2CE88:1020102051FC5E2050505088FFFE000892E892A8AAA8C6E882A88E08F2280210 2CE93:1088108851FE5E8850DC51AAFE88000093FE9222AAA0C6BC82A08F60F23E0200 +2CE9E:04000FE010403FF0501010101FF001003FF821083FF821083FF80102010200FE +2CEA2:00000000FFFE0000000004800440042008100810100810082004400480040000 +2CEA3:000000001FF01010101010101010101010101FF0000000000000FFFE00000000 +2CEA4:020001000100FFFE00000480044008201010220842048404084010203FF01010 +2CEA5:020001000100FFFE00001FF010101FF010101FF00100FFFE0100010001000100 +2CEA6:020001000100FFFE00001FF0101010101FF000007EFC4284428442847EFC4284 +2CEA7:000020081008081008200000FFFE0440044004400440084208421042203EC000 +2CEA8:040004000FF010102020404080803FF82108210821082108210821083FF82008 +2CEA9:0100010001FE0100010001003FF82008200820083FF82008200820083FF82008 +2CEAA:00008BFE5252225253FE9020102011FC3020502097FE104010881104A3FE4102 +2CEAB:010041047FFC209010FEFD9002FC789000FC789000FC788049FC488878704B8E +2CEAC:1F04210E3E38022A7FEA18AA652A1AAA666A1A2A24AAFBEAAAAAFBEA28ACFBEA +2CEAD:1400140027EE490081001FE0211E6284A444282427C424442444244427D42448 +2CF65:08000BFE08401040104030403050504890441044104010401040104010401040 +2D026:1008103C95E0542058201020FDFE282028202850285028502A884C8849048202 +2D075:00007FFE404280443E40007800907F10145014201450148A250A240243FE8000 2D25D:00101F50E450A47CA750A590A910ADFEAB38B238E254A4540492081010100010 2D382:11101110111011101110F91011101110111012A81A68E2284444044408841102 2D544:0104108408480410000000000000000000000000000000000000000000000000 +2D64F:010000803FFE2000200027FC2008201020202040204020402040404041408080 +2D655:010000803FFE2000203C27C02040204027FC204020402FFE4040404081400080 +2D70C:1000100017FE10801880548050FC508490841084110411041104120412281410 2DC4A:000020FE10101720827C42444254125412542254E3D42E542010202820440082 +2DCFF:084008400840094049404A404C408840084008401440124221422142403E8000 +2DD08:1000100010FC14005800500051FE90201020104010402888248445FE40828000 2DD0A:200023FC20402040A840B040A7FEA04020A020A020A0212051224A22441E8800 +2DDD4:00003FF80208040808503020010011001FF821000100FFFE0100010001000100 +2DEFE:100010001FFC20004000BFF8010801100100110011F011001100290047FE8000 2E014:000001FCF8002000200043FE78204820C92849244A244A227C22482000A00040 +2E0B9:08401C20F02013FE1088FC881088308838885450545090201050108811041602 +2E1D8:100011FC9504550459FC1104FD0431FC38205420542093FE1020102010201020 2E26B:101C11E0202020204BFEF8A8112422424040FBFE4088010818D0E03040480184 2E26C:1040102021FC20004888F888115422224000F82043FE00201820E02040200020 2E26F:1100111023DC22544D54FA88110822F44402F80043FC00401950E24845440080 @@ -74416,6 +76810,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2E505:1040104010F87C88551057FC550455247D245124112415241C50E48841040202 2E50A:200023FE2050F850A850ABFEAA52AA52FA52A2AA22A62B023A02EA02420A0204 2E5B1:2100113E0108F7D0113E212223AA682AB02A2BAA22AA22AA22AA238822942022 +2E5FB:209010900090FC9003FC78900090789007FE7890489048904890791049100210 2E64A:0010473C25442508057E0602E502253E25022502257E2610248A34A22424041C 2E64B:8108410447C0010E0100CFEE4020448E4280448E428A4FEA518A624E442A0820 2E774:2008201C21F0FD50415051509150FD50115011481D48F1685154127412521400 @@ -74433,6 +76828,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2EB21:1000107C1E44227424547EFEAA822A7C3E442A7C2A443E7C00440E4470542048 2EB66:08104920497C49447F6408541444224C5140887E08027E0202FA0402040A0804 2EB68:00107E20427C7E4442647E540844FF4C8140107EFF02220264FA1802240AC204 +2EB91:00F83F0001007FFC092011102288C44409203118C92609101108210805000200 2EBD9:080008FE28042F0428742854FF54005449544954557463544104470479140108 2EBF0:00007FFC044004400440044004400440044004400440044004400440FFFE0000 2EBF1:00001FF0101010101210111011101010FFFE1010121011102110201040508020 @@ -74456,7 +76852,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2EC03:0600010002800C603018C0061020102010AC7CB410E413A410AC1EA0E082007E 2EC04:00007FFE4002842404100410FFFE04800488049008A008C0108221824682807E 2EC05:00007FFE40028824101020080820082008207EFC08301C682AA4C92208200820 -2EC06:000021FE10021002000204FE04800880090071FE100210021002100210140008 +2EC06:000043FC20042004000409FC090011001200E3FC200420042004200420280010 2EC07:0210421022FE22100F7C021412FE1214237CEE102250225C225022502ABE0400 2EC08:008843FE2088202001FC08200BFE10881144E27A208821502220205021880606 2EC09:000043F020100910090011FC2004E3F4200420142FE80820082008221022601E @@ -75049,7 +77445,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 2EE54:010002001FF010101210115010201FFC01047D1405A4094C11202118C5060200 2EE55:08901088307ED7C01022109A11060FF00A10093008000FFC00043FC400140008 2EE56:00100F20E97CA944A964AF54A944A94CAF40A97EE902A9820F7A1802000A0004 -2EE57:08104920497C49447F6408541444224C5140887E08027E0202FA0402040A0804 +2EE57:08104920497C7F44086414542244414C9040087E7F02010202FA3402080A0404 2EE58:08202AA44D28145022887FFE400282041FE01420126010001FF800087FA80010 2EE59:08104920497C7F44146412543F44644CA4403F7E24023F02247A24023F8A2004 2EE5A:08104920497C7F44086414542244DD4C0840087E7F022A021C7A0F02780A2004 @@ -75066,7 +77462,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 30005:0200020002007FE0022012200A20042004200A2209221122201E40000000FFFE 30006:000000007FFC0000001010100810082004200440044000800000FFFE00000000 30007:0000FEFE202020202020404040407C7C04040404040404040404040428281010 -30008:010001007FFC010001003FF801000100FFFE0004000800300CC0030000800040 +30008:0100010001007FFC010001003FF801000100FFFE000C00300CC0030000800040 30009:010001000100FFFE010001003FF821082108210821083FF82108010001000100 3000A:010001003FF8210821082108FFFE0800080010001FF000100010001000A00040 3000B:220822A822A822A822A8FAA822A822A822A822A824A824AA280A20021FFE0000 @@ -75155,7 +77551,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 3005E:02000100FFFE00003FF8244824483FF801000100793C01000100793C01000100 3005F:20101210113C0124F844442844104128414642004E3C42247A240224023C0024 30060:20001008FEE800087C1E440A7DEA004AFE4A82AA389229F228164820480287FE -30061:0880084008401020102030203020505090501050104810881088108411041202 +30061:0880084008401020102030203020505090501050108810881088110411041202 30062:080009FC090411041104310431FC510491001100110011001200120012001400 30063:080009FC08041004100431FC31005100920013FC100410041004100410281010 30064:000000407840004000400040FC4028A028902890290829082A0A480247FE8000 @@ -75166,7 +77562,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 30069:00101110109010901010121011101110101E13F0281028102410431040FE8000 3006A:1000100017BC20A420A464A462A4A2A8212821282290229024A8282820442082 3006B:11001100113E210827C861086108A14821882708210821082108210825282210 -3006C:08000BF80A08124812483248324852489248124812481FFE1080109011081204 +3006C:08000BF80A08120812483248324852489248124812481FFE1080109011081204 3006D:0804083E0BC0124411243128300053F890101060108011001202120211FE1000 3006E:1020102020207C2044204420442044207C5044504450445044887C8845040202 3006F:010001000280044008203118C0861F0001087D9005A0094011202118C5060200 @@ -75343,7 +77739,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 3011A:00047F040104012401240524092411242124412481240124010401040A140408 3011B:004000407E40127C1284128413041244122412241204220422044A0484280010 3011C:1004100410041044144452445244504490441044104410441004100410141008 -3011D:00047E0404040824102420247FA424A424A424A444A448A48884108425144208 +3011D:00047E0404040824102420247F2415241524252449248924110421044A140408 3011E:0804080408047F2408241024FFA4102420247F24012422241404080404140408 3011F:000400047F0404240424082408241A24292448A488A408240804080408140808 30120:000000007DFC004400440044FE4420442044204448444444FC84448401280210 @@ -75388,7 +77784,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 30147:0820FFA0147E7F4449A45D2849105D2855445D0202007FF80808080810506020 30148:20023E024202FF8A488A7F8A142AE3EA410A71CA924AFFEAAAA2FBE2555A8E34 30149:24202420242024207EFC242424242424FF242424242424242444444444A88510 -3014A:00001FF010101FF010101FF00000FFFE020002007FF804080408080810506020 +3014A:00001FF010101FF010101FF00000FFFE020002003FF804080408080810502020 3014B:242024202420242024FCE724242424242424242424246424A544264424A80110 3014C:200021FC21042104FD0425FC2520252025FE2520252025102512454A55868902 3014D:0820082008207E2008FC4A242A242C240824FF24082414241244224440A88110 @@ -75442,44 +77838,258 @@ FFFD:0000007E665A5A7A76767E76767E0000 3017D:22282228FF2822283EA822683E2822FE2228FF28402C542A622A40487E480088 3017E:20081028FEC8004844482848FE48A2FE1048FE4820483C482448448854888908 3017F:208220822BF4A888708023E2F80223E422282220FBE022222142207427882210 +30180:0100FFFE24482FE821082FE821180100FFFE01003FF824482FE821082FE82118 +30181:18886BFE288829FC290429FCFD0429FC28402FFE288829242EFA48204BFE8800 +30182:0100FFFE24482FE821082FE821181010FEFE1010FEFEAAAABABA9292BABA9696 +30183:0100010001FC010001003FF82008210821082FE822882248242828283FF82008 +30184:020403F402041FE410241FE410241FE400043FFC200420002000400040008000 +30185:0100010001FE010001003FF820082FE8200827C82448244827C820083FF82008 +30186:0100010001FC01001FF0101017D011101FF0111017D01550254A25CA41068102 +30187:010001FC01003FF8244823882C68211001FE01007FFC40044FE4444443945C68 +30188:010001FC01003FF8228824683918224827C8200827C821082FEA410A42C68C22 +30189:0800087C0F24081808667F0055FE5544557C7F44557C5544555E51E445044204 +3018A:000000007FFC0204020402040204020402040204020402280210020002000200 +3018B:000000007EFC4284428442844284428442844284428454A84890408040804080 +3018C:00001FF0101010101FF0101010101FF000007FFC010401040114010801000100 +3018D:20002000207C7F444844884408440844FFC40844085408480840084008400840 +3018E:00003E00227C224422443E642254225422443E4422542248224042404A408440 +3018F:010002001FF010101FF010101FF010101FF000007FFC01040104011401080100 +30190:00001FF011101FF011101FF001003FF80100FFFE00007FFC0104011401080100 +30191:01081FD001207FFC02000FF03810CFF008100FF000007FFC0104011401080100 +30192:0610381008527E5408901C282A284844088200007FFC01040104011401080100 +30193:080008007F7C08444944AAE414542254494488442A441C542A48C94028401040 +30194:102010CE7E8A22AAFFAA00EE7EAA42AA7EAA08AA7EEA08AE48287E4808480888 +30195:00003FFE2000210820882488241024102220222021402080414042208C183006 +30196:00003FFE2000200027F8200020003FFE212021202120212022224222441E8800 +30197:00003FFE2100208020803FFC241024102220222021402080414042208C183006 +30198:00003FFE200020402240224023FC24402840204023F82040204040404FFE8000 +30199:00003FFE208020802FF82080249022A03FFC208021C022A02490588C40808080 +3019A:00003FFE208020802140222024102BE83006211024902290229042205FFE8000 +3019B:00107F10401044FE4410445444545F5444544454467C4510451244125F8E8000 +3019C:00003FFE2200220023BE221222123FD2201222142A942A48324842144A248442 +3019D:00003FFE200027F8240827F8240827F820403FFE210021F82108420842288C10 +3019E:00003FFE2100263824082738240827F82080208027F020902112411242128C0E +3019F:00003FFE20402248225024A0211026083BF6221023F0221023F0421042508220 +301A0:00007F7E40424442447E444244425F7E4450445246544548454844445F628040 +301A1:00003FFE220022102F90223E22223FC4201022102F902210422843A89C440082 +301A2:00003FFE220022382FA8222822283FC62000227C2FA42224422843909C2800C6 +301A3:00003FFE2200227C2F44225422483F40207C22542F542254424843489C540062 +301A4:00003FFE220024382F2829282F2829462F00287C2F24292449285110952822C6 +301A5:00003FFE20802FFC221021203FFE200027F8248827F8248827F8448A4082807E +301A6:00003FFE2000245E288A2AAA244A2AAA2EEA222A210A210A2FEA411241128126 +301A7:00107F904A104A3E6AA25B424A3A4A2A5B2A6AAA4A3A4A2A4A82530292142008 +301A8:00003FFE2110211027FC21102FFE211022082DF6204027FC224841504FFE8000 +301A9:00003FFE200021BC2E20223C22202FBC2220227E2FA82228222A442444348822 +301AA:00003FFE29103F9429122F10297E2F1022102F902A902D902AA84DA848C48982 +301AB:00447E28400048FE4810487C48107EFE4800487C4C544A544A544854BEFE0000 +301AC:00007EFE448848905EBE52A25EBE52A25EBE448856AC55AA64CA448A95280810 +301AD:02000400082010103FF8000800000FE0082008200A200920092210222022401E +301AE:0200044008201FF0021004007FFC0820101027C8C0061FF00480048808883078 +301AF:100011FC112411247DFC1124112411FCFE20102011FC24204220FE2043FE0000 +301B0:080008001FFC108020804100020000003FF0101008200440038004401830E00E +301B1:00000000FDFC1084108420843088588854509250122010201050108811041202 +301B2:0800080008FC494449444944494449287F280928081008100F28F04840840102 +301B3:00A000A0F8A0092409244B282D302920116011A02920292249228122011E0100 +301B4:02000100FFFE0200024002200210020000003FF008200440038004401830E00E +301B5:00107C1024102410281028FE2E1032102A102A10241044104A109180207E0000 +301B6:000000FC0084FC8404FC0484488428FC10841080288024804480808000800080 +301B7:00003FF008200440038004401830E80E08487F48144814481408242A241243FE +301B8:00001FF010101FF010101FF010101FF0000000003FF00820044003800C60701C +301B9:0800080008FC08447F444944494449287F284928491049107F28414800840102 +301BA:080008000FFC140027F04400040007F8040000003FF00820044003801C70E00E +301BB:00200020FDFC0420042048202BFE28001020102029FC24204420802003FE0000 +301BC:00007EFC428442844A94448840807EFC42A444A454A848A8489054A862C44282 +301BD:00003EF80288145008201450628C000010001FF82208440808881FC808500020 +301BE:00207C10241024FE280428442E4432282A282A28241044FE4A009180207E0000 +301BF:08200820145022887FFC200820083FF820082FF0241022202140408043609C1C +301C0:100010001F7C10447F4441443E4400287F284128491049104928142822444282 +301C1:004000480084FDFE042027FE148849142A2210C81010282224C4441880600380 +301C2:00FC7F00220811107FFC08200FE008200FE0083EFFE000203FF0082007C0F83E +301C3:1FE0064001800E4000007CF82448183066CC0000024032580E60325A0C42703E +301C4:2008201C7EE04080FE8042FC7EA442A47EA420A83EA86290949009283544C282 +301C5:7EFC2448183066CC10201020FEFE28504890BF7C2A542A542A542E5C08100810 +301C6:00007E7C22041C3C2204777C5500227E5542FFBC80A43F24292835102BA8FC46 +301C7:0000000078004BFC48004800480048004800480078004800000007FE00000000 +301C8:00001010082004401FF01010101010101FF0101000007FFC0004000400040004 +301C9:00003FF8000800081FF8100020003FFC0004001400083FFC200420043FFC2004 +301CA:0020002078204BFC484048404FFE488049004BFC780448880050002000100010 +301CB:00000FF0081009100890FFFE08101010105020201FF01010101010101FF01010 +301CC:002003A03C2004200420FFFE08200820102020201FF01010101010101FF01010 +301CD:00003EF8028822881450082034D8C306000000001FF01010101010101FF01010 +301CE:0040004078404FFE4880492049204A204FFC4820792849240222042200A00040 +301CF:000001FC79044904490449FC49044904490449FC790449040104010401FC0104 +301D0:000001FC7924492449244924492449FC4924492479244924012401FC01040000 +301D1:00001E78124812481248FFFE12481248128826A841101FF0101010101FF01010 +301D2:009000907890493E49404B004D3C4904490849107920492001420142013E0100 +301D3:0040002078004BFE4820482049FC492449244924792449240134012800200020 +301D4:010001003FF801000100FFFE028004401830E00E3E20223C22E022223E22221E +301D5:00200020782049FC4820492448A448A848204BFE785048500088008801040202 +301D6:00100010E790A010A07EA012AFD2A212A212A422A522E8A2AFC2004200940108 +301D7:010001000100793E4FE249224922496249A24F22792249220122013E05220200 +301D8:000407C474445454555455545554555455545554755451040284024404140808 +301D9:00000FF0081009100890FFFE08101010105020207C40447845C044407C44443C +301DA:0108010879084BE84A284C48490C490A490A49087A884A480248042804280808 301DB:01200128F1249224922096209AFC922092209250F25092500288028803040202 -301E3:0008000CF78A9088908E94B89288928A910A910CF28C9288048A081A00260042 +301DC:0100010001FC7A004DF848004BF848084A48494878884888014A022A04260002 +301DD:020001007FF8003001C00E0030004C0083FE00007DFC4484444844307C484586 +301DE:00001FF0101010101FF010100804FF8402242224142408241424220442148008 +301DF:0200010000007FFC41044924454441044FE4482448244FE44824400440144008 +301E0:080008007F7C094411441544227C414402800C603018C8C60F000808080807F8 +301E1:02200220F220943E95409F4092BC920494089F88F410902001C20E42043E0000 +301E2:000003F0791048A0484049B04E0C484048404FFC78E049500248044408420040 +301E3:00100014779250925090549E52F052925112511472945298048A081A00260042 +301E4:0000FFFE040004000FF018102810CFF0081000003E20223C22E022223E22221E +301E5:0000040072FE52205020503C5E24522452245224724452540288050008FE0000 +301E6:00207820482049FC4820482078204BFE010001007FFC010011101FF2010200FE +301E7:02100210F210927C92149F949214921492FE9210F21093A80E28044400440082 +301E8:00001FF01010101010101FF010100820101020487E44227823C022423E42223E +301E9:00003FF820083FF820083FF820083FF81010200840043FF8200820083FF82008 +301EA:00007C7C444444447D7C454401003FF82108210821083FF82108010001000100 +301EB:00003EF8228822883EF800003FF82108210821083FF82002200220021FFE0000 +301EC:00C0031E7A524A524A524B5A4AD64A524A527AD24B5A00540090009001100210 +301ED:01007FFC40240210FFFC042008201E4001C00E3870041FF8100810081FF81008 +301EE:00207E2022502450248829042EFA2200220024FC548448849484228442FC0084 +301EF:0000FF3E092209247F2809240922FF2A1124252042201FF8100810081FF81008 +301F0:07FC0404F40497FC9420942095FC9420944097FEF44094FC0408085008201010 +301F1:00087C1C44E0448044807CFE0080FE8020BC40A47CA404A404A4053C29241200 +301F2:004000A079104A484DF6482048404BF84A084A487A484A48024800B001080604 +301F3:01000100F1F09210922097FC9A449244924493FCF2A490B00128022A0422081E +301F4:104010202820240042FE80007C04008400847C484448444844507C1045FE0000 +301F5:00000186F6389420942097A094BE94A494A497A4F42494240424084408441084 +301F6:00001FF010101FF002007FFC044008203458C2861FF001007FFC010001000100 +301F7:0410021072105FA0543E544457A454A454A874A8549004900AA8092810440082 +301F8:0040002007FE7900490049FC4800480049FC490479FC490401FC010401FC0104 +301F9:00001FF0101010101FF010100040204013F88040484017FE1080E11023F82008 +301FA:01003FFE20802FF820883FFE20882FF821402630380E27F84408440887F80408 +301FB:03F00010F02090449E5893F09250924895E8F44894440BF41042004001400080 +301FC:00400048788449FE48204BFE488849244A427988481000620184001800600380 +301FD:000003F8780848684B88488848884BE84AA87AA84BE8008800AA00EA07260002 +301FE:00003FFC00047FE400043FC420443FD400087FFC40044FE4400447C4444447CC +301FF:00007FFC00001FF010101FF008200440FFFE00003E20223C22E022223E22221E +30270:2040204027FC204023F8FA08224822482248224822483A48EFFE409001080604 302C0:2124212422AA23AE2124FAAA23AE202427FE201027D43D54E7CA454A07D60022 +302D9:00000FE0082008200920092009200920092009200920FFFE0240042008103008 +302DB:010001007FFC0280044008203858C9860E000800FFFE08000980086009900E08 +302DC:0100010001007FFC0100492429141108110829144AA40280044008203018C006 +302DE:010001007FFC0280044008203018CFE60100010009F00900090009007FFC0000 +302F7:04000208210811100810082002400200FFFE042008201E400180066018186004 +302FB:100011FC11241124FD24252425FC250425004900290011002900460082000400 30300:08200820FFFE0820082000007FFE400282040200FFFE08201C4003800C707008 30302:10201020103E1020FC2025FC2504252425244924292411242850444884840104 +30335:0200010001007FFE400280043FF012101120092004400280010006C01830E00E +3033B:020001007FFE4002840404007FFC08001040304053F890401040104017FE1000 +3034E:1020101010FEFE82110410007CFE10101010FE90049E0890509020D0113E1200 +30370:00001FF810081008100810081FF81008100010001000100020002FFC40008000 +30371:3FFC200420043FFC2080208027F8208021003FFE210023F82010432040C08020 +30409:208020843E9820E020842684387C2000082008200820FFFE0820082010202020 +30414:0000F80009F809080908790841F841084108790809F809080800080057FE2000 +3043A:00003FF0006001800600180420041FFC00000100088848844812481287F00000 +3043F:100013F0102018401480510053FC512491241124122412441444188411281210 +3044A:10201020102013FE1820542051FC5020902017FE100410081190106010101008 +3044C:100013F8120812081A485648524852489248124812481FFE1080109011081204 +30450:100011081088109010005BFC54005000900011F8100010001000100017FE1000 +3045D:2040204027FC204033F8AA08A248A248A2482248224822482FFE209021082604 +3045E:100011FC1020102010205BFE5420502090201040102412A2128A148810781000 +304BC:1000100013FC1000FC001000100015F818003000D0001000100017FE50002000 +304CA:2080208020802080F3F02090209022983294E4922892209021102110A2504420 +304CC:10201020102013FEFC20102011FC152419243124D1FC11241020102050202020 +304E2:10841044104813FEFC20104011FC1440188031FCD00410881050102050102010 +304E3:1040102011FE1102FA04100013FC19443124D0A8108810501020105051882606 +304E8:100011F810881050FC2010D81306102014201BFE3020D07010A8112452222020 +304ED:100011FC10201020FC2013FE1020142018203040D02412A2128A148850782000 +3057A:0020002078204BFE4820482049FC782048204BFE480448087850482000100010 +305D1:00003FF010100820044003801C70E10E010001007FFC054009203118C1060100 +305DD:1020102013FE1020FC2011FC3104392455245524912411241124112417FE1000 +305E3:020001007FFC0820082008201450228801000100FFFE054009203118C1060100 +305F6:1042122211241124FD08100031FC39245524512491FC11241124112411FC1104 +3067D:0020FC2023FE202020203DFC4504452465249524092409241124212447FE8000 +306D1:004020201020100083FE42024404100010002000E0002000200027FE20000000 +306D3:00202020102013FE8020402049FC0820102017FEE00420082190206020100008 +306EC:0040204017FC104083F842084248124812482248E24822482FFE209021080604 +30708:00842444124812488210400047FC144414442444E7FC24442444244427FC0404 +30776:100013FC10041008541058205020902010201020102028202420442040A08040 30787:100013FC110414885850502050D89326102011FC102010202BFE242040208020 307D8:2200213E20022242AA7AB28AA312A242229A228A22DA228A52FA4A02420A8204 +30828:00003FF8200820083FF820002080248027F82480288020805FFE408080800080 +30831:100011FC510451047D245124912411241D24F124512417FE1040108811041602 +30842:00204420282013FE2820482089FC082018202BFE480488080850082050102010 30858:004088A05110224855F69020104013F83208524892481248124810A0A1104608 +308F2:008000401FFE1084944452485210100037FC5444944417FC2444244447FC8404 308FB:008000401FFE100097FC500853E8122833E850009FFE100823E8222843E88018 30915:1008101C21E07D0045204520452045FE7C20442044A844A445227E2244A00040 +3094C:000007FE78404840484078404850484878444844484048407840484000400040 +30955:0020002078204BFE4820782049FC482078204BFE480448087850482000100010 +30969:07FCF404940497FCF420942095FCF420944097FE9440F4FC9408085008201010 +30993:2040204020407E404840886008500848FF440844144014402240224042408040 +309AA:000000FCFC841084108420843CFC64846480A480248024803D00257E02000400 +309AB:00007FFC040008001FF0281048108FF0081000003EF80288145008203458C286 +30A1B:08001C00F1FC10441044FE441044304438445444544490841084110411281210 +30A62:202010201020FDFE0020082089FC882048204BFE500450081C50E02040100010 +30AA9:082008104A102AFE2C800880FE8018801C802A802A8048808880090009000A00 +30AB1:10201020942055FE58201020FCFC3020382055FE540490081050102010101010 30ABF:1088108893FE5488580011FEFD023244384055FC544490841084110412281410 +30AFE:1000100023FC20004800F80017FE20904090F890409000901912E112420E0400 +30B04:100017FE204020404880F3FC120422044204FA04420402041A04E20443FC0204 +30B0A:10001108208820904800F3FC100020004000F9F8400000001800E00047FE0000 +30B15:10401024222421084908F8101040204047FEF888410801901860E05041880604 +30B38:1020102023FE242045FCF92411FC212441FCFC2243FE00421C24E2A2428A0478 +30B43:200021F83C88508890881088FE50105010505420542054505C50648805040202 +30B4B:7FFC444444447FFC0100FFFE01001FF0101011101110111011101110FFFE0000 +30B5D:00007EFC020422441224122402040A14122462C402040A1404080000FFFE0000 +30BF6:080010007F7C41107F1041107F1041FE7F1022102210FF902210221042108210 30BFC:2FEC48246BAC48246BAC4AA4FFFE84423FF80440FFFE1FF010101FF010101FF0 +30C1F:04400440FFFE04401000103010D017103810D010105010201002100210020FFE +30C21:08200820FFFE0820082000003FFC2004400800000000000000000000FFFE0000 +30C24:04400440FFFE044000007FF84020482044404280410042804440582040007FFC +30C2B:04400440FFFE044001003FF8010001001FF0010001007FFC0018066001800040 +30C2C:08200820FFFE08200000FFFE010001001110111021200280044008203018C006 30C72:08200820FFFE082000007F7C22443E44224422443E44227C2700FA2802440282 +30CBD:1048104811FE7C485448540055FE55027E045000100014001C00E40043FE0000 +30CC7:2020212420A4F8A8A820A9FEA902AA24F820A02021FC28203820E82043FE0000 +30D4B:0008203C11E0102000200020F02013FE10201020102010201420182010200020 +30D55:00202020102013FE00200020F1FC1020102013FE100410081450182010100010 30D5D:003843C020402040004007FCE04020E020E0215021502A483248244408420040 30D5E:00804040200023E000220034E7B820B020A820A8212821242A24342220A00040 +30D5F:0000210810881090000003FCF0001000100011F8100014001800100007FE0000 30D67:40202020202003FE0020E020202021FC2040202020A42A82328A228A04780000 30D74:0100410021DC211401140114E7D4201421142194254825482908311425140222 30D7C:0208420823BE24880AA8013EE2082448284827FC20E021502A48344628400040 30D8A:0040202011FC1088005003FEF00011FC110411FC110411FC14201A94128A047A +30DDF:00007DF8441054205440548055FC545454545494552410242844248445288010 +30DE3:082008207EFC0820FEFE1450228841069FF0101011101110111002600C187004 30DE5:01007FFC40041FF000007FFC1110250842041FF010101110111002C00C303008 +30E01:00007C0045FC444444447C44104410445C445044504450845C84E10401280210 +30E04:00007DF84410442044407C8011FC105410545C945124502450445C84E1280010 30E6C:2090209027FEF894200AF9FEAD08FFE8A94AF9EA272AFDEA254C21EA22162462 +30E70:208020402040FC20402050209020FC50105010501C88F0885088110411041202 +30E77:200021FC2000FC00400053FE9090FC90109010901C90F09251121112120E1400 +30E79:20002200FAFC2224422453A45E249224FA2412241AA4F3245244104410941108 30EDD:00809FFE548A0BE4C1405DCA541A57CA5D5A55EA542A5FAA5462550642A8BFFE 30EDE:00809FFE548A0BE4C1405DCA541A55EA5D5A55EA542A5EAA5462550642A8BFFE +30F03:0020FE2028202820FE20AA20AA3CAA20AE20C2208220FE2082208220FEFE8200 30F57:100011FC3C2020204020BC20102013FEFC201020102010201420182010A00040 +30F59:104010403C4020404040BC40107C1040FC401040104010401440184017FE0000 30F5A:102010103C1020FE4080BC8010801080FC801080108010801480190011000200 +30F5F:108810883C88208841FCBC8810881088FC8813FE108810881488190811080208 +30F62:100011FC3D0421044124BD2411241124FD24115410501090149019121212040E +30F64:102010203C2021FC4024BC2410241024FDFE1020105010501488188811040202 30F74:102010203DFE20504088BD0412FA1000FBFE1040108011FC1404180410280010 30F7D:210420843888200043FE7820A02021FCF820202023FE20202820302020200020 +30F82:202020203BFE402041FC7904A1242124F92421242124292437FE204800840302 30F89:200023FE3A02249441087204A1F82020F820202023FC20202820302020200020 30FA0:210021F03A10242043FC7A44A24423FCF8A02122261E20C02830318020600010 30FAB:209022903A9C22A042D07A88A2882080F80023F822A822A82AA832A82FFE0000 -3106C:07E00FF007E00FF07BDEFFFF7BDEFFBF7BDE14503FFC3CF02FBC3EF83EF82FBC +3106C:0FE01FF829501FE0644CFFBEAAD67F4CCADEAE94EADA56AEFBF256AE74E856AE 31090:2000107C7C440044447C2800FEFE00827C92449244927C92442844247C424582 310A9:140012FEFE101020107CFE4492549254FE5492549254FE549228922492428682 +310AA:080008FE7F1008203E7C22442A542A542A542A542A542A547F28102424424282 310B1:020002BE02087F90423E42225E2A42AA42AA5EAA56AA552A5D6A414842D48462 310EA:108810882BFE24885088F8F84888788848F87888408853FE4800588869044202 310F1:2040204020403CFE44804900A07C200820102020204020802902310220FE0000 310FA:2008203C21E03C2044204BFEA0202020202021FC210421042904310421FC0104 3114B:00007CFE044424442444247C24443E44027C02441A44E24E42F4020414040804 +3114C:0090F890089048924B94489848907C90059006923492C48E048004002BFE1000 +31151:111009203FF8020002007FFC082010102FC8C04608400FF800083F8800280010 3115B:0104F888085049FC4924492449FC7D24052405FC1C20E42045FE042028201020 311E3:202020287D24452089FE7C405440547C7CA454A454A87CA800901D28E2444082 311F1:108011F8128820702B8E688068F8A9102A202DFC292429FC292421FC200023FE @@ -75490,6 +78100,7 @@ FFFD:0000007E665A5A7A76767E76767E0000 313FF:000043FC2204220402040A040A0412041204E20422042204220423FC22040000 3158E:1008103C11E010201020FC2013FE10201020105010501C50E088408801040202 31592:205020482040205C21E0F840205E23E02044204820303822E052408A03060002 +317DB:E92EB7D4FC7EABA4F6D41BB4E00AABDEEE88ABEAFC2AABA4AC6A0910A08A9FFA 31B92:008844882BFE108828A84850888809241A2229FC482088A809240A2250A02040 31B9C:004088A05110224855F69020104013F8320853F8920813F8120813F8A1104208 31C7F:0840084008407F4049404A5048487E444244424052404C4044404A4092402040 @@ -75497,13 +78108,462 @@ FFFD:0000007E665A5A7A76767E76767E0000 31D31:00200020FBFE202021FC4154795449FCC8004BFE484048247AA24A8A04880078 31E07:20403F7E489085080820FFFE08200000FFFE800201003FF8020802080C503020 31E4D:1088108895FE5488588810F8FC88308838F8542055FE907010A8112412221020 +31E91:100011FC200424084410F820102020204020FC20402000201C20E02040A00040 32003:202022222222FBFEA800ABDEAA52AA52FBDEA25222522BDE3A52EA52455A08A4 +32064:204010240124FD04010478880088788800507850482048204850788849040202 3208E:000021FC10201020002003FEF020104011FC1104110411FC1504190411FC0104 32217:202021FC3888205043FE7800A1FC2104F9FC210421FC20202BFE302020200020 +322A6:020001007FFC0820044003801C70E44E04407C7C04403C7804407C7C0440FFFE 322E4:200021FE20423C4244424842808A2084210020FE208224822882308220FE0082 3235B:2040208021FCFD0421FCA904A9FCA900A9FEF90021FE20022AAA32AA2202000C 3236D:1020104010FCFE8410A454845494548854807CFE1002100215FA180210140008 3237F:20201040FEFC288428A44E845294DA88568062FE54024C0249FA540264144008 +323B0:00007FFC02000200020002003FF0041004100410041008100810081008100000 +323B1:0080208020802080208020802080FFFE208020802080208226823882207E0000 +323B2:0000FFFE0100010002003FF82008200820082008200820082008200820282010 +323B3:00007FFC000000003FF800000000FFFE00007EFC000000003C7800000000FEFE +323B4:43FC2204020413FC2090E11222122C0E0000FFFE020002400220021002000200 +323B5:100011FE10101010FE2010FC108420843E8462FCA2842284228422843EFC2284 +323B6:0804081E08F07F1010921452245424107EFEA4102410241024103F1020502020 +323B7:08201C20712410A410A87C2011FE10501050FE501050205220524892FC8E4500 +323B8:0800087E08527F52107E14522452247E7E10A41024FE241224223F22204A2084 +323B9:20402E9E22B22A5226543BB424382BD42252225223D2245A3A94C0F00F100410 +323BA:001000F83F00010002007FFC044009203118C106010001000100010001000100 +323BB:0820082049FC482048204BFE480048484844487E4BC0082810281012206A4386 +323BC:141012102110491008FE149222924192BE9222FE2292221022103E1022100010 +323BD:200023DE22522252FA52ABDEAA52AA52AA52FBDEAA52225222522252255228A6 +323BE:2000247E2210FA30A84AA89AF82C264CFA9AAA2AAA4AFA88AA28251028FE2000 +323BF:0020042004208520452C2934296413A411242934292845224522810200FE0000 +323C0:000801FC7F00010001003FF82108210821083FF8210801400120011001100100 +323C1:00003FE00420047C08043014C2080100FFFE0200024002200210020002000200 +323C2:00200020FF48048405FE14025420542054205420542014201420042004A00440 +323C3:001000FC7F0001000100FFFE1110111029284544111011102928454401000100 +323C4:104092405440FE78308854889288011010101010FE2810282848244444848102 +323C5:08001FE020207FF8A108228824483FF8000021083FF821083FFA410A41068002 +323C6:0100010021002100210021003FFC010401040204020404040404080410286010 +323C7:00007FF00020004000800120021004080908108010402044200420041FFC0000 +323C8:0100010009200910110821044104050002007FF0006001800600180420041FFC +323C9:040004000FE01040208003401C30E00E00007FF0006001800600180420041FFC +323CA:00007FF000100410041044104410441044107FD00412040A040A0406FFE20000 +323CB:010001003FF801000100FFFE028004401830E00E1FF0006003801C0420041FFC +323CC:00007FF000100010FFF00810109021107E1004100812110A208A7FC620420000 +323CD:0100111011082124414401800E00F00000007FF0006001800600180420041FFC +323CE:0100028004401830E44E044004400840104000007FF0006003801C0420041FFC +323CF:0880088013F03090509090921112120E140000007FF0006003801C0420041FFC +323D0:080008001FF822484448088811082228041000007FF0006003801C0420041FFC +323D1:000007A0F8A0092009201120112011A02720212021244124451C420240023FFE +323D2:00007FF00010001000100012FFEA00260822112022207C2008243094FFCC4044 +323D3:000003F8F8400A4809480950104017FC2040204040404040404240023FFE0000 +323D4:010001007FFC010001001FF0101010101FF000007FF0006003801C0420041FFC +323D5:010001003FF801000100FFFE09203118C10600007FF0006003801C0420041FFC +323D6:02000200FFFE040008001FF82808C8080FF800007FF0006003801C0420041FFC +323D7:00807C88449044A044C044847C84007C00007FF0006001800600180420041FFC +323D8:000027F824082408240827F8240027FC24042404240427FC240420003FFE0000 +323D9:080008001FF82008DF88108810881F88005000207FF0006003801C0420041FFC +323DA:089008881080309E57E0908010441034100C00007FF0006003801C0420041FFC +323DB:000001F8F908094809280BFC11081248222823FC40084050402240023FFE0000 +323DC:02000FE0344003803C8003F81E1001607F8000007FF0006003801C0420041FFC +323DD:0840084008407E6018502C484A448840084000007FF0006003801C0420041FFC +323DE:04400440244427582460244224422F42F03E00007FF0006003801C0420041FFC +323DF:010011001FF8210001007FFC05401930E10E00007FF0006003801C0420041FFC +323E0:101010103EFC4210A290149008FE1010601000007FF0006003801C0420041FFC +323E1:3FF020103FF020103FF0220821902C60301C00007FF0006003801C0420041FFC +323E2:011001087FFC0100211811A007401920E118450602003FF001C01E0420041FFC +323E3:10001000FEFC10041008FE10822004207840084010801E82F0821082507E2000 +323E4:010002800C603018CFE601003FF801001110250802003FF001C01E0420041FFC +323E5:04000FE0344003801C70E10E1FF001001110250802003FF001C01E0420041FFC +323E6:3FF820083FF820702F8020F02F8040F85F84807C00003FF001C01E0420041FFC +323E7:108050807CFC515492541CA4F12412441094110800003FF001C01E0420041FFC +323E8:00F83F0001007FFC0920FFFE09207FFC01003FF800003FF001C01E0420041FFC +323E9:3FF820083FF820803FFC208027F04410441087F000003FF001C01E0420041FFC +323EA:00007DFC440849E85128492845E854084828401000003FF001C01E0420041FFC +323EB:204013F8004077FC1080110813FC280447FE00007FF0006003801C0420041FFC +323EC:0820FFFE082010007F7C114411442144257C420000003FF001C01E0420041FFC +323ED:1108614401840FF078100FF008100FF008100FF000003FF001C01E0420041FFC +323EE:00003DFC244424443C94250824FC24843C8400FC00003FF001C01E0420041FFC +323EF:00007FE000240A287214120AFFE6122412282214420A3FF601C01E0420041FFC +323F0:0820FFFE08203FF820083FF820083FF80100FFFE01003FF001C01E0420041FFC +323F1:1FF010101F9010907FFC50141FF010101050102000003FF001C01E0420041FFC +323F2:108011F822886870AB8E282029FC28A82924226200003FF001C01E0420041FFC +323F3:0E80F0BE22909290549000987C940892109210901E90F090109210925082207E +323F4:0100FFFE00001FF010107FFC40044FE448244FEC00003FF001C01E0420041FFC +323F5:10200810FEFE1020244878F0102024487EFC020400003FF001C01E0420041FFC +323F6:3FF821083FF821083FF808103FF801081110230800003FF001C01E0420041FFC +323F7:00107F1049507F50495C7F7400D43E5422543E54225C3E52224222422A3E2400 +323F8:208820883C8843E8908851DC5DA876A8D6885488548854BE5880508240023FFE +323F9:10003FFC529012907FFC12901290FFFE2488424400003FF001C01E0420041FFC +323FA:1040FC2003FE7820002079FC002078204BFE780000003FF001C01E0420041FFC +323FB:00907EA004442BA810102FE8C8260FE004407FFC00003FF001C01E0420041FFC +323FC:3DFC244424943D0824FC24843CFC00002224411200003FF001C01E0420041FFC +323FD:1A00E2EE4A22AAAA52660222F222126622AA3A22E22222AA22442202A1FE4000 +323FE:211017FC004073F8120813F8120813F812082FFE40003FF001C01E0420041FFC +323FF:1A32E2CC4A88AAE852AE02AAF2EA128A228A3A8AE292232222002202A1FE4000 +32400:1A10E2FE4A54AA7C5210027CF21412FE22143A7CE210225022202202A1FE4000 +32401:100011FC1004FC08101078201020FC2010203820342054209020102010A01040 +32402:00001FF00000000000007FFC000001000100210821082108210821083FF80008 +32403:00001FF0000000003FF80000FFFE020004003FF820083FF8200820083FF82008 +32404:00001FF000000000FFFE080010087FFC00043FF8210821083FF8200220021FFE +32405:08001FF822484448088811082228041000001FF00000FFFE040008203FF80008 +32406:00001FF0000000007FFC000004407C7C044004407C7C04400440FC7E04400440 +32407:0080FE80288028FE29022904AA206C2028A828A4292429222E22F02040A00040 +32408:00003FF80000FFFE082010103FF8000800007C7C0000FEFE20204444FEFE4242 +32409:00880088FBFE2088200021FCF808285028204BFE486248A45D20E22004A00040 +3240A:00400240014003F87888009000FC0104010803FE1A02E42A4AAA028204140008 +3240B:00007FFC02003FF00410FFFE0000203C17C08244412817FC2040EFFE204027FC +3240C:020001000100FFFE0000080049F8488848884850485048204820485008880B06 +3240D:02000100FFFE000008000BF81208320853F8904017FE10E0115012481C461040 +3240E:02000100FFFE00003FF8244824483FF801007FFC0380054009203118C1060100 +3240F:10100810FFA80028144414922708297C6D04B2082A08241026202980307E2000 +32410:02000100FFFE020001007FFE40029FF410101FF002003FF8200820083FF82008 +32411:2000123C11240124F83C4400427E424240C2417E41424642427E7A42024A0044 +32412:202011FCFE2000207CF844887C8800F8FE50825038542894290C2802480287FE +32413:02000100FFFE000022204AA08ABE1FC420A46F24A0282FA822102FA822442F82 +32414:0100FFFE20003FF800007FFC44447FFC104822707F44013C3E4022703E44223C +32415:080008000BFE1020102030203020502090201020102010201020102010201000 +32416:00100010FE1022102410241028102F102110212821282128412841444A448482 +32417:010002800C603018C0063FF802000200FFFE040008000FF80008000800500020 +32418:1200120012FC2224222463A46E24A2242224222422A423242244204420942108 +32419:010001000280044008203118C10601007FFC0380054009203118C10601000100 +3241A:0810081017FE301052109110111010101050102001000100028004401830E00E +3241B:1040104013F82248224862486FFEA1002100220023FC20042004200420282010 +3241C:082008200820107E124232845210921012101210122812281248104410841102 +3241D:084008400A481248124833F83000500097FE1040104010401040104011401080 +3241E:1000148012BC212422A464A460A4A1A421B422A824A028A220A220A2251E2200 +3241F:010001007FF801083FF821003FFC0284044C1830E60E01800040060001800040 +32420:0880089808E017841084307C300057FC904010401FFE104010A0111012081406 +32421:10001FFE10A020A027FC64A464A4A4A424A424A4251C26042404240427FC2404 +32422:08200820082014401248228449FE888208100810141012282128214440848102 +32423:3C78244827C8200820083FF8010002800C603218C1061FE00020004000800100 +32424:08000BFE0A021252128A3306320252FA928A128A128A12FA128A1202120A1204 +32425:080009FC090411FC110431FC3000500091FC1020102013FE1020102010201020 +32426:100017F82110613CA104220424142808210011001FF821005FF00100FFFE0000 +32427:100010001FBC24A424A46524A53C25A424A424A424BC28A428A428A432FE2100 +32428:1080104017FE20802110620867FCA00420002248224822482248224A244A2846 +32429:080008FC14841484228452FC888008A000A27EA402B804A004A20922091E0200 +3242A:100017BC14A424A424A4653C6624A52424A424BC24A426A4252424242444248C +3242B:08000BFC0844114411443284309451089240102010A41282128A128A14781000 +3242C:00007FFC01001110111029284524854211921110292825284544818201000100 +3242D:14101210121020102F106110627CA31026902A90221022102210221022FE2200 +3242E:3FFC20003FF020103FF020003FFC000008500848107E37C050409022101A1006 +3242F:082009240924112411FC3000300053FE9040108010FC11841284148410FC1084 +32430:107813C0104027FC204063F86048A7FE204823F820E0215022482C4620402040 +32431:083C09E00820102013FE302031FC5104910411FC110411FC1104110411FC1104 +32432:084008200BFE122012FC3224322453FE9224122412FC12201250145014881906 +32433:13F8128812482FFE2488644867FCA0082028201023E0202020402FFE204020C0 +32434:084008400BFE108011FC322035FE500091FC110411FC110411FC110411141108 +32435:100017FC1080210023F865086108A1F8200027BC20A422A42128229024A82846 +32436:0850084817FC304050A09110120814043FF821083FF821083FF8210801000100 +32437:100013F8120823F8220863F86208A080204027FC20002208211020002FFE2000 +32438:100017FC144427FC244467FC6000A3F8220823F8220823F82208220822282210 +32439:104014441444244427FC60006FFEA0A020A027FC24A4251C2604240427FC2404 +3243A:104010A0111022082DF6600063F8A208220823F8211021102FFE211022102410 +3243B:0880088009F81208141033FE32025252928A1222102017FE1050108811041602 +3243C:204020403E4052BC52A4D5A454BC56A452A452A452BC52A45280628062FE4680 +3243D:100017FE1402200423846004603EA7C42294228C22842284228C2482247E2800 +3243E:1208111017FE2040204063FC6040A04027FE2000204027FC20A0211022082C06 +3243F:1040102017FE2488248867FE6488A4F8240025FC248424882450282028D83306 +32440:1200120017BC22A422A464A465BCA840204027FC20E021502248244428422040 +32441:10141012101027FE20146018A79024B42498249027B2200C20CA2F1A20662002 +32442:084008200BFC1204120433FC3220521093FE1220125412C81348144414521860 +32443:104010FC11042288287068886B06A8F82820292029FC2A2028F8202023FE2000 +32444:08000BF8120813F8320853F8900017FC00007FFC010011F811001100FFFE0000 +32445:02000100FFFE000011101110292845441110292845440100FFFE010001000100 +32446:1110109010A027FC204060406FFEA04020A0211022082C062000252424922892 +32447:1110111017FC211021F06110A1F021102FFE2110224825F4204020402FFE2000 +32448:100017DC151427D4245467C8A508251427E22000204027FC204020402FFE2000 +32449:208020BCF89021102110FB10897E01107110111021283928E128214421446182 +3244A:08200820083C102011F8310831E85128912817FE140215FA150A15FA14021406 +3244B:1040144412482FFE280263F8A208220823F8204027FC24442444245424482040 +3244C:10101450127C2290201060FEAE002200227C22442244227C2244250028FE2000 +3244D:1200111E17D2201224546298A01427D2201227D2245A2454245027D024502010 +3244E:201020082F88417E4142DD085528553E554855085D7E51084108410845084208 +3244F:010002800C603018C82614502288082008201450228808200820145022884104 +32450:100016EE1242224222E26EAEA8A828A828A82EEE22A222A222A222E22AAA2404 +32451:20202F3C29444AA84A10CC284AC64938491049504D7E4A90487C481048FE4800 +32452:104013F810482FFE204863F86040AFFE200023F8224823F8224823F820002FFE +32453:100017FC10402FFE284263586040A358200027FC2444244427FC2444244427FC +32454:128812881FE8228823BE610A67CAA54A27CA210A27CA210A27D2211221EA2E44 +32455:100017FC14A427FC204063F86040A7FC211020A023F820402FFE204020402040 +32456:0840082017FE3088D1501320159811063FF82448282837D8244827C820282010 +32457:10881448125020FC202060506E94A23822502298223422542290222025FE2800 +32458:23F8220823F8200037BCACA4A7BCA040A0A023182C4622482244244421402080 +32459:104017FC100023F8224863F86248A3F8204027FC2148224424AA299022C82086 +3245A:084013F8311057FC900013F8120813F801003FF801101FF011001FF802887C7C +3245B:17FE140217FE242025FC652467FEA52425FC252425FC244027FE28882870338E +3245C:150815081FBE2508270862086FBEAA802A882F88223E2F8822082208223E2200 +3245D:128812881FE82288211E67AA612AA14A2FEA210A23CA264A2BD2225223EA2244 +3245E:10141792149E24F02794648A6496A7E224942492279E20702514248A28962062 +3245F:1040102017FE240221F8610861F8A10827FE224023DC225423D4226827D42062 +32460:1200110017DC2014245462946FE6A2002D3C2354259429482348251429142322 +32461:102017FE140025FC252465FC6524A5FC242025FC242027FE25242AFA282033FE +32462:010002800C6037D8C0061FF010101FF0424224247E7E2424FEFE242444448484 +32463:1080109CFD041104133E7D4045507D5C45687D48457E7D4845484F14F1240142 +32464:111017FC115023F8224863F86040AFFE220823F8220823F8220823F821102208 +32465:12081210153E24A2283E67A2623EA2082FBE222A22AA2B2A262A23AE2E082008 +32466:100017FE109027FE249267FE6000A7FE242A27FE255225DA241227AA244627FE +32467:1040144417FC200027FE64006590A49E27D4256425D4255425C825682BD43062 +32468:201023285C4454BAD50054FE54925ED6549254FE5400557C5544537C55445A7C +32469:10487E44107E7EA210A2FFBE00A07EA042BE7EAA42EA7EBE42AA7EAA24AA42A6 +3246A:17FC10401FFE28422B5860406358A0002EEE2AAA2EEE20002FFE224825542FFE +3246B:042009FC18506BFE088808F801003FFE225024FC2D9036FC249024FC4A9493F2 +3246C:108010409240522054201020FE2028502850285028482A884C88490481040202 +3246D:102010209420542059FC1124FD24292429FC28202820282028204820480287FE +3246E:2810285028502850AA886C8829042AFA6C48AA48284828482A884C8849288210 +3246F:100010FE92825282548210FEFE20282029FE282228222A424C42488281140208 +32470:20202020FE2025FC282012F82A00C6F80088FC88288828F8288A480247FE8000 +32471:1008103C95E0549658481030FE4829942824284C299428244A444D8488280010 +32472:107C10449244527C54441044FE7C280028FE288228822AFE4C82488280FE0082 +32473:1044104492FE52445444107CFE442844287C284428442AFE4C00482880440082 +32474:10881048945055FE584010A2FD342858289429342852289229504820480287FE +32475:10081388928856945A941322FF1C2A882A882ABE2A882AAC2B2A4E4A4A088218 +32476:08207E20087EFEC410281E1022284A468FE010203FFC50841FFC01400642783E +32477:10441024922852FE549210D6FEBA289228FE2800287C2A444C7C4844807C0044 +32478:101411FE511051D47D48914A1296FCFC28A42BFE291429FE2804480C480287FE +32479:002020F84C2045FC44886DDC448845DC7C0029FC28502854288C490247FE8000 +3247A:00807C40104010201020FE202820445082507C504448448844887D0445040202 +3247B:078002400C203018C2861EB002C00E84727C01007FFC11101FF01110FFFE0100 +3247C:0620382008A47EA819202C504A88090406C01830E00E1FF001000FE001007FFC +3247D:070002800C603118C0863FFC24483FF828402F7828442F3C20804FF840809FFC +3247E:10100810042004403FF80010002000C000800080008000800080008002800100 +3247F:100010007E7C124412441244227C4A4484000080048004400820101020084004 +32480:44204420FE50445044887D24461244107CFC44044408FE880050282044108210 +32481:1020921054101000FE0011FE3800D40012482044FC4444444882308248828502 +32482:1020FDFC10203820542093FE00001FF010101FF010101FF01010FFFE08201010 +32483:448024862958FD0212AA7DD41140FDC8297E45D4AB1429A4295829CC49528820 +32484:00007FFC4004444444444AA45114400441044104428444444824400440144008 +32485:0100010002807FFC4444482450146FEC40044FE4482448244FE4400440144008 +32486:00007FFC41044FE441245FF441244FE441045FF448244FE448244FE440144008 +32487:00007FFE40028004004004400440044008200820082010101010200840048002 +32488:00007FFE4002810401007FFC010001003FF0082004400280010006C01830E00E +32489:00007FFE40028104010001000100010011F011001100110011002D00430080FE +3248A:00007FFE4822901428084FE4102020407FF8A10821083FF8024004421842603E +3248B:00804080208020FC01040104128414482028E010201020202040208021000600 +3248C:010841082108210807FE0108110811082108E1F8210821082108210821F80108 +3248D:00404240224023FC04400040104017FE20E0E150215022482444284220400040 +3248E:0040404027FC204003F8004017FE108020F8E108231024A0204020A023180C06 +3248F:000047FE204027FC0444044417FC14442444E7FC224021402080214022300C0E +32490:000043F8220822080208020813F810402040E240227C22402240254028FE1000 +32491:0040404020A021100288044611F010102020E04023F822082208220823F80208 +32492:0040404020A02110020805F61040104027FCE040204023F82208220823F80208 +32493:04444244228427D40114011411141FF42114E114229422542444244428140008 +32494:0208411027FE2040004003FC1040104027FEE000204027FC20A0211022080C06 +32495:0004454425542A9405540554101417D42114E3D424542A542194210422140C08 +32496:0200823E452244A20862343E222022284FAAC0AA40AC4928452A424A41460080 +32497:00004FFE20A027FC04A404A417FC100027FCE0002FFE20402248244429420080 +32498:000047FC244427FC044407FC1100121027E0E0C823042FFE2042224825440882 +32499:0140412023FE26200BFC022013FC122023FEE200279E2492249224F224020406 +3249A:0810841044285F4400822E7C20002EFE40AACEAA4AFE4AAA4AAA4EA24A8A0084 +3249B:200211F2FE42824A284AFEEA28AA7CAA292AFEAA284A444A52828A82210A1204 +3249C:0444842844FE4A10097C291034FE225440385FFEC100427C4A444444427C0044 +3249D:02089FC8400E5FD2104A174455485758504E5FCAC0125FCA40045FC44A881650 +3249E:00003FF8200821082108210821082108210821082108210A210A410A41068002 +3249F:122012482AFC774452AA5FFE562857445A9A526052185260520C52F250028FFE +324A0:00003FF821083FF8200020041FFC0100210821083FF80100410441047FFC0004 +324A1:0008082C48CA284A2848AAFE9248924A924AAA6CAAC8CA5A826A9E4AE24600C2 +324A2:100010EE542254AA546654AA7D50104810FE559054FE549054FE5C9064FE0080 +324A3:200023FEAA52AA52ABFEA908F954225E23B4A91EAA54ABDEB814CD54055E0010 +324A4:04040404040404242424242427A42424242424242424242424042F84F0140008 +324D1:100010003FFC200441C49E0402047FF402041FC4104410441FC4000400280010 +324DC:01000100FFFE010001007FFC4004400440044004400440044004400440144008 +324DD:01000100010001007FFC0100010001000100044004400820082010102008C006 +324DE:0008181006600180066018186004010001000100FFFE01000100010001000100 +324E0:2000204020202020200027FEF800200020902088208820842104210222022402 +3251F:102010AC10B47CE413A410AC10A01E82E07E00001FF01010101010101FF01010 +32520:00003FF82008200820083FF80000102010AC10B47CE413A410AC1EA0E082007E +3261E:07C0183020085FC440448082810282028402881250144FF42008183007C00000 +32623:00007FFC420441045FF4424442444A644A54525444444544488440047FFC4004 +32629:00007FFC420441045FF442844AA4529441044AA44A14525441C440047FFC4004 +3262C:7FFC40045FF452947FFC41045FF4545457D4545457D454545FF440047FFC4004 +32631:1000100013FE10401040FC40107C10441044104410841C84E104410402280410 +32632:10801080108010FE1080FD00110011FC100410041C04E3F44004000400280010 +32635:11001108110811101120FD40110017FE1140112011201D10E108414401820100 +3263B:1020104011FC11041144FD241124110C110011FE10021C02E3FA400200140008 +3263C:10001FFC2000413011D01F107152112210020FFE000001003FF801000100FFFE +3263F:22081108111000207FFE40028104010001003FF80100010001000100FFFE0000 +32640:100011FC10441048105EFC821082112A1224102011FC1C20E020402003FE0000 +32641:100011FC100810101030FC4810841302100011FC10201C20E020402003FE0000 +32644:040008003FFC21043FFC21043FFC21044114800801003FF801000100FFFE0000 +32646:2040202023FC20002108F89023FE22002200220022003A00E200440004000800 +32647:00007FFC01000770190CE1021120102010AC7CB410E413A410AC1EA0E082007E +3264F:21002102211C2FD02210F210251E27D42114211431D4EF144514012401240144 +32650:082008207EFC0820FEFE145022884106810001003FF8010001000100FFFE0000 +32656:200021F02110211021F0F84023F82248224823F822483A48E3FA40420042003E +32657:08000F7C08440844FF4808282A30491089282844108201003FF801000100FFFE +3265A:0600787C08440844FF441C442A44497C8844090001003FF801000100FFFE0000 +3265D:2040202027FE24002488FC882508257E270825483D28E5284908090811280110 +3265E:100012201110110010FEFC08134811281110111811281D24E1444280047E0000 +3265F:102011FC1020108813FEFC88100011FC1104112411241D24E124405000880304 +32660:2020202023FE20502088FB2621FC2020202023FE20003820E1FC4020002003FE +32662:1020102011FC112411FCFC2013FE100011FC110411241D24E124405000880304 +32669:208010F811088290486049981606E1F82108210821F8000001003FF80100FFFE +3266F:2080204027FC24042110FA08203C23D02290229022903A88E28844A404D40892 +32672:2208224827482290F29E2FE4211422142FD42494291431C8EF08411405140222 +32674:20002FBE28A22AAA2AAAFAAA251428A220802FFE21103210E3A0406001980E04 +3267B:1040102013FE12021088FDFC1088100011FC110411241D24E12440500092030E +3267C:0804AA789C408840FF7E9C48AA488848FF480088010001003FF801000100FFFE +3267D:22102110211027BE2240FA0023BE228A228822A822AE3AA8E4A845A8085E1080 +32688:108010F8111013FC1124FDFC112411FC100013FE10001DFCE10441FC010401FC +3268A:211027FE211023F8F84027FC204023F8224823F822483BF8E04047FC00400FFE +3268F:2090209422D82292FAD2270E21F0221027FC2A4423FC3A44E3FC444404540808 +32694:204023F820482FFE2048FBF820402554275C244427FC3C44E75C455405540844 +32695:20802FFE22082D2423FEF6202BFC222023FC222023FE3010EFFE421001500020 +3269A:2040202023FE220023DCFB5422CC2354222022D823263AC8E23044C4041809E0 +326AD:1010FE9C10907DFE0010FE1403FE7D1011F0FF540154FFD40268FF4AAA96E722 +326BD:010001007FFC0280044008203018C0061FF0101010101FF0101010101FF01010 +326BE:020002007FFC044008203018CFE600001FF0101010101FF0101010101FF01010 +326C0:020002007FFC044008203118C1063FF822882448292821082288244820082018 +326F5:2010200823C8227EFA404A544BC84A7E4A0893C8537E254835484DC849488008 +326FA:2040202023FE2248FBFE4A484AEC4B5A8A484BFE3220127C2AC44B44847C0844 +32709:020001007FFE40028084008000807FFC01800280048008801080608002800100 +3270B:020001007FFE4002810400803FF8200820083FF8200820002000400040008000 +32714:020001007FFE4002882404403FF8200820083FF8010008844892481287F00000 +32744:100011FC10001000540057FE54405440548054FC54045C046404000400280010 +32748:102010201050105054885504560254F85488548854A85C9064820082007E0000 +3274B:2008203C23D02290AA90AA90AA90AA90AA90AA88AA88BAC8CAA404D404920800 +3274C:0100210821083FF800001E78124812481248FFFE124812481248128826A84110 +3274E:0100210821083FF80000010000801F0001047D880550092011102108C5060200 +32755:0100210821083FF800000100111009100920FFFE0440044008421042203EC000 +32765:0100210821083FF800007FFC482444445FF441045FF44404440447E440144008 +32768:2040202023FE2200AA1CAAF0AA90AA90AAFEAA90AA90BA90CAAA02CA04A60812 +32769:102010A210A211245450548857045422542054A454A45D286450008801040202 +327C0:010000803FFE208020802FF82080208020803FFC20802140414042208410180C +327C3:010000803FFE208020802FF82080208020803FFC21C022A04490488890860080 +327F1:108810881088108819FC54885088508893FE1088108810881088110811081208 +327FB:090009001FF8210001007FFE044008421042603E010008844892481287F00000 +32800:10201020FEAC22B444E435A408AC14A02282C07E02005104511290120FF00000 +32859:1104112411241124FD2411241124152419243124D12411241124122452042404 +3285A:200023FE22002220FA20222022FC2A243224E2242244224424842484A9285210 +3285F:3E80048008800E847884087C280010F03F0001003FF801007FFC010005000200 +3287C:200027FE240025FCF524252425FC25243524E5FC2420242025FC2820A82053FE +32901:00007FFC01000770190CE1020804AA789C408840FF7E9C48AA488848FF480088 +32940:002007A4F0A892929114920895F4F80293F89208920893F8F20891100FFE0000 +3295B:00203C202450248825043E0225FC242024203C2025FC24202420442057FE8800 +32972:1040104017FC1080F88013E031203A2057FC5020912811241222142210A01040 +32985:100013FE10101020FC6810A4332238205488549090A013FE10A0109010C81086 +32996:110010BE12821242FE7A128A33523A225652538E92FA128A128A12FA128A1204 +32997:2080204027FE2090FA942492600073F8A808A3F8220023FC2004200420282010 +32A3A:010001087D1005A009603118C50602001FF0101011101110129004821882E07E +32A3B:010001087D1005A009603118C5060200010011001FF821000100FFFE01000100 +32A4C:000023F81040104087FC400048000BF812081248E248224822A8211022080C04 +32A5A:00104F90289028A00ABE8AC44AA44AA41AA42AA8E2282210252824A828441082 +32A72:0080204017FC10A082A842A444A410A010002040E0242522250A290820F80000 +32A98:00082790113E17A2813E41A2463E100017FE2080E10023FC2D04210421FC0104 +32ACE:0200020002003FE002200220042004220822301EC00000002488224442448004 +32AF9:1020102013FE102055FC584053FE9088113412E2102029FC247044AC43228020 +32BDD:00400040FC4013FE108010A011207DFC13241524112411241D34E12840200020 +32BE1:00200124F8A420A8202023FE2202FA0222FA228A228A3A8AE2FA4202020A0204 +32BE8:01040088F80023FE204020C22122FA542098213822543894E112461000500020 +32BFF:00200122F9222224205020882304F802208820AA22DC3A88E488414802540422 +32C0A:000003DEF8422252214A22522090F90823FE251021FE3910E1FE411001FE0100 +32C0D:002003FEFA5023FE225223FE2200FBFE22922348223A3A40E2FC4548043009CE +32C0E:008803FEF888201C23E0212420A8FBFE2124220225FC212439FCE12401FC0104 +32C13:004007FEF49223FC209023FC2090F7FE210823FC250A21F83108C1F800900108 +32C36:00003FF821082108210821083FF821082108210821083FF800000000FFFE0000 +32C37:000001F07D105510551055107D1055105510551055107D1245120212020E0400 +32C39:010002001FF010101210115010201FFC00043FE422243FEC22203FE002000200 +32C3B:0004001E7DE05400542054107DFE54045408541054207C4044800140023E0000 +32C3C:00207C20542054A07CAC54B454E47DA410A4FEB412A812A222A222824A7E8400 +32C82:02001FF010101FF010101FF001843D480930730E3EF80288145008203458C286 +32CCA:000003FCFD041104110420883C8864886450A450242024203C50248821040602 +32CCC:00200028FE241024102021FE3E2062206220A250225022503E88228801040202 +32CCD:0008003CFDE01020102020203C2067FE6420A420242024203C20242021FC0000 +32CD3:00400040F84027FE2080412079204A20CFFC4820492849247A224C2200A00040 +32CD4:0000FFFE08001FF02810C8100FF000007FFC010011100920FFFE010001000100 +32CD6:000001FCFC441048105E20823C82652A6624A4A824A425223E22242020A00040 +32CDA:00900094FC9211121110237E3D1065106510A528252825283D28254421440182 +32CDC:00200020F82023FE2242444478A048A2C9A44A984C904888788448A200C00080 +32CDD:00400020F82023FE2202444478404BFEC8884888490848D07820485000880304 +32CE4:00400040F888210423FE400278884944CA4248F849884A507820485001880606 +32CE5:00200020FBFE202021FC40407BFE4888C9244A2248F848207BFE482000200020 +32CE6:100CFEF0208048807EFE08880E88F9084A08FFFE08001FF82808C8080FF80808 +32CF3:000003FCFA942294229443FC78804840CFFE488048F848887908490802280410 +32CF4:00800040FBFC2000210840907BFE4800C9F84908490849F87908490801F80108 +32CF7:000003FCF90821F8210841F8790E4FF8C8084FBC48A44AA479284A9004A80846 +32CFD:4140212003FE0A2017FCEA2023FC222023FE0200FFFE04000FF83808CFF80808 +32D09:01080090FBFC20902294419878904FFEC80049F84908490879F84908010801F8 +32D46:08201D24F124112411FCFC0011FC3004380455FC550091001102110210FE1000 +32D49:08081C3CF1E010201020FDFE1050308839045622542091241124112411FC1004 +32D4F:08401C20F3FE10881050FC2010D83306388854F85488908810F8110811081208 +32D50:09001D00F3DE11521152FD52115E32C038205420552491241124112411FC1004 +32D79:104010403F7E489085080800101020087FFC00041010101020204444FEFE4242 +32D89:20403F7E4890850810007DFC11247D241124FD2411FC390055009502110210FE +32DAF:20803EFE491080A044A422A827FC0110E7FC204023F8204027FC214856448FFE +32DB7:104010409440544059F81048FC483048394854C8544890A810AA110A12061402 +32E2F:10401040204025FE4480F8A0112021FC4020FC20402003FE1C20E02040200020 +32E31:100013FE225222524A52FBFE1020204040FCF904428800501820E04041800600 +32E34:202020203D2450A490A81020FDFC10201020542057FE54205C20642004200020 +32E8B:020002007FFC080017F060801FFC00001FF010101FF010101FF0101010501020 +32EA3:00883C8827FE248824883C0025FC252425243D2425FC25242524452455FC8904 +32ED0:08801C84708410881090FEA0108013FE7CA044904490448844847CA244C00080 +32EF0:08200820FFFE082008203FF00010101010101FFC000400047FE4000400280010 +32EF2:08200820FFFE092002001FF010101010105010201FFC00047FE4000400280010 +32F17:08200820FFFE08200040082049FC488848504BFE4820482049FC102010202020 +32F1D:0820FFFE0820087CFF4808507E480844FF54104821405FF01110115011200100 +32F1E:0820FFFE08201008103C7DC010407C7C11C0FC40107C3BC0544090421042103E +32F36:0820FFFE08201FF010101110111002C00C3070083E7C22442A542A54142862C4 +32F49:0440FFFE04400C2073FE102011FCFC2013FE300039FC5504552491241050138C +32F56:0820FFFE0820201021FC7C4080887DFC540444A8FEA854A844AA7EAA14AA0906 +32F58:0820FFFE08202200117C110482A442FC4BA40AFC12A4E2FC22A422FC2284220C +32F59:0440FFFE04401020FC2003FE442029FCFD24112411FCFC7010A8212442228020 +32F6C:04400440FFFE0440200010F8FC8800F8788800F8780001FC7954495479544BFE +32F8C:100013FC11047D44552454A8548854887C505050102014201E50E28841040602 +32F99:10201020107E7C8255445428541054207C4050FE114214421C42E442407E0042 +32F9D:0840484028FC09041A8828504860898001001FF0111011101FF001087FFC2004 +32FF9:211027DC2124F948A93EAFE2AD6AAD6AFFEAA12A23AA2D6A3948E91441220142 +3301A:11001100211C47C081001100213E67C8A4482448244827C82448200820282010 +33056:04402440247C2490250804001FF010101FF010101FF010101FF004421842E03E +33074:2080108000F8FD08021079FC01047954018C792448204BFE4850788849040602 +33084:01003FF801001FF001007FFC01107EA004442BA810102FE8C8260FE004407FFC +330AC:7FFC01000770190CE102000001001FF011101FF00100FFFE1110111006C0783C +330D4:00003E7C22442244224422443E7C0810081028502E5E2850285038704E9E8100 +330F1:102020207C2044207C2045FE7C2044204420FC500C5014502488448895040A02 +330F2:102020287C2444247C2045FE7C2044204420FC500C5014502488448895040A02 +33113:104010501048FE48204029FE48507E50085008500E90F89048920912090E0A00 +33157:0000FE5028482884FF24AA20AA50AA88AF04C2FA8288FE8882888288FEF88288 +331B2:42042FB884204A3E0FA822285FA88248010006C01830EFEE01003FF80920FFFE +331E7:27D4211457FE4D5487D47D7E22802008FDFE256A2FFEB56A67FE3D40E5D40562 +331E9:102010203C5020504088BD0412021088FC881088108810881488190811080208 +331EA:20202020382023FE40207820A0A82088F88827FE208820882908310822080408 +331EF:208820883BFE208840007BFEA2022424F82023FE207020A828A8312422220020 +331F0:208820883BFE208840247BFEA0502088F904228A208823FE2888308821080208 +331F2:212420A83BFE220240F87888A0F8200CF9F0202021FC20202BFE302020A00040 +33211:200017FC0004420442045FF4450449044FE441045FF441044104410440144008 +33213:200017FC0004410441044FE449244FE449244FE44114411440F4400440144008 +33214:200017FC0004420442045FF44404488458844BE4488448844FF4480440144008 +33215:200017FC00044FE441045FF440044FE44824492449244284444448244004400C +33216:200017FC00045FF441044FE441045FF4400444447FFC44444844504440144008 +33217:200017FC000440147F1440FC5E14521452945E54401452144F1478545024400C +3321B:00007DFC442048204820502048204BFE44204420442068205020402040A04040 +33220:002078204920513C5120612057FE48004BF84808690851FE400247F2400A4004 +3323A:11401120212043FE922016202BFC6220A22023FC22202220222023FE22002200 +33255:3FF801007FFE41029D74000007A0F82048A025207F20022007A2FC2244220C1E +33257:3FF801007FFE41029D7401001D70203C17C08248415010402FFEE04021402080 +33261:3FF801007FFE41029D740000203C17C0824449280BF81010E7FE202020A02040 +33279:3FF801007FFE41029D7420007C1054127DD454587C542A922D124F50482287FE +3327A:3FF801007FFE41029D7420007C5054547C98549055B07CD42A944E8C480287FE +3327C:3FF801007FFE41029D7420107C0854F07C1255D47C582A942D124F50482287FE +33282:3FF801007FFE41029D7420007DFC55047D54558C7D742B542D744F0C480287FE +33283:3FF801007FFE41029D7420007C0857C87D4855487FD02D542D524FFE481287FE +33287:3FF801007FFE41029D7420207D2454587C8457027C202D242A584E84490287FE +3328B:3FF801007FFE41029D7420207DFC55047DFC55007DFC2BB42D6C4FB44A4A87FE +3328E:3FF801007FFE41029D744000F9F8A840FBFCAD54F84057FC59105FF8520A8FFE +3328F:3FF801007FFE41029D744000FBB8AAA8FBB8AA08FBF856A85BF85EA8532A8FFE +33291:3FF801007FFE41029D744000FA50AD7CFF50AAFCFD50577C5850557C50428FFE +33293:3FF801007FFE41029D7420007C5055FC7CA854FC7D902AFC2D904FFC488287FE +33294:3FF801007FFE41029D744200FAF8AF50FAF8AB10FFFC52A852AC5BF8542A8FFE +332AD:202010207C20004044482884FEFE00027C0044FC44847C84448444847CFC4484 +332BF:240024FE7E102420247CFF4400547E54425442547E54425442287E2442420082 +332E1:1040102029FC25045050FC8845247C5044887D0442FA50884888548864F84088 +3331A:00207C2047FE745054A8FF2482FA7C2044A87C8847FE7C884488448855084A08 +3331E:020001007FFC08200FE000007FFE40028FE408200FE0010011F81100290047FE +33366:08001FF020207FF8A38824882FC8254827C8254827C82AA83FF8444442228222 +33397:200020F87C88448888F87C0055FC55047D0455FC55047D0401FC1D04E1144108 +33398:202020407CF8448888F87C8854F8548A7C8C55F854187C2800481C88E3284010 +3339A:202020207DFC445088887D0457FE54087DE8552855287DE801281C08E0284010 +3339D:400047FE7A528A5213D4FA54AA58ABD4FA52AA52AA72FBDA06541850E0504050 +33400:00207E4002FC028402A402940A84128C2280C2FE4202020203FA020214140808 +3340A:101008207F7C4044406449546544554C5540527E40024702787A5002800A0004 +33410:40104020F77C5544556455545744B04C0840087EFF021C022AFA4902890A0804 E0001:555580003399AA20332DAA243399800000019FE01011900810119FE00001AAAA E0020:555580000E7190480C7182401C41800000019FE01011900810119FE00001AAAA E0021:5555800001018100010180000101800000019FE01011900810119FE00001AAAA From db1ae7d2b19227264d2158452c3e0e924399c5fd Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 08:22:20 -0700 Subject: [PATCH 16/38] Create bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 73 ++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..e12c5a8aa9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,73 @@ +--- +name: Bug report +about: Report a reproducible problem with OpenComputers +title: "[Bug]: " +labels: bug +assignees: '' +--- + +## Description + + + +## Versions + +- Minecraft version: +- Forge version: +- OpenComputers version: +- Java version: +- Modpack (if applicable): + +## Environment + +- Operating system: +- Single-player or server: +- If server: dedicated or integrated, and server-side mod list: +- Other mods installed: + +## Steps to reproduce + + + +1. +2. +3. + +## Expected behavior + + + +## Actual behavior + + + +## Logs and crash reports + + + +- Log/crash-report file: +- mclo.gs link: + +## Additional information + + + +## Checklist + +- [ ] I searched the existing issues for duplicates. +- [ ] I included the exact Minecraft, Forge, and OpenComputers versions. +- [ ] I included clear reproduction steps. +- [ ] I attached the relevant log/crash report or provided a full mclo.gs link. +- [ ] I removed private information from attached logs. +- [ ] I tested whether the issue occurs without unrelated mods, if practical. From 52d38081ed48fc1f3d7f4167eb3bed4f66a9e566 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 08:36:44 -0700 Subject: [PATCH 17/38] Fix disassembler template output handling Restores flat-array disassembly results for Microcontrollers and other template-based devices. Preserves the original item when a callback fails, and removes empty placeholder outputs from Microcontroller and Drone disassembly. Fixes #41 --- .../cil/oc/common/blockentity/Disassembler.scala | 11 +++++++++-- .../oc/common/template/DisassemblerTemplates.scala | 14 +++++++++----- .../li/cil/oc/common/template/DroneTemplate.scala | 2 +- .../common/template/MicrocontrollerTemplate.scala | 2 +- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/blockentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/blockentity/Disassembler.scala index 0bad887895..5b697d2419 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/Disassembler.scala @@ -118,8 +118,15 @@ class Disassembler(pos: BlockPos, state: BlockState) DisassemblerTemplates.select(stack) match { case Some(template) => val (stacks, drops) = template.disassemble(stack, ingredients) - stacks.foreach(queue ++= _) - drops.foreach(_.foreach(drop)) + stacks match { + case Some(output) => + queue ++= output + drops.foreach(_.foreach(drop)) + case None => + // The input was already removed from the inventory. Preserve + // it if a callback failed or returned an unsupported result. + drop(stack) + } case _ => queue ++= ingredients } totalRequiredEnergy = queue.size * Settings.get.disassemblerItemCost diff --git a/src/main/scala/li/cil/oc/common/template/DisassemblerTemplates.scala b/src/main/scala/li/cil/oc/common/template/DisassemblerTemplates.scala index 0b5e8d45cc..ba12ac99ec 100644 --- a/src/main/scala/li/cil/oc/common/template/DisassemblerTemplates.scala +++ b/src/main/scala/li/cil/oc/common/template/DisassemblerTemplates.scala @@ -30,14 +30,18 @@ object DisassemblerTemplates { def disassemble(stack: ItemStack, ingredients: Array[ItemStack]) = { val result = IMC.tryInvokeStatic(disassembler, stack, ingredients)(null: Array[_]) - Option(result).map(_.toSeq).getOrElse(Seq.empty) match { - case Seq(stacks: Array[ItemStack], drops: Array[ItemStack]) => + result match { + // Disassembler callbacks return an array directly. Do not convert the + // result to a sequence first: that turns Array[ItemStack] into a + // sequence of individual stacks and makes the valid flat-array form + // impossible to match. + case Array(stacks: Array[ItemStack], drops: Array[ItemStack]) => (Some(stacks), Some(drops)) - case Seq(stack: ItemStack, drops: Array[ItemStack]) => + case Array(stack: ItemStack, drops: Array[ItemStack]) => (Some(Array[ItemStack](stack)), Some(drops)) - case Seq(stacks: Array[ItemStack], drop: ItemStack) => + case Array(stacks: Array[ItemStack], drop: ItemStack) => (Some(stacks), Some(Array[ItemStack](drop))) - case Seq(stacks: Array[ItemStack]) => + case stacks: Array[ItemStack] => (Some(stacks), None) case _ => (None, None) } diff --git a/src/main/scala/li/cil/oc/common/template/DroneTemplate.scala b/src/main/scala/li/cil/oc/common/template/DroneTemplate.scala index f3bce83329..4c941533d5 100644 --- a/src/main/scala/li/cil/oc/common/template/DroneTemplate.scala +++ b/src/main/scala/li/cil/oc/common/template/DroneTemplate.scala @@ -52,7 +52,7 @@ object DroneTemplate extends Template { val info = new MicrocontrollerData(stack) val itemName = Constants.ItemName.DroneCase(info.tier) - Array(api.Items.get(itemName).createItemStack(1)) ++ info.components + Array(api.Items.get(itemName).createItemStack(1)) ++ info.components.filter(!_.isEmpty) } def register(): Unit = { diff --git a/src/main/scala/li/cil/oc/common/template/MicrocontrollerTemplate.scala b/src/main/scala/li/cil/oc/common/template/MicrocontrollerTemplate.scala index 2a389aec4f..4fc9be45ce 100644 --- a/src/main/scala/li/cil/oc/common/template/MicrocontrollerTemplate.scala +++ b/src/main/scala/li/cil/oc/common/template/MicrocontrollerTemplate.scala @@ -49,7 +49,7 @@ object MicrocontrollerTemplate extends Template { val info = new MicrocontrollerData(stack) val itemName = Constants.ItemName.MicrocontrollerCase(info.tier) - Array(api.Items.get(itemName).createItemStack(1)) ++ info.components + Array(api.Items.get(itemName).createItemStack(1)) ++ info.components.filter(!_.isEmpty) } def register(): Unit = { From a8e2f8059b746cfc5ea67b8ccdd2374a21cf9fb9 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 9 Aug 2026 16:22:13 +0100 Subject: [PATCH 18/38] Generate block state files --- .../java/li/cil/oc/data/DataGenerators.java | 1 + .../li/cil/oc/data/OCBlockStateProvider.java | 298 ++++++++++++++++++ .../li/cil/oc/data/OCItemModelProvider.java | 42 --- .../opencomputers/blockstates/adapter.json | 7 + .../opencomputers/blockstates/assembler.json | 7 + .../blockstates/backflatscreen1.json | 56 ++-- .../blockstates/backflatscreen2.json | 56 ++-- .../blockstates/backflatscreen3.json | 56 ++-- .../blockstates/backflatscreen4.json | 56 ++-- .../opencomputers/blockstates/briefcase.json | 19 ++ .../opencomputers/blockstates/cable.json | 7 + .../opencomputers/blockstates/capacitor.json | 7 + .../blockstates/carpetedcapacitor.json | 7 + .../opencomputers/blockstates/case1.json | 34 ++ .../opencomputers/blockstates/case2.json | 34 ++ .../opencomputers/blockstates/case3.json | 34 ++ .../opencomputers/blockstates/case4.json | 34 ++ .../blockstates/casecreative.json | 34 ++ .../blockstates/chameliumblock.json | 7 + .../opencomputers/blockstates/charger.json | 19 ++ .../blockstates/disassembler.json | 7 + .../opencomputers/blockstates/diskdrive.json | 19 ++ .../blockstates/document_printer.json | 19 ++ .../opencomputers/blockstates/endstone.json | 7 + .../blockstates/filecabinet.json | 19 ++ .../blockstates/frontflatscreen1.json | 56 ++-- .../blockstates/frontflatscreen2.json | 56 ++-- .../blockstates/frontflatscreen3.json | 56 ++-- .../blockstates/frontflatscreen4.json | 56 ++-- .../opencomputers/blockstates/geolyzer.json | 7 + .../opencomputers/blockstates/hologram1.json | 7 + .../opencomputers/blockstates/hologram2.json | 7 + .../opencomputers/blockstates/hologram3.json | 7 + .../blockstates/holoscreen1.json | 28 +- .../blockstates/holoscreen2.json | 28 +- .../blockstates/holoscreen3.json | 28 +- .../blockstates/holoscreen4.json | 28 +- .../opencomputers/blockstates/keyboard.json | 57 ++++ .../blockstates/microcontroller.json | 19 ++ .../blockstates/motionsensor.json | 7 + .../blockstates/netsplitter.json | 7 + .../blockstates/powerconverter.json | 7 + .../blockstates/powerdistributor.json | 7 + .../opencomputers/blockstates/print.json | 7 + .../opencomputers/blockstates/printer.json | 7 + .../opencomputers/blockstates/rack.json | 19 ++ .../opencomputers/blockstates/raid.json | 19 ++ .../opencomputers/blockstates/redstone.json | 7 + .../opencomputers/blockstates/relay.json | 7 + .../opencomputers/blockstates/robot.json | 7 + .../blockstates/robotafterimage.json | 7 + .../opencomputers/blockstates/screen1.json | 57 ++++ .../opencomputers/blockstates/screen2.json | 57 ++++ .../opencomputers/blockstates/screen3.json | 57 ++++ .../opencomputers/blockstates/screen4.json | 57 ++++ .../opencomputers/blockstates/shredder.json | 19 ++ .../opencomputers/blockstates/transposer.json | 7 + .../opencomputers/blockstates/waypoint.json | 57 ++++ .../opencomputers/models/block/adapter.json | 7 + .../opencomputers/models/block/capacitor.json | 8 + .../models/block/carpetedcapacitor.json | 8 + .../opencomputers/models/block/charger.json | 8 + .../models/block/disassembler.json | 8 + .../opencomputers/models/block/diskdrive.json | 8 + .../models/block/filecabinet.json | 6 +- .../opencomputers/models/block/geolyzer.json | 8 + .../models/block/microcontroller.json | 8 + .../models/block/motionsensor.json | 7 + .../models/block/powerconverter.json | 7 + .../models/block/powerdistributor.json | 8 + .../opencomputers/models/block/rack.json | 8 + .../opencomputers/models/block/raid.json | 8 + .../opencomputers/models/block/redstone.json | 12 + .../opencomputers/models/block/relay.json | 8 + .../opencomputers/models/block/shredder.json | 6 +- .../opencomputers/models/block/waypoint.json | 9 + .../opencomputers/models/item/case1.json | 3 + .../opencomputers/models/item/case2.json | 3 + .../opencomputers/models/item/case3.json | 3 + .../opencomputers/models/item/case4.json | 3 + .../models/item/casecreative.json | 3 + .../opencomputers/models/item/screen1.json | 3 + .../opencomputers/models/item/screen2.json | 3 + .../opencomputers/models/item/screen3.json | 3 + .../opencomputers/models/item/screen4.json | 3 + .../recipe/carpetedcapacitor.json | 2 +- .../data/opencomputers/recipe/datacard1.json | 2 +- .../data/opencomputers/recipe/endstone.json | 2 +- .../recipe/paper_from_shreds.json | 16 + .../data/opencomputers/recipe/screen1.json | 2 +- .../data/opencomputers/recipe/screen2.json | 2 +- .../data/opencomputers/recipe/screen3.json | 2 +- .../data/opencomputers/recipe/screen4.json | 2 +- .../blockstates/accesspoint.json | 5 - .../opencomputers/blockstates/adapter.json | 5 - .../opencomputers/blockstates/assembler.json | 5 - .../opencomputers/blockstates/briefcase.json | 8 - .../opencomputers/blockstates/cable.json | 5 - .../opencomputers/blockstates/capacitor.json | 5 - .../blockstates/carpetedcapacitor.json | 5 - .../opencomputers/blockstates/case1.json | 12 - .../opencomputers/blockstates/case2.json | 12 - .../opencomputers/blockstates/case3.json | 12 - .../opencomputers/blockstates/case4.json | 12 - .../blockstates/casecreative.json | 12 - .../blockstates/chameliumblock.json | 20 -- .../opencomputers/blockstates/charger.json | 8 - .../blockstates/disassembler.json | 5 - .../opencomputers/blockstates/diskdrive.json | 8 - .../blockstates/document_printer.json | 8 - .../opencomputers/blockstates/endstone.json | 5 - .../blockstates/filecabinet.json | 8 - .../opencomputers/blockstates/geolyzer.json | 5 - .../opencomputers/blockstates/hologram1.json | 5 - .../opencomputers/blockstates/hologram2.json | 5 - .../opencomputers/blockstates/hologram3.json | 5 - .../opencomputers/blockstates/keyboard.json | 16 - .../blockstates/microcontroller.json | 8 - .../blockstates/motionsensor.json | 5 - .../blockstates/netsplitter.json | 5 - .../blockstates/powerconverter.json | 5 - .../blockstates/powerdistributor.json | 5 - .../opencomputers/blockstates/print.json | 5 - .../opencomputers/blockstates/printer.json | 5 - .../opencomputers/blockstates/rack.json | 8 - .../opencomputers/blockstates/raid.json | 8 - .../opencomputers/blockstates/redstone.json | 5 - .../opencomputers/blockstates/relay.json | 5 - .../opencomputers/blockstates/robot.json | 5 - .../blockstates/robotafterimage.json | 5 - .../opencomputers/blockstates/screen1.json | 16 - .../opencomputers/blockstates/screen2.json | 16 - .../opencomputers/blockstates/screen3.json | 16 - .../opencomputers/blockstates/screen4.json | 16 - .../opencomputers/blockstates/shredder.json | 8 - .../opencomputers/blockstates/switch.json | 5 - .../opencomputers/blockstates/transposer.json | 5 - .../opencomputers/blockstates/waypoint.json | 16 - .../opencomputers/models/block/adapter.json | 8 - .../opencomputers/models/block/capacitor.json | 8 - .../models/block/carpetedcapacitor.json | 8 - .../opencomputers/models/block/charger.json | 9 - .../models/block/disassembler.json | 8 - .../opencomputers/models/block/diskdrive.json | 9 - .../opencomputers/models/block/geolyzer.json | 8 - .../models/block/microcontroller.json | 9 - .../models/block/motionsensor.json | 7 - .../models/block/powerconverter.json | 7 - .../models/block/powerdistributor.json | 8 - .../opencomputers/models/block/rack.json | 9 - .../opencomputers/models/block/raid.json | 9 - .../opencomputers/models/block/redstone.json | 12 - .../opencomputers/models/block/relay.json | 8 - .../opencomputers/models/block/switch.json | 8 - .../opencomputers/models/block/waypoint.json | 9 - .../opencomputers/models/item/case1.json | 10 - .../opencomputers/models/item/case2.json | 10 - .../opencomputers/models/item/case3.json | 10 - .../opencomputers/models/item/case4.json | 10 - .../models/item/casecreative.json | 10 - .../opencomputers/models/item/screen1.json | 10 - .../opencomputers/models/item/screen2.json | 10 - .../opencomputers/models/item/screen3.json | 10 - .../opencomputers/models/item/screen4.json | 10 - .../block/property/PropertyRotatable.scala | 4 +- 165 files changed, 1611 insertions(+), 939 deletions(-) create mode 100644 src/data/java/li/cil/oc/data/OCBlockStateProvider.java create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/adapter.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/assembler.json rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/backflatscreen1.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/backflatscreen2.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/backflatscreen3.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/backflatscreen4.json (99%) create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/briefcase.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/cable.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/capacitor.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/carpetedcapacitor.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/case1.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/case2.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/case3.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/case4.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/casecreative.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/chameliumblock.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/charger.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/disassembler.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/diskdrive.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/document_printer.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/endstone.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/filecabinet.json rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/frontflatscreen1.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/frontflatscreen2.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/frontflatscreen3.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/frontflatscreen4.json (99%) create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/geolyzer.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/hologram1.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/hologram2.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/hologram3.json rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/holoscreen1.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/holoscreen2.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/holoscreen3.json (99%) rename src/main/{resources => generatedResources}/assets/opencomputers/blockstates/holoscreen4.json (99%) create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/keyboard.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/microcontroller.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/motionsensor.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/netsplitter.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/powerconverter.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/powerdistributor.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/print.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/printer.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/rack.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/raid.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/redstone.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/relay.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/robot.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/robotafterimage.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/screen1.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/screen2.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/screen3.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/screen4.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/shredder.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/transposer.json create mode 100644 src/main/generatedResources/assets/opencomputers/blockstates/waypoint.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/adapter.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/capacitor.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/carpetedcapacitor.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/charger.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/disassembler.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/diskdrive.json rename src/main/{resources => generatedResources}/assets/opencomputers/models/block/filecabinet.json (56%) create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/geolyzer.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/microcontroller.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/motionsensor.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/powerconverter.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/powerdistributor.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/rack.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/raid.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/redstone.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/relay.json rename src/main/{resources => generatedResources}/assets/opencomputers/models/block/shredder.json (55%) create mode 100644 src/main/generatedResources/assets/opencomputers/models/block/waypoint.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/case1.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/case2.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/case3.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/case4.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/casecreative.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/screen1.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/screen2.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/screen3.json create mode 100644 src/main/generatedResources/assets/opencomputers/models/item/screen4.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/paper_from_shreds.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/accesspoint.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/adapter.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/assembler.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/briefcase.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/cable.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/capacitor.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/carpetedcapacitor.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/case1.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/case2.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/case3.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/case4.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/casecreative.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/chameliumblock.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/charger.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/disassembler.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/diskdrive.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/document_printer.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/endstone.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/filecabinet.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/geolyzer.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/hologram1.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/hologram2.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/hologram3.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/keyboard.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/microcontroller.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/motionsensor.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/netsplitter.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/powerconverter.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/powerdistributor.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/print.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/printer.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/rack.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/raid.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/redstone.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/relay.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/robot.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/robotafterimage.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/screen1.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/screen2.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/screen3.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/screen4.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/shredder.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/switch.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/transposer.json delete mode 100644 src/main/resources/assets/opencomputers/blockstates/waypoint.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/adapter.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/capacitor.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/carpetedcapacitor.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/charger.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/disassembler.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/diskdrive.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/geolyzer.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/microcontroller.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/motionsensor.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/powerconverter.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/powerdistributor.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/rack.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/raid.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/redstone.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/relay.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/switch.json delete mode 100644 src/main/resources/assets/opencomputers/models/block/waypoint.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/case1.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/case2.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/case3.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/case4.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/casecreative.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/screen1.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/screen2.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/screen3.json delete mode 100644 src/main/resources/assets/opencomputers/models/item/screen4.json diff --git a/src/data/java/li/cil/oc/data/DataGenerators.java b/src/data/java/li/cil/oc/data/DataGenerators.java index dd098e1a32..5695757532 100644 --- a/src/data/java/li/cil/oc/data/DataGenerators.java +++ b/src/data/java/li/cil/oc/data/DataGenerators.java @@ -45,5 +45,6 @@ public static void gatherData(GatherDataEvent event) { ), registries)); generator.addProvider(o -> new OCItemModelProvider(o, existingFiles)); + generator.addProvider(o -> new OCBlockStateProvider(o, existingFiles)); } } diff --git a/src/data/java/li/cil/oc/data/OCBlockStateProvider.java b/src/data/java/li/cil/oc/data/OCBlockStateProvider.java new file mode 100644 index 0000000000..d05e9ee66d --- /dev/null +++ b/src/data/java/li/cil/oc/data/OCBlockStateProvider.java @@ -0,0 +1,298 @@ +package li.cil.oc.data; + +import li.cil.oc.OpenComputers; +import li.cil.oc.common.block.property.PropertyRotatable; +import li.cil.oc.common.block.property.PropertyRunning; +import li.cil.oc.common.init.OCBlocks; +import li.cil.oc.common.openprinter.OpenPrinter; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.neoforged.neoforge.client.model.generators.BlockStateProvider; +import net.neoforged.neoforge.client.model.generators.ConfiguredModel; +import net.neoforged.neoforge.client.model.generators.ModelFile; +import net.neoforged.neoforge.common.data.ExistingFileHelper; + +public class OCBlockStateProvider extends BlockStateProvider { + public static final ResourceLocation GENERIC_TOP = ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "block/generic_top"); + public static final ResourceLocation BLOCK_SIDE = ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "block/block_side"); + + public OCBlockStateProvider(PackOutput output, ExistingFileHelper existingFiles) { + super(output, OpenComputers.ID(), existingFiles); + } + + @Override + protected void registerStatesAndModels() { + // Block Entity Renderers + simpleBlock(OCBlocks.Cable().get(), existingModel(Blocks.AIR)); + simpleBlock(OCBlocks.NetSplitter().get(), existingModel(Blocks.AIR)); + simpleBlock(OCBlocks.Print().get(), existingModel(Blocks.AIR)); + simpleBlock(OCBlocks.Robot().get(), existingModel(Blocks.AIR)); + simpleBlock(OCBlocks.RobotAfterimage().get(), existingModel(Blocks.AIR)); + + simpleBlockWithItem(OCBlocks.Adapter().get(), models().cubeTop(modelName(OCBlocks.Adapter().get()), + textureName(OCBlocks.Adapter().get(), "side"), + textureName(OCBlocks.Adapter().get(), "top") + )); + + simpleBlockWithItem(OCBlocks.Assembler().get(), existingModel(OCBlocks.Assembler().get())); + + simpleBlockWithItem(OCBlocks.Capacitor().get(), cubeGenericBottomTop(OCBlocks.Capacitor().get())); + + simpleBlockWithItem(OCBlocks.CarpetedCapacitor().get(), models().cubeBottomTop(modelName(OCBlocks.CarpetedCapacitor().get()), + textureName(OCBlocks.Capacitor().get(), "side"), + GENERIC_TOP, + ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "block/carpeted_capacitor_top") + )); + + caseBlock(OCBlocks.CaseTier1().get()); + caseBlock(OCBlocks.CaseTier2().get()); + caseBlock(OCBlocks.CaseTier3().get()); + caseBlock(OCBlocks.CaseTier4().get()); + caseBlock(OCBlocks.CaseCreative().get()); + + simpleBlockWithItem(OCBlocks.ChameliumBlock().get(), existingModel(OCBlocks.ChameliumBlock().get())); + + horizontalBlockGenericTop(OCBlocks.Charger().get()); + itemModels().simpleBlockItem(OCBlocks.Charger().get()); + + simpleBlockWithItem(OCBlocks.Disassembler().get(), cubeGenericBottomTop(OCBlocks.Disassembler().get())); + + horizontalBlockGenericTop(OCBlocks.DiskDrive().get()); + itemModels().simpleBlockItem(OCBlocks.DiskDrive().get()); + + simpleBlockWithItem(OCBlocks.Geolyzer().get(), cubeGenericBottomTop(OCBlocks.Geolyzer().get())); + + simpleBlockWithItem(OCBlocks.HologramTier1().get(), existingModel(OCBlocks.HologramTier1().get())); + simpleBlockWithItem(OCBlocks.HologramTier2().get(), existingModel(OCBlocks.HologramTier2().get())); + simpleBlockWithItem(OCBlocks.HologramTier3().get(), existingModel(OCBlocks.HologramTier3().get())); + + holoScreenBlock(OCBlocks.HoloScreenTier1().get()); + holoScreenBlock(OCBlocks.HoloScreenTier2().get()); + holoScreenBlock(OCBlocks.HoloScreenTier3().get()); + holoScreenBlock(OCBlocks.HoloScreenTier4().get()); + + keyboardBlock(); + + simpleBlockWithItem(OCBlocks.MotionSensor().get(), models().cubeColumn(modelName(OCBlocks.MotionSensor().get()), + textureName(OCBlocks.MotionSensor().get(), "side"), + textureName(OCBlocks.MotionSensor().get(), "top") + )); + + simpleBlockWithItem(OCBlocks.PowerConverter().get(), models().cubeColumn(modelName(OCBlocks.PowerConverter().get()), + textureName(OCBlocks.PowerConverter().get(), "side"), + GENERIC_TOP + )); + + simpleBlockWithItem(OCBlocks.PowerDistributor().get(), cubeGenericBottomTop(OCBlocks.PowerDistributor().get())); + + simpleBlockWithItem(OCBlocks.Printer().get(), existingModel(OCBlocks.Printer().get())); + + horizontalBlockGenericTop(OCBlocks.Raid().get()); + itemModels().simpleBlockItem(OCBlocks.Raid().get()); + + simpleBlockWithItem(OCBlocks.Redstone().get(), models().cube(modelName(OCBlocks.Redstone().get()), + textureName(OCBlocks.Redstone().get(), "bottom"), + textureName(OCBlocks.Redstone().get(), "top"), + textureName(OCBlocks.Redstone().get(), "north"), + textureName(OCBlocks.Redstone().get(), "south"), + textureName(OCBlocks.Redstone().get(), "east"), + textureName(OCBlocks.Redstone().get(), "west") + ).texture("particle", textureName(OCBlocks.Redstone().get(), "top"))); + + simpleBlockWithItem(OCBlocks.Relay().get(), models().cubeBottomTop(modelName(OCBlocks.Relay().get()), + ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "block/switch_side"), + GENERIC_TOP, + ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "block/switch_top")) + ); + + screenBlock(OCBlocks.ScreenTier1().get()); + screenBlock(OCBlocks.ScreenTier2().get()); + screenBlock(OCBlocks.ScreenTier3().get()); + screenBlock(OCBlocks.ScreenTier4().get()); + + flatScreenBlock(OCBlocks.FlatScreenBackTier1().get()); + flatScreenBlock(OCBlocks.FlatScreenBackTier2().get()); + flatScreenBlock(OCBlocks.FlatScreenBackTier3().get()); + flatScreenBlock(OCBlocks.FlatScreenBackTier4().get()); + + flatScreenBlock(OCBlocks.FlatScreenFrontTier1().get()); + flatScreenBlock(OCBlocks.FlatScreenFrontTier2().get()); + flatScreenBlock(OCBlocks.FlatScreenFrontTier3().get()); + flatScreenBlock(OCBlocks.FlatScreenFrontTier4().get()); + + horizontalBlockGenericTop(OCBlocks.Rack().get()); + itemModels().simpleBlockItem(OCBlocks.Rack().get()); + + waypointBlock(); + + horizontalBlock(OCBlocks.Microcontroller().get()); + itemModels().simpleBlockItem(OCBlocks.Microcontroller().get()); + + simpleBlock(OCBlocks.Endstone().get(), existingModel(Blocks.END_STONE)); + + simpleBlockWithItem(OCBlocks.Transposer().get(), existingModel(OCBlocks.Transposer().get())); + + // Open Printers + horizontalBlock(OpenPrinter.FILE_CABINET.get(), BLOCK_SIDE, ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "block/filingcabinet_front"), BLOCK_SIDE); + itemModels().simpleBlockItem(OpenPrinter.FILE_CABINET.get()); + + horizontalBlock(OpenPrinter.SHREDDER.get(), BLOCK_SIDE, textureName(OpenPrinter.SHREDDER.get(), "front"), BLOCK_SIDE); + itemModels().simpleBlockItem(OpenPrinter.SHREDDER.get()); + + horizontalBlock(OpenPrinter.BRIEFCASE.get(), existingModel(OpenPrinter.BRIEFCASE.get())); + itemModels().simpleBlockItem(OpenPrinter.BRIEFCASE.get()); + + horizontalBlock(OpenPrinter.PRINTER.get(), existingModel(OpenPrinter.PRINTER.get())); + itemModels().simpleBlockItem(OpenPrinter.PRINTER.get()); + } + + private void caseBlock(Block block) { + var model = models().getExistingFile(ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "case")); + var runningModel = models().getExistingFile(ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "case_running")); + horizontalBlock(block, s -> s.getValue(PropertyRunning.Running()) ? runningModel : model); + simpleBlockItem(block, model); + } + + private void screenBlock(Block block) { + var model = models().getExistingFile(ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "screen")); + getVariantBuilder(block).forAllStates(state -> ConfiguredModel.builder() + .modelFile(model) + .rotationY(getInvYRotation(state.getValue(PropertyRotatable.Yaw()))) + .rotationX(getXRotation(state.getValue(PropertyRotatable.Pitch()))) + .build() + ); + simpleBlockItem(block, model); + } + + private void flatScreenBlock(Block block) { + var model = existingModel(block); + getVariantBuilder(block).forAllStates(state -> { + var pitch = state.getValue(PropertyRotatable.Pitch()); + var yaw = state.getValue(PropertyRotatable.Yaw()); + return ConfiguredModel.builder() + .modelFile(model) + .rotationY(pitch == Direction.DOWN ? getInvYRotation(yaw) : getYRotation(yaw)) + .rotationX(-getXRotation(pitch)) + .build(); + } + ); + simpleBlockItem(block, model); + } + + private void holoScreenBlock(Block block) { + var model = existingModel(block); + getVariantBuilder(block).forAllStates(state -> ConfiguredModel.builder() + .modelFile(model) + .rotationY(getYRotation(state.getValue(PropertyRotatable.Facing()))) + .rotationX(state.getValue(PropertyRotatable.Mount()) == Direction.DOWN ? 180 : 0) + .build() + ); + simpleBlockItem(block, model); + } + + private void keyboardBlock() { + var block = OCBlocks.Keyboard().get(); + var model = existingModel(block); + getVariantBuilder(block).forAllStates(state -> { + var yaw = state.getValue(PropertyRotatable.Yaw()); + var pitch = state.getValue(PropertyRotatable.Pitch()); + return ConfiguredModel.builder() + .modelFile(model) + .rotationY(getYRotation(yaw, pitch == Direction.NORTH ? 180 : 0)) + .rotationX(-getXRotation(pitch)) + .build(); + }); + simpleBlockItem(block, model); + } + + private void waypointBlock() { + var block = OCBlocks.Waypoint().get(); + var model = models().orientableWithBottom( + modelName(block), textureName(block, "side"), textureName(block, "front"), GENERIC_TOP, textureName(block, "top") + ); + getVariantBuilder(block).forAllStates(state -> ConfiguredModel.builder() + .modelFile(model) + .rotationY(getYRotation(state.getValue(PropertyRotatable.Yaw()))) + .rotationX(-getXRotation(state.getValue(PropertyRotatable.Pitch()))) + .build()); + + simpleBlockItem(block, model); + } + + + private String modelName(Block block) { + return "block/" + BuiltInRegistries.BLOCK.getKey(block).getPath(); + } + + private ResourceLocation textureName(Block block) { + return BuiltInRegistries.BLOCK.getKey(block).withPrefix("block/"); + } + + private ResourceLocation textureName(Block block, String variant) { + return textureName(block).withSuffix("_" + variant); + } + + private ModelFile existingModel(Block block) { + return models().getExistingFile(BuiltInRegistries.BLOCK.getKey(block).withPrefix("block/")); + } + + private ModelFile cubeGenericBottomTop(Block block) { + return models().cubeBottomTop(modelName(block), textureName(block, "side"), GENERIC_TOP, textureName(block, "top")); + } + + private void horizontalBlock(Block block) { + horizontalBlock(block, models().orientable( + modelName(block), textureName(block, "side"), textureName(block, "front"), textureName(block, "top")) + ); + } + + private void horizontalBlockGenericTop(Block block) { + horizontalBlock(block, models().orientable( + modelName(block), textureName(block, "side"), textureName(block, "front"), GENERIC_TOP) + ); + } + + /** + * Get the Y rotation of a direction. + * + * @param direction The direction. + * @return The Y rotation. + */ + private static int getYRotation(Direction direction) { + return getYRotation(direction, 180); + } + + private static int getYRotation(Direction direction, int offset) { + return ((int) direction.toYRot() + offset) % 360; + } + + /** + * Get the inverse Y rotation of a direction. This is similar to {@link #getYRotation(Direction)}, but with + * {@link Direction#EAST} and {@link Direction#WEST} swapped. + * + * @param direction The direction. + * @return The Y rotation. + */ + private static int getInvYRotation(Direction direction) { + return switch (direction) { + case NORTH -> 0; + case SOUTH -> 180; + case EAST -> 270; + case WEST -> 90; + default -> throw new UnsupportedOperationException("Expected a horizontal direction"); + }; + } + + private static int getXRotation(Direction direction) { + return switch (direction) { + case UP -> 90; + case DOWN -> -90; + default -> 0; + }; + } + +} diff --git a/src/data/java/li/cil/oc/data/OCItemModelProvider.java b/src/data/java/li/cil/oc/data/OCItemModelProvider.java index 7d91c34e01..a2b65a1b8f 100644 --- a/src/data/java/li/cil/oc/data/OCItemModelProvider.java +++ b/src/data/java/li/cil/oc/data/OCItemModelProvider.java @@ -172,48 +172,6 @@ protected void registerModels() { basicItem(OpenPrinter.PAPER_SHREDS.get(), "shredded_paper"); // TODO: This feels like it should have a custom full/empty texture? basicItem(OpenPrinter.FOLDER.get(), "folder_empty"); - - simpleBlockItem(OCBlocks.Adapter().get()); - simpleBlockItem(OCBlocks.Assembler().get()); - simpleBlockItem(OCBlocks.Capacitor().get()); - simpleBlockItem(OCBlocks.CarpetedCapacitor().get()); - simpleBlockItem(OCBlocks.ChameliumBlock().get()); - simpleBlockItem(OCBlocks.Charger().get()); - simpleBlockItem(OCBlocks.Disassembler().get()); - simpleBlockItem(OCBlocks.DiskDrive().get()); - simpleBlockItem(OCBlocks.FlatScreenBackTier1().get()); - simpleBlockItem(OCBlocks.FlatScreenBackTier2().get()); - simpleBlockItem(OCBlocks.FlatScreenBackTier3().get()); - simpleBlockItem(OCBlocks.FlatScreenBackTier4().get()); - simpleBlockItem(OCBlocks.FlatScreenFrontTier1().get()); - simpleBlockItem(OCBlocks.FlatScreenFrontTier2().get()); - simpleBlockItem(OCBlocks.FlatScreenFrontTier3().get()); - simpleBlockItem(OCBlocks.FlatScreenFrontTier4().get()); - simpleBlockItem(OCBlocks.Geolyzer().get()); - simpleBlockItem(OCBlocks.HoloScreenTier1().get()); - simpleBlockItem(OCBlocks.HoloScreenTier2().get()); - simpleBlockItem(OCBlocks.HoloScreenTier3().get()); - simpleBlockItem(OCBlocks.HoloScreenTier4().get()); - simpleBlockItem(OCBlocks.HologramTier1().get()); - simpleBlockItem(OCBlocks.HologramTier2().get()); - simpleBlockItem(OCBlocks.HologramTier3().get()); - simpleBlockItem(OCBlocks.Keyboard().get()); - simpleBlockItem(OCBlocks.Microcontroller().get()); - simpleBlockItem(OCBlocks.MotionSensor().get()); - simpleBlockItem(OCBlocks.PowerConverter().get()); - simpleBlockItem(OCBlocks.PowerDistributor().get()); - simpleBlockItem(OCBlocks.Printer().get()); - simpleBlockItem(OCBlocks.Rack().get()); - simpleBlockItem(OCBlocks.Raid().get()); - simpleBlockItem(OCBlocks.Redstone().get()); - simpleBlockItem(OCBlocks.Relay().get()); - simpleBlockItem(OCBlocks.Transposer().get()); - simpleBlockItem(OCBlocks.Waypoint().get()); - - simpleBlockItem(OpenPrinter.BRIEFCASE.get()); - simpleBlockItem(OpenPrinter.FILE_CABINET.get()); - simpleBlockItem(OpenPrinter.PRINTER.get()); - simpleBlockItem(OpenPrinter.SHREDDER.get()); } private ItemModelBuilder basicItem(Item item, String texture) { diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/adapter.json b/src/main/generatedResources/assets/opencomputers/blockstates/adapter.json new file mode 100644 index 0000000000..dd410bcbe9 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/adapter.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/adapter" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/assembler.json b/src/main/generatedResources/assets/opencomputers/blockstates/assembler.json new file mode 100644 index 0000000000..17e3b8e029 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/assembler.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/assembler" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/backflatscreen1.json b/src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen1.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/backflatscreen1.json rename to src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen1.json index 9c61d11f06..c2938e3bcf 100644 --- a/src/main/resources/assets/opencomputers/blockstates/backflatscreen1.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen1.json @@ -1,57 +1,57 @@ { "variants": { - "pitch=north,yaw=north": { - "model": "opencomputers:block/backflatscreen1" + "pitch=down,yaw=east": { + "model": "opencomputers:block/backflatscreen1", + "x": 90, + "y": 270 }, - "pitch=north,yaw=south": { + "pitch=down,yaw=north": { "model": "opencomputers:block/backflatscreen1", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/backflatscreen1", + "x": 90, "y": 180 }, - "pitch=north,yaw=east": { + "pitch=down,yaw=west": { "model": "opencomputers:block/backflatscreen1", + "x": 90, "y": 90 }, - "pitch=north,yaw=west": { + "pitch=north,yaw=east": { "model": "opencomputers:block/backflatscreen1", - "y": 270 + "y": 90 }, - "pitch=up,yaw=north": { - "model": "opencomputers:block/backflatscreen1", - "x": -90 + "pitch=north,yaw=north": { + "model": "opencomputers:block/backflatscreen1" }, - "pitch=up,yaw=south": { + "pitch=north,yaw=south": { "model": "opencomputers:block/backflatscreen1", - "x": -90, "y": 180 }, - "pitch=up,yaw=east": { + "pitch=north,yaw=west": { "model": "opencomputers:block/backflatscreen1", - "x": -90, - "y": 90 + "y": 270 }, - "pitch=up,yaw=west": { + "pitch=up,yaw=east": { "model": "opencomputers:block/backflatscreen1", "x": -90, - "y": 270 + "y": 90 }, - "pitch=down,yaw=north": { + "pitch=up,yaw=north": { "model": "opencomputers:block/backflatscreen1", - "x": 90 + "x": -90 }, - "pitch=down,yaw=south": { + "pitch=up,yaw=south": { "model": "opencomputers:block/backflatscreen1", - "x": 90, + "x": -90, "y": 180 }, - "pitch=down,yaw=east": { + "pitch=up,yaw=west": { "model": "opencomputers:block/backflatscreen1", - "x": 90, + "x": -90, "y": 270 - }, - "pitch=down,yaw=west": { - "model": "opencomputers:block/backflatscreen1", - "x": 90, - "y": 90 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/backflatscreen2.json b/src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen2.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/backflatscreen2.json rename to src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen2.json index 5f352f28cc..086cc6d8a6 100644 --- a/src/main/resources/assets/opencomputers/blockstates/backflatscreen2.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen2.json @@ -1,57 +1,57 @@ { "variants": { - "pitch=north,yaw=north": { - "model": "opencomputers:block/backflatscreen2" + "pitch=down,yaw=east": { + "model": "opencomputers:block/backflatscreen2", + "x": 90, + "y": 270 }, - "pitch=north,yaw=south": { + "pitch=down,yaw=north": { "model": "opencomputers:block/backflatscreen2", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/backflatscreen2", + "x": 90, "y": 180 }, - "pitch=north,yaw=east": { + "pitch=down,yaw=west": { "model": "opencomputers:block/backflatscreen2", + "x": 90, "y": 90 }, - "pitch=north,yaw=west": { + "pitch=north,yaw=east": { "model": "opencomputers:block/backflatscreen2", - "y": 270 + "y": 90 }, - "pitch=up,yaw=north": { - "model": "opencomputers:block/backflatscreen2", - "x": -90 + "pitch=north,yaw=north": { + "model": "opencomputers:block/backflatscreen2" }, - "pitch=up,yaw=south": { + "pitch=north,yaw=south": { "model": "opencomputers:block/backflatscreen2", - "x": -90, "y": 180 }, - "pitch=up,yaw=east": { + "pitch=north,yaw=west": { "model": "opencomputers:block/backflatscreen2", - "x": -90, - "y": 90 + "y": 270 }, - "pitch=up,yaw=west": { + "pitch=up,yaw=east": { "model": "opencomputers:block/backflatscreen2", "x": -90, - "y": 270 + "y": 90 }, - "pitch=down,yaw=north": { + "pitch=up,yaw=north": { "model": "opencomputers:block/backflatscreen2", - "x": 90 + "x": -90 }, - "pitch=down,yaw=south": { + "pitch=up,yaw=south": { "model": "opencomputers:block/backflatscreen2", - "x": 90, + "x": -90, "y": 180 }, - "pitch=down,yaw=east": { + "pitch=up,yaw=west": { "model": "opencomputers:block/backflatscreen2", - "x": 90, + "x": -90, "y": 270 - }, - "pitch=down,yaw=west": { - "model": "opencomputers:block/backflatscreen2", - "x": 90, - "y": 90 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/backflatscreen3.json b/src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen3.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/backflatscreen3.json rename to src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen3.json index 6a7f166589..7c2005edf2 100644 --- a/src/main/resources/assets/opencomputers/blockstates/backflatscreen3.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen3.json @@ -1,57 +1,57 @@ { "variants": { - "pitch=north,yaw=north": { - "model": "opencomputers:block/backflatscreen3" + "pitch=down,yaw=east": { + "model": "opencomputers:block/backflatscreen3", + "x": 90, + "y": 270 }, - "pitch=north,yaw=south": { + "pitch=down,yaw=north": { "model": "opencomputers:block/backflatscreen3", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/backflatscreen3", + "x": 90, "y": 180 }, - "pitch=north,yaw=east": { + "pitch=down,yaw=west": { "model": "opencomputers:block/backflatscreen3", + "x": 90, "y": 90 }, - "pitch=north,yaw=west": { + "pitch=north,yaw=east": { "model": "opencomputers:block/backflatscreen3", - "y": 270 + "y": 90 }, - "pitch=up,yaw=north": { - "model": "opencomputers:block/backflatscreen3", - "x": -90 + "pitch=north,yaw=north": { + "model": "opencomputers:block/backflatscreen3" }, - "pitch=up,yaw=south": { + "pitch=north,yaw=south": { "model": "opencomputers:block/backflatscreen3", - "x": -90, "y": 180 }, - "pitch=up,yaw=east": { + "pitch=north,yaw=west": { "model": "opencomputers:block/backflatscreen3", - "x": -90, - "y": 90 + "y": 270 }, - "pitch=up,yaw=west": { + "pitch=up,yaw=east": { "model": "opencomputers:block/backflatscreen3", "x": -90, - "y": 270 + "y": 90 }, - "pitch=down,yaw=north": { + "pitch=up,yaw=north": { "model": "opencomputers:block/backflatscreen3", - "x": 90 + "x": -90 }, - "pitch=down,yaw=south": { + "pitch=up,yaw=south": { "model": "opencomputers:block/backflatscreen3", - "x": 90, + "x": -90, "y": 180 }, - "pitch=down,yaw=east": { + "pitch=up,yaw=west": { "model": "opencomputers:block/backflatscreen3", - "x": 90, + "x": -90, "y": 270 - }, - "pitch=down,yaw=west": { - "model": "opencomputers:block/backflatscreen3", - "x": 90, - "y": 90 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/backflatscreen4.json b/src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen4.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/backflatscreen4.json rename to src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen4.json index d901ba21d6..af3d85f700 100644 --- a/src/main/resources/assets/opencomputers/blockstates/backflatscreen4.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/backflatscreen4.json @@ -1,57 +1,57 @@ { "variants": { - "pitch=north,yaw=north": { - "model": "opencomputers:block/backflatscreen4" + "pitch=down,yaw=east": { + "model": "opencomputers:block/backflatscreen4", + "x": 90, + "y": 270 }, - "pitch=north,yaw=south": { + "pitch=down,yaw=north": { "model": "opencomputers:block/backflatscreen4", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/backflatscreen4", + "x": 90, "y": 180 }, - "pitch=north,yaw=east": { + "pitch=down,yaw=west": { "model": "opencomputers:block/backflatscreen4", + "x": 90, "y": 90 }, - "pitch=north,yaw=west": { + "pitch=north,yaw=east": { "model": "opencomputers:block/backflatscreen4", - "y": 270 + "y": 90 }, - "pitch=up,yaw=north": { - "model": "opencomputers:block/backflatscreen4", - "x": -90 + "pitch=north,yaw=north": { + "model": "opencomputers:block/backflatscreen4" }, - "pitch=up,yaw=south": { + "pitch=north,yaw=south": { "model": "opencomputers:block/backflatscreen4", - "x": -90, "y": 180 }, - "pitch=up,yaw=east": { + "pitch=north,yaw=west": { "model": "opencomputers:block/backflatscreen4", - "x": -90, - "y": 90 + "y": 270 }, - "pitch=up,yaw=west": { + "pitch=up,yaw=east": { "model": "opencomputers:block/backflatscreen4", "x": -90, - "y": 270 + "y": 90 }, - "pitch=down,yaw=north": { + "pitch=up,yaw=north": { "model": "opencomputers:block/backflatscreen4", - "x": 90 + "x": -90 }, - "pitch=down,yaw=south": { + "pitch=up,yaw=south": { "model": "opencomputers:block/backflatscreen4", - "x": 90, + "x": -90, "y": 180 }, - "pitch=down,yaw=east": { + "pitch=up,yaw=west": { "model": "opencomputers:block/backflatscreen4", - "x": 90, + "x": -90, "y": 270 - }, - "pitch=down,yaw=west": { - "model": "opencomputers:block/backflatscreen4", - "x": 90, - "y": 90 } } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/briefcase.json b/src/main/generatedResources/assets/opencomputers/blockstates/briefcase.json new file mode 100644 index 0000000000..199c043c67 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/briefcase.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/briefcase", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/briefcase" + }, + "facing=south": { + "model": "opencomputers:block/briefcase", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/briefcase", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/cable.json b/src/main/generatedResources/assets/opencomputers/blockstates/cable.json new file mode 100644 index 0000000000..2c8f02f067 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/cable.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/air" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/capacitor.json b/src/main/generatedResources/assets/opencomputers/blockstates/capacitor.json new file mode 100644 index 0000000000..87dda23e39 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/capacitor.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/capacitor" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/carpetedcapacitor.json b/src/main/generatedResources/assets/opencomputers/blockstates/carpetedcapacitor.json new file mode 100644 index 0000000000..35807f613d --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/carpetedcapacitor.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/carpetedcapacitor" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/case1.json b/src/main/generatedResources/assets/opencomputers/blockstates/case1.json new file mode 100644 index 0000000000..5d4ecb314b --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/case1.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,running=false": { + "model": "opencomputers:block/case", + "y": 90 + }, + "facing=east,running=true": { + "model": "opencomputers:block/case_running", + "y": 90 + }, + "facing=north,running=false": { + "model": "opencomputers:block/case" + }, + "facing=north,running=true": { + "model": "opencomputers:block/case_running" + }, + "facing=south,running=false": { + "model": "opencomputers:block/case", + "y": 180 + }, + "facing=south,running=true": { + "model": "opencomputers:block/case_running", + "y": 180 + }, + "facing=west,running=false": { + "model": "opencomputers:block/case", + "y": 270 + }, + "facing=west,running=true": { + "model": "opencomputers:block/case_running", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/case2.json b/src/main/generatedResources/assets/opencomputers/blockstates/case2.json new file mode 100644 index 0000000000..5d4ecb314b --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/case2.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,running=false": { + "model": "opencomputers:block/case", + "y": 90 + }, + "facing=east,running=true": { + "model": "opencomputers:block/case_running", + "y": 90 + }, + "facing=north,running=false": { + "model": "opencomputers:block/case" + }, + "facing=north,running=true": { + "model": "opencomputers:block/case_running" + }, + "facing=south,running=false": { + "model": "opencomputers:block/case", + "y": 180 + }, + "facing=south,running=true": { + "model": "opencomputers:block/case_running", + "y": 180 + }, + "facing=west,running=false": { + "model": "opencomputers:block/case", + "y": 270 + }, + "facing=west,running=true": { + "model": "opencomputers:block/case_running", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/case3.json b/src/main/generatedResources/assets/opencomputers/blockstates/case3.json new file mode 100644 index 0000000000..5d4ecb314b --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/case3.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,running=false": { + "model": "opencomputers:block/case", + "y": 90 + }, + "facing=east,running=true": { + "model": "opencomputers:block/case_running", + "y": 90 + }, + "facing=north,running=false": { + "model": "opencomputers:block/case" + }, + "facing=north,running=true": { + "model": "opencomputers:block/case_running" + }, + "facing=south,running=false": { + "model": "opencomputers:block/case", + "y": 180 + }, + "facing=south,running=true": { + "model": "opencomputers:block/case_running", + "y": 180 + }, + "facing=west,running=false": { + "model": "opencomputers:block/case", + "y": 270 + }, + "facing=west,running=true": { + "model": "opencomputers:block/case_running", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/case4.json b/src/main/generatedResources/assets/opencomputers/blockstates/case4.json new file mode 100644 index 0000000000..5d4ecb314b --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/case4.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,running=false": { + "model": "opencomputers:block/case", + "y": 90 + }, + "facing=east,running=true": { + "model": "opencomputers:block/case_running", + "y": 90 + }, + "facing=north,running=false": { + "model": "opencomputers:block/case" + }, + "facing=north,running=true": { + "model": "opencomputers:block/case_running" + }, + "facing=south,running=false": { + "model": "opencomputers:block/case", + "y": 180 + }, + "facing=south,running=true": { + "model": "opencomputers:block/case_running", + "y": 180 + }, + "facing=west,running=false": { + "model": "opencomputers:block/case", + "y": 270 + }, + "facing=west,running=true": { + "model": "opencomputers:block/case_running", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/casecreative.json b/src/main/generatedResources/assets/opencomputers/blockstates/casecreative.json new file mode 100644 index 0000000000..5d4ecb314b --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/casecreative.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,running=false": { + "model": "opencomputers:block/case", + "y": 90 + }, + "facing=east,running=true": { + "model": "opencomputers:block/case_running", + "y": 90 + }, + "facing=north,running=false": { + "model": "opencomputers:block/case" + }, + "facing=north,running=true": { + "model": "opencomputers:block/case_running" + }, + "facing=south,running=false": { + "model": "opencomputers:block/case", + "y": 180 + }, + "facing=south,running=true": { + "model": "opencomputers:block/case_running", + "y": 180 + }, + "facing=west,running=false": { + "model": "opencomputers:block/case", + "y": 270 + }, + "facing=west,running=true": { + "model": "opencomputers:block/case_running", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/chameliumblock.json b/src/main/generatedResources/assets/opencomputers/blockstates/chameliumblock.json new file mode 100644 index 0000000000..c515bb14c4 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/chameliumblock.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/chameliumblock" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/charger.json b/src/main/generatedResources/assets/opencomputers/blockstates/charger.json new file mode 100644 index 0000000000..f7b84d6261 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/charger", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/charger" + }, + "facing=south": { + "model": "opencomputers:block/charger", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/disassembler.json b/src/main/generatedResources/assets/opencomputers/blockstates/disassembler.json new file mode 100644 index 0000000000..b3a45394df --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/disassembler.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/disassembler" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/diskdrive.json b/src/main/generatedResources/assets/opencomputers/blockstates/diskdrive.json new file mode 100644 index 0000000000..021f0327b0 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/diskdrive.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/diskdrive", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/diskdrive" + }, + "facing=south": { + "model": "opencomputers:block/diskdrive", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/diskdrive", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/document_printer.json b/src/main/generatedResources/assets/opencomputers/blockstates/document_printer.json new file mode 100644 index 0000000000..d5c22264aa --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/document_printer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/document_printer", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/document_printer" + }, + "facing=south": { + "model": "opencomputers:block/document_printer", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/document_printer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/endstone.json b/src/main/generatedResources/assets/opencomputers/blockstates/endstone.json new file mode 100644 index 0000000000..e8e23c9113 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/endstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/end_stone" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/filecabinet.json b/src/main/generatedResources/assets/opencomputers/blockstates/filecabinet.json new file mode 100644 index 0000000000..32f3a17876 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/filecabinet.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/filecabinet", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/filecabinet" + }, + "facing=south": { + "model": "opencomputers:block/filecabinet", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/filecabinet", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/frontflatscreen1.json b/src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen1.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/frontflatscreen1.json rename to src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen1.json index d5af7237c7..d0e34d9221 100644 --- a/src/main/resources/assets/opencomputers/blockstates/frontflatscreen1.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen1.json @@ -1,57 +1,57 @@ { "variants": { - "pitch=north,yaw=north": { - "model": "opencomputers:block/frontflatscreen1" + "pitch=down,yaw=east": { + "model": "opencomputers:block/frontflatscreen1", + "x": 90, + "y": 270 }, - "pitch=north,yaw=south": { + "pitch=down,yaw=north": { "model": "opencomputers:block/frontflatscreen1", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/frontflatscreen1", + "x": 90, "y": 180 }, - "pitch=north,yaw=east": { + "pitch=down,yaw=west": { "model": "opencomputers:block/frontflatscreen1", + "x": 90, "y": 90 }, - "pitch=north,yaw=west": { + "pitch=north,yaw=east": { "model": "opencomputers:block/frontflatscreen1", - "y": 270 + "y": 90 }, - "pitch=up,yaw=north": { - "model": "opencomputers:block/frontflatscreen1", - "x": -90 + "pitch=north,yaw=north": { + "model": "opencomputers:block/frontflatscreen1" }, - "pitch=up,yaw=south": { + "pitch=north,yaw=south": { "model": "opencomputers:block/frontflatscreen1", - "x": -90, "y": 180 }, - "pitch=up,yaw=east": { + "pitch=north,yaw=west": { "model": "opencomputers:block/frontflatscreen1", - "x": -90, - "y": 90 + "y": 270 }, - "pitch=up,yaw=west": { + "pitch=up,yaw=east": { "model": "opencomputers:block/frontflatscreen1", "x": -90, - "y": 270 + "y": 90 }, - "pitch=down,yaw=north": { + "pitch=up,yaw=north": { "model": "opencomputers:block/frontflatscreen1", - "x": 90 + "x": -90 }, - "pitch=down,yaw=south": { + "pitch=up,yaw=south": { "model": "opencomputers:block/frontflatscreen1", - "x": 90, + "x": -90, "y": 180 }, - "pitch=down,yaw=east": { + "pitch=up,yaw=west": { "model": "opencomputers:block/frontflatscreen1", - "x": 90, + "x": -90, "y": 270 - }, - "pitch=down,yaw=west": { - "model": "opencomputers:block/frontflatscreen1", - "x": 90, - "y": 90 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/frontflatscreen2.json b/src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen2.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/frontflatscreen2.json rename to src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen2.json index 343f169a2e..7e9cc9b599 100644 --- a/src/main/resources/assets/opencomputers/blockstates/frontflatscreen2.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen2.json @@ -1,57 +1,57 @@ { "variants": { - "pitch=north,yaw=north": { - "model": "opencomputers:block/frontflatscreen2" + "pitch=down,yaw=east": { + "model": "opencomputers:block/frontflatscreen2", + "x": 90, + "y": 270 }, - "pitch=north,yaw=south": { + "pitch=down,yaw=north": { "model": "opencomputers:block/frontflatscreen2", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/frontflatscreen2", + "x": 90, "y": 180 }, - "pitch=north,yaw=east": { + "pitch=down,yaw=west": { "model": "opencomputers:block/frontflatscreen2", + "x": 90, "y": 90 }, - "pitch=north,yaw=west": { + "pitch=north,yaw=east": { "model": "opencomputers:block/frontflatscreen2", - "y": 270 + "y": 90 }, - "pitch=up,yaw=north": { - "model": "opencomputers:block/frontflatscreen2", - "x": -90 + "pitch=north,yaw=north": { + "model": "opencomputers:block/frontflatscreen2" }, - "pitch=up,yaw=south": { + "pitch=north,yaw=south": { "model": "opencomputers:block/frontflatscreen2", - "x": -90, "y": 180 }, - "pitch=up,yaw=east": { + "pitch=north,yaw=west": { "model": "opencomputers:block/frontflatscreen2", - "x": -90, - "y": 90 + "y": 270 }, - "pitch=up,yaw=west": { + "pitch=up,yaw=east": { "model": "opencomputers:block/frontflatscreen2", "x": -90, - "y": 270 + "y": 90 }, - "pitch=down,yaw=north": { + "pitch=up,yaw=north": { "model": "opencomputers:block/frontflatscreen2", - "x": 90 + "x": -90 }, - "pitch=down,yaw=south": { + "pitch=up,yaw=south": { "model": "opencomputers:block/frontflatscreen2", - "x": 90, + "x": -90, "y": 180 }, - "pitch=down,yaw=east": { + "pitch=up,yaw=west": { "model": "opencomputers:block/frontflatscreen2", - "x": 90, + "x": -90, "y": 270 - }, - "pitch=down,yaw=west": { - "model": "opencomputers:block/frontflatscreen2", - "x": 90, - "y": 90 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/frontflatscreen3.json b/src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen3.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/frontflatscreen3.json rename to src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen3.json index 093cb3d31e..7b3c7a7b7f 100644 --- a/src/main/resources/assets/opencomputers/blockstates/frontflatscreen3.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen3.json @@ -1,57 +1,57 @@ { "variants": { - "pitch=north,yaw=north": { - "model": "opencomputers:block/frontflatscreen3" + "pitch=down,yaw=east": { + "model": "opencomputers:block/frontflatscreen3", + "x": 90, + "y": 270 }, - "pitch=north,yaw=south": { + "pitch=down,yaw=north": { "model": "opencomputers:block/frontflatscreen3", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/frontflatscreen3", + "x": 90, "y": 180 }, - "pitch=north,yaw=east": { + "pitch=down,yaw=west": { "model": "opencomputers:block/frontflatscreen3", + "x": 90, "y": 90 }, - "pitch=north,yaw=west": { + "pitch=north,yaw=east": { "model": "opencomputers:block/frontflatscreen3", - "y": 270 + "y": 90 }, - "pitch=up,yaw=north": { - "model": "opencomputers:block/frontflatscreen3", - "x": -90 + "pitch=north,yaw=north": { + "model": "opencomputers:block/frontflatscreen3" }, - "pitch=up,yaw=south": { + "pitch=north,yaw=south": { "model": "opencomputers:block/frontflatscreen3", - "x": -90, "y": 180 }, - "pitch=up,yaw=east": { + "pitch=north,yaw=west": { "model": "opencomputers:block/frontflatscreen3", - "x": -90, - "y": 90 + "y": 270 }, - "pitch=up,yaw=west": { + "pitch=up,yaw=east": { "model": "opencomputers:block/frontflatscreen3", "x": -90, - "y": 270 + "y": 90 }, - "pitch=down,yaw=north": { + "pitch=up,yaw=north": { "model": "opencomputers:block/frontflatscreen3", - "x": 90 + "x": -90 }, - "pitch=down,yaw=south": { + "pitch=up,yaw=south": { "model": "opencomputers:block/frontflatscreen3", - "x": 90, + "x": -90, "y": 180 }, - "pitch=down,yaw=east": { + "pitch=up,yaw=west": { "model": "opencomputers:block/frontflatscreen3", - "x": 90, + "x": -90, "y": 270 - }, - "pitch=down,yaw=west": { - "model": "opencomputers:block/frontflatscreen3", - "x": 90, - "y": 90 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/frontflatscreen4.json b/src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen4.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/frontflatscreen4.json rename to src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen4.json index 2cdcc2aa88..54e0a5ddaa 100644 --- a/src/main/resources/assets/opencomputers/blockstates/frontflatscreen4.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/frontflatscreen4.json @@ -1,57 +1,57 @@ { "variants": { - "pitch=north,yaw=north": { - "model": "opencomputers:block/frontflatscreen4" + "pitch=down,yaw=east": { + "model": "opencomputers:block/frontflatscreen4", + "x": 90, + "y": 270 }, - "pitch=north,yaw=south": { + "pitch=down,yaw=north": { "model": "opencomputers:block/frontflatscreen4", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/frontflatscreen4", + "x": 90, "y": 180 }, - "pitch=north,yaw=east": { + "pitch=down,yaw=west": { "model": "opencomputers:block/frontflatscreen4", + "x": 90, "y": 90 }, - "pitch=north,yaw=west": { + "pitch=north,yaw=east": { "model": "opencomputers:block/frontflatscreen4", - "y": 270 + "y": 90 }, - "pitch=up,yaw=north": { - "model": "opencomputers:block/frontflatscreen4", - "x": -90 + "pitch=north,yaw=north": { + "model": "opencomputers:block/frontflatscreen4" }, - "pitch=up,yaw=south": { + "pitch=north,yaw=south": { "model": "opencomputers:block/frontflatscreen4", - "x": -90, "y": 180 }, - "pitch=up,yaw=east": { + "pitch=north,yaw=west": { "model": "opencomputers:block/frontflatscreen4", - "x": -90, - "y": 90 + "y": 270 }, - "pitch=up,yaw=west": { + "pitch=up,yaw=east": { "model": "opencomputers:block/frontflatscreen4", "x": -90, - "y": 270 + "y": 90 }, - "pitch=down,yaw=north": { + "pitch=up,yaw=north": { "model": "opencomputers:block/frontflatscreen4", - "x": 90 + "x": -90 }, - "pitch=down,yaw=south": { + "pitch=up,yaw=south": { "model": "opencomputers:block/frontflatscreen4", - "x": 90, + "x": -90, "y": 180 }, - "pitch=down,yaw=east": { + "pitch=up,yaw=west": { "model": "opencomputers:block/frontflatscreen4", - "x": 90, + "x": -90, "y": 270 - }, - "pitch=down,yaw=west": { - "model": "opencomputers:block/frontflatscreen4", - "x": 90, - "y": 90 } } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/geolyzer.json b/src/main/generatedResources/assets/opencomputers/blockstates/geolyzer.json new file mode 100644 index 0000000000..aaacd4b419 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/geolyzer.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/geolyzer" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/hologram1.json b/src/main/generatedResources/assets/opencomputers/blockstates/hologram1.json new file mode 100644 index 0000000000..cd4eec373c --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/hologram1.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/hologram1" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/hologram2.json b/src/main/generatedResources/assets/opencomputers/blockstates/hologram2.json new file mode 100644 index 0000000000..c229cb3a81 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/hologram2.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/hologram2" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/hologram3.json b/src/main/generatedResources/assets/opencomputers/blockstates/hologram3.json new file mode 100644 index 0000000000..41e1e80230 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/hologram3.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/hologram3" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/holoscreen1.json b/src/main/generatedResources/assets/opencomputers/blockstates/holoscreen1.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/holoscreen1.json rename to src/main/generatedResources/assets/opencomputers/blockstates/holoscreen1.json index de3bd1c7f9..e8054a7590 100644 --- a/src/main/resources/assets/opencomputers/blockstates/holoscreen1.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/holoscreen1.json @@ -1,38 +1,38 @@ { "variants": { - "facing=north,mount=up": { - "model": "opencomputers:block/holoscreen1" - }, - "facing=north,mount=down": { + "facing=east,mount=down": { "model": "opencomputers:block/holoscreen1", - "x": 180 + "x": 180, + "y": 90 }, "facing=east,mount=up": { "model": "opencomputers:block/holoscreen1", "y": 90 }, - "facing=east,mount=down": { + "facing=north,mount=down": { "model": "opencomputers:block/holoscreen1", - "x": 180, - "y": 90 + "x": 180 }, - "facing=south,mount=up": { - "model": "opencomputers:block/holoscreen1", - "y": 180 + "facing=north,mount=up": { + "model": "opencomputers:block/holoscreen1" }, "facing=south,mount=down": { "model": "opencomputers:block/holoscreen1", "x": 180, "y": 180 }, - "facing=west,mount=up": { + "facing=south,mount=up": { "model": "opencomputers:block/holoscreen1", - "y": 270 + "y": 180 }, "facing=west,mount=down": { "model": "opencomputers:block/holoscreen1", "x": 180, "y": 270 + }, + "facing=west,mount=up": { + "model": "opencomputers:block/holoscreen1", + "y": 270 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/holoscreen2.json b/src/main/generatedResources/assets/opencomputers/blockstates/holoscreen2.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/holoscreen2.json rename to src/main/generatedResources/assets/opencomputers/blockstates/holoscreen2.json index a260724c18..a17efabe1e 100644 --- a/src/main/resources/assets/opencomputers/blockstates/holoscreen2.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/holoscreen2.json @@ -1,38 +1,38 @@ { "variants": { - "facing=north,mount=up": { - "model": "opencomputers:block/holoscreen2" - }, - "facing=north,mount=down": { + "facing=east,mount=down": { "model": "opencomputers:block/holoscreen2", - "x": 180 + "x": 180, + "y": 90 }, "facing=east,mount=up": { "model": "opencomputers:block/holoscreen2", "y": 90 }, - "facing=east,mount=down": { + "facing=north,mount=down": { "model": "opencomputers:block/holoscreen2", - "x": 180, - "y": 90 + "x": 180 }, - "facing=south,mount=up": { - "model": "opencomputers:block/holoscreen2", - "y": 180 + "facing=north,mount=up": { + "model": "opencomputers:block/holoscreen2" }, "facing=south,mount=down": { "model": "opencomputers:block/holoscreen2", "x": 180, "y": 180 }, - "facing=west,mount=up": { + "facing=south,mount=up": { "model": "opencomputers:block/holoscreen2", - "y": 270 + "y": 180 }, "facing=west,mount=down": { "model": "opencomputers:block/holoscreen2", "x": 180, "y": 270 + }, + "facing=west,mount=up": { + "model": "opencomputers:block/holoscreen2", + "y": 270 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/holoscreen3.json b/src/main/generatedResources/assets/opencomputers/blockstates/holoscreen3.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/holoscreen3.json rename to src/main/generatedResources/assets/opencomputers/blockstates/holoscreen3.json index aef224f5f9..517daea566 100644 --- a/src/main/resources/assets/opencomputers/blockstates/holoscreen3.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/holoscreen3.json @@ -1,38 +1,38 @@ { "variants": { - "facing=north,mount=up": { - "model": "opencomputers:block/holoscreen3" - }, - "facing=north,mount=down": { + "facing=east,mount=down": { "model": "opencomputers:block/holoscreen3", - "x": 180 + "x": 180, + "y": 90 }, "facing=east,mount=up": { "model": "opencomputers:block/holoscreen3", "y": 90 }, - "facing=east,mount=down": { + "facing=north,mount=down": { "model": "opencomputers:block/holoscreen3", - "x": 180, - "y": 90 + "x": 180 }, - "facing=south,mount=up": { - "model": "opencomputers:block/holoscreen3", - "y": 180 + "facing=north,mount=up": { + "model": "opencomputers:block/holoscreen3" }, "facing=south,mount=down": { "model": "opencomputers:block/holoscreen3", "x": 180, "y": 180 }, - "facing=west,mount=up": { + "facing=south,mount=up": { "model": "opencomputers:block/holoscreen3", - "y": 270 + "y": 180 }, "facing=west,mount=down": { "model": "opencomputers:block/holoscreen3", "x": 180, "y": 270 + }, + "facing=west,mount=up": { + "model": "opencomputers:block/holoscreen3", + "y": 270 } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/holoscreen4.json b/src/main/generatedResources/assets/opencomputers/blockstates/holoscreen4.json similarity index 99% rename from src/main/resources/assets/opencomputers/blockstates/holoscreen4.json rename to src/main/generatedResources/assets/opencomputers/blockstates/holoscreen4.json index 28b17a2152..ae26b7e8eb 100644 --- a/src/main/resources/assets/opencomputers/blockstates/holoscreen4.json +++ b/src/main/generatedResources/assets/opencomputers/blockstates/holoscreen4.json @@ -1,38 +1,38 @@ { "variants": { - "facing=north,mount=up": { - "model": "opencomputers:block/holoscreen4" - }, - "facing=north,mount=down": { + "facing=east,mount=down": { "model": "opencomputers:block/holoscreen4", - "x": 180 + "x": 180, + "y": 90 }, "facing=east,mount=up": { "model": "opencomputers:block/holoscreen4", "y": 90 }, - "facing=east,mount=down": { + "facing=north,mount=down": { "model": "opencomputers:block/holoscreen4", - "x": 180, - "y": 90 + "x": 180 }, - "facing=south,mount=up": { - "model": "opencomputers:block/holoscreen4", - "y": 180 + "facing=north,mount=up": { + "model": "opencomputers:block/holoscreen4" }, "facing=south,mount=down": { "model": "opencomputers:block/holoscreen4", "x": 180, "y": 180 }, - "facing=west,mount=up": { + "facing=south,mount=up": { "model": "opencomputers:block/holoscreen4", - "y": 270 + "y": 180 }, "facing=west,mount=down": { "model": "opencomputers:block/holoscreen4", "x": 180, "y": 270 + }, + "facing=west,mount=up": { + "model": "opencomputers:block/holoscreen4", + "y": 270 } } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/keyboard.json b/src/main/generatedResources/assets/opencomputers/blockstates/keyboard.json new file mode 100644 index 0000000000..e169ae3880 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/keyboard.json @@ -0,0 +1,57 @@ +{ + "variants": { + "pitch=down,yaw=east": { + "model": "opencomputers:block/keyboard", + "x": 90, + "y": 270 + }, + "pitch=down,yaw=north": { + "model": "opencomputers:block/keyboard", + "x": 90, + "y": 180 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/keyboard", + "x": 90 + }, + "pitch=down,yaw=west": { + "model": "opencomputers:block/keyboard", + "x": 90, + "y": 90 + }, + "pitch=north,yaw=east": { + "model": "opencomputers:block/keyboard", + "y": 90 + }, + "pitch=north,yaw=north": { + "model": "opencomputers:block/keyboard" + }, + "pitch=north,yaw=south": { + "model": "opencomputers:block/keyboard", + "y": 180 + }, + "pitch=north,yaw=west": { + "model": "opencomputers:block/keyboard", + "y": 270 + }, + "pitch=up,yaw=east": { + "model": "opencomputers:block/keyboard", + "x": -90, + "y": 270 + }, + "pitch=up,yaw=north": { + "model": "opencomputers:block/keyboard", + "x": -90, + "y": 180 + }, + "pitch=up,yaw=south": { + "model": "opencomputers:block/keyboard", + "x": -90 + }, + "pitch=up,yaw=west": { + "model": "opencomputers:block/keyboard", + "x": -90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/microcontroller.json b/src/main/generatedResources/assets/opencomputers/blockstates/microcontroller.json new file mode 100644 index 0000000000..a9778558a2 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/microcontroller.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/microcontroller", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/microcontroller" + }, + "facing=south": { + "model": "opencomputers:block/microcontroller", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/microcontroller", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/motionsensor.json b/src/main/generatedResources/assets/opencomputers/blockstates/motionsensor.json new file mode 100644 index 0000000000..ca7c8eed40 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/motionsensor.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/motionsensor" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/netsplitter.json b/src/main/generatedResources/assets/opencomputers/blockstates/netsplitter.json new file mode 100644 index 0000000000..2c8f02f067 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/netsplitter.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/air" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/powerconverter.json b/src/main/generatedResources/assets/opencomputers/blockstates/powerconverter.json new file mode 100644 index 0000000000..1f8a3620ad --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/powerconverter.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/powerconverter" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/powerdistributor.json b/src/main/generatedResources/assets/opencomputers/blockstates/powerdistributor.json new file mode 100644 index 0000000000..e4233b9f94 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/powerdistributor.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/powerdistributor" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/print.json b/src/main/generatedResources/assets/opencomputers/blockstates/print.json new file mode 100644 index 0000000000..2c8f02f067 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/print.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/air" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/printer.json b/src/main/generatedResources/assets/opencomputers/blockstates/printer.json new file mode 100644 index 0000000000..a9f1030f5c --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/printer.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/printer" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/rack.json b/src/main/generatedResources/assets/opencomputers/blockstates/rack.json new file mode 100644 index 0000000000..fd3f2fae28 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/rack.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/rack", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/rack" + }, + "facing=south": { + "model": "opencomputers:block/rack", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/rack", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/raid.json b/src/main/generatedResources/assets/opencomputers/blockstates/raid.json new file mode 100644 index 0000000000..91353b60e3 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/raid.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/raid", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/raid" + }, + "facing=south": { + "model": "opencomputers:block/raid", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/raid", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/redstone.json b/src/main/generatedResources/assets/opencomputers/blockstates/redstone.json new file mode 100644 index 0000000000..b2f32641c6 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/redstone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/redstone" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/relay.json b/src/main/generatedResources/assets/opencomputers/blockstates/relay.json new file mode 100644 index 0000000000..ea56f51469 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/relay.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/relay" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/robot.json b/src/main/generatedResources/assets/opencomputers/blockstates/robot.json new file mode 100644 index 0000000000..2c8f02f067 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/robot.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/air" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/robotafterimage.json b/src/main/generatedResources/assets/opencomputers/blockstates/robotafterimage.json new file mode 100644 index 0000000000..2c8f02f067 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/robotafterimage.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/air" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/screen1.json b/src/main/generatedResources/assets/opencomputers/blockstates/screen1.json new file mode 100644 index 0000000000..770b3de94e --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/screen1.json @@ -0,0 +1,57 @@ +{ + "variants": { + "pitch=down,yaw=east": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 270 + }, + "pitch=down,yaw=north": { + "model": "opencomputers:block/screen", + "x": -90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 180 + }, + "pitch=down,yaw=west": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 90 + }, + "pitch=north,yaw=east": { + "model": "opencomputers:block/screen", + "y": 270 + }, + "pitch=north,yaw=north": { + "model": "opencomputers:block/screen" + }, + "pitch=north,yaw=south": { + "model": "opencomputers:block/screen", + "y": 180 + }, + "pitch=north,yaw=west": { + "model": "opencomputers:block/screen", + "y": 90 + }, + "pitch=up,yaw=east": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 270 + }, + "pitch=up,yaw=north": { + "model": "opencomputers:block/screen", + "x": 90 + }, + "pitch=up,yaw=south": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 180 + }, + "pitch=up,yaw=west": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/screen2.json b/src/main/generatedResources/assets/opencomputers/blockstates/screen2.json new file mode 100644 index 0000000000..770b3de94e --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/screen2.json @@ -0,0 +1,57 @@ +{ + "variants": { + "pitch=down,yaw=east": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 270 + }, + "pitch=down,yaw=north": { + "model": "opencomputers:block/screen", + "x": -90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 180 + }, + "pitch=down,yaw=west": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 90 + }, + "pitch=north,yaw=east": { + "model": "opencomputers:block/screen", + "y": 270 + }, + "pitch=north,yaw=north": { + "model": "opencomputers:block/screen" + }, + "pitch=north,yaw=south": { + "model": "opencomputers:block/screen", + "y": 180 + }, + "pitch=north,yaw=west": { + "model": "opencomputers:block/screen", + "y": 90 + }, + "pitch=up,yaw=east": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 270 + }, + "pitch=up,yaw=north": { + "model": "opencomputers:block/screen", + "x": 90 + }, + "pitch=up,yaw=south": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 180 + }, + "pitch=up,yaw=west": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/screen3.json b/src/main/generatedResources/assets/opencomputers/blockstates/screen3.json new file mode 100644 index 0000000000..770b3de94e --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/screen3.json @@ -0,0 +1,57 @@ +{ + "variants": { + "pitch=down,yaw=east": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 270 + }, + "pitch=down,yaw=north": { + "model": "opencomputers:block/screen", + "x": -90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 180 + }, + "pitch=down,yaw=west": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 90 + }, + "pitch=north,yaw=east": { + "model": "opencomputers:block/screen", + "y": 270 + }, + "pitch=north,yaw=north": { + "model": "opencomputers:block/screen" + }, + "pitch=north,yaw=south": { + "model": "opencomputers:block/screen", + "y": 180 + }, + "pitch=north,yaw=west": { + "model": "opencomputers:block/screen", + "y": 90 + }, + "pitch=up,yaw=east": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 270 + }, + "pitch=up,yaw=north": { + "model": "opencomputers:block/screen", + "x": 90 + }, + "pitch=up,yaw=south": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 180 + }, + "pitch=up,yaw=west": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/screen4.json b/src/main/generatedResources/assets/opencomputers/blockstates/screen4.json new file mode 100644 index 0000000000..770b3de94e --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/screen4.json @@ -0,0 +1,57 @@ +{ + "variants": { + "pitch=down,yaw=east": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 270 + }, + "pitch=down,yaw=north": { + "model": "opencomputers:block/screen", + "x": -90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 180 + }, + "pitch=down,yaw=west": { + "model": "opencomputers:block/screen", + "x": -90, + "y": 90 + }, + "pitch=north,yaw=east": { + "model": "opencomputers:block/screen", + "y": 270 + }, + "pitch=north,yaw=north": { + "model": "opencomputers:block/screen" + }, + "pitch=north,yaw=south": { + "model": "opencomputers:block/screen", + "y": 180 + }, + "pitch=north,yaw=west": { + "model": "opencomputers:block/screen", + "y": 90 + }, + "pitch=up,yaw=east": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 270 + }, + "pitch=up,yaw=north": { + "model": "opencomputers:block/screen", + "x": 90 + }, + "pitch=up,yaw=south": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 180 + }, + "pitch=up,yaw=west": { + "model": "opencomputers:block/screen", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/shredder.json b/src/main/generatedResources/assets/opencomputers/blockstates/shredder.json new file mode 100644 index 0000000000..6786c8c308 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/shredder.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "opencomputers:block/shredder", + "y": 90 + }, + "facing=north": { + "model": "opencomputers:block/shredder" + }, + "facing=south": { + "model": "opencomputers:block/shredder", + "y": 180 + }, + "facing=west": { + "model": "opencomputers:block/shredder", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/transposer.json b/src/main/generatedResources/assets/opencomputers/blockstates/transposer.json new file mode 100644 index 0000000000..78b8c4e74f --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/transposer.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "opencomputers:block/transposer" + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/blockstates/waypoint.json b/src/main/generatedResources/assets/opencomputers/blockstates/waypoint.json new file mode 100644 index 0000000000..81ab61ec11 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/blockstates/waypoint.json @@ -0,0 +1,57 @@ +{ + "variants": { + "pitch=down,yaw=east": { + "model": "opencomputers:block/waypoint", + "x": 90, + "y": 90 + }, + "pitch=down,yaw=north": { + "model": "opencomputers:block/waypoint", + "x": 90 + }, + "pitch=down,yaw=south": { + "model": "opencomputers:block/waypoint", + "x": 90, + "y": 180 + }, + "pitch=down,yaw=west": { + "model": "opencomputers:block/waypoint", + "x": 90, + "y": 270 + }, + "pitch=north,yaw=east": { + "model": "opencomputers:block/waypoint", + "y": 90 + }, + "pitch=north,yaw=north": { + "model": "opencomputers:block/waypoint" + }, + "pitch=north,yaw=south": { + "model": "opencomputers:block/waypoint", + "y": 180 + }, + "pitch=north,yaw=west": { + "model": "opencomputers:block/waypoint", + "y": 270 + }, + "pitch=up,yaw=east": { + "model": "opencomputers:block/waypoint", + "x": -90, + "y": 90 + }, + "pitch=up,yaw=north": { + "model": "opencomputers:block/waypoint", + "x": -90 + }, + "pitch=up,yaw=south": { + "model": "opencomputers:block/waypoint", + "x": -90, + "y": 180 + }, + "pitch=up,yaw=west": { + "model": "opencomputers:block/waypoint", + "x": -90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/adapter.json b/src/main/generatedResources/assets/opencomputers/models/block/adapter.json new file mode 100644 index 0000000000..0ce2804931 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/adapter.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_top", + "textures": { + "side": "opencomputers:block/adapter_side", + "top": "opencomputers:block/adapter_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/capacitor.json b/src/main/generatedResources/assets/opencomputers/models/block/capacitor.json new file mode 100644 index 0000000000..3e77cc449f --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/capacitor.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "opencomputers:block/generic_top", + "side": "opencomputers:block/capacitor_side", + "top": "opencomputers:block/capacitor_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/carpetedcapacitor.json b/src/main/generatedResources/assets/opencomputers/models/block/carpetedcapacitor.json new file mode 100644 index 0000000000..8bbfae6764 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/carpetedcapacitor.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "opencomputers:block/generic_top", + "side": "opencomputers:block/capacitor_side", + "top": "opencomputers:block/carpeted_capacitor_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/charger.json b/src/main/generatedResources/assets/opencomputers/models/block/charger.json new file mode 100644 index 0000000000..cac79039f0 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/charger.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/orientable", + "textures": { + "front": "opencomputers:block/charger_front", + "side": "opencomputers:block/charger_side", + "top": "opencomputers:block/generic_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/disassembler.json b/src/main/generatedResources/assets/opencomputers/models/block/disassembler.json new file mode 100644 index 0000000000..af8c6154cb --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/disassembler.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "opencomputers:block/generic_top", + "side": "opencomputers:block/disassembler_side", + "top": "opencomputers:block/disassembler_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/diskdrive.json b/src/main/generatedResources/assets/opencomputers/models/block/diskdrive.json new file mode 100644 index 0000000000..0727164423 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/diskdrive.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/orientable", + "textures": { + "front": "opencomputers:block/diskdrive_front", + "side": "opencomputers:block/diskdrive_side", + "top": "opencomputers:block/generic_top" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/models/block/filecabinet.json b/src/main/generatedResources/assets/opencomputers/models/block/filecabinet.json similarity index 56% rename from src/main/resources/assets/opencomputers/models/block/filecabinet.json rename to src/main/generatedResources/assets/opencomputers/models/block/filecabinet.json index 14bede85c5..59dcb91779 100644 --- a/src/main/resources/assets/opencomputers/models/block/filecabinet.json +++ b/src/main/generatedResources/assets/opencomputers/models/block/filecabinet.json @@ -1,8 +1,8 @@ { "parent": "minecraft:block/orientable", "textures": { - "top": "opencomputers:block/block_side", "front": "opencomputers:block/filingcabinet_front", - "side": "opencomputers:block/block_side" + "side": "opencomputers:block/block_side", + "top": "opencomputers:block/block_side" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/geolyzer.json b/src/main/generatedResources/assets/opencomputers/models/block/geolyzer.json new file mode 100644 index 0000000000..a546354b80 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/geolyzer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "opencomputers:block/generic_top", + "side": "opencomputers:block/geolyzer_side", + "top": "opencomputers:block/geolyzer_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/microcontroller.json b/src/main/generatedResources/assets/opencomputers/models/block/microcontroller.json new file mode 100644 index 0000000000..5170d2ef20 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/microcontroller.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/orientable", + "textures": { + "front": "opencomputers:block/microcontroller_front", + "side": "opencomputers:block/microcontroller_side", + "top": "opencomputers:block/microcontroller_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/motionsensor.json b/src/main/generatedResources/assets/opencomputers/models/block/motionsensor.json new file mode 100644 index 0000000000..89e9e116a1 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/motionsensor.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "opencomputers:block/motionsensor_top", + "side": "opencomputers:block/motionsensor_side" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/powerconverter.json b/src/main/generatedResources/assets/opencomputers/models/block/powerconverter.json new file mode 100644 index 0000000000..d17d798233 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/powerconverter.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "opencomputers:block/generic_top", + "side": "opencomputers:block/powerconverter_side" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/powerdistributor.json b/src/main/generatedResources/assets/opencomputers/models/block/powerdistributor.json new file mode 100644 index 0000000000..6c3ce3ec0c --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/powerdistributor.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "opencomputers:block/generic_top", + "side": "opencomputers:block/powerdistributor_side", + "top": "opencomputers:block/powerdistributor_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/rack.json b/src/main/generatedResources/assets/opencomputers/models/block/rack.json new file mode 100644 index 0000000000..dcccea5f20 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/rack.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/orientable", + "textures": { + "front": "opencomputers:block/rack_front", + "side": "opencomputers:block/rack_side", + "top": "opencomputers:block/generic_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/raid.json b/src/main/generatedResources/assets/opencomputers/models/block/raid.json new file mode 100644 index 0000000000..702c0722c7 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/raid.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/orientable", + "textures": { + "front": "opencomputers:block/raid_front", + "side": "opencomputers:block/raid_side", + "top": "opencomputers:block/generic_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/redstone.json b/src/main/generatedResources/assets/opencomputers/models/block/redstone.json new file mode 100644 index 0000000000..5b8fc40835 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/redstone.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "opencomputers:block/redstone_bottom", + "east": "opencomputers:block/redstone_east", + "north": "opencomputers:block/redstone_north", + "particle": "opencomputers:block/redstone_top", + "south": "opencomputers:block/redstone_south", + "up": "opencomputers:block/redstone_top", + "west": "opencomputers:block/redstone_west" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/relay.json b/src/main/generatedResources/assets/opencomputers/models/block/relay.json new file mode 100644 index 0000000000..9ee2619a68 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/relay.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "opencomputers:block/generic_top", + "side": "opencomputers:block/switch_side", + "top": "opencomputers:block/switch_top" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/models/block/shredder.json b/src/main/generatedResources/assets/opencomputers/models/block/shredder.json similarity index 55% rename from src/main/resources/assets/opencomputers/models/block/shredder.json rename to src/main/generatedResources/assets/opencomputers/models/block/shredder.json index 1255a43242..1078cc03fe 100644 --- a/src/main/resources/assets/opencomputers/models/block/shredder.json +++ b/src/main/generatedResources/assets/opencomputers/models/block/shredder.json @@ -1,8 +1,8 @@ { "parent": "minecraft:block/orientable", "textures": { - "top": "opencomputers:block/block_side", "front": "opencomputers:block/shredder_front", - "side": "opencomputers:block/block_side" + "side": "opencomputers:block/block_side", + "top": "opencomputers:block/block_side" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/block/waypoint.json b/src/main/generatedResources/assets/opencomputers/models/block/waypoint.json new file mode 100644 index 0000000000..4590fe5324 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/block/waypoint.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "opencomputers:block/generic_top", + "front": "opencomputers:block/waypoint_front", + "side": "opencomputers:block/waypoint_side", + "top": "opencomputers:block/waypoint_top" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/case1.json b/src/main/generatedResources/assets/opencomputers/models/item/case1.json new file mode 100644 index 0000000000..d34ca9b8c6 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/case1.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/case" +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/case2.json b/src/main/generatedResources/assets/opencomputers/models/item/case2.json new file mode 100644 index 0000000000..d34ca9b8c6 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/case2.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/case" +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/case3.json b/src/main/generatedResources/assets/opencomputers/models/item/case3.json new file mode 100644 index 0000000000..d34ca9b8c6 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/case3.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/case" +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/case4.json b/src/main/generatedResources/assets/opencomputers/models/item/case4.json new file mode 100644 index 0000000000..d34ca9b8c6 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/case4.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/case" +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/casecreative.json b/src/main/generatedResources/assets/opencomputers/models/item/casecreative.json new file mode 100644 index 0000000000..d34ca9b8c6 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/casecreative.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/case" +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/screen1.json b/src/main/generatedResources/assets/opencomputers/models/item/screen1.json new file mode 100644 index 0000000000..1a947ce815 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/screen1.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/screen" +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/screen2.json b/src/main/generatedResources/assets/opencomputers/models/item/screen2.json new file mode 100644 index 0000000000..1a947ce815 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/screen2.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/screen" +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/screen3.json b/src/main/generatedResources/assets/opencomputers/models/item/screen3.json new file mode 100644 index 0000000000..1a947ce815 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/screen3.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/screen" +} \ No newline at end of file diff --git a/src/main/generatedResources/assets/opencomputers/models/item/screen4.json b/src/main/generatedResources/assets/opencomputers/models/item/screen4.json new file mode 100644 index 0000000000..1a947ce815 --- /dev/null +++ b/src/main/generatedResources/assets/opencomputers/models/item/screen4.json @@ -0,0 +1,3 @@ +{ + "parent": "opencomputers:block/screen" +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/carpetedcapacitor.json b/src/main/generatedResources/data/opencomputers/recipe/carpetedcapacitor.json index 031bc3e6a7..0930b551a5 100644 --- a/src/main/generatedResources/data/opencomputers/recipe/carpetedcapacitor.json +++ b/src/main/generatedResources/data/opencomputers/recipe/carpetedcapacitor.json @@ -13,4 +13,4 @@ "count": 1, "id": "opencomputers:carpetedcapacitor" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/datacard1.json b/src/main/generatedResources/data/opencomputers/recipe/datacard1.json index 6d2d8c1435..154ca2a1f6 100644 --- a/src/main/generatedResources/data/opencomputers/recipe/datacard1.json +++ b/src/main/generatedResources/data/opencomputers/recipe/datacard1.json @@ -23,4 +23,4 @@ "count": 1, "id": "opencomputers:datacard1" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/endstone.json b/src/main/generatedResources/data/opencomputers/recipe/endstone.json index 255bd83530..dbd24ff573 100644 --- a/src/main/generatedResources/data/opencomputers/recipe/endstone.json +++ b/src/main/generatedResources/data/opencomputers/recipe/endstone.json @@ -18,4 +18,4 @@ "count": 4, "id": "opencomputers:endstone" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/paper_from_shreds.json b/src/main/generatedResources/data/opencomputers/recipe/paper_from_shreds.json new file mode 100644 index 0000000000..75297c91fb --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/paper_from_shreds.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:paper_shreds" + }, + { + "item": "minecraft:water_bucket" + } + ], + "result": { + "count": 1, + "id": "minecraft:paper" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/screen1.json b/src/main/generatedResources/data/opencomputers/recipe/screen1.json index d0255629a8..477fe11e09 100644 --- a/src/main/generatedResources/data/opencomputers/recipe/screen1.json +++ b/src/main/generatedResources/data/opencomputers/recipe/screen1.json @@ -24,4 +24,4 @@ "count": 1, "id": "opencomputers:screen1" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/screen2.json b/src/main/generatedResources/data/opencomputers/recipe/screen2.json index abcfd64d64..5e08d8d880 100644 --- a/src/main/generatedResources/data/opencomputers/recipe/screen2.json +++ b/src/main/generatedResources/data/opencomputers/recipe/screen2.json @@ -30,4 +30,4 @@ "count": 1, "id": "opencomputers:screen2" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/screen3.json b/src/main/generatedResources/data/opencomputers/recipe/screen3.json index 25481e333a..b23d294acd 100644 --- a/src/main/generatedResources/data/opencomputers/recipe/screen3.json +++ b/src/main/generatedResources/data/opencomputers/recipe/screen3.json @@ -24,4 +24,4 @@ "count": 1, "id": "opencomputers:screen3" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/screen4.json b/src/main/generatedResources/data/opencomputers/recipe/screen4.json index e330a9d384..0312b3d617 100644 --- a/src/main/generatedResources/data/opencomputers/recipe/screen4.json +++ b/src/main/generatedResources/data/opencomputers/recipe/screen4.json @@ -24,4 +24,4 @@ "count": 1, "id": "opencomputers:screen4" } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/blockstates/accesspoint.json b/src/main/resources/assets/opencomputers/blockstates/accesspoint.json deleted file mode 100644 index 90e6d47100..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/accesspoint.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/accesspoint" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/adapter.json b/src/main/resources/assets/opencomputers/blockstates/adapter.json deleted file mode 100644 index 1893a7394b..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/adapter.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/adapter" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/assembler.json b/src/main/resources/assets/opencomputers/blockstates/assembler.json deleted file mode 100644 index f9cf866fce..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/assembler.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/assembler" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/briefcase.json b/src/main/resources/assets/opencomputers/blockstates/briefcase.json deleted file mode 100644 index e48364d700..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/briefcase.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/briefcase" }, - "facing=east": { "model": "opencomputers:block/briefcase", "y": 90 }, - "facing=south": { "model": "opencomputers:block/briefcase", "y": 180 }, - "facing=west": { "model": "opencomputers:block/briefcase", "y": 270 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/cable.json b/src/main/resources/assets/opencomputers/blockstates/cable.json deleted file mode 100644 index dbeef9edc2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/cable.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "minecraft:block/air" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/capacitor.json b/src/main/resources/assets/opencomputers/blockstates/capacitor.json deleted file mode 100644 index ab9a30aebd..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/capacitor.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/capacitor" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/carpetedcapacitor.json b/src/main/resources/assets/opencomputers/blockstates/carpetedcapacitor.json deleted file mode 100644 index 43bb89c09f..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/carpetedcapacitor.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/carpetedcapacitor" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/case1.json b/src/main/resources/assets/opencomputers/blockstates/case1.json deleted file mode 100644 index 22429bafcf..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/case1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "variants": { - "facing=north,running=false": { "model": "opencomputers:block/case" }, - "facing=south,running=false": { "model": "opencomputers:block/case", "y": 180 }, - "facing=west,running=false": { "model": "opencomputers:block/case", "y": 270 }, - "facing=east,running=false": { "model": "opencomputers:block/case", "y": 90 }, - "facing=north,running=true": { "model": "opencomputers:block/case_running" }, - "facing=south,running=true": { "model": "opencomputers:block/case_running", "y": 180 }, - "facing=west,running=true": { "model": "opencomputers:block/case_running", "y": 270 }, - "facing=east,running=true": { "model": "opencomputers:block/case_running", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/case2.json b/src/main/resources/assets/opencomputers/blockstates/case2.json deleted file mode 100644 index 22429bafcf..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/case2.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "variants": { - "facing=north,running=false": { "model": "opencomputers:block/case" }, - "facing=south,running=false": { "model": "opencomputers:block/case", "y": 180 }, - "facing=west,running=false": { "model": "opencomputers:block/case", "y": 270 }, - "facing=east,running=false": { "model": "opencomputers:block/case", "y": 90 }, - "facing=north,running=true": { "model": "opencomputers:block/case_running" }, - "facing=south,running=true": { "model": "opencomputers:block/case_running", "y": 180 }, - "facing=west,running=true": { "model": "opencomputers:block/case_running", "y": 270 }, - "facing=east,running=true": { "model": "opencomputers:block/case_running", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/case3.json b/src/main/resources/assets/opencomputers/blockstates/case3.json deleted file mode 100644 index 22429bafcf..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/case3.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "variants": { - "facing=north,running=false": { "model": "opencomputers:block/case" }, - "facing=south,running=false": { "model": "opencomputers:block/case", "y": 180 }, - "facing=west,running=false": { "model": "opencomputers:block/case", "y": 270 }, - "facing=east,running=false": { "model": "opencomputers:block/case", "y": 90 }, - "facing=north,running=true": { "model": "opencomputers:block/case_running" }, - "facing=south,running=true": { "model": "opencomputers:block/case_running", "y": 180 }, - "facing=west,running=true": { "model": "opencomputers:block/case_running", "y": 270 }, - "facing=east,running=true": { "model": "opencomputers:block/case_running", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/case4.json b/src/main/resources/assets/opencomputers/blockstates/case4.json deleted file mode 100644 index 22429bafcf..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/case4.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "variants": { - "facing=north,running=false": { "model": "opencomputers:block/case" }, - "facing=south,running=false": { "model": "opencomputers:block/case", "y": 180 }, - "facing=west,running=false": { "model": "opencomputers:block/case", "y": 270 }, - "facing=east,running=false": { "model": "opencomputers:block/case", "y": 90 }, - "facing=north,running=true": { "model": "opencomputers:block/case_running" }, - "facing=south,running=true": { "model": "opencomputers:block/case_running", "y": 180 }, - "facing=west,running=true": { "model": "opencomputers:block/case_running", "y": 270 }, - "facing=east,running=true": { "model": "opencomputers:block/case_running", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/casecreative.json b/src/main/resources/assets/opencomputers/blockstates/casecreative.json deleted file mode 100644 index 22429bafcf..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/casecreative.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "variants": { - "facing=north,running=false": { "model": "opencomputers:block/case" }, - "facing=south,running=false": { "model": "opencomputers:block/case", "y": 180 }, - "facing=west,running=false": { "model": "opencomputers:block/case", "y": 270 }, - "facing=east,running=false": { "model": "opencomputers:block/case", "y": 90 }, - "facing=north,running=true": { "model": "opencomputers:block/case_running" }, - "facing=south,running=true": { "model": "opencomputers:block/case_running", "y": 180 }, - "facing=west,running=true": { "model": "opencomputers:block/case_running", "y": 270 }, - "facing=east,running=true": { "model": "opencomputers:block/case_running", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/chameliumblock.json b/src/main/resources/assets/opencomputers/blockstates/chameliumblock.json deleted file mode 100644 index 4f4f19a937..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/chameliumblock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "variants": { - "color=light_gray": { "model": "opencomputers:block/chameliumblock" }, - "color=magenta": { "model": "opencomputers:block/chameliumblock" }, - "color=light_blue": { "model": "opencomputers:block/chameliumblock" }, - "color=red": { "model": "opencomputers:block/chameliumblock" }, - "color=yellow": { "model": "opencomputers:block/chameliumblock" }, - "color=gray": { "model": "opencomputers:block/chameliumblock" }, - "color=brown": { "model": "opencomputers:block/chameliumblock" }, - "color=cyan": { "model": "opencomputers:block/chameliumblock" }, - "color=green": { "model": "opencomputers:block/chameliumblock" }, - "color=blue": { "model": "opencomputers:block/chameliumblock" }, - "color=purple": { "model": "opencomputers:block/chameliumblock" }, - "color=orange": { "model": "opencomputers:block/chameliumblock" }, - "color=pink": { "model": "opencomputers:block/chameliumblock" }, - "color=black": { "model": "opencomputers:block/chameliumblock" }, - "color=white": { "model": "opencomputers:block/chameliumblock" }, - "color=lime": { "model": "opencomputers:block/chameliumblock" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/charger.json b/src/main/resources/assets/opencomputers/blockstates/charger.json deleted file mode 100644 index 6d0afd9e90..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/charger.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/charger" }, - "facing=south": { "model": "opencomputers:block/charger", "y": 180 }, - "facing=west": { "model": "opencomputers:block/charger", "y": 270 }, - "facing=east": { "model": "opencomputers:block/charger", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/disassembler.json b/src/main/resources/assets/opencomputers/blockstates/disassembler.json deleted file mode 100644 index 2ce043f06c..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/disassembler.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/disassembler" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/diskdrive.json b/src/main/resources/assets/opencomputers/blockstates/diskdrive.json deleted file mode 100644 index 68bc7d87df..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/diskdrive.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/diskdrive" }, - "facing=south": { "model": "opencomputers:block/diskdrive", "y": 180 }, - "facing=west": { "model": "opencomputers:block/diskdrive", "y": 270 }, - "facing=east": { "model": "opencomputers:block/diskdrive", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/document_printer.json b/src/main/resources/assets/opencomputers/blockstates/document_printer.json deleted file mode 100644 index 1bcdb43a16..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/document_printer.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/document_printer" }, - "facing=east": { "model": "opencomputers:block/document_printer", "y": 90 }, - "facing=south": { "model": "opencomputers:block/document_printer", "y": 180 }, - "facing=west": { "model": "opencomputers:block/document_printer", "y": 270 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/endstone.json b/src/main/resources/assets/opencomputers/blockstates/endstone.json deleted file mode 100644 index f14a18da61..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/endstone.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "minecraft:block/end_stone" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/filecabinet.json b/src/main/resources/assets/opencomputers/blockstates/filecabinet.json deleted file mode 100644 index 2d2e27010c..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/filecabinet.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/filecabinet" }, - "facing=east": { "model": "opencomputers:block/filecabinet", "y": 90 }, - "facing=south": { "model": "opencomputers:block/filecabinet", "y": 180 }, - "facing=west": { "model": "opencomputers:block/filecabinet", "y": 270 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/geolyzer.json b/src/main/resources/assets/opencomputers/blockstates/geolyzer.json deleted file mode 100644 index 7ee1d77440..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/geolyzer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/geolyzer" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/hologram1.json b/src/main/resources/assets/opencomputers/blockstates/hologram1.json deleted file mode 100644 index 0d567612b4..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/hologram1.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/hologram1" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/hologram2.json b/src/main/resources/assets/opencomputers/blockstates/hologram2.json deleted file mode 100644 index 21638bd491..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/hologram2.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/hologram2" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/hologram3.json b/src/main/resources/assets/opencomputers/blockstates/hologram3.json deleted file mode 100644 index 8b809ec238..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/hologram3.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/hologram3" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/keyboard.json b/src/main/resources/assets/opencomputers/blockstates/keyboard.json deleted file mode 100644 index 1490131bb4..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/keyboard.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "pitch=north,yaw=north": { "model": "opencomputers:block/keyboard" }, - "pitch=north,yaw=east": { "model": "opencomputers:block/keyboard", "y": 90 }, - "pitch=north,yaw=south": { "model": "opencomputers:block/keyboard", "y": 180 }, - "pitch=north,yaw=west": { "model": "opencomputers:block/keyboard", "y": 270 }, - "pitch=up,yaw=north": { "model": "opencomputers:block/keyboard", "x": -90, "y": 180 }, - "pitch=up,yaw=east": { "model": "opencomputers:block/keyboard", "x": -90, "y": 270 }, - "pitch=up,yaw=south": { "model": "opencomputers:block/keyboard", "x": -90 }, - "pitch=up,yaw=west": { "model": "opencomputers:block/keyboard", "x": -90, "y": 90 }, - "pitch=down,yaw=north": { "model": "opencomputers:block/keyboard", "x": 90, "y": 180 }, - "pitch=down,yaw=east": { "model": "opencomputers:block/keyboard", "x": 90, "y": 270 }, - "pitch=down,yaw=south": { "model": "opencomputers:block/keyboard", "x": 90 }, - "pitch=down,yaw=west": { "model": "opencomputers:block/keyboard", "x": 90, "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/microcontroller.json b/src/main/resources/assets/opencomputers/blockstates/microcontroller.json deleted file mode 100644 index c329e47fa9..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/microcontroller.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/microcontroller" }, - "facing=south": { "model": "opencomputers:block/microcontroller", "y": 180 }, - "facing=west": { "model": "opencomputers:block/microcontroller", "y": 270 }, - "facing=east": { "model": "opencomputers:block/microcontroller", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/motionsensor.json b/src/main/resources/assets/opencomputers/blockstates/motionsensor.json deleted file mode 100644 index f1181d7ab7..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/motionsensor.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/motionsensor" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/netsplitter.json b/src/main/resources/assets/opencomputers/blockstates/netsplitter.json deleted file mode 100644 index dbeef9edc2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/netsplitter.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "minecraft:block/air" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/powerconverter.json b/src/main/resources/assets/opencomputers/blockstates/powerconverter.json deleted file mode 100644 index 47e646e637..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/powerconverter.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/powerconverter" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/powerdistributor.json b/src/main/resources/assets/opencomputers/blockstates/powerdistributor.json deleted file mode 100644 index 2194435bd2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/powerdistributor.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/powerdistributor" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/print.json b/src/main/resources/assets/opencomputers/blockstates/print.json deleted file mode 100644 index dbeef9edc2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/print.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "minecraft:block/air" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/printer.json b/src/main/resources/assets/opencomputers/blockstates/printer.json deleted file mode 100644 index e87119e7bd..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/printer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/printer" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/rack.json b/src/main/resources/assets/opencomputers/blockstates/rack.json deleted file mode 100644 index 27c0034d94..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/rack.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/rack" }, - "facing=south": { "model": "opencomputers:block/rack", "y": 180 }, - "facing=west": { "model": "opencomputers:block/rack", "y": 270 }, - "facing=east": { "model": "opencomputers:block/rack", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/raid.json b/src/main/resources/assets/opencomputers/blockstates/raid.json deleted file mode 100644 index d9c02591a8..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/raid.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/raid" }, - "facing=south": { "model": "opencomputers:block/raid", "y": 180 }, - "facing=west": { "model": "opencomputers:block/raid", "y": 270 }, - "facing=east": { "model": "opencomputers:block/raid", "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/redstone.json b/src/main/resources/assets/opencomputers/blockstates/redstone.json deleted file mode 100644 index db1ee2bed2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/redstone.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/redstone" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/relay.json b/src/main/resources/assets/opencomputers/blockstates/relay.json deleted file mode 100644 index 2ec907449b..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/relay.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/relay" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/robot.json b/src/main/resources/assets/opencomputers/blockstates/robot.json deleted file mode 100644 index dbeef9edc2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/robot.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "minecraft:block/air" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/robotafterimage.json b/src/main/resources/assets/opencomputers/blockstates/robotafterimage.json deleted file mode 100644 index dbeef9edc2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/robotafterimage.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "minecraft:block/air" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/screen1.json b/src/main/resources/assets/opencomputers/blockstates/screen1.json deleted file mode 100644 index 63967b93f2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/screen1.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "pitch=north,yaw=north": { "model": "opencomputers:block/screen" }, - "pitch=north,yaw=south": { "model": "opencomputers:block/screen", "y": 180 }, - "pitch=north,yaw=east": { "model": "opencomputers:block/screen", "y": 270 }, - "pitch=north,yaw=west": { "model": "opencomputers:block/screen", "y": 90 }, - "pitch=up,yaw=north": { "model": "opencomputers:block/screen", "x": 90 }, - "pitch=up,yaw=south": { "model": "opencomputers:block/screen", "x": 90, "y": 180 }, - "pitch=up,yaw=east": { "model": "opencomputers:block/screen", "x": 90, "y": 270 }, - "pitch=up,yaw=west": { "model": "opencomputers:block/screen", "x": 90, "y": 90 }, - "pitch=down,yaw=north": { "model": "opencomputers:block/screen", "x": -90 }, - "pitch=down,yaw=south": { "model": "opencomputers:block/screen", "x": -90, "y": 180 }, - "pitch=down,yaw=east": { "model": "opencomputers:block/screen", "x": -90, "y": 270 }, - "pitch=down,yaw=west": { "model": "opencomputers:block/screen", "x": -90, "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/screen2.json b/src/main/resources/assets/opencomputers/blockstates/screen2.json deleted file mode 100644 index 63967b93f2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/screen2.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "pitch=north,yaw=north": { "model": "opencomputers:block/screen" }, - "pitch=north,yaw=south": { "model": "opencomputers:block/screen", "y": 180 }, - "pitch=north,yaw=east": { "model": "opencomputers:block/screen", "y": 270 }, - "pitch=north,yaw=west": { "model": "opencomputers:block/screen", "y": 90 }, - "pitch=up,yaw=north": { "model": "opencomputers:block/screen", "x": 90 }, - "pitch=up,yaw=south": { "model": "opencomputers:block/screen", "x": 90, "y": 180 }, - "pitch=up,yaw=east": { "model": "opencomputers:block/screen", "x": 90, "y": 270 }, - "pitch=up,yaw=west": { "model": "opencomputers:block/screen", "x": 90, "y": 90 }, - "pitch=down,yaw=north": { "model": "opencomputers:block/screen", "x": -90 }, - "pitch=down,yaw=south": { "model": "opencomputers:block/screen", "x": -90, "y": 180 }, - "pitch=down,yaw=east": { "model": "opencomputers:block/screen", "x": -90, "y": 270 }, - "pitch=down,yaw=west": { "model": "opencomputers:block/screen", "x": -90, "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/screen3.json b/src/main/resources/assets/opencomputers/blockstates/screen3.json deleted file mode 100644 index 63967b93f2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/screen3.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "pitch=north,yaw=north": { "model": "opencomputers:block/screen" }, - "pitch=north,yaw=south": { "model": "opencomputers:block/screen", "y": 180 }, - "pitch=north,yaw=east": { "model": "opencomputers:block/screen", "y": 270 }, - "pitch=north,yaw=west": { "model": "opencomputers:block/screen", "y": 90 }, - "pitch=up,yaw=north": { "model": "opencomputers:block/screen", "x": 90 }, - "pitch=up,yaw=south": { "model": "opencomputers:block/screen", "x": 90, "y": 180 }, - "pitch=up,yaw=east": { "model": "opencomputers:block/screen", "x": 90, "y": 270 }, - "pitch=up,yaw=west": { "model": "opencomputers:block/screen", "x": 90, "y": 90 }, - "pitch=down,yaw=north": { "model": "opencomputers:block/screen", "x": -90 }, - "pitch=down,yaw=south": { "model": "opencomputers:block/screen", "x": -90, "y": 180 }, - "pitch=down,yaw=east": { "model": "opencomputers:block/screen", "x": -90, "y": 270 }, - "pitch=down,yaw=west": { "model": "opencomputers:block/screen", "x": -90, "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/screen4.json b/src/main/resources/assets/opencomputers/blockstates/screen4.json deleted file mode 100644 index 63967b93f2..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/screen4.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "pitch=north,yaw=north": { "model": "opencomputers:block/screen" }, - "pitch=north,yaw=south": { "model": "opencomputers:block/screen", "y": 180 }, - "pitch=north,yaw=east": { "model": "opencomputers:block/screen", "y": 270 }, - "pitch=north,yaw=west": { "model": "opencomputers:block/screen", "y": 90 }, - "pitch=up,yaw=north": { "model": "opencomputers:block/screen", "x": 90 }, - "pitch=up,yaw=south": { "model": "opencomputers:block/screen", "x": 90, "y": 180 }, - "pitch=up,yaw=east": { "model": "opencomputers:block/screen", "x": 90, "y": 270 }, - "pitch=up,yaw=west": { "model": "opencomputers:block/screen", "x": 90, "y": 90 }, - "pitch=down,yaw=north": { "model": "opencomputers:block/screen", "x": -90 }, - "pitch=down,yaw=south": { "model": "opencomputers:block/screen", "x": -90, "y": 180 }, - "pitch=down,yaw=east": { "model": "opencomputers:block/screen", "x": -90, "y": 270 }, - "pitch=down,yaw=west": { "model": "opencomputers:block/screen", "x": -90, "y": 90 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/shredder.json b/src/main/resources/assets/opencomputers/blockstates/shredder.json deleted file mode 100644 index 095ac41bdf..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/shredder.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "variants": { - "facing=north": { "model": "opencomputers:block/shredder" }, - "facing=east": { "model": "opencomputers:block/shredder", "y": 90 }, - "facing=south": { "model": "opencomputers:block/shredder", "y": 180 }, - "facing=west": { "model": "opencomputers:block/shredder", "y": 270 } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/switch.json b/src/main/resources/assets/opencomputers/blockstates/switch.json deleted file mode 100644 index 24f1db9d96..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/switch.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/switch" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/transposer.json b/src/main/resources/assets/opencomputers/blockstates/transposer.json deleted file mode 100644 index eb059ab372..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/transposer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "opencomputers:block/transposer" } - } -} diff --git a/src/main/resources/assets/opencomputers/blockstates/waypoint.json b/src/main/resources/assets/opencomputers/blockstates/waypoint.json deleted file mode 100644 index 1c856cd5ad..0000000000 --- a/src/main/resources/assets/opencomputers/blockstates/waypoint.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "pitch=north,yaw=north": { "model": "opencomputers:block/waypoint" }, - "pitch=north,yaw=east": { "model": "opencomputers:block/waypoint", "y": 90 }, - "pitch=north,yaw=south": { "model": "opencomputers:block/waypoint", "y": 180 }, - "pitch=north,yaw=west": { "model": "opencomputers:block/waypoint", "y": 270 }, - "pitch=up,yaw=north": { "model": "opencomputers:block/waypoint", "x": -90 }, - "pitch=up,yaw=east": { "model": "opencomputers:block/waypoint", "x": -90, "y": 90 }, - "pitch=up,yaw=south": { "model": "opencomputers:block/waypoint", "x": -90, "y": 180 }, - "pitch=up,yaw=west": { "model": "opencomputers:block/waypoint", "x": -90, "y": 270 }, - "pitch=down,yaw=north": { "model": "opencomputers:block/waypoint", "x": 90 }, - "pitch=down,yaw=east": { "model": "opencomputers:block/waypoint", "x": 90, "y": 90 }, - "pitch=down,yaw=south": { "model": "opencomputers:block/waypoint", "x": 90, "y": 180 }, - "pitch=down,yaw=west": { "model": "opencomputers:block/waypoint", "x": 90, "y": 270 } - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/adapter.json b/src/main/resources/assets/opencomputers/models/block/adapter.json deleted file mode 100644 index eebc34b716..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/adapter.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "bottom": "opencomputers:block/adapter_top", - "top": "opencomputers:block/adapter_top", - "side": "opencomputers:block/adapter_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/capacitor.json b/src/main/resources/assets/opencomputers/models/block/capacitor.json deleted file mode 100644 index 64de4d096c..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/capacitor.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "bottom": "opencomputers:block/generic_top", - "top": "opencomputers:block/capacitor_top", - "side": "opencomputers:block/capacitor_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/carpetedcapacitor.json b/src/main/resources/assets/opencomputers/models/block/carpetedcapacitor.json deleted file mode 100644 index 66eecb3802..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/carpetedcapacitor.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "bottom": "opencomputers:block/generic_top", - "top": "opencomputers:block/carpeted_capacitor_top", - "side": "opencomputers:block/capacitor_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/charger.json b/src/main/resources/assets/opencomputers/models/block/charger.json deleted file mode 100644 index 0fd9c4f2c2..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/charger.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "block/orientable", - "textures": { - "bottom": "opencomputers:block/generic_top", - "top": "opencomputers:block/generic_top", - "side": "opencomputers:block/charger_side", - "front": "opencomputers:block/charger_front" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/disassembler.json b/src/main/resources/assets/opencomputers/models/block/disassembler.json deleted file mode 100644 index d9eea8dfc6..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/disassembler.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "bottom": "opencomputers:block/generic_top", - "top": "opencomputers:block/disassembler_top", - "side": "opencomputers:block/disassembler_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/diskdrive.json b/src/main/resources/assets/opencomputers/models/block/diskdrive.json deleted file mode 100644 index c674fff009..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/diskdrive.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "block/orientable", - "textures": { - "top": "opencomputers:block/generic_top", - "bottom": "opencomputers:block/generic_top", - "side": "opencomputers:block/diskdrive_side", - "front": "opencomputers:block/diskdrive_front" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/geolyzer.json b/src/main/resources/assets/opencomputers/models/block/geolyzer.json deleted file mode 100644 index 35e9143c5a..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/geolyzer.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "top": "opencomputers:block/geolyzer_top", - "bottom": "opencomputers:block/generic_top", - "side": "opencomputers:block/geolyzer_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/microcontroller.json b/src/main/resources/assets/opencomputers/models/block/microcontroller.json deleted file mode 100644 index 23421644b6..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/microcontroller.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "block/orientable", - "textures": { - "top": "opencomputers:block/microcontroller_top", - "bottom": "opencomputers:block/microcontroller_top", - "side": "opencomputers:block/microcontroller_side", - "front": "opencomputers:block/microcontroller_front" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/motionsensor.json b/src/main/resources/assets/opencomputers/models/block/motionsensor.json deleted file mode 100644 index da5c192541..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/motionsensor.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "block/cube_column", - "textures": { - "end": "opencomputers:block/motionsensor_top", - "side": "opencomputers:block/motionsensor_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/powerconverter.json b/src/main/resources/assets/opencomputers/models/block/powerconverter.json deleted file mode 100644 index 366b5516b3..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/powerconverter.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "block/cube_column", - "textures": { - "end": "opencomputers:block/generic_top", - "side": "opencomputers:block/powerconverter_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/powerdistributor.json b/src/main/resources/assets/opencomputers/models/block/powerdistributor.json deleted file mode 100644 index d50c9aedc9..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/powerdistributor.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "top": "opencomputers:block/powerdistributor_top", - "bottom": "opencomputers:block/generic_top", - "side": "opencomputers:block/powerdistributor_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/rack.json b/src/main/resources/assets/opencomputers/models/block/rack.json deleted file mode 100644 index 0175fcb1c8..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/rack.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "block/orientable", - "textures": { - "bottom": "opencomputers:block/generic_top", - "top": "opencomputers:block/generic_top", - "side": "opencomputers:block/rack_side", - "front": "opencomputers:block/rack_front" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/raid.json b/src/main/resources/assets/opencomputers/models/block/raid.json deleted file mode 100644 index 95f2259f1a..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/raid.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "block/orientable", - "textures": { - "top": "opencomputers:block/generic_top", - "bottom": "opencomputers:block/generic_top", - "side": "opencomputers:block/raid_side", - "front": "opencomputers:block/raid_front" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/redstone.json b/src/main/resources/assets/opencomputers/models/block/redstone.json deleted file mode 100644 index bc0d2fd1f7..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/redstone.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "block/cube", - "textures": { - "down": "opencomputers:block/redstone_bottom", - "up": "opencomputers:block/redstone_top", - "north": "opencomputers:block/redstone_north", - "south": "opencomputers:block/redstone_south", - "west": "opencomputers:block/redstone_west", - "east": "opencomputers:block/redstone_east", - "particle": "opencomputers:block/redstone_top" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/relay.json b/src/main/resources/assets/opencomputers/models/block/relay.json deleted file mode 100644 index 5cb7c9455d..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/relay.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "top": "opencomputers:block/switch_top", - "bottom": "opencomputers:block/generic_top", - "side": "opencomputers:block/switch_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/switch.json b/src/main/resources/assets/opencomputers/models/block/switch.json deleted file mode 100644 index 5cb7c9455d..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/switch.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "block/cube_bottom_top", - "textures": { - "top": "opencomputers:block/switch_top", - "bottom": "opencomputers:block/generic_top", - "side": "opencomputers:block/switch_side" - } -} diff --git a/src/main/resources/assets/opencomputers/models/block/waypoint.json b/src/main/resources/assets/opencomputers/models/block/waypoint.json deleted file mode 100644 index b9d8317aa2..0000000000 --- a/src/main/resources/assets/opencomputers/models/block/waypoint.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parent": "block/orientable", - "textures": { - "bottom": "opencomputers:block/generic_top", - "top": "opencomputers:block/waypoint_top", - "side": "opencomputers:block/waypoint_side", - "front": "opencomputers:block/waypoint_front" - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/case1.json b/src/main/resources/assets/opencomputers/models/item/case1.json deleted file mode 100644 index f676c6433c..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/case1.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/case", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/case2.json b/src/main/resources/assets/opencomputers/models/item/case2.json deleted file mode 100644 index f676c6433c..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/case2.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/case", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/case3.json b/src/main/resources/assets/opencomputers/models/item/case3.json deleted file mode 100644 index f676c6433c..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/case3.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/case", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/case4.json b/src/main/resources/assets/opencomputers/models/item/case4.json deleted file mode 100644 index f676c6433c..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/case4.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/case", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/casecreative.json b/src/main/resources/assets/opencomputers/models/item/casecreative.json deleted file mode 100644 index f676c6433c..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/casecreative.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/case", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/screen1.json b/src/main/resources/assets/opencomputers/models/item/screen1.json deleted file mode 100644 index 9ddfb70f6b..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/screen1.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/screen", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/screen2.json b/src/main/resources/assets/opencomputers/models/item/screen2.json deleted file mode 100644 index 9ddfb70f6b..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/screen2.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/screen", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/screen3.json b/src/main/resources/assets/opencomputers/models/item/screen3.json deleted file mode 100644 index 9ddfb70f6b..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/screen3.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/screen", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/resources/assets/opencomputers/models/item/screen4.json b/src/main/resources/assets/opencomputers/models/item/screen4.json deleted file mode 100644 index 9ddfb70f6b..0000000000 --- a/src/main/resources/assets/opencomputers/models/item/screen4.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "parent": "opencomputers:block/screen", - "display": { - "thirdperson": { - "rotation": [ 10, -45, 170 ], - "translation": [ 0, 1.5, -2.75 ], - "scale": [ 0.375, 0.375, 0.375 ] - } - } -} diff --git a/src/main/scala/li/cil/oc/common/block/property/PropertyRotatable.scala b/src/main/scala/li/cil/oc/common/block/property/PropertyRotatable.scala index a614c68030..10887fac4d 100644 --- a/src/main/scala/li/cil/oc/common/block/property/PropertyRotatable.scala +++ b/src/main/scala/li/cil/oc/common/block/property/PropertyRotatable.scala @@ -1,10 +1,10 @@ package li.cil.oc.common.block.property -import net.minecraft.world.level.block.state.properties.DirectionProperty import net.minecraft.core.Direction +import net.minecraft.world.level.block.state.properties.{BlockStateProperties, DirectionProperty} object PropertyRotatable { - final val Facing = DirectionProperty.create("facing", Direction.Plane.HORIZONTAL) + final val Facing = BlockStateProperties.HORIZONTAL_FACING final val Mount = DirectionProperty.create("mount", (d: Direction) => d == Direction.UP || d == Direction.DOWN) final val Pitch = DirectionProperty.create("pitch", (d: Direction) => d.getAxis == Direction.Axis.Y || d == Direction.NORTH) final val Yaw = DirectionProperty.create("yaw", Direction.Plane.HORIZONTAL) From 8b33eb198937e2bf807935b2048f869a16d4788b Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 9 Aug 2026 17:17:59 +0100 Subject: [PATCH 19/38] Use a dedicated component for chamelium color Previously the color was stored using item damage, like we're back in Minecraft 1.12. However, getDamageValue clamps the value to the max damage (which is zero here), so the block/item is never tinted correctly. It's much cleaner to use a dedicated component, which we now do. We now also datagen the remaining recipes and loot tables for chamelium. --- src/data/java/li/cil/oc/data/OCBlockLoot.java | 28 +++- .../java/li/cil/oc/data/OCRecipeProvider.java | 40 ++++- .../misc/chamelium/coloring/black.json | 32 ++++ .../recipes/misc/chamelium/coloring/blue.json | 32 ++++ .../misc/chamelium/coloring/brown.json | 32 ++++ .../recipes/misc/chamelium/coloring/cyan.json | 32 ++++ .../recipes/misc/chamelium/coloring/gray.json | 32 ++++ .../misc/chamelium/coloring/green.json | 32 ++++ .../misc/chamelium/coloring/light_blue.json | 32 ++++ .../misc/chamelium/coloring/light_gray.json | 32 ++++ .../recipes/misc/chamelium/coloring/lime.json | 32 ++++ .../misc/chamelium/coloring/magenta.json | 32 ++++ .../misc/chamelium/coloring/orange.json | 32 ++++ .../recipes/misc/chamelium/coloring/pink.json | 32 ++++ .../misc/chamelium/coloring/purple.json | 32 ++++ .../recipes/misc/chamelium/coloring/red.json | 32 ++++ .../misc/chamelium/coloring/white.json | 32 ++++ .../misc/chamelium/coloring/yellow.json | 32 ++++ .../recipes/misc/chamelium/splitting.json | 32 ++++ .../loot_table/blocks/chameliumblock.json | 153 ++++++++++-------- .../recipe/chamelium/coloring/black.json | 19 +++ .../recipe/chamelium/coloring/blue.json | 19 +++ .../recipe/chamelium/coloring/brown.json | 19 +++ .../recipe/chamelium/coloring/cyan.json | 19 +++ .../recipe/chamelium/coloring/gray.json | 19 +++ .../recipe/chamelium/coloring/green.json | 19 +++ .../recipe/chamelium/coloring/light_blue.json | 19 +++ .../recipe/chamelium/coloring/light_gray.json | 19 +++ .../recipe/chamelium/coloring/lime.json | 19 +++ .../recipe/chamelium/coloring/magenta.json | 19 +++ .../recipe/chamelium/coloring/orange.json | 19 +++ .../recipe/chamelium/coloring/pink.json | 19 +++ .../recipe/chamelium/coloring/purple.json | 19 +++ .../recipe/chamelium/coloring/red.json | 19 +++ .../recipe/chamelium/coloring/white.json | 19 +++ .../recipe/chamelium/coloring/yellow.json | 19 +++ .../recipe/chamelium/splitting.json | 5 +- .../opencomputers/recipe/chameliumblock.json | 2 +- .../recipe/chamelium/coloring/black.json | 17 -- .../recipe/chamelium/coloring/blue.json | 17 -- .../recipe/chamelium/coloring/brown.json | 17 -- .../recipe/chamelium/coloring/cyan.json | 17 -- .../recipe/chamelium/coloring/gray.json | 17 -- .../recipe/chamelium/coloring/green.json | 17 -- .../recipe/chamelium/coloring/light_blue.json | 17 -- .../recipe/chamelium/coloring/light_gray.json | 17 -- .../recipe/chamelium/coloring/lime.json | 17 -- .../recipe/chamelium/coloring/magenta.json | 17 -- .../recipe/chamelium/coloring/orange.json | 17 -- .../recipe/chamelium/coloring/pink.json | 17 -- .../recipe/chamelium/coloring/purple.json | 17 -- .../recipe/chamelium/coloring/red.json | 17 -- .../recipe/chamelium/coloring/white.json | 17 -- .../recipe/chamelium/coloring/yellow.json | 17 -- src/main/scala/li/cil/oc/OpenComputers.scala | 12 +- .../scala/li/cil/oc/client/ColorHandler.scala | 56 +++---- src/main/scala/li/cil/oc/client/Proxy.scala | 2 - .../cil/oc/common/block/ChameliumBlock.scala | 38 ++--- .../common/datacomponents/OCComponents.scala | 1 + 59 files changed, 1037 insertions(+), 420 deletions(-) create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/black.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/blue.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/brown.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/cyan.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/gray.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/green.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/light_blue.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/light_gray.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/lime.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/magenta.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/orange.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/pink.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/purple.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/red.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/white.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/yellow.json create mode 100644 src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/splitting.json rename src/main/{resources => generatedResources}/data/opencomputers/loot_table/blocks/chameliumblock.json (67%) create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/black.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/blue.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/brown.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/cyan.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/gray.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/green.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/light_blue.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/light_gray.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/lime.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/magenta.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/orange.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/pink.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/purple.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/red.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/white.json create mode 100644 src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/yellow.json rename src/main/{resources => generatedResources}/data/opencomputers/recipe/chamelium/splitting.json (70%) delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/black.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/blue.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/brown.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/cyan.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/gray.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/green.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/light_blue.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/light_gray.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/lime.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/magenta.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/orange.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/pink.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/purple.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/red.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/white.json delete mode 100644 src/main/resources/data/opencomputers/recipe/chamelium/coloring/yellow.json diff --git a/src/data/java/li/cil/oc/data/OCBlockLoot.java b/src/data/java/li/cil/oc/data/OCBlockLoot.java index 2609e24ccc..ba754f7a30 100644 --- a/src/data/java/li/cil/oc/data/OCBlockLoot.java +++ b/src/data/java/li/cil/oc/data/OCBlockLoot.java @@ -1,21 +1,30 @@ package li.cil.oc.data; import li.cil.oc.OpenComputers; +import li.cil.oc.common.block.ChameliumBlock; +import li.cil.oc.common.datacomponents.OCComponents; import li.cil.oc.common.init.OCBlocks; import li.cil.oc.common.openprinter.OpenPrinter; import li.cil.oc.server.loot.CopyColor; import li.cil.oc.server.loot.LootFunctions; +import net.minecraft.advancements.critereon.StatePropertiesPredicate; +import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.AlternativesEntry; import net.minecraft.world.level.storage.loot.entries.DynamicLoot; import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.SetComponentsFunction; +import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import java.util.Arrays; import java.util.Set; class OCBlockLoot extends BlockLootSubProvider { @@ -27,9 +36,7 @@ class OCBlockLoot extends BlockLootSubProvider { protected Iterable getKnownBlocks() { return BuiltInRegistries.BLOCK.holders() .filter(x -> x.key().location().getNamespace().equals(OpenComputers.ID())) - // TODO: Handle this, but not until we've switched to components - .filter(x -> !x.key().location().getPath().equals("chameliumblock")) - .map(x -> x.value()) + .map(Holder.Reference::value) .toList(); } @@ -43,7 +50,7 @@ protected void generate() { dropVolatileContents(OCBlocks.CaseTier2().get()); dropVolatileContents(OCBlocks.CaseTier3().get()); dropVolatileContents(OCBlocks.CaseTier4().get()); - // TODO: chameliumblock + dropChamelium(); dropVolatileContents(OCBlocks.Charger().get()); dropVolatileContents(OCBlocks.Disassembler().get()); dropVolatileContents(OCBlocks.DiskDrive().get()); @@ -104,6 +111,19 @@ protected void generate() { dropSelf(OpenPrinter.SHREDDER.get()); } + private void dropChamelium() { + var block = OCBlocks.ChameliumBlock().get(); + add(block, LootTable.lootTable() + .withPool(applyExplosionCondition(block, LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(AlternativesEntry.alternatives(Arrays.asList(DyeColor.values()), color -> LootItem.lootTableItem(block) + .when( + LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(ChameliumBlock.Color(), color)) + ) + .apply(SetComponentsFunction.setComponent(OCComponents.CHAMELIUM_COLOR().get(), color)))))) + ); + } private void dropVolatileContents(Block block) { add(block, LootTable.lootTable() diff --git a/src/data/java/li/cil/oc/data/OCRecipeProvider.java b/src/data/java/li/cil/oc/data/OCRecipeProvider.java index 19d4c82106..7b5ca894c8 100644 --- a/src/data/java/li/cil/oc/data/OCRecipeProvider.java +++ b/src/data/java/li/cil/oc/data/OCRecipeProvider.java @@ -1,6 +1,7 @@ package li.cil.oc.data; import li.cil.oc.OpenComputers; +import li.cil.oc.common.block.ChameliumBlock; import li.cil.oc.common.datacomponents.OCComponents; import li.cil.oc.common.init.OCBlocks; import li.cil.oc.common.init.OCItems; @@ -12,15 +13,37 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; import net.neoforged.neoforge.common.Tags; +import java.util.Map; import java.util.concurrent.CompletableFuture; class OCRecipeProvider extends RecipeProvider { + private static final Map> DYE_TAGS = Map.ofEntries( + Map.entry(DyeColor.BLACK, Tags.Items.DYES_BLACK), + Map.entry(DyeColor.RED, Tags.Items.DYES_RED), + Map.entry(DyeColor.GREEN, Tags.Items.DYES_GREEN), + Map.entry(DyeColor.BROWN, Tags.Items.DYES_BROWN), + Map.entry(DyeColor.BLUE, Tags.Items.DYES_BLUE), + Map.entry(DyeColor.PURPLE, Tags.Items.DYES_PURPLE), + Map.entry(DyeColor.CYAN, Tags.Items.DYES_CYAN), + Map.entry(DyeColor.LIGHT_GRAY, Tags.Items.DYES_LIGHT_GRAY), + Map.entry(DyeColor.GRAY, Tags.Items.DYES_GRAY), + Map.entry(DyeColor.PINK, Tags.Items.DYES_PINK), + Map.entry(DyeColor.LIME, Tags.Items.DYES_LIME), + Map.entry(DyeColor.YELLOW, Tags.Items.DYES_YELLOW), + Map.entry(DyeColor.LIGHT_BLUE, Tags.Items.DYES_LIGHT_BLUE), + Map.entry(DyeColor.MAGENTA, Tags.Items.DYES_MAGENTA), + Map.entry(DyeColor.ORANGE, Tags.Items.DYES_ORANGE), + Map.entry(DyeColor.WHITE, Tags.Items.DYES_WHITE) + ); + OCRecipeProvider(PackOutput output, CompletableFuture registries) { super(output, registries); } @@ -1414,7 +1437,7 @@ private void addBlocks(RecipeOutput output) { .save(output); var chamelium = new ItemStack(OCBlocks.ChameliumBlock()); - chamelium.set(DataComponents.DAMAGE, 15); + chamelium.set(OCComponents.CHAMELIUM_COLOR(), ChameliumBlock.DEFAULT_COLOR()); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, chamelium) .pattern("CCC") .pattern("CCC") @@ -1423,6 +1446,21 @@ private void addBlocks(RecipeOutput output) { .unlockedBy(getHasName(OCItems.Chamelium()), has(OCItems.Chamelium())) .save(output); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, OCItems.Chamelium(), 9) + .requires(OCBlocks.ChameliumBlock()) + .unlockedBy(getHasName(OCBlocks.ChameliumBlock()), has(OCBlocks.ChameliumBlock())) + .save(output, ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "chamelium/splitting")); + + for (var dye : DYE_TAGS.entrySet()) { + var dyedChamelium = new ItemStack(OCBlocks.ChameliumBlock()); + dyedChamelium.set(OCComponents.CHAMELIUM_COLOR(), dye.getKey()); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, dyedChamelium) + .requires(OCBlocks.ChameliumBlock()) + .requires(dye.getValue()) + .unlockedBy(getHasName(OCBlocks.ChameliumBlock()), has(OCBlocks.ChameliumBlock())) + .save(output, ResourceLocation.fromNamespaceAndPath(OpenComputers.ID(), "chamelium/coloring/" + dye.getKey().getName())); + } + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, OCBlocks.Charger()) .pattern("igi") .pattern("cCc") diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/black.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/black.json new file mode 100644 index 0000000000..f9965f51ef --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/black.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/black" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/black" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/blue.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/blue.json new file mode 100644 index 0000000000..f23429d548 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/blue.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/blue" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/brown.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/brown.json new file mode 100644 index 0000000000..df8ecebb10 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/brown.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/brown" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/brown" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/cyan.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/cyan.json new file mode 100644 index 0000000000..4635d25031 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/cyan.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/cyan" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/cyan" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/gray.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/gray.json new file mode 100644 index 0000000000..cf5869d33d --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/gray.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/gray" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/green.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/green.json new file mode 100644 index 0000000000..7a378ab804 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/green.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/green" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/green" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/light_blue.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/light_blue.json new file mode 100644 index 0000000000..d4dd795f3a --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/light_blue.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/light_blue" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/light_blue" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/light_gray.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/light_gray.json new file mode 100644 index 0000000000..733234affa --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/light_gray.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/light_gray" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/light_gray" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/lime.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/lime.json new file mode 100644 index 0000000000..98e64983d2 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/lime.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/lime" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/lime" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/magenta.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/magenta.json new file mode 100644 index 0000000000..7be283d311 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/magenta.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/magenta" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/magenta" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/orange.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/orange.json new file mode 100644 index 0000000000..db043fbd47 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/orange.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/orange" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/orange" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/pink.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/pink.json new file mode 100644 index 0000000000..20dce344dd --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/pink.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/pink" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/pink" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/purple.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/purple.json new file mode 100644 index 0000000000..983793d6bc --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/purple.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/purple" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/purple" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/red.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/red.json new file mode 100644 index 0000000000..30f7f6493a --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/red.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/red" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/red" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/white.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/white.json new file mode 100644 index 0000000000..031a6f6685 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/white.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/white" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/white" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/yellow.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/yellow.json new file mode 100644 index 0000000000..8f68b2656a --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/coloring/yellow.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/coloring/yellow" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/coloring/yellow" + ] + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/splitting.json b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/splitting.json new file mode 100644 index 0000000000..b70fe7ed61 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/advancement/recipes/misc/chamelium/splitting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_chameliumblock": { + "conditions": { + "items": [ + { + "items": "opencomputers:chameliumblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "opencomputers:chamelium/splitting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_chameliumblock" + ] + ], + "rewards": { + "recipes": [ + "opencomputers:chamelium/splitting" + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/opencomputers/loot_table/blocks/chameliumblock.json b/src/main/generatedResources/data/opencomputers/loot_table/blocks/chameliumblock.json similarity index 67% rename from src/main/resources/data/opencomputers/loot_table/blocks/chameliumblock.json rename to src/main/generatedResources/data/opencomputers/loot_table/blocks/chameliumblock.json index 529177f1ff..68e992bed6 100644 --- a/src/main/resources/data/opencomputers/loot_table/blocks/chameliumblock.json +++ b/src/main/generatedResources/data/opencomputers/loot_table/blocks/chameliumblock.json @@ -2,7 +2,12 @@ "type": "minecraft:block", "pools": [ { - "rolls": 1, + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], "entries": [ { "type": "minecraft:alternatives", @@ -11,8 +16,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "white" } @@ -20,10 +25,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 0 - } + "opencomputers:chamelium_color": "white" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -32,8 +37,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "orange" } @@ -41,10 +46,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 1 - } + "opencomputers:chamelium_color": "orange" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -53,8 +58,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "magenta" } @@ -62,10 +67,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 2 - } + "opencomputers:chamelium_color": "magenta" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -74,8 +79,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "light_blue" } @@ -83,10 +88,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 3 - } + "opencomputers:chamelium_color": "light_blue" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -95,8 +100,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "yellow" } @@ -104,10 +109,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 4 - } + "opencomputers:chamelium_color": "yellow" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -116,8 +121,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "lime" } @@ -125,10 +130,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 5 - } + "opencomputers:chamelium_color": "lime" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -137,8 +142,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "pink" } @@ -146,10 +151,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 6 - } + "opencomputers:chamelium_color": "pink" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -158,8 +163,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "gray" } @@ -167,10 +172,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 7 - } + "opencomputers:chamelium_color": "gray" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -179,8 +184,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "light_gray" } @@ -188,10 +193,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 8 - } + "opencomputers:chamelium_color": "light_gray" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -200,8 +205,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "cyan" } @@ -209,10 +214,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 9 - } + "opencomputers:chamelium_color": "cyan" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -221,8 +226,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "purple" } @@ -230,10 +235,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 10 - } + "opencomputers:chamelium_color": "purple" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -242,8 +247,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "blue" } @@ -251,10 +256,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 11 - } + "opencomputers:chamelium_color": "blue" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -263,8 +268,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "brown" } @@ -272,10 +277,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 12 - } + "opencomputers:chamelium_color": "brown" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -284,8 +289,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "green" } @@ -293,10 +298,10 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 13 - } + "opencomputers:chamelium_color": "green" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -305,8 +310,8 @@ "type": "minecraft:item", "conditions": [ { - "condition": "block_state_property", "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", "properties": { "color": "red" } @@ -314,22 +319,31 @@ ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 14 - } + "opencomputers:chamelium_color": "red" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" }, { "type": "minecraft:item", + "conditions": [ + { + "block": "opencomputers:chameliumblock", + "condition": "minecraft:block_state_property", + "properties": { + "color": "black" + } + } + ], "functions": [ { - "function": "minecraft:set_components", "components": { - "minecraft:damage": 15 - } + "opencomputers:chamelium_color": "black" + }, + "function": "minecraft:set_components" } ], "name": "opencomputers:chameliumblock" @@ -337,11 +351,8 @@ ] } ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] + "rolls": 1.0 } - ] -} + ], + "random_sequence": "opencomputers:blocks/chameliumblock" +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/black.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/black.json new file mode 100644 index 0000000000..478db2f730 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/black.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/black" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "black" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/blue.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/blue.json new file mode 100644 index 0000000000..c7c35efc1b --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/blue.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/blue" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "blue" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/brown.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/brown.json new file mode 100644 index 0000000000..2d50018297 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/brown.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/brown" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "brown" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/cyan.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/cyan.json new file mode 100644 index 0000000000..58174dcb25 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/cyan.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/cyan" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "cyan" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/gray.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/gray.json new file mode 100644 index 0000000000..0dd38ac3b3 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/gray.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/gray" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "gray" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/green.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/green.json new file mode 100644 index 0000000000..4b78b86cc1 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/green.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/green" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "green" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/light_blue.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/light_blue.json new file mode 100644 index 0000000000..867ec5d6e1 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/light_blue.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/light_blue" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "light_blue" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/light_gray.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/light_gray.json new file mode 100644 index 0000000000..1c46a7864d --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/light_gray.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/light_gray" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "light_gray" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/lime.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/lime.json new file mode 100644 index 0000000000..e3823a94bc --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/lime.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/lime" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "lime" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/magenta.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/magenta.json new file mode 100644 index 0000000000..0d6229ce00 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/magenta.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/magenta" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "magenta" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/orange.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/orange.json new file mode 100644 index 0000000000..1a818547ce --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/orange.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/orange" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "orange" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/pink.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/pink.json new file mode 100644 index 0000000000..85d5b19a21 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/pink.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/pink" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "pink" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/purple.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/purple.json new file mode 100644 index 0000000000..e588bd5605 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/purple.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/purple" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "purple" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/red.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/red.json new file mode 100644 index 0000000000..f82d5ac6c0 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/red.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/red" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "red" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/white.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/white.json new file mode 100644 index 0000000000..e2a89f5100 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/white.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/white" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "white" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/yellow.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/yellow.json new file mode 100644 index 0000000000..dd283e1b92 --- /dev/null +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/coloring/yellow.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "opencomputers:chameliumblock" + }, + { + "tag": "c:dyes/yellow" + } + ], + "result": { + "components": { + "opencomputers:chamelium_color": "yellow" + }, + "count": 1, + "id": "opencomputers:chameliumblock" + } +} \ No newline at end of file diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/splitting.json b/src/main/generatedResources/data/opencomputers/recipe/chamelium/splitting.json similarity index 70% rename from src/main/resources/data/opencomputers/recipe/chamelium/splitting.json rename to src/main/generatedResources/data/opencomputers/recipe/chamelium/splitting.json index bdd9beb0db..dc8783440f 100644 --- a/src/main/resources/data/opencomputers/recipe/chamelium/splitting.json +++ b/src/main/generatedResources/data/opencomputers/recipe/chamelium/splitting.json @@ -1,5 +1,6 @@ { - "type": "opencomputers:crafting_shapeless_extended", + "type": "minecraft:crafting_shapeless", + "category": "misc", "ingredients": [ { "item": "opencomputers:chameliumblock" @@ -9,4 +10,4 @@ "count": 9, "id": "opencomputers:chamelium" } -} +} \ No newline at end of file diff --git a/src/main/generatedResources/data/opencomputers/recipe/chameliumblock.json b/src/main/generatedResources/data/opencomputers/recipe/chameliumblock.json index 6bb2360b0e..30ff475906 100644 --- a/src/main/generatedResources/data/opencomputers/recipe/chameliumblock.json +++ b/src/main/generatedResources/data/opencomputers/recipe/chameliumblock.json @@ -13,7 +13,7 @@ ], "result": { "components": { - "minecraft:damage": 15 + "opencomputers:chamelium_color": "black" }, "count": 1, "id": "opencomputers:chameliumblock" diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/black.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/black.json deleted file mode 100644 index 2f578470dd..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/black.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/black" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 15 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/blue.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/blue.json deleted file mode 100644 index 6f2b359c99..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/blue.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/blue" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 11 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/brown.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/brown.json deleted file mode 100644 index 8edee0777d..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/brown.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/brown" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 12 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/cyan.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/cyan.json deleted file mode 100644 index ee008bfa9f..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/cyan.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/cyan" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 9 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/gray.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/gray.json deleted file mode 100644 index 5ae693018a..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/gray.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/gray" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 7 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/green.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/green.json deleted file mode 100644 index 6a50fe0d44..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/green.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/green" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 13 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/light_blue.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/light_blue.json deleted file mode 100644 index cc61fd1337..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/light_blue.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/light_blue" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 3 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/light_gray.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/light_gray.json deleted file mode 100644 index 028ff119ba..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/light_gray.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/light_gray" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 8 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/lime.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/lime.json deleted file mode 100644 index 76e902ab82..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/lime.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/lime" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 5 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/magenta.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/magenta.json deleted file mode 100644 index d281ce90dc..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/magenta.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/magenta" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 2 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/orange.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/orange.json deleted file mode 100644 index fea000de7b..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/orange.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/orange" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 1 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/pink.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/pink.json deleted file mode 100644 index ca52c24f07..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/pink.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/pink" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 6 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/purple.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/purple.json deleted file mode 100644 index 44378816f7..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/purple.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/purple" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 10 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/red.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/red.json deleted file mode 100644 index 3dfa175b1d..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/red.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/red" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 14 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/white.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/white.json deleted file mode 100644 index ab9741a198..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/white.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/white" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 0 - } - } -} diff --git a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/yellow.json b/src/main/resources/data/opencomputers/recipe/chamelium/coloring/yellow.json deleted file mode 100644 index 395cf965dd..0000000000 --- a/src/main/resources/data/opencomputers/recipe/chamelium/coloring/yellow.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "opencomputers:crafting_shapeless_extended", - "ingredients": [ - { - "item": "opencomputers:chameliumblock" - }, - { - "tag": "c:dyes/yellow" - } - ], - "result": { - "id": "opencomputers:chameliumblock", - "components": { - "minecraft:damage": 4 - } - } -} diff --git a/src/main/scala/li/cil/oc/OpenComputers.scala b/src/main/scala/li/cil/oc/OpenComputers.scala index 82ba533c6b..646ce02852 100644 --- a/src/main/scala/li/cil/oc/OpenComputers.scala +++ b/src/main/scala/li/cil/oc/OpenComputers.scala @@ -1,7 +1,6 @@ package li.cil.oc -import li.cil.oc.common.{IMC, Proxy} -import li.cil.oc.common.block.ChameliumBlock +import li.cil.oc.client.ColorHandler import li.cil.oc.common.blockentity.BlockEntityTypes import li.cil.oc.common.datacomponents.OCComponents import li.cil.oc.common.entity.EntityTypes @@ -9,16 +8,17 @@ import li.cil.oc.common.init.{OCBlocks, OCItems} import li.cil.oc.common.menu.MenuTypes import li.cil.oc.common.openprinter.OpenPrinter import li.cil.oc.common.recipe.Recipes +import li.cil.oc.common.{IMC, Proxy} import li.cil.oc.integration.Mods -import li.cil.oc.server.loot.LootFunctions import li.cil.oc.server.command.CommandHandler +import li.cil.oc.server.loot.LootFunctions import li.cil.oc.util.ThreadPoolFactory import net.neoforged.api.distmarker.Dist import net.neoforged.bus.api.{IEventBus, SubscribeEvent} -import net.neoforged.fml.{InterModComms, ModContainer} import net.neoforged.fml.common.Mod import net.neoforged.fml.event.lifecycle.{FMLCommonSetupEvent, InterModProcessEvent} import net.neoforged.fml.loading.FMLPaths +import net.neoforged.fml.{InterModComms, ModContainer} import net.neoforged.neoforge.common.NeoForge import net.neoforged.neoforgespi.Environment import org.apache.logging.log4j.{LogManager, Logger} @@ -78,9 +78,7 @@ class OpenComputers(modBus: IEventBus, modContainer: ModContainer) { OpenComputers.proxy.preInit() NeoForge.EVENT_BUS.register(ThreadPoolFactory) NeoForge.EVENT_BUS.addListener(CommandHandler.onRegisterCommands) - - // these used to use @EventBusSubscriber but Scala makes this impossible on NeoForge - modBus.register(ChameliumBlock) + modBus.register(ColorHandler) Mods.preInit() // Must happen after loading Settings but before registry events are fired. diff --git a/src/main/scala/li/cil/oc/client/ColorHandler.scala b/src/main/scala/li/cil/oc/client/ColorHandler.scala index 829c35e98c..da90003c0b 100644 --- a/src/main/scala/li/cil/oc/client/ColorHandler.scala +++ b/src/main/scala/li/cil/oc/client/ColorHandler.scala @@ -1,35 +1,28 @@ package li.cil.oc.client -import li.cil.oc.Constants -import li.cil.oc.api import li.cil.oc.api.internal.Colored import li.cil.oc.common.block +import li.cil.oc.common.block.ChameliumBlock +import li.cil.oc.common.datacomponents.OCComponents import li.cil.oc.common.init.{OCBlocks, OCItems} -import li.cil.oc.util.Color -import li.cil.oc.util.ItemColorizer -import li.cil.oc.util.ItemUtils -import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState -import net.minecraft.client.Minecraft -import net.minecraft.client.color.block.BlockColor +import li.cil.oc.util.{Color, ItemColorizer, ItemUtils} import net.minecraft.world.item.DyeColor -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import net.minecraft.core.BlockPos -import net.minecraft.world.level.{BlockAndTintGetter, BlockGetter, ItemLike} +import net.neoforged.bus.api.SubscribeEvent +import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent object ColorHandler { private def opaque(color: Int): Int = 0xFF000000 | (color & 0x00FFFFFF) - def init(): Unit = { - register((state, world, pos, tintIndex) => state.getBlock match { + @SubscribeEvent + def onRegisterBlocks(event: RegisterColorHandlersEvent.Block): Unit = { + event.register((state, world, pos, tintIndex) => state.getBlock match { case block: block.Cable => block.colorMultiplierOverride.getOrElse(0xFFFFFFFF) case _ => 0xFFFFFFFF }, OCBlocks.Cable.get()) - register((state, world, pos, tintIndex) => if (pos == null) 0xFFFFFFFF else world.getBlockEntity(pos) match { + event.register((state, world, pos, tintIndex) => if (pos == null) 0xFFFFFFFF else world.getBlockEntity(pos) match { case colored: Colored => colored.getColor case _ => state.getBlock match { case block: block.Case => Color.byTier(block.tier) @@ -42,25 +35,28 @@ object ColorHandler { OCBlocks.CaseTier4.get(), OCBlocks.CaseCreative.get()) - register((state, world, pos, tintIndex) => Color.rgbValues(state.getValue(block.ChameliumBlock.Color)), + event.register((state, world, pos, tintIndex) => Color.rgbValues(state.getValue(block.ChameliumBlock.Color)), OCBlocks.ChameliumBlock.get()) - register((state, world, pos, tintIndex) => tintIndex, + event.register((state, world, pos, tintIndex) => tintIndex, OCBlocks.Print.get()) - register((state, world, pos, tintIndex) => state.getBlock match { + event.register((state, world, pos, tintIndex) => state.getBlock match { case block: block.Screen => Color.byTier(block.tier) case _ => 0xFFFFFFFF }, OCBlocks.ScreenTier1.get(), OCBlocks.ScreenTier2.get(), OCBlocks.ScreenTier3.get()) + } - register((stack, tintIndex) => + @SubscribeEvent + def onRegisterItems(event: RegisterColorHandlersEvent.Item): Unit = { + event.register((stack, tintIndex) => if (ItemColorizer.hasColor(stack)) opaque(ItemColorizer.getColor(stack)) else 0xFFFFFFFF, OCBlocks.Cable.get()) - register((stack, tintIndex) => + event.register((stack, tintIndex) => opaque(Color.byTier(ItemUtils.caseTier(stack))), OCBlocks.CaseTier1.get(), OCBlocks.CaseTier2.get(), @@ -68,32 +64,22 @@ object ColorHandler { OCBlocks.CaseTier4.get(), OCBlocks.CaseCreative.get()) - register((stack, tintIndex) => - opaque(Color.rgbValues(DyeColor.byId(stack.getDamageValue))), + event.register((stack, tintIndex) => + opaque(Color.rgbValues(stack.getOrDefault(OCComponents.CHAMELIUM_COLOR.get(), ChameliumBlock.DEFAULT_COLOR))), OCBlocks.ChameliumBlock.get()) - register((stack, tintIndex) => 0xFFFFFFFF, + event.register((stack, tintIndex) => 0xFFFFFFFF, OCBlocks.ScreenTier1.get(), OCBlocks.ScreenTier2.get(), OCBlocks.ScreenTier3.get(), OCBlocks.Print.get(), OCBlocks.Robot.get()) - register((stack, tintIndex) => + event.register((stack, tintIndex) => if (tintIndex == 1) { val rgb = if (ItemColorizer.hasColor(stack)) ItemColorizer.getColor(stack) else 0x66DD55 opaque(rgb) } else 0xFFFFFFFF, OCItems.HoverBoots.get()) } - - def register(handler: (BlockState, BlockGetter, BlockPos, Int) => Int, blocks: Block*): Unit = { - Minecraft.getInstance.getBlockColors.register((state: BlockState, world: BlockAndTintGetter, pos: BlockPos, tintIndex: Int) => - handler(state, world, pos, tintIndex), blocks: _*) - } - - def register(handler: (ItemStack, Int) => Int, items: ItemLike*): Unit = { - Minecraft.getInstance.getItemColors.register((stack: ItemStack, tintIndex: Int) - => handler(stack, tintIndex), items: _*) - } } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/client/Proxy.scala b/src/main/scala/li/cil/oc/client/Proxy.scala index 8c571bdb6d..fda99a84f1 100644 --- a/src/main/scala/li/cil/oc/client/Proxy.scala +++ b/src/main/scala/li/cil/oc/client/Proxy.scala @@ -42,8 +42,6 @@ private[oc] class Proxy(modBus: IEventBus) extends CommonProxy(modBus) { e.enqueueWork((() => { ModelInitialization.preInit() - ColorHandler.init() - NeoForge.EVENT_BUS.register(HighlightRenderer) NeoForge.EVENT_BUS.register(NanomachinesHandler.Client) NeoForge.EVENT_BUS.register(PetRenderer) diff --git a/src/main/scala/li/cil/oc/common/block/ChameliumBlock.scala b/src/main/scala/li/cil/oc/common/block/ChameliumBlock.scala index fedabc135b..a12891efbe 100644 --- a/src/main/scala/li/cil/oc/common/block/ChameliumBlock.scala +++ b/src/main/scala/li/cil/oc/common/block/ChameliumBlock.scala @@ -1,22 +1,16 @@ package li.cil.oc.common.block import com.mojang.serialization.MapCodec -import li.cil.oc.api.Items -import li.cil.oc.common.block.ChameliumBlock.CODEC -import li.cil.oc.{CreativeTab, OpenComputers} +import li.cil.oc.common.block.ChameliumBlock.{CODEC, DEFAULT_COLOR} +import li.cil.oc.common.datacomponents.OCComponents +import net.minecraft.core.BlockPos +import net.minecraft.world.item.context.{BlockPlaceContext => BlockItemUseContext} +import net.minecraft.world.item.{DyeColor, ItemStack} +import net.minecraft.world.level.LevelReader import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockBehaviour.{Properties, simpleCodec} -import net.minecraft.world.item.context.{BlockPlaceContext => BlockItemUseContext} -import net.minecraft.world.item.DyeColor -import net.minecraft.world.item.ItemStack import net.minecraft.world.level.block.state.properties.EnumProperty -import net.minecraft.world.level.block.state.{StateDefinition => StateContainer} -import net.minecraft.core.BlockPos -import net.minecraft.world.level.{LevelReader, BlockGetter => IBlockReader} -import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent -import net.neoforged.bus.api.SubscribeEvent -import net.neoforged.fml.common.EventBusSubscriber +import net.minecraft.world.level.block.state.{BlockState, StateDefinition => StateContainer} class ChameliumBlock(props: Properties) extends SimpleBlock(props) { override def codec(): MapCodec[ChameliumBlock] = CODEC @@ -24,28 +18,22 @@ class ChameliumBlock(props: Properties) extends SimpleBlock(props) { protected override def createBlockStateDefinition(builder: StateContainer.Builder[Block, BlockState]): Unit = { builder.add(ChameliumBlock.Color) } - registerDefaultState(stateDefinition.any.setValue(ChameliumBlock.Color, DyeColor.BLACK)) + registerDefaultState(stateDefinition.any.setValue(ChameliumBlock.Color, DEFAULT_COLOR)) + + @Deprecated override def getCloneItemStack(world: LevelReader, pos: BlockPos, state: BlockState): ItemStack = { val stack = new ItemStack(this) - stack.setDamageValue(state.getValue(ChameliumBlock.Color).getId) + stack.set(OCComponents.CHAMELIUM_COLOR.get(), state.getValue(ChameliumBlock.Color)) stack } override def getStateForPlacement(ctx: BlockItemUseContext): BlockState = - defaultBlockState.setValue(ChameliumBlock.Color, DyeColor.byId(ctx.getItemInHand.getDamageValue)) + defaultBlockState.setValue(ChameliumBlock.Color, ctx.getItemInHand.getOrDefault(OCComponents.CHAMELIUM_COLOR.get(), DEFAULT_COLOR)) } object ChameliumBlock { final val CODEC = simpleCodec(new ChameliumBlock(_)) final val Color = EnumProperty.create("color", classOf[DyeColor]) - - @SubscribeEvent - def onBuildCreativeTab(e: BuildCreativeModeTabContentsEvent): Unit = { - if (e.getTabKey == CreativeTab.CREATIVE_TABS.getRegistryKey) { - val stack = Items.get("opencomputers:chamelium_block").createItemStack(1) - stack.setDamageValue(DyeColor.WHITE.getId) - e.accept(stack) - } - } + final val DEFAULT_COLOR = DyeColor.BLACK } diff --git a/src/main/scala/li/cil/oc/common/datacomponents/OCComponents.scala b/src/main/scala/li/cil/oc/common/datacomponents/OCComponents.scala index eb7146bfda..68fa984877 100644 --- a/src/main/scala/li/cil/oc/common/datacomponents/OCComponents.scala +++ b/src/main/scala/li/cil/oc/common/datacomponents/OCComponents.scala @@ -143,6 +143,7 @@ object OCComponents { val RACK_NODE_MAPPING: Type[List[List[Direction]]] = persistent("rack_node_mapping", ScalaCodec.list(ScalaCodec.list(Direction.CODEC))) val DEBUG_CARD_ACCESS_CONTEXT: Type[AccessContext] = persistent("debug_card/access_context", AccessContext.CODEC) val DEBUG_CARD_REMOTE_NODE_POSITION: Type[BlockPos] = persistent("debug_card/remote_node", BlockPos.CODEC) + val CHAMELIUM_COLOR: Type[DyeColor] = persistentShared("chamelium_color", DyeColor.CODEC, DyeColor.STREAM_CODEC) object Network { val LAST_ACCESS: Type[Long] = sharedOnly("network/last_access_timestamp", ScalaStreamCodec.VAR_LONG) From 28142a631fac1523d54325274e1a715066246060 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 12:33:04 -0700 Subject: [PATCH 20/38] Prideflag Robots! Stollen with permission from CC:Tweaked. --- LICENSE | 2 + LICENSES/CC-Tweaked.txt | 120 ++++++++++++++++++ THIRD_PARTY_NOTICES.md | 1 + .../textures/model/robot_rainbow_flag.png | Bin 0 -> 186 bytes .../textures/model/robot_trans_flag.png | Bin 0 -> 154 bytes .../recipe/robot/rainbow_flag.json | 21 +++ .../recipe/robot/trans_flag.json | 18 +++ .../scala/li/cil/oc/client/Textures.scala | 2 + .../cil/oc/client/renderer/RenderTypes.java | 14 ++ .../renderer/tileentity/RobotRenderer.scala | 52 +++++++- .../scala/li/cil/oc/common/EventHandler.scala | 15 ++- .../common/datacomponents/OCComponents.scala | 1 + .../cil/oc/common/item/data/RobotData.scala | 5 + .../li/cil/oc/common/recipe/Recipes.java | 1 + .../cil/oc/common/recipe/RobotFlagRecipe.java | 118 +++++++++++++++++ 15 files changed, 365 insertions(+), 5 deletions(-) create mode 100644 LICENSES/CC-Tweaked.txt create mode 100644 src/main/resources/assets/opencomputers/textures/model/robot_rainbow_flag.png create mode 100644 src/main/resources/assets/opencomputers/textures/model/robot_trans_flag.png create mode 100644 src/main/resources/data/opencomputers/recipe/robot/rainbow_flag.json create mode 100644 src/main/resources/data/opencomputers/recipe/robot/trans_flag.json create mode 100644 src/main/scala/li/cil/oc/common/recipe/RobotFlagRecipe.java diff --git a/LICENSE b/LICENSE index 321a5f9339..75df302bfa 100644 --- a/LICENSE +++ b/LICENSE @@ -48,3 +48,5 @@ Assets from other sources: https://www.freesound.org/people/artykris/sounds/117401/ OpenScreens display block portions: copyright (c) 2019 its_meow, MIT License, see LICENSES/OpenScreens.txt. + CC:Tweaked rainbow and trans robot flag textures: + ComputerCraft Public License, see LICENSES/CC-Tweaked.txt. diff --git a/LICENSES/CC-Tweaked.txt b/LICENSES/CC-Tweaked.txt new file mode 100644 index 0000000000..7e6e054718 --- /dev/null +++ b/LICENSES/CC-Tweaked.txt @@ -0,0 +1,120 @@ +CC:Tweaked pride flag textures + +Source: CC:Tweaked 1.119.0 +https://github.com/cc-tweaked/CC-Tweaked + +Copyright: Daniel Ratcliffe and the CC:Tweaked developers +License: ComputerCraft Public License 1.0.0 + +ComputerCraft Public License + +============================ + +Version 1.0.0 (Based on Minecraft Mod Public License 1.0.1) + +0. Definitions + +-------------- + +Minecraft: Denotes a copy of the PC Java version of the game “Minecraft” licensed by Mojang AB + +User: Anybody that interacts with the software in one of the following ways: + + - play + + - decompile + + - recompile or compile + + - modify + + - distribute + +Mod: The mod code designated by the present license, in source form, binary +form, as obtained standalone, as part of a wider distribution or resulting from +the compilation of the original or modified sources. + +Dependency: Code required for the mod to work properly. This includes +dependencies required to compile the code as well as any file or modification +that is explicitly or implicitly required for the mod to be working. + +1. Scope + +-------- + +The present license is granted to any user of the mod. As a prerequisite, +a user must own a legally acquired copy of Minecraft + +2. Liability + +------------ + +This mod is provided 'as is' with no warranties, implied or otherwise. The owner +of this mod takes no responsibility for any damages incurred from the use of +this mod. This mod alters fundamental parts of the Minecraft game, parts of +Minecraft may not work with this mod installed. All damages caused from the use +or misuse of this mod fall on the user. + +3. Play rights + +-------------- + +The user is allowed to install this mod on a Minecraft client or server and to play +without restriction. + +4. Modification rights + +---------------------- + +The user has the right to decompile the source code, look at either the +decompiled version or the original source code, and to modify it. + +5. Distribution of original or modified copy rights + +--------------------------------------------------- + +Is subject to distribution rights this entire mod in its various forms. This +include: + + - original binary or source forms of this mod files + + - modified versions of these binaries or source files, as well as binaries + resulting from source modifications + + - patch to its source or binary files + + - any copy of a portion of its binary source files + +The user is allowed to redistribute this mod partially, in totality, or +included in a distribution. +When distributing binary files, the user must provide means to obtain its +entire set of sources or modified sources at no cost. +All distributions of this mod must remain licensed under the CCPL. +All dependencies that this mod have on other mods or classes must be licensed +under conditions comparable to this version of CCPL, with the exception of the +Minecraft code and the mod loading framework (e.g. Forge). + +Modified version of binaries and sources, as well as files containing sections +copied from this mod, should be distributed under the terms of the present +license. + +7. Use of mod code and assets in other projects + +----------------------------------------------- + +It is permitted to use the code and assets contained in this mod (and modified +versions thereof) in other Minecraft Mods, provided they are non-commercial. +However: the code and assets may not be used in commercial mods, mods for other +games, other games, other non-game projects, or any commercial projects. +When using code covered by this license in other projects, the source code used +must be made available at no cost and remain licensed under the CCPL. + +8. Contributing + +--------------- + +If you choose to contribute code or assets to be included in this mod, you +agree that, if added to to the main repository at +https://github.com/dan200/ComputerCraft, your contributions will be covered by +this license, and that Daniel Ratcliffe will retain the right to re-license the +mod, including your contributions, in part or in whole, under other licenses. diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index d2c81adbd9..f0b740ca66 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -12,6 +12,7 @@ release JARs under `META-INF/licenses`. | OpenScreens | Adapted display assets and implementation portions | [OpenScreens](LICENSES/OpenScreens.txt) | | GNU Unifont | Glyph data used by screens and manuals | [GNU Unifont](LICENSES/Unifont.txt) | | wcwidth tables | Unicode character-width data | [wcwidth](LICENSES/wcwidth.txt) | +| CC:Tweaked | Rainbow and trans turtle flag textures adapted for robots | [CC:Tweaked](LICENSES/CC-Tweaked.txt) | Optional mod integrations are compiled against their respective APIs but are not bundled into the OpenComputers JAR. Those projects remain subject to their diff --git a/src/main/resources/assets/opencomputers/textures/model/robot_rainbow_flag.png b/src/main/resources/assets/opencomputers/textures/model/robot_rainbow_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..a406f8cdb343d0ffcd8d3aaca079e74e873d78ed GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=7~m)(k%X85$J}+}+C< zJIeh0Y9k|?LPMW2F#PXj`2UVUE@qlEP#sfAkY6wZL)qlB7C@e}r;B3<$MxhHmc`Fn z7})sz+Co={>2f4^JWRQZZPO9U9w~egBT|-FE2+z!Q+&M1|c>U0g(iO dlm#*j3>wM&=DCudJwW3aJYD@<);T3K0RSNMHL?Hz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/opencomputers/textures/model/robot_trans_flag.png b/src/main/resources/assets/opencomputers/textures/model/robot_trans_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..1677be7b8ddb2cede18fca34be46a40a3b5db52d GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=68s{}i~pm-+eCMn*P; zhJIhM (RenderTypes.ROBOT_RAINBOW_FLAG, 6f) + case RobotRenderer.TransFlag => (RenderTypes.ROBOT_TRANS_FLAG, 5f) + case _ => return + } + + val r = buffer.getBuffer(renderType) + val x = 2f / 16f + val flagBottom = 13.5f / 16f + val flagTop = (13.5f + flagHeight / 2f) / 16f + val flagFront = 10.5f / 16f + val flagBack = 15.5f / 16f + val poleBottom = 10.5f / 16f + val poleTop = 13.5f / 16f + val poleBack = 11f / 16f + + @inline def lu(value: Float) = value / 16f + @inline def lv(value: Float) = value / 16f + + def quad(y0: Float, y1: Float, z0: Float, z1: Float, + u0: Float, v0: Float, u1: Float, v1: Float): Unit = { + r.addVertex(stack.last.pose(), x, y0, z0).setColor(0xFF, 0xFF, 0xFF, 0xFF).setUv(lu(u0), lv(v1)).setLight(light).setNormal(stack.last, 1, 0, 0) + r.addVertex(stack.last.pose(), x, y1, z0).setColor(0xFF, 0xFF, 0xFF, 0xFF).setUv(lu(u0), lv(v0)).setLight(light).setNormal(stack.last, 1, 0, 0) + r.addVertex(stack.last.pose(), x, y1, z1).setColor(0xFF, 0xFF, 0xFF, 0xFF).setUv(lu(u1), lv(v0)).setLight(light).setNormal(stack.last, 1, 0, 0) + r.addVertex(stack.last.pose(), x, y0, z1).setColor(0xFF, 0xFF, 0xFF, 0xFF).setUv(lu(u1), lv(v1)).setLight(light).setNormal(stack.last, 1, 0, 0) + } + + stack.pushPose() + stack.translate(x, 11f / 16f, 10.75f / 16f) + stack.mulPose(Axis.XP.rotationDegrees(22.5f)) + stack.translate(-x, -11f / 16f, -10.75f / 16f) + + quad(flagBottom, flagTop, flagFront, flagBack, 0, 0, 7, flagHeight) + quad(poleBottom, poleTop, flagFront, poleBack, 13, 0, 14, 6) + + stack.popPose() + } + private def drawTop( stack: PoseStack, buffer: MultiBufferSource, @@ -192,6 +240,8 @@ class RobotRenderer extends TileEntityRenderer[blockentity.RobotProxy] { if (!isRunning) stack.translate(0, -2 * gap, 0) drawTop(stack, buffer, light, cr, cg, cb) + if (robot != null) robot.info.flag.foreach(drawFlag(stack, buffer, light, _)) + if (isRunning) { val lightColor = if (event.lightColor < 0) { if (robot != null && robot.info != null) robot.info.lightColor else 0xF23030 @@ -405,4 +455,4 @@ class RobotRenderer extends TileEntityRenderer[blockentity.RobotProxy] { RenderState.checkError(getClass.getName + ".render: leaving") } -} \ No newline at end of file +} diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index b98b722043..d752b86b33 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -280,10 +280,17 @@ object EventHandler { new MicrocontrollerData(stack).components.find(api.Items.get(_) == eeprom).asStackOption }) || didRecraft - didRecraft = recraft(e, robot, stack => { - // Restore EEPROM currently used in robot. - new RobotData(stack).components.find(api.Items.get(_) == eeprom).asStackOption - }) || didRecraft + // The robot recrafting recipe swaps an EEPROM and returns the old one. + // Do not treat unrelated robot-to-robot recipes (such as cosmetics) as + // EEPROM swaps merely because their input and output items match. + val swapsRobotEeprom = (0 until e.getInventory.getContainerSize).exists(slot => + api.Items.get(e.getInventory.getItem(slot)) == eeprom) + if (swapsRobotEeprom) { + didRecraft = recraft(e, robot, stack => { + // Restore EEPROM currently used in robot. + new RobotData(stack).components.find(api.Items.get(_) == eeprom).asStackOption + }) || didRecraft + } didRecraft = recraft(e, tablet, stack => { // Restore EEPROM currently used in tablet. diff --git a/src/main/scala/li/cil/oc/common/datacomponents/OCComponents.scala b/src/main/scala/li/cil/oc/common/datacomponents/OCComponents.scala index 68fa984877..6d06da5598 100644 --- a/src/main/scala/li/cil/oc/common/datacomponents/OCComponents.scala +++ b/src/main/scala/li/cil/oc/common/datacomponents/OCComponents.scala @@ -108,6 +108,7 @@ object OCComponents { val DRONE_STATE: Type[DroneState] = persistentShared("drone_state", DroneState.CODEC, DroneState.STREAM_CODEC) val STATUS_TEXT: Type[Component] = persistentShared("status_text", ComponentSerialization.FLAT_CODEC, ComponentSerialization.STREAM_CODEC) val LIGHT_COLOR: Type[ColorRGBA] = persistentShared("light_color", ColorRGBA.CODEC, ScalaStreamCodec.COLOR_RGBA) + val ROBOT_FLAG: Type[ResourceLocation] = persistentShared("robot_flag", ResourceLocation.CODEC, ResourceLocation.STREAM_CODEC) val PRINT: Type[PrintData] = persistentShared("print", PrintData.CODEC, PrintData.STREAM_CODEC) val FILESYSTEM_DATA: Type[CompoundTag] = persistent("filesystem", CompoundTag.CODEC) val ROBOT_ROM_FILESYSTEM_DATA: Type[CompoundTag] = persistent("robot_rom_filesystem", CompoundTag.CODEC) diff --git a/src/main/scala/li/cil/oc/common/item/data/RobotData.scala b/src/main/scala/li/cil/oc/common/item/data/RobotData.scala index f69c41bb7b..6fda39aa10 100644 --- a/src/main/scala/li/cil/oc/common/item/data/RobotData.scala +++ b/src/main/scala/li/cil/oc/common/item/data/RobotData.scala @@ -20,6 +20,7 @@ import scala.jdk.CollectionConverters._ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.Tag import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation import net.minecraft.util.ColorRGBA import net.neoforged.neoforge.common.MutableDataComponentHolder import net.neoforged.neoforge.server.ServerLifecycleHooks @@ -57,6 +58,7 @@ class RobotData extends ItemData(Constants.BlockName.Robot) { var components = Array.empty[ItemStack] var containers = Array.empty[ItemStack] var lightColor = 0xF23030 + var flag: Option[ResourceLocation] = None private final val StoredEnergyTag = Settings.namespace + "storedEnergy" private final val RobotEnergyTag = Settings.namespace + "robotEnergy" @@ -91,6 +93,8 @@ class RobotData extends ItemData(Constants.BlockName.Robot) { for(color <- holder.getComponent(OCComponents.LIGHT_COLOR)) { lightColor = color.rgba } + + flag = holder.getComponent(OCComponents.ROBOT_FLAG) } override def saveData(holder: MutableDataComponentHolder): Unit = { @@ -100,6 +104,7 @@ class RobotData extends ItemData(Constants.BlockName.Robot) { holder.setComponent(OCComponents.COMPONENTS, components.map(ImmutableItemStack.copyOf).toList) holder.setComponent(OCComponents.CONTAINERS, containers.map(ImmutableItemStack.copyOf).toList) holder.setComponent(OCComponents.LIGHT_COLOR, new ColorRGBA(lightColor)) + holder.setComponent(OCComponents.ROBOT_FLAG, flag) } def copyItemStack(provider: HolderLookup.Provider) = { diff --git a/src/main/scala/li/cil/oc/common/recipe/Recipes.java b/src/main/scala/li/cil/oc/common/recipe/Recipes.java index d7669bce68..402c46210b 100644 --- a/src/main/scala/li/cil/oc/common/recipe/Recipes.java +++ b/src/main/scala/li/cil/oc/common/recipe/Recipes.java @@ -37,6 +37,7 @@ public RecipeSerializer getSerializer() { ); public static final RecipeRegistration COLORIZE = register("crafting_colorize", new ItemSpecialSerializer<>(ColorizeRecipe::new, ColorizeRecipe::targetItem)); public static final RecipeRegistration DECOLORIZE = register("crafting_decolorize", new ItemSpecialSerializer<>(DecolorizeRecipe::new, DecolorizeRecipe::targetItem)); + public static final RecipeRegistration ROBOT_FLAG = register("crafting_robot_flag", new RobotFlagRecipe.Serializer()); public static final RecipeRegistration SHAPED_EXTENDED = register("crafting_shaped_extended", new ExtendedShapedRecipe.Serializer()); public static final RecipeRegistration SHAPELESS_EXTENDED = register("crafting_shapeless_extended", new ExtendedShapelessRecipe.Serializer()); diff --git a/src/main/scala/li/cil/oc/common/recipe/RobotFlagRecipe.java b/src/main/scala/li/cil/oc/common/recipe/RobotFlagRecipe.java new file mode 100644 index 0000000000..d6dae1f5ec --- /dev/null +++ b/src/main/scala/li/cil/oc/common/recipe/RobotFlagRecipe.java @@ -0,0 +1,118 @@ +package li.cil.oc.common.recipe; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.ShapelessRecipe; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; + +/** + * Applies a flag to a robot while preserving the robot ItemStack verbatim. + * + *

The general extended recipe wrapper treats any device-to-device recipe as + * an EEPROM swap. A cosmetic recipe must not enter that path: it only applies + * the result's component patch to the input robot.

+ */ +public final class RobotFlagRecipe implements CraftingRecipe { + private final ShapelessRecipe wrapped; + + public RobotFlagRecipe(ShapelessRecipe wrapped) { + this.wrapped = wrapped; + } + + @Override + public boolean matches(@NonNull CraftingInput inv, @NonNull Level level) { + return wrapped.matches(inv, level); + } + + @Override + public ItemStack assemble(@NonNull CraftingInput inv, @NotNull HolderLookup.Provider provider) { + ItemStack recipeResult = wrapped.assemble(inv, provider); + if (recipeResult.isEmpty()) return ItemStack.EMPTY; + + for (int slot = 0; slot < inv.size(); slot++) { + ItemStack input = inv.getItem(slot); + if (!input.isEmpty() && input.is(recipeResult.getItem())) { + ItemStack output = input.copy(); + output.setCount(recipeResult.getCount()); + output.applyComponents(recipeResult.getComponentsPatch()); + return output; + } + } + + return ItemStack.EMPTY; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { + return wrapped.canCraftInDimensions(width, height); + } + + @Override + public ItemStack getResultItem(@NotNull HolderLookup.Provider provider) { + return wrapped.getResultItem(provider); + } + + @Override + public NonNullList getRemainingItems(CraftingInput inv) { + return wrapped.getRemainingItems(inv); + } + + @Override + public NonNullList getIngredients() { + return wrapped.getIngredients(); + } + + @Override + public RecipeSerializer getSerializer() { + return Recipes.ROBOT_FLAG.getSerializer(); + } + + @Override + public RecipeType getType() { + return RecipeType.CRAFTING; + } + + @Override + public CraftingBookCategory category() { + return wrapped.category(); + } + + @Override + public String getGroup() { + return wrapped.getGroup(); + } + + @Override + public boolean showNotification() { + return wrapped.showNotification(); + } + + public static final class Serializer implements RecipeSerializer { + private static final MapCodec CODEC = + RecipeSerializer.SHAPELESS_RECIPE.codec().xmap(RobotFlagRecipe::new, recipe -> recipe.wrapped); + private static final StreamCodec STREAM_CODEC = + RecipeSerializer.SHAPELESS_RECIPE.streamCodec().map(RobotFlagRecipe::new, recipe -> recipe.wrapped); + + @Override + public @NotNull MapCodec codec() { + return CODEC; + } + + @Override + public @NotNull StreamCodec streamCodec() { + return STREAM_CODEC; + } + } +} From cc0871e805e1bdcad06020610b699f903d9b833a Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 12:52:22 -0700 Subject: [PATCH 21/38] Correct CC:T Pride flag license --- LICENSE | 2 +- LICENSES/CC-Tweaked.txt | 120 ---------------------------------------- THIRD_PARTY_NOTICES.md | 6 +- 3 files changed, 4 insertions(+), 124 deletions(-) delete mode 100644 LICENSES/CC-Tweaked.txt diff --git a/LICENSE b/LICENSE index 75df302bfa..c5ba635fc9 100644 --- a/LICENSE +++ b/LICENSE @@ -49,4 +49,4 @@ Assets from other sources: OpenScreens display block portions: copyright (c) 2019 its_meow, MIT License, see LICENSES/OpenScreens.txt. CC:Tweaked rainbow and trans robot flag textures: - ComputerCraft Public License, see LICENSES/CC-Tweaked.txt. + CC0 1.0 Universal, relicensed with permission; see LICENSES/CC-Tweaked.txt. diff --git a/LICENSES/CC-Tweaked.txt b/LICENSES/CC-Tweaked.txt deleted file mode 100644 index 7e6e054718..0000000000 --- a/LICENSES/CC-Tweaked.txt +++ /dev/null @@ -1,120 +0,0 @@ -CC:Tweaked pride flag textures - -Source: CC:Tweaked 1.119.0 -https://github.com/cc-tweaked/CC-Tweaked - -Copyright: Daniel Ratcliffe and the CC:Tweaked developers -License: ComputerCraft Public License 1.0.0 - -ComputerCraft Public License - -============================ - -Version 1.0.0 (Based on Minecraft Mod Public License 1.0.1) - -0. Definitions - --------------- - -Minecraft: Denotes a copy of the PC Java version of the game “Minecraft” licensed by Mojang AB - -User: Anybody that interacts with the software in one of the following ways: - - - play - - - decompile - - - recompile or compile - - - modify - - - distribute - -Mod: The mod code designated by the present license, in source form, binary -form, as obtained standalone, as part of a wider distribution or resulting from -the compilation of the original or modified sources. - -Dependency: Code required for the mod to work properly. This includes -dependencies required to compile the code as well as any file or modification -that is explicitly or implicitly required for the mod to be working. - -1. Scope - --------- - -The present license is granted to any user of the mod. As a prerequisite, -a user must own a legally acquired copy of Minecraft - -2. Liability - ------------- - -This mod is provided 'as is' with no warranties, implied or otherwise. The owner -of this mod takes no responsibility for any damages incurred from the use of -this mod. This mod alters fundamental parts of the Minecraft game, parts of -Minecraft may not work with this mod installed. All damages caused from the use -or misuse of this mod fall on the user. - -3. Play rights - --------------- - -The user is allowed to install this mod on a Minecraft client or server and to play -without restriction. - -4. Modification rights - ----------------------- - -The user has the right to decompile the source code, look at either the -decompiled version or the original source code, and to modify it. - -5. Distribution of original or modified copy rights - ---------------------------------------------------- - -Is subject to distribution rights this entire mod in its various forms. This -include: - - - original binary or source forms of this mod files - - - modified versions of these binaries or source files, as well as binaries - resulting from source modifications - - - patch to its source or binary files - - - any copy of a portion of its binary source files - -The user is allowed to redistribute this mod partially, in totality, or -included in a distribution. -When distributing binary files, the user must provide means to obtain its -entire set of sources or modified sources at no cost. -All distributions of this mod must remain licensed under the CCPL. -All dependencies that this mod have on other mods or classes must be licensed -under conditions comparable to this version of CCPL, with the exception of the -Minecraft code and the mod loading framework (e.g. Forge). - -Modified version of binaries and sources, as well as files containing sections -copied from this mod, should be distributed under the terms of the present -license. - -7. Use of mod code and assets in other projects - ------------------------------------------------ - -It is permitted to use the code and assets contained in this mod (and modified -versions thereof) in other Minecraft Mods, provided they are non-commercial. -However: the code and assets may not be used in commercial mods, mods for other -games, other games, other non-game projects, or any commercial projects. -When using code covered by this license in other projects, the source code used -must be made available at no cost and remain licensed under the CCPL. - -8. Contributing - ---------------- - -If you choose to contribute code or assets to be included in this mod, you -agree that, if added to to the main repository at -https://github.com/dan200/ComputerCraft, your contributions will be covered by -this license, and that Daniel Ratcliffe will retain the right to re-license the -mod, including your contributions, in part or in whole, under other licenses. diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index f0b740ca66..d3c0d9b88a 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -1,10 +1,10 @@ # Third-party notices OpenComputers contains or distributes work from other projects. Their license -texts are retained in the [`LICENSES`](LICENSES) directory and are packaged in -release JARs under `META-INF/licenses`. +and provenance notices are retained in the [`LICENSES`](LICENSES) directory and +are packaged in release JARs under `META-INF/licenses`. -| Component | Use | License file | +| Component | Use | License / notice | | --- | --- | --- | | JNLua | Lua runtime bindings and native libraries | [JNLua](LICENSES/JNLua.txt) | | LuaJ | Pure-Java Lua fallback | [LuaJ](LICENSES/LuaJ.txt) | From 56388d9f504c8e79598d16afabdb563efaa05a14 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sat, 8 Aug 2026 10:44:34 -0700 Subject: [PATCH 22/38] Add Create train computer integration and train robot --- .../assets/opencomputers/lang/en_us.json | 1 + src/main/scala/li/cil/oc/OpenComputers.scala | 1 + src/main/scala/li/cil/oc/client/Proxy.scala | 3 +- .../entity/CreateTrainRobotHatRenderer.scala | 28 +++++ .../renderer/entity/TrainRobotRenderer.scala | 59 ++++++++++ .../li/cil/oc/common/block/RobotProxy.scala | 13 ++- .../blockentity/traits/TextBuffer.scala | 9 +- .../cil/oc/common/component/TextBuffer.scala | 7 +- .../li/cil/oc/common/entity/EntityTypes.java | 9 ++ .../li/cil/oc/common/entity/TrainRobot.scala | 104 ++++++++++++++++++ 10 files changed, 227 insertions(+), 7 deletions(-) create mode 100644 src/main/scala/li/cil/oc/client/renderer/entity/CreateTrainRobotHatRenderer.scala create mode 100644 src/main/scala/li/cil/oc/client/renderer/entity/TrainRobotRenderer.scala create mode 100644 src/main/scala/li/cil/oc/common/entity/TrainRobot.scala diff --git a/src/main/resources/assets/opencomputers/lang/en_us.json b/src/main/resources/assets/opencomputers/lang/en_us.json index 2472a0cb27..b2e6600582 100644 --- a/src/main/resources/assets/opencomputers/lang/en_us.json +++ b/src/main/resources/assets/opencomputers/lang/en_us.json @@ -196,6 +196,7 @@ "itemGroup.OpenComputers.section.80_upgrade": "Upgrades§f", "itemGroup.OpenComputers.section.99_misc": "Miscellaneous§f", "entity.oc.Drone": "Drone", + "entity.oc.TrainRobot": "Train Robot", "oc:gui.Analyzer.Address": "§6Address§f: %s", "oc:gui.Analyzer.AddressCopied": "Address copied to clipboard.", "oc:gui.Analyzer.ChargerSpeed": "§6Charge speed§f: %s", diff --git a/src/main/scala/li/cil/oc/OpenComputers.scala b/src/main/scala/li/cil/oc/OpenComputers.scala index 646ce02852..5ab6917251 100644 --- a/src/main/scala/li/cil/oc/OpenComputers.scala +++ b/src/main/scala/li/cil/oc/OpenComputers.scala @@ -70,6 +70,7 @@ class OpenComputers(modBus: IEventBus, modContainer: ModContainer) { Recipes.init(modBus) LootFunctions.init(modBus) EntityTypes.ENTITY_TYPES.register(modBus) + modBus.addListener(EntityTypes.onAttributeCreation) MenuTypes.MENU.register(modBus) OpenPrinter.init(modBus, modContainer) modBus.register(CreativeTab) diff --git a/src/main/scala/li/cil/oc/client/Proxy.scala b/src/main/scala/li/cil/oc/client/Proxy.scala index fda99a84f1..e63ae9a8b7 100644 --- a/src/main/scala/li/cil/oc/client/Proxy.scala +++ b/src/main/scala/li/cil/oc/client/Proxy.scala @@ -4,7 +4,7 @@ import li.cil.oc.{api, client} import li.cil.oc.client.gui.GuiTypes import li.cil.oc.client.renderer._ import li.cil.oc.client.renderer.block.{ModelInitialization, NetSplitterModel} -import li.cil.oc.client.renderer.entity.{DroneRenderer, ModelQuadcopter} +import li.cil.oc.client.renderer.entity.{DroneRenderer, ModelQuadcopter, TrainRobotRenderer} import li.cil.oc.client.renderer.tileentity._ import li.cil.oc.common.blockentity.BlockEntityTypes import li.cil.oc.common.component.TextBuffer @@ -73,6 +73,7 @@ private[oc] class Proxy(modBus: IEventBus) extends CommonProxy(modBus) { @SubscribeEvent def onRegisterRenderers(e: EntityRenderersEvent.RegisterRenderers): Unit = { e.registerEntityRenderer(EntityTypes.DRONE.get(), ctx => new DroneRenderer(ctx)) + e.registerEntityRenderer(EntityTypes.TRAIN_ROBOT.get(), ctx => new TrainRobotRenderer(ctx)) BlockEntityRenderers.register(BlockEntityTypes.ADAPTER.get(), AdapterRenderer) BlockEntityRenderers.register(BlockEntityTypes.ASSEMBLER.get(), AssemblerRenderer) diff --git a/src/main/scala/li/cil/oc/client/renderer/entity/CreateTrainRobotHatRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/entity/CreateTrainRobotHatRenderer.scala new file mode 100644 index 0000000000..9b98797ae6 --- /dev/null +++ b/src/main/scala/li/cil/oc/client/renderer/entity/CreateTrainRobotHatRenderer.scala @@ -0,0 +1,28 @@ +package li.cil.oc.client.renderer.entity + +import com.mojang.blaze3d.vertex.PoseStack +import com.simibubi.create.AllPartialModels +import com.simibubi.create.content.equipment.hats.EntityHats +import net.createmod.catnip.render.CachedBuffers +import net.createmod.catnip.render.SuperByteBuffer +import net.minecraft.client.renderer.{MultiBufferSource, Sheets} +import net.minecraft.world.level.block.Blocks +import li.cil.oc.common.entity.TrainRobot + +/** Renders Create's train hat without making the base entity renderer require Create at runtime. */ +object CreateTrainRobotHatRenderer { + def render(entity: TrainRobot, pose: PoseStack, buffer: MultiBufferSource, light: Int): Unit = { + if (!EntityHats.shouldRenderTrainHat(entity)) return + + pose.pushPose() + // The robot's chassis is wider than a normal mob head. Keep the hat's + // point above the chassis while bringing the brim down onto it. + pose.translate(0.5, 0.86, 0.5) + pose.scale(0.8f, 0.8f, 0.8f) + val hat = CachedBuffers.partial(AllPartialModels.TRAIN_HAT, Blocks.AIR.defaultBlockState()).asInstanceOf[SuperByteBuffer] + hat.disableDiffuse() + hat.light(light) + hat.renderInto(pose, buffer.getBuffer(Sheets.cutoutBlockSheet())) + pose.popPose() + } +} diff --git a/src/main/scala/li/cil/oc/client/renderer/entity/TrainRobotRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/entity/TrainRobotRenderer.scala new file mode 100644 index 0000000000..e64a50b352 --- /dev/null +++ b/src/main/scala/li/cil/oc/client/renderer/entity/TrainRobotRenderer.scala @@ -0,0 +1,59 @@ +package li.cil.oc.client.renderer.entity + +import com.mojang.blaze3d.vertex.PoseStack +import li.cil.oc.client.Textures +import li.cil.oc.client.renderer.tileentity.RobotRenderer +import li.cil.oc.common.entity.TrainRobot +import net.minecraft.client.renderer.MultiBufferSource +import net.minecraft.client.renderer.entity.{EntityRenderer, EntityRendererProvider} +import net.minecraft.util.Mth +import com.mojang.math.Axis + +import java.lang.reflect.Method + +class TrainRobotRenderer(ctx: EntityRendererProvider.Context) extends EntityRenderer[TrainRobot](ctx) { + shadowRadius = 0f + + private val createHatRenderer: Option[(AnyRef, Method)] = try { + val companion = Class.forName("li.cil.oc.client.renderer.entity.CreateTrainRobotHatRenderer$") + val module = companion.getField("MODULE$").get(null).asInstanceOf[AnyRef] + val method = companion.getMethod( + "render", + classOf[TrainRobot], + classOf[PoseStack], + classOf[MultiBufferSource], + java.lang.Integer.TYPE + ) + Some(module -> method) + } + catch { + case _: Throwable => None + } + + override def render(entity: TrainRobot, + yaw: Float, + partialTick: Float, + pose: PoseStack, + buffer: MultiBufferSource, + light: Int): Unit = { + pose.pushPose() + val renderYaw = Mth.rotLerp(partialTick, entity.yRotO, entity.getYRot) + pose.mulPose(Axis.YP.rotationDegrees(renderYaw)) + pose.translate(-0.5, 0, -0.5) + RobotRenderer.renderChassis( + pose, + buffer, + light, + offset = entity.tickCount + partialTick, + isRunningOverride = true + ) + createHatRenderer.foreach { case (module, method) => + try method.invoke(module, entity, pose, buffer, Int.box(light)) + catch { case _: Throwable => () } + } + pose.popPose() + super.render(entity, yaw, partialTick, pose, buffer, light) + } + + override def getTextureLocation(entity: TrainRobot) = Textures.Model.Robot +} diff --git a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala index 61b2ee41ac..0eff69d9b1 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala @@ -6,6 +6,7 @@ import li.cil.oc.common.item.data.RobotData import li.cil.oc.common.menu.MenuTypes import li.cil.oc.common.blockentity import li.cil.oc.common.blockentity.BlockEntityTypes +import li.cil.oc.common.entity.TrainRobot import li.cil.oc.server.{PacketSender, agent} import li.cil.oc.server.loot.LootFunctions import li.cil.oc.util.{BlockPosition, InventoryUtils, Tooltip} @@ -154,7 +155,17 @@ class RobotProxy(props: Properties) extends RedstoneAware(props) with traits.Sta // ----------------------------------------------------------------------- // override def localOnBlockActivated(world: World, pos: BlockPos, player: PlayerEntity, hand: Hand, heldItem: ItemStack, side: Direction, hitX: Float, hitY: Float, hitZ: Float): Boolean = { - if (!player.isCrouching) { + if (!player.isCrouching && TrainRobot.isHat(heldItem)) { + if (!world.isClientSide) { + world.getBlockEntity(pos) match { + case proxy: blockentity.RobotProxy if TrainRobot.replaceRobot(world, pos, player.getYRot, proxy) => + if (!player.isCreative) heldItem.shrink(1) + case _ => + } + } + true + } + else if (!player.isCrouching) { if (!world.isClientSide) { // We only send slot changes to nearby players, so if there was no slot // change since this player got into range he might have the wrong one, diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala index 63807340e1..4286cea43a 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala @@ -39,8 +39,13 @@ trait TextBuffer extends Environment with Tickable { /** Create renders captured screens in a virtual level, but packets use the real client level. */ def registerMovingClientBuffer(level: Level): Unit = buffer match { case moving: li.cil.oc.common.component.TextBuffer if movingClientLevel ne level => - movingClientLevel = level - moving.registerClientBufferOnLevel(level) + // The captured client block entity can be constructed before its + // component snapshot supplies the node address. Do not remember a + // failed registration, or the real-world tracker will never receive + // this screen's updates after the address arrives. + if (moving.registerClientBufferOnLevel(level)) { + movingClientLevel = level + } case _ => } diff --git a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala index 2f85020fdc..0d90294bfb 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -110,7 +110,7 @@ class TextBuffer(val host: EnvironmentHost) extends AbstractManagedEnvironment w } /** Register a captured Create screen with the real client world. */ - def registerClientBufferOnLevel(level: Level): Unit = + def registerClientBufferOnLevel(level: Level): Boolean = TextBuffer.registerClientBuffer(this, level) /** Remove a captured Create screen from the client tracker after disassembly. */ @@ -568,8 +568,8 @@ object TextBuffer { registerClientBuffer(t, t.host.getEnvironmentLevel) } - def registerClientBuffer(t: TextBuffer, level: Level): Unit = { - if (level == null || Strings.isNullOrEmpty(t.proxy.nodeAddress)) return + def registerClientBuffer(t: TextBuffer, level: Level): Boolean = { + if (level == null || Strings.isNullOrEmpty(t.proxy.nodeAddress)) return false // Captured block entities initially register against Create's virtual // render level. Move the same buffer to the real client level instead. @@ -588,6 +588,7 @@ object TextBuffer { } ClientPacketSender.sendTextBufferInit(t.proxy.nodeAddress) + true } def unregisterClientBuffer(t: TextBuffer, level: Level): Unit = { diff --git a/src/main/scala/li/cil/oc/common/entity/EntityTypes.java b/src/main/scala/li/cil/oc/common/entity/EntityTypes.java index f19282f80e..76d18e34bb 100644 --- a/src/main/scala/li/cil/oc/common/entity/EntityTypes.java +++ b/src/main/scala/li/cil/oc/common/entity/EntityTypes.java @@ -4,6 +4,7 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; +import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; @@ -15,6 +16,14 @@ public final class EntityTypes { ENTITY_TYPES.register("drone", () -> EntityType.Builder.of(Drone::new, MobCategory.MISC) .sized(12 / 16f, 6 / 16f).fireImmune().build("drone")); + public static final DeferredHolder, EntityType> TRAIN_ROBOT = + ENTITY_TYPES.register("train_robot", () -> EntityType.Builder.of(TrainRobot::new, MobCategory.MISC) + .sized(12 / 16f, 12 / 16f).fireImmune().build("train_robot")); + + public static void onAttributeCreation(EntityAttributeCreationEvent event) { + event.put(TRAIN_ROBOT.get(), TrainRobot.createMobAttributes().build()); + } + private EntityTypes() { throw new Error(); } diff --git a/src/main/scala/li/cil/oc/common/entity/TrainRobot.scala b/src/main/scala/li/cil/oc/common/entity/TrainRobot.scala new file mode 100644 index 0000000000..d107deca25 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/entity/TrainRobot.scala @@ -0,0 +1,104 @@ +package li.cil.oc.common.entity + +import net.minecraft.network.chat.Component +import net.minecraft.core.BlockPos +import net.minecraft.world.entity.{Entity, EntityType, EquipmentSlot, Mob, MoverType} +import net.minecraft.world.item.{ArmorItem, ItemStack} +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Blocks +import net.minecraft.world.phys.Vec3 + +object TrainRobot { + /** Any vanilla or modded head armor can be used as the physical hat. */ + def isHat(stack: ItemStack): Boolean = stack.getItem match { + case armor: ArmorItem => armor.getEquipmentSlot == EquipmentSlot.HEAD + case _ => false + } + + def replaceRobot(level: Level, pos: BlockPos, yaw: Float, proxy: li.cil.oc.common.blockentity.RobotProxy): Boolean = { + val entity = EntityTypes.TRAIN_ROBOT.get().create(level) + if (entity == null) return false + + // The assembled robot is intentionally consumed; the train robot has no + // computer or inventory to migrate. + proxy.robot.node.remove() + proxy.robot.saveComponents() + if (!level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3)) return false + + entity.setPos(pos.getX + 0.5, pos.getY, pos.getZ + 0.5) + entity.setYRot(yaw) + entity.setYHeadRot(yaw) + entity.getPersistentData.putBoolean("TrainHat", true) + level.addFreshEntity(entity) + true + } +} + +/** + * A deliberately inert robot-shaped mob for Create train conductor seats. + * + * It is a Mob so vanilla lead interaction can target it. Create only needs a + * non-player passenger in a conductor seat, so there is no computer, AI, or + * other robot functionality attached to this entity. + */ +class TrainRobot(selfType: EntityType[TrainRobot], level: Level) extends Mob(selfType, level) { + setNoAi(true) + + override protected def registerGoals(): Unit = () + + override def tick(): Unit = { + super.tick() + if (isPassenger) faceMotion() + } + + private def faceMotion(): Unit = { + val vehicle = getVehicle + if (vehicle == null) return + + val delta = vehicle.position().subtract(vehicle.xo, vehicle.yo, vehicle.zo) + val horizontal = new Vec3(delta.x, 0, delta.z) + if (horizontal.lengthSqr() > 0.0001) { + val yaw = (-math.toDegrees(math.atan2(horizontal.x, horizontal.z))).toFloat + setYRot(yaw) + setYHeadRot(yaw) + } + } + + // No-AI mobs do not pathfind toward a leash holder. Keep the leash attached + // and use the vanilla movement tick to pull this inert conductor instead. + override def closeRangeLeashBehaviour(holder: Entity): Unit = moveToward(holder, 0.12) + + override def elasticRangeLeashBehaviour(holder: Entity, distance: Float): Unit = { + moveToward(holder, math.min(0.45, 0.12 + (distance - 6.0) * 0.05)) + } + + override def leashTooFarBehaviour(): Unit = { + val holder = getLeashHolder + if (holder != null) elasticRangeLeashBehaviour(holder, distanceTo(holder)) + } + + private def moveToward(holder: Entity, speed: Double): Unit = { + val delta = holder.position().subtract(position()) + val horizontal = new Vec3(delta.x, 0, delta.z) + if (horizontal.lengthSqr() > 0.01) { + val direction = horizontal.normalize() + val current = getDeltaMovement + val pull = direction.scale(math.min(speed, horizontal.length() * 0.5)) + move(MoverType.SELF, pull) + setDeltaMovement(0, current.y, 0) + if (!isPassenger) { + setYRot((math.toDegrees(math.atan2(direction.z, direction.x)) - 90).toFloat) + setYHeadRot(getYRot) + } + } else { + val current = getDeltaMovement + setDeltaMovement(0, current.y, 0) + } + } + + override def mobInteract(player: net.minecraft.world.entity.player.Player, + hand: net.minecraft.world.InteractionHand) = + net.minecraft.world.InteractionResult.PASS + + override def getName: Component = Component.translatable("entity.oc.TrainRobot") +} From b4dfefedefc3b991b087ddc0a66edc9123cf4efe Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 12:56:35 -0700 Subject: [PATCH 23/38] Create CC-Tweaked.txt --- LICENSES/CC-Tweaked.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 LICENSES/CC-Tweaked.txt diff --git a/LICENSES/CC-Tweaked.txt b/LICENSES/CC-Tweaked.txt new file mode 100644 index 0000000000..4338246b94 --- /dev/null +++ b/LICENSES/CC-Tweaked.txt @@ -0,0 +1,18 @@ +CC:Tweaked pride flag textures + +Source project: CC:Tweaked 1.119.0 +https://github.com/cc-tweaked/CC-Tweaked + +Upstream files: + projects/common/src/main/resources/assets/computercraft/textures/block/turtle_rainbow_overlay.png + projects/common/src/main/resources/assets/computercraft/textures/block/turtle_trans_overlay.png + +Adapted OpenComputers files: + src/main/resources/assets/opencomputers/textures/model/robot_rainbow_flag.png + src/main/resources/assets/opencomputers/textures/model/robot_trans_flag.png + +License: CC0 1.0 Universal +https://creativecommons.org/publicdomain/zero/1.0/ + +Relicensing permission from SquidDev, maintainer of CC:Tweaked, on 2026-08-09: + "Happy to share them as CC0." From 97d57057c9eaaeeb3f97b53b80571b5c8445dfd5 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 16:07:41 -0700 Subject: [PATCH 24/38] Persist train component, make sure screens initialize after restore --- .../create/CreateTrainEnvironment.java | 22 +++++++++++++++++-- .../li/cil/oc/server/machine/Machine.scala | 6 +++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/li/cil/oc/integration/create/CreateTrainEnvironment.java b/src/main/java/li/cil/oc/integration/create/CreateTrainEnvironment.java index b1780c51e7..47873a09f8 100644 --- a/src/main/java/li/cil/oc/integration/create/CreateTrainEnvironment.java +++ b/src/main/java/li/cil/oc/integration/create/CreateTrainEnvironment.java @@ -7,7 +7,10 @@ import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.content.trains.station.TrainEditPacket; import com.simibubi.create.foundation.utility.StringHelper; +import li.cil.oc.api.DataComponents; import li.cil.oc.api.Network; +import li.cil.oc.api.UnrecoverablePersistanceException; +import li.cil.oc.api.datacomponents.MutableNbtComponentHolder; import li.cil.oc.api.driver.NamedBlock; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; @@ -29,9 +32,11 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.level.Level; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; +import java.util.UUID; import java.util.WeakHashMap; import java.util.regex.PatternSyntaxException; @@ -42,17 +47,30 @@ public final class CreateTrainEnvironment extends AbstractManagedEnvironment imp private final Train train; private final Level level; - private CreateTrainEnvironment(final Train train, final Level level) { + private CreateTrainEnvironment(final Train train, final Level level, final String address) { this.train = train; this.level = level; setNode(Network.newNode(this, Visibility.Network).withComponent("train").create()); + final MutableNbtComponentHolder addressHolder = new MutableNbtComponentHolder(); + addressHolder.set(DataComponents.ADDRESS.get(), address); + try { + node().loadData(addressHolder); + } catch (final UnrecoverablePersistanceException e) { + throw new IllegalStateException("failed to restore the train component address", e); + } } /** Attach one train component to a computer that is currently inside a train carriage. */ public static synchronized void attach(final Environment computer, final Train train, final Level level) { if (computer == null || computer.node() == null || train == null || level == null || attached.containsKey(computer)) return; - final CreateTrainEnvironment environment = new CreateTrainEnvironment(train, level); + // The train component is recreated whenever Create restores a carriage. + // Give it the same address for the same persisted computer/train pair, + // otherwise the machine restores a stale random address and emits a + // phantom component_removed after every world load. + final String address = UUID.nameUUIDFromBytes((computer.node().address() + ":" + train.id) + .getBytes(StandardCharsets.UTF_8)).toString(); + final CreateTrainEnvironment environment = new CreateTrainEnvironment(train, level, address); attached.put(computer, environment); computer.node().connect(environment.node()); } diff --git a/src/main/scala/li/cil/oc/server/machine/Machine.scala b/src/main/scala/li/cil/oc/server/machine/Machine.scala index 7181fe76d3..7c5068d32e 100644 --- a/src/main/scala/li/cil/oc/server/machine/Machine.scala +++ b/src/main/scala/li/cil/oc/server/machine/Machine.scala @@ -755,6 +755,12 @@ class Machine(val host: MachineHost) extends AbstractManagedEnvironment with mac } } deferredRemovedComponents.clear() + // Create restores a moving contraption's actors one at a time. Once its + // grace period has elapsed, do the same final component check that a + // normal power-on does. Without this, a resumed computer can retain the + // saved addresses of the pre-reload screen/keyboard graph until the + // player manually power-cycles it. + verifyComponents() } } From dd4267fab4dc5b4cc5ca8088cd97566889a95be8 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 16:58:50 -0700 Subject: [PATCH 25/38] Fix TextBuffers loading blank after restore TextBuffers could load blank when restored in a different chunk from where they were saved. --- src/main/scala/li/cil/oc/common/component/TextBuffer.scala | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala index 0d90294bfb..ecfa6d8822 100644 --- a/src/main/scala/li/cil/oc/common/component/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/component/TextBuffer.scala @@ -519,6 +519,13 @@ class TextBuffer(val host: EnvironmentHost) extends AbstractManagedEnvironment w // with its ScreenTier1 constructor buffer and can overwrite the saved // higher resolution before the auxiliary state is recovered. case _: api.internal.Tablet | _: RemoteTerminalHost => data.saveData(holder) + // Create's moving block entities are restored at the train's current + // coordinates, while physical screen buffers normally live in a + // SaveHandler file keyed by the chunk where they were saved. That makes + // the post-reload lookup coordinate-dependent and can replace a real + // terminal with a blank buffer. The captured block-entity NBT travels + // with the contraption, so keep this snapshot inline while it is moving. + case moving: blockentity.traits.BaseBlockEntity if moving.isMoving => data.saveData(holder) case environmentHost: EnvironmentHost => SaveHandler.scheduleSave(environmentHost, new CompoundTag(), bufferPath, (tag: CompoundTag) => { val storage = new CompoundStorage() From be4f8002ad9bd32d9b4d2b684d0437a677f2cdf4 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 23:14:09 -0700 Subject: [PATCH 26/38] Fix tablet rendering with batching mods and shaders Render in-hand tablets through the supplied render buffer to preserve ordering with ImmediatelyFast. Use shader-compatible textured quads for tablet and terminal backgrounds. Write depth for opaque backgrounds to prevent transparency and angle-dependent overlap. Add UV coordinates required by Iris shader hand passes. --- .../cil/oc/client/renderer/RenderTypes.java | 11 ++-- .../oc/client/renderer/TabletRenderer.scala | 54 +++++++++---------- .../renderer/TextBufferRenderCache.scala | 35 +++++++----- .../renderer/font/TextureFontRenderer.scala | 10 ++-- 4 files changed, 59 insertions(+), 51 deletions(-) diff --git a/src/main/scala/li/cil/oc/client/renderer/RenderTypes.java b/src/main/scala/li/cil/oc/client/renderer/RenderTypes.java index fb3a018aa5..9146d3b2c0 100644 --- a/src/main/scala/li/cil/oc/client/renderer/RenderTypes.java +++ b/src/main/scala/li/cil/oc/client/renderer/RenderTypes.java @@ -16,6 +16,8 @@ public class RenderTypes extends RenderType { private static final RenderStateShard.ShaderStateShard POSITION_TEX_COLOR_SHADER = new RenderStateShard.ShaderStateShard(GameRenderer::getPositionTexColorShader); + private static final RenderStateShard.TextureStateShard WHITE_TEXTURE = + new RenderStateShard.TextureStateShard(ResourceLocation.withDefaultNamespace("textures/misc/white.png"), false, false); public static final RenderStateShard.TextureStateShard ROBOT_CHASSIS_TEXTURE = new RenderStateShard.TextureStateShard(Textures.Model$.MODULE$.Robot(), false, false); @@ -113,11 +115,12 @@ private static RenderType createUpgrade(String name, ResourceLocation texture) { .createCompositeState(false)); public static final RenderType FONT_QUAD = create(OpenComputers.ID() + ":font_quad", - DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, 1024, false, false, CompositeState.builder() - .setShaderState(POSITION_COLOR_SHADER) - .setWriteMaskState(COLOR_WRITE) + DefaultVertexFormat.POSITION_TEX_COLOR, VertexFormat.Mode.QUADS, 1024, false, false, CompositeState.builder() + .setShaderState(POSITION_TEX_COLOR_SHADER) + .setTextureState(WHITE_TEXTURE) + .setWriteMaskState(COLOR_DEPTH_WRITE) .setDepthTestState(LEQUAL_DEPTH_TEST) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setTransparencyState(NO_TRANSPARENCY) // NO_CULL required: block rendering works because ScreenRenderer.transform() // applies mirrorScale(1,-1,1) which flips Y and reverses winding to CCW (front-face). // GUI rendering has no Y-flip, so quads are CW (back-face) and get culled without this. diff --git a/src/main/scala/li/cil/oc/client/renderer/TabletRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/TabletRenderer.scala index f5408ffe87..e227ff2460 100644 --- a/src/main/scala/li/cil/oc/client/renderer/TabletRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/TabletRenderer.scala @@ -1,6 +1,6 @@ package li.cil.oc.client.renderer -import com.mojang.blaze3d.vertex.{ByteBufferBuilder, PoseStack, VertexConsumer} +import com.mojang.blaze3d.vertex.{PoseStack, VertexConsumer} import com.mojang.math.Axis import li.cil.oc.{Constants, api} import li.cil.oc.common.component.{TextBuffer => ComponentTextBuffer} @@ -105,7 +105,7 @@ object TabletRenderer { -0.3f * Mth.sin(swingProgress * Math.PI.toFloat)) stack.mulPose(Axis.XP.rotationDegrees(swing * -45f)) stack.mulPose(Axis.YP.rotationDegrees(side * swing * -30f)) - renderTablet(stack, textBuffer, powered, faceSize) + renderTablet(stack, renderBuffer, textBuffer, powered, faceSize) stack.popPose() } @@ -138,7 +138,7 @@ object TabletRenderer { stack.mulPose(Axis.XP.rotationDegrees(Mth.sin(swingRoot * Math.PI.toFloat) * 20f)) stack.scale(2f, 2f, 2f) - renderTablet(stack, textBuffer, powered, CenterFaceSize) + renderTablet(stack, renderBuffer, textBuffer, powered, CenterFaceSize) } private def calculateMapTilt(pitch: Float): Float = { @@ -193,7 +193,11 @@ object TabletRenderer { else playerRenderer.renderLeftHand(stack, renderBuffer, packedLight, minecraft.player) } - private def renderTablet(stack: PoseStack, textBuffer: Option[api.internal.TextBuffer], powered: Boolean, faceSize: Float): Unit = { + private def renderTablet(stack: PoseStack, + renderBuffer: MultiBufferSource, + textBuffer: Option[api.internal.TextBuffer], + powered: Boolean, + faceSize: Float): Unit = { val width = textBuffer.fold(160)(_.renderWidth) val height = textBuffer.fold(90)(_.renderHeight) if (width <= 0 || height <= 0) return @@ -207,12 +211,12 @@ object TabletRenderer { stack.scale(scale, scale, -1f) stack.translate(-width * 0.5, -height * 0.5, 0) - renderFrame(stack, width, height, powered) + renderFrame(stack, renderBuffer, width, height, powered) for (buffer <- textBuffer if buffer.isRenderingEnabled) { stack.translate(0, 0, 0.002f) buffer match { - case component: ComponentTextBuffer => component.renderText(stack) + case component: ComponentTextBuffer => component.renderText(stack, renderBuffer) case _ => buffer.renderText(stack) } } @@ -220,25 +224,19 @@ object TabletRenderer { stack.popPose() } - private def renderFrame(stack: PoseStack, width: Int, height: Int, powered: Boolean): Unit = { - val byteBuffer = new ByteBufferBuilder(4096) - try { - val source = MultiBufferSource.immediate(byteBuffer) - val builder = source.getBuffer(RenderTypes.FONT_QUAD) - val matrix = stack.last.pose() + private def renderFrame(stack: PoseStack, renderBuffer: MultiBufferSource, width: Int, height: Int, powered: Boolean): Unit = { + val builder = renderBuffer.getBuffer(RenderTypes.FONT_QUAD) + val matrix = stack.last.pose() - val frameWidth = width + FrameBorder * 2 - val frameHeight = height + FrameBorder + BottomBorder - quad(builder, matrix, -FrameBorder, -FrameBorder, frameWidth, frameHeight, 0f, 0x25262D) - quad(builder, matrix, -FrameBorder + 2, -FrameBorder + 2, frameWidth - 4, 2, 0.0005f, 0x4A4C57) - quad(builder, matrix, -FrameBorder + 2, -FrameBorder + 4, 2, frameHeight - 8, 0.0005f, 0x3A3C46) - quad(builder, matrix, -FrameBorder + 2, height + BottomBorder - 4, frameWidth - 4, 2, 0.0005f, 0x17181D) - quad(builder, matrix, width + FrameBorder - 4, -FrameBorder + 4, 2, frameHeight - 8, 0.0005f, 0x17181D) - quad(builder, matrix, 0, 0, width, height, 0.001f, 0x000000) - quad(builder, matrix, width - 8, height + 5, 5, 5, 0.001f, if (powered) 0x66DD55 else 0x333333) - source.endBatch() - } - finally byteBuffer.close() + val frameWidth = width + FrameBorder * 2 + val frameHeight = height + FrameBorder + BottomBorder + quad(builder, matrix, -FrameBorder, -FrameBorder, frameWidth, frameHeight, 0f, 0x25262D) + quad(builder, matrix, -FrameBorder + 2, -FrameBorder + 2, frameWidth - 4, 2, 0.0005f, 0x4A4C57) + quad(builder, matrix, -FrameBorder + 2, -FrameBorder + 4, 2, frameHeight - 8, 0.0005f, 0x3A3C46) + quad(builder, matrix, -FrameBorder + 2, height + BottomBorder - 4, frameWidth - 4, 2, 0.0005f, 0x17181D) + quad(builder, matrix, width + FrameBorder - 4, -FrameBorder + 4, 2, frameHeight - 8, 0.0005f, 0x17181D) + quad(builder, matrix, 0, 0, width, height, 0.001f, 0x000000) + quad(builder, matrix, width - 8, height + 5, 5, 5, 0.001f, if (powered) 0x66DD55 else 0x333333) } private def quad(builder: VertexConsumer, @@ -252,9 +250,9 @@ object TabletRenderer { val r = (color >> 16) & 0xFF val g = (color >> 8) & 0xFF val b = color & 0xFF - builder.addVertex(matrix, x.toFloat, (y + height).toFloat, z).setColor(r, g, b, 255) - builder.addVertex(matrix, (x + width).toFloat, (y + height).toFloat, z).setColor(r, g, b, 255) - builder.addVertex(matrix, (x + width).toFloat, y.toFloat, z).setColor(r, g, b, 255) - builder.addVertex(matrix, x.toFloat, y.toFloat, z).setColor(r, g, b, 255) + builder.addVertex(matrix, x.toFloat, (y + height).toFloat, z).setUv(0f, 1f).setColor(r, g, b, 255) + builder.addVertex(matrix, (x + width).toFloat, (y + height).toFloat, z).setUv(1f, 1f).setColor(r, g, b, 255) + builder.addVertex(matrix, (x + width).toFloat, y.toFloat, z).setUv(1f, 0f).setColor(r, g, b, 255) + builder.addVertex(matrix, x.toFloat, y.toFloat, z).setUv(0f, 0f).setColor(r, g, b, 255) } } diff --git a/src/main/scala/li/cil/oc/client/renderer/TextBufferRenderCache.scala b/src/main/scala/li/cil/oc/client/renderer/TextBufferRenderCache.scala index b3af5f57ca..55afe6e91b 100644 --- a/src/main/scala/li/cil/oc/client/renderer/TextBufferRenderCache.scala +++ b/src/main/scala/li/cil/oc/client/renderer/TextBufferRenderCache.scala @@ -17,32 +17,39 @@ object TextBufferRenderCache { def render(stack: PoseStack, buffer: TextBufferRenderData): Unit = { RenderState.checkError(getClass.getName + ".render: entering") - renderDirect(stack, buffer) + renderDirect(stack, null, buffer) RenderState.checkError(getClass.getName + ".render: leaving") } - def renderImmediate(stack: PoseStack, _renderBuffer: MultiBufferSource, buffer: TextBufferRenderData): Unit = { + def renderImmediate(stack: PoseStack, renderBuffer: MultiBufferSource, buffer: TextBufferRenderData): Unit = { RenderState.checkError(getClass.getName + ".renderImmediate: entering") - renderDirect(stack, buffer) + renderDirect(stack, renderBuffer, buffer) RenderState.checkError(getClass.getName + ".renderImmediate: leaving") } - private def renderDirect(stack: PoseStack, buffer: TextBufferRenderData): Unit = { + private def renderDirect(stack: PoseStack, + renderBuffer: MultiBufferSource, + buffer: TextBufferRenderData): Unit = { for (line <- buffer.data.buffer) { renderer.generateChars(line) } - // Match the immediate-mode behavior of the working pre-1.13 renderer. - // The port's custom VBO cache loses render state in both GUI and block - // entity paths, leaving otherwise valid screen contents invisible. - val byteBuffer = new ByteBufferBuilder(786432) - try { - val source = MultiBufferSource.immediate(byteBuffer) - renderer.drawBuffer(stack, source, buffer.data, buffer.viewport._1, buffer.viewport._2) - source.endBatch() - buffer.dirty = false + if (renderBuffer == null) { + // Match the immediate-mode behavior of the working pre-1.13 renderer. + // The port's custom VBO cache loses render state in GUI paths, leaving + // otherwise valid screen contents invisible. + val byteBuffer = new ByteBufferBuilder(786432) + try { + val source = MultiBufferSource.immediate(byteBuffer) + renderer.drawBuffer(stack, source, buffer.data, buffer.viewport._1, buffer.viewport._2) + source.endBatch() + } + finally byteBuffer.close() } - finally byteBuffer.close() + else { + renderer.drawBuffer(stack, renderBuffer, buffer.data, buffer.viewport._1, buffer.viewport._2) + } + buffer.dirty = false } } diff --git a/src/main/scala/li/cil/oc/client/renderer/font/TextureFontRenderer.scala b/src/main/scala/li/cil/oc/client/renderer/font/TextureFontRenderer.scala index 0982c72693..3bcfedbd4d 100644 --- a/src/main/scala/li/cil/oc/client/renderer/font/TextureFontRenderer.scala +++ b/src/main/scala/li/cil/oc/client/renderer/font/TextureFontRenderer.scala @@ -123,10 +123,10 @@ abstract class TextureFontRenderer { val r = (color >> 16) & 0xFF val g = (color >> 8) & 0xFF val b = color & 0xFF - builder.addVertex(matrix, x0.toFloat, y1.toFloat, 0).setColor(r, g, b, 255) - builder.addVertex(matrix, x1.toFloat, y1.toFloat, 0).setColor(r, g, b, 255) - builder.addVertex(matrix, x1.toFloat, y0.toFloat, 0).setColor(r, g, b, 255) - builder.addVertex(matrix, x0.toFloat, y0.toFloat, 0).setColor(r, g, b, 255) + builder.addVertex(matrix, x0.toFloat, y1.toFloat, 0).setUv(0f, 1f).setColor(r, g, b, 255) + builder.addVertex(matrix, x1.toFloat, y1.toFloat, 0).setUv(1f, 1f).setColor(r, g, b, 255) + builder.addVertex(matrix, x1.toFloat, y0.toFloat, 0).setUv(1f, 0f).setColor(r, g, b, 255) + builder.addVertex(matrix, x0.toFloat, y0.toFloat, 0).setUv(0f, 0f).setColor(r, g, b, 255) } } -} \ No newline at end of file +} From 477abf04e3bd3d8367b36e79570e82de66e19765 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Sun, 9 Aug 2026 23:43:08 -0700 Subject: [PATCH 27/38] Open tablet UIs even when not looking at a block --- src/main/scala/li/cil/oc/common/item/Tablet.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/item/Tablet.scala b/src/main/scala/li/cil/oc/common/item/Tablet.scala index f6552ddace..db5bb6aee7 100644 --- a/src/main/scala/li/cil/oc/common/item/Tablet.scala +++ b/src/main/scala/li/cil/oc/common/item/Tablet.scala @@ -134,6 +134,10 @@ class Tablet(props: Properties) extends Item(props) with traits.SimpleItem with true } + @Deprecated + override def use(level: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = + use(player.getItemInHand(hand), level, player) + override def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = { player.startUsingItem(if (player.getItemInHand(InteractionHand.MAIN_HAND) == stack) InteractionHand.MAIN_HAND else InteractionHand.OFF_HAND) new InteractionResultHolder(InteractionResult.sidedSuccess(level.isClientSide), stack) @@ -166,7 +170,7 @@ class Tablet(props: Properties) extends Item(props) with traits.SimpleItem with } } else { - if (player.isCrouching) { + if (player.isSecondaryUseActive) { if (!level.isClientSide) { player match { case srvPlr: ServerPlayer => MenuTypes.openTabletGui(srvPlr, Tablet.get(stack, player)) From c8241bfee7105deaa188568152b2c49a93a46af9 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Mon, 10 Aug 2026 00:22:57 -0700 Subject: [PATCH 28/38] Open manual on right click again... --- src/main/scala/li/cil/oc/common/item/Manual.scala | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/scala/li/cil/oc/common/item/Manual.scala b/src/main/scala/li/cil/oc/common/item/Manual.scala index f0fe24bc91..1f9b872860 100644 --- a/src/main/scala/li/cil/oc/common/item/Manual.scala +++ b/src/main/scala/li/cil/oc/common/item/Manual.scala @@ -11,6 +11,7 @@ import net.neoforged.api.distmarker.OnlyIn import net.minecraft.world.level.Level import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Player +import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionResultHolder import net.minecraft.world.InteractionResult import net.minecraft.ChatFormatting @@ -24,6 +25,10 @@ class Manual(props: Properties) extends Item(props) with traits.SimpleItem with tooltip.add(Component.literal(ChatFormatting.DARK_GRAY.toString + "v" + OpenComputers.Version)) } + @Deprecated + override def use(level: Level, player: Player, hand: InteractionHand): InteractionResultHolder[ItemStack] = + use(player.getItemInHand(hand), level, player) + override def use(stack: ItemStack, level: Level, player: Player): InteractionResultHolder[ItemStack] = { if (level.isClientSide) { if (player.isCrouching) { From 02454bbb76320e06796f9417b65f551dd8b82e98 Mon Sep 17 00:00:00 2001 From: Caitlyn <1423429+CaitlynMainer@users.noreply.github.com> Date: Mon, 10 Aug 2026 00:42:21 -0700 Subject: [PATCH 29/38] Resync monitor resolution and color on load --- src/main/scala/li/cil/oc/client/PacketHandler.scala | 3 +++ .../li/cil/oc/common/blockentity/traits/TextBuffer.scala | 7 +++++++ src/main/scala/li/cil/oc/server/PacketHandler.scala | 1 + src/main/scala/li/cil/oc/server/PacketSender.scala | 3 ++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/client/PacketHandler.scala b/src/main/scala/li/cil/oc/client/PacketHandler.scala index 5094f400cb..f06c2a442c 100644 --- a/src/main/scala/li/cil/oc/client/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/client/PacketHandler.scala @@ -724,6 +724,9 @@ object PacketHandler extends CommonPacketHandler { case Some(buffer: li.cil.oc.common.component.TextBuffer) => val nbt = CompoundStorage.CODEC.parse(NbtOps.INSTANCE, p.readNBT()).getOrThrow() buffer.setMaximumResolution(p.readInt(), p.readInt()) + val depthValues = api.internal.TextBuffer.ColorDepth.values + val depth = p.readInt() min (depthValues.length - 1) max 0 + buffer.setMaximumColorDepth(depthValues(depth)) buffer.data.loadData(nbt) buffer.setViewport(p.readInt(), p.readInt()) buffer.proxy.setChanged() diff --git a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala index 4286cea43a..0fe85f6abe 100644 --- a/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/common/blockentity/traits/TextBuffer.scala @@ -99,6 +99,10 @@ trait TextBuffer extends Environment with Tickable { private def loadServerBufferData(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { reapplyTierToBuffer() buffer.loadData(nbt, provider) + // loadData also restores MAX_VIDEO_MODE when it is present. A stale save + // can contain the constructor's tier-one limits, so enforce the physical + // screen tier again after loading persisted data as well. + reapplyTierToBuffer() } /** @@ -144,6 +148,9 @@ trait TextBuffer extends Environment with Tickable { buffer.loadData(storage) } else buffer.loadData(nbt, provider) + // The saved MAX_VIDEO_MODE may be stale or may have been produced while + // this block entity still had its constructor-default tier. + reapplyTierToBuffer() } override def saveForClient(nbt: CompoundTag, provider: HolderLookup.Provider): Unit = { diff --git a/src/main/scala/li/cil/oc/server/PacketHandler.scala b/src/main/scala/li/cil/oc/server/PacketHandler.scala index 2f7df6fab2..327a2a90be 100644 --- a/src/main/scala/li/cil/oc/server/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/server/PacketHandler.scala @@ -433,6 +433,7 @@ object PacketHandler extends CommonPacketHandler { CompoundStorage.CODEC.encode(nbt, NbtOps.INSTANCE, new CompoundTag()).getOrThrow().asInstanceOf[CompoundTag], buffer.getMaximumWidth, buffer.getMaximumHeight, + buffer.getMaximumColorDepth.ordinal, buffer.getViewportWidth, buffer.getViewportHeight, entity diff --git a/src/main/scala/li/cil/oc/server/PacketSender.scala b/src/main/scala/li/cil/oc/server/PacketSender.scala index 770ce70e8e..da26f0ed95 100644 --- a/src/main/scala/li/cil/oc/server/PacketSender.scala +++ b/src/main/scala/li/cil/oc/server/PacketSender.scala @@ -855,7 +855,7 @@ object PacketSender { } } - def sendTextBufferInit(address: String, value: CompoundTag, maxWidth: Int, maxHeight: Int, viewportWidth: Int, viewportHeight: Int, player: ServerPlayer): Unit = { + def sendTextBufferInit(address: String, value: CompoundTag, maxWidth: Int, maxHeight: Int, maxDepth: Int, viewportWidth: Int, viewportHeight: Int, player: ServerPlayer): Unit = { val pb = new CompressedPacketBuilder(PacketType.TextBufferInit) pb.writeUTF(address) @@ -863,6 +863,7 @@ object PacketSender { pb.writeInt(maxWidth) pb.writeInt(maxHeight) + pb.writeInt(maxDepth) pb.writeInt(viewportWidth) pb.writeInt(viewportHeight) From 1dfe1bb8c014b06874ca40e36cdb216931df2d50 Mon Sep 17 00:00:00 2001 From: Grahmindol Date: Mon, 10 Aug 2026 17:21:37 +0200 Subject: [PATCH 30/38] better banner  Conflicts:  src/main/resources/assets/opencomputers/textures/gui/banner.png  src/main/resources/assets/opencomputers/textures/gui/banner.png~ --- .../opencomputers/textures/gui/banner.png~ | Bin 0 -> 1838 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/textures/gui/banner.png~ diff --git a/src/main/resources/assets/opencomputers/textures/gui/banner.png~ b/src/main/resources/assets/opencomputers/textures/gui/banner.png~ new file mode 100644 index 0000000000000000000000000000000000000000..7c337b947816e39a7830605b1986bb28051c1e6f GIT binary patch literal 1838 zcmV+}2hsS6P)M;ymb@gJGEc5T{Xs7XpR)E!bN_2Mb@@RoKd z8Pb5Wln%uZXfYm~!MM~YkU&MCLopdlhbE9@FkPBOP&bnow@U}RgH7$I;Nl{;u1qYf zx;$ID`@PfM>7@7Md$PZuNqX&6%C@bFMsKE+bX<1#-y_?T5h_~6F3OjDf|Yi!NxI$La?K?i*{AF5M| ztlviT&_68R(cGtVEWwW7>-ha~cF5H4sDDkASzcbYQcFHB+J)zNyi7hNj{E593#-#8 zcr^EjxBKhk*LfS(wV(F3bL{Eu&yU)v=iO8PV9q$_&iL~K000LaA^-rCX+I5`pyu+> z*o>1$dj4FPT4BuPI3jx^rXD|2iurKz!@%*rcf%QNcg9E(GZ@I0y%bQ5Dq*Z-y4EFKs ze$VY#mC>=!qWvegeFh!$*?e;OfBB_-o#MH7cXtC-^z`)b@ARDRxKAlrQi^eD;AO3R z8yiBNy}dnt-NC_u)qCje?d8|W_b==fly%tX^!C?3Da+Oa4MQ>^`)?__FsVj3?cq8u zM~J?;eq^#&dSzWKAOHZI1TKAu|H%)C8885VOKOe~yU%wwOTH>sVOvL%b#>Gf$%w7I zI#b9*`+2==ot>)lZ4K&uB?dJZChQ@@>^T#@;+4Gwk`n|$mXvN@=UO9_O@75 z&pyip+NNZEo6gmXO(Z}RNjiqva6q)H7q9Z~nM{U%9=b19Xr#YJAn z($XvZv*&q%-z{C`Gd(@s@(Ckcju5M9d36E+S{aueqQYbb004K?G?^YYrA~NrlP@PcIFEG1lm^968=S00EhFG2* zrTRAMm%0wBW@1C&$|Vssrr_=hRr>9Jsiqh@{j5HmZ73*Om$%dB=1pPB>Y(QC5t@{q z)I|1~pPyG&xwfXy&qAcT zb?sxTZyLsP@Q+<$1FBQoa3R+;zFJ54zJFc+qv?-vW#X&Q_ZS|Q!fr-I*o`h3E)9k8 zxpu9}U4MkhA4&I|F+s1Z@?EwdE=Pz}=r)Q10DzOgWrwK#+X4UpN7OW#FJFHBNHkls ztqznvM1OIAvhCQ;)g=coA)A~1{W@2rK6J>Id|sILx|JrTupfG^qUSKWmcw-_m{ySJ z+zqDCDhjRJHvgb2Y(m1~4qbJ!v^2rRr3oG6l_?8iK}!H?e*2ihYiyvVdN!N2DH1ze zjt~);4FHH0E;~d30EiVeP3D!A<5eI{n1NKdd0w63Y-4c;&Y#rJVyQziX zJyqE!PedP0^S$}l1dGbK;6_INQj2I5ZPF_sysBR`;aHJHJsqG@>6}-4oya7&xa3P?pKw6|=HY z?1<+YQxXUp|>c{N-?Ovg!-21fhO1-84=3? zCMPF(H6~qAeN$b_zMZMZdVdT>xA5QAA4Km<_1I{52i5WBX8l`PQvC)J5$KzRk+43u zIG}5D^c~yosUo*c+HPqG4Q&^4s17}+YwL0%TKX<&Qdv{ow(?}N*-(?U7$E`xKpAw1 c002 Date: Tue, 11 Aug 2026 22:47:13 +0200 Subject: [PATCH 31/38] add disk/eeprom support --- src/main/scala/li/cil/oc/common/Loot.scala | 10 +++----- .../scala/li/cil/oc/common/init/OCItems.scala | 23 +++++++------------ 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/Loot.scala b/src/main/scala/li/cil/oc/common/Loot.scala index 2cb70c5227..d836d89de5 100644 --- a/src/main/scala/li/cil/oc/common/Loot.scala +++ b/src/main/scala/li/cil/oc/common/Loot.scala @@ -269,7 +269,7 @@ object Loot { val root = "opencomputers/eeproms/" + id.getPath val code = readEEPROMResource(json, "code", id, root, manager) val data = readEEPROMResource(json, "data", id, root, manager) - val stack = OCItems.createEEPROM(label, code.orNull, data.orNull, readonly) + val stack = OCItems.registerEEPROM(label, code.orNull, data.orNull, readonly) datapackEEPROMs += stack eepromsForServer += stack eepromsForClient += stack.copy() @@ -332,12 +332,8 @@ object Loot { } else new Callable[FileSystem] { override def call(): FileSystem = api.FileSystem.fromResource(ResourceLocation.fromNamespaceAndPath(Settings.resourceDomain, "loot/" + path)) } - val stack = registerLootDisk(path, ResourceLocation.fromNamespaceAndPath(Settings.resourceDomain, path), color.getOrElse(DyeColor.LIGHT_GRAY), callable, doRecipeCycling = true) - stack.set(DataComponents.CUSTOM_NAME, Component.literal(name)) - if (!external) { - OCItems.registerStack(stack, path) - lootDiskDescriptorIds += path - } + val stack = OCItems.registerFloppy(path, ResourceLocation.fromNamespaceAndPath(Settings.resourceDomain, path), color.getOrElse(DyeColor.LIGHT_GRAY), callable, doRecipeCycling = true) + lootDiskDescriptorIds += path stack } } diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index 7e1c2e04f8..56846f1c36 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -168,19 +168,15 @@ object OCItems extends ItemAPI { // ----------------------------------------------------------------------- // - private val registeredItems: ArrayBuffer[ItemStack] = mutable.ArrayBuffer.empty[ItemStack] - override def registerFloppy(name: String, loc: ResourceLocation, color: DyeColor, factory: Callable[FileSystem], doRecipeCycling: Boolean): ItemStack = { val stack = Loot.registerLootDisk(name, loc, color, factory, doRecipeCycling) - - registeredItems += stack - + OCItems.registerStack(stack, name) stack.copy() } override def registerEEPROM(name: String, code: Array[Byte], data: Array[Byte], readonly: Boolean): ItemStack = { val stack = createEEPROM(name, code, data, readonly) - registeredItems += stack + OCItems.registerStack(stack, name) stack.copy() } @@ -597,11 +593,12 @@ object OCItems extends ItemAPI { SECTION_Y_VALUES.put(key, y) val rowCount = Math.ceil(itemCount / 9.0f).toInt y += rowCount + 1 - if (key.equals(sectionKeys.last)) return - var padding = 9 - itemCount % 9 - if (padding < 9) padding += 9 - for (i <- 0 until padding) { - displayItems.accept(ItemStack.EMPTY) + if (!key.equals(sectionKeys.last)) { + var padding = 9 - itemCount % 9 + if (padding < 9) padding += 9 + for (i <- 0 until padding) { + displayItems.accept(ItemStack.EMPTY) + } } }) @@ -610,10 +607,6 @@ object OCItems extends ItemAPI { displayItems.accept(OCItems.createConfiguredRobot()) displayItems.accept(OCItems.createConfiguredTablet()) - Loot.disksForClient.foreach(displayItems.accept) - Loot.eepromsForClient.foreach(displayItems.accept) - registeredItems.foreach(displayItems.accept) - /*if (hasRedstoneCardT2) { descriptors.get(Constants.ItemName.RedstoneCardTier2).foreach { info => event.accept(info.createItemStack(1)) From f1e0c8778cb51d6a8abfb664872e99a20a9ca0f4 Mon Sep 17 00:00:00 2001 From: Grahmindol Date: Tue, 11 Aug 2026 22:53:57 +0200 Subject: [PATCH 32/38] handle network T2 card ban --- src/main/scala/li/cil/oc/common/init/OCItems.scala | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index 56846f1c36..0e9f23656b 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -1,5 +1,6 @@ package li.cil.oc.common.init +import codechicken.lib.gui.modular.lib.geometry.Position.Mutable import li.cil.oc.api.detail.{ItemAPI, ItemInfo} import li.cil.oc.api.fs.FileSystem import li.cil.oc.common.block.SimpleBlock @@ -7,6 +8,7 @@ import li.cil.oc.common.datacomponents.OCComponents import li.cil.oc.common.item.data._ import li.cil.oc.common.item.traits.SimpleItem import li.cil.oc.common.{Loot, Tier, item} +import li.cil.oc.integration.opencomputers.ModOpenComputers import li.cil.oc.server.machine.luac.LuaStateFactory import li.cil.oc.util.{Rarity => OCRarity} import li.cil.oc.{Constants, OpenComputers, Settings, common} @@ -549,7 +551,11 @@ object OCItems extends ItemAPI { import Constants.{BlockName => B, ItemName => I} // Assembled devices are not usable without their component data. Their // configured creative variants are added explicitly below. - val excluded = Set(B.Microcontroller, B.Print, B.Robot, I.Drone, I.Tablet) + val excluded = mutable.Set(B.Microcontroller, B.Print, B.Robot, I.Drone, I.Tablet) + + if (!ModOpenComputers.hasRedstoneCardT2){ + excluded += I.RedstoneCardTier2 + } def accept(id: String, info: ItemInfo): Unit = { if (id != B.PowerConverter || !Settings.get.ignorePower) { @@ -607,10 +613,6 @@ object OCItems extends ItemAPI { displayItems.accept(OCItems.createConfiguredRobot()) displayItems.accept(OCItems.createConfiguredTablet()) - /*if (hasRedstoneCardT2) { - descriptors.get(Constants.ItemName.RedstoneCardTier2).foreach { info => - event.accept(info.createItemStack(1)) - } - }*/ + } } From 0ffcc11e24714fbcbfcf02ecdd3996d476575b4b Mon Sep 17 00:00:00 2001 From: Grahmindol Date: Tue, 11 Aug 2026 23:01:22 +0200 Subject: [PATCH 33/38] handle openprinter..... --- .../oc/common/openprinter/OpenPrinter.java | 22 ++++++++++--------- .../scala/li/cil/oc/common/init/OCItems.scala | 13 +++-------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/main/java/li/cil/oc/common/openprinter/OpenPrinter.java b/src/main/java/li/cil/oc/common/openprinter/OpenPrinter.java index 2f51921fa0..c4d0f35b6a 100644 --- a/src/main/java/li/cil/oc/common/openprinter/OpenPrinter.java +++ b/src/main/java/li/cil/oc/common/openprinter/OpenPrinter.java @@ -46,6 +46,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.function.Consumer; + /** * OpenPrinter, integrated directly into OpenComputers. * @@ -164,16 +166,16 @@ private static void registerOpenComputersIntegration() { } } - public static void addCreativeItems(BuildCreativeModeTabContentsEvent event) { - event.accept(PRINTER.get()); - event.accept(SHREDDER.get()); - event.accept(FILE_CABINET.get()); - event.accept(BRIEFCASE.get()); - event.accept(PRINTED_PAGE.get()); - event.accept(BLACK_INK.get()); - event.accept(COLOR_INK.get()); - event.accept(PAPER_SHREDS.get()); - event.accept(FOLDER.get()); + public static void addCreativeItems(Consumer event) { + event.accept(PRINTER.toStack()); + event.accept(SHREDDER.toStack()); + event.accept(FILE_CABINET.toStack()); + event.accept(BRIEFCASE.toStack()); + event.accept(PRINTED_PAGE.toStack()); + event.accept(BLACK_INK.toStack()); + event.accept(COLOR_INK.toStack()); + event.accept(PAPER_SHREDS.toStack()); + event.accept(FOLDER.toStack()); // The tools disk is registered through OpenComputers' public floppy API, // which already adds it to the OpenComputers creative tab. } diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index 0e9f23656b..e1ddd2e266 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -7,6 +7,7 @@ import li.cil.oc.common.block.SimpleBlock import li.cil.oc.common.datacomponents.OCComponents import li.cil.oc.common.item.data._ import li.cil.oc.common.item.traits.SimpleItem +import li.cil.oc.common.openprinter.OpenPrinter import li.cil.oc.common.{Loot, Tier, item} import li.cil.oc.integration.opencomputers.ModOpenComputers import li.cil.oc.server.machine.luac.LuaStateFactory @@ -557,16 +558,6 @@ object OCItems extends ItemAPI { excluded += I.RedstoneCardTier2 } - def accept(id: String, info: ItemInfo): Unit = { - if (id != B.PowerConverter || !Settings.get.ignorePower) { - val stack = info.createItemStack(1) - if (!stack.isEmpty) { - displayItems.accept(stack); - searchItems.accept(stack); - } - } - } - val sectionMap = new util.HashMap[String, util.List[ItemStack]] for ((id, info) <- descriptors if !excluded.contains(id)){ val sectionId = ITEM_TO_SECTION.get(id) @@ -613,6 +604,8 @@ object OCItems extends ItemAPI { displayItems.accept(OCItems.createConfiguredRobot()) displayItems.accept(OCItems.createConfiguredTablet()) + //TODO: revove this line + OpenPrinter.addCreativeItems(displayItems) } } From 8704f39fd2da0e63c65ec8316b8d2ab979c7a91f Mon Sep 17 00:00:00 2001 From: Daydrain Date: Wed, 12 Aug 2026 12:21:34 +0200 Subject: [PATCH 34/38] some few fixs --- .../opencomputers/textures/gui/banner.png | Bin 1784 -> 2198 bytes .../opencomputers/textures/gui/banner.png~ | Bin 1838 -> 0 bytes .../scala/li/cil/oc/common/init/OCItems.scala | 54 +++++++++--------- .../li/cil/oc/server/machine/Machine.scala | 7 +-- 4 files changed, 29 insertions(+), 32 deletions(-) delete mode 100644 src/main/resources/assets/opencomputers/textures/gui/banner.png~ diff --git a/src/main/resources/assets/opencomputers/textures/gui/banner.png b/src/main/resources/assets/opencomputers/textures/gui/banner.png index 996448545b6764b55095d81dcf86494316112022..1d0ccb9d98afc14a6138fae414974e7d468b1aad 100644 GIT binary patch literal 2198 zcmY*bdpr|*8=qIXB(sBa5-YYQq-||N7Q^PU6~){MZFVu5EnC@;I=SRh|$0PIMaola+6S&d1QSnR;kI9ZRTT4i$u#fSapvR6esTew$ZcCw3ZQ&HM4Hb?; zQOR&J)dmHp+SpL-ZBcvBbQA^py*!Ue|8M;`?spkff*{v!kSN5iHOgxkb1Sj3}`wC}qL^-a_BX z;-$6)c8X06ox#`!!fCl)m@`W|-agU z%jocnOXBD&QEZST-JmO9$w=lxiwmz7q7BRfT!7;9Cr`(RLa)$jtF4$V~qUzG^)_khf# z#6-*>9S_X(^Ya@QE8bU$24ARO*Oh%7mJOc^W8|uXLA5?;gGQp|r%$B_%I|9V=e=z*4+yqgt(MEv@5slR7~>kJSTa$i zXiN$4d0S(i`)t%{xoU36G1+K|ArOSfp2h^o5E>d9&8&#_wnGQN^)C#DZ8ptctgFf| z^g>9LwGZsHOVXb?Eg8-0`j+eXgx|s%{lmqu0agIg&*i97(gKDnJw0$*+AjEB%_u*27I|xQNT&1}^;y(q?RS{%+@9`rWA~q9F$=;Xp59O2yqjNTvD?kDA0DUg zM+aR{Qg5CMg6({)L?mDmUPiI}&<41k?U2z^MwPIQ zKhBnFL)4g-W%XxI0s%(gvyAwwb`&W+*`5i;raA<_TU{SHtYAsM7^f z(iJ%3VUtYU@Iiq!zBKdAr3&`Pd1;mMbH^p^`I9xyN83C~nh9H%u@=l^F8LwPwy%c( zt)Ye&M}-Mei=Nusy=+~WXswX1t}Io5?GveM0%7BJ(2gmP-wPcm1ZMU^!>y78vw@_g zRg_c3pPtrq9tml?8yiHz5d#B_B~`d`6W_GR;?9Vc>Fj+BC*9Ax;O2+d1B}`sg|shSRPYf6|^I^ z_W?!(E|%iU6!u|2WFDAO)6*zSPhZcH1XpD7B_CTZo-BU0o69ceW`@|m=d+h&^Dc3r_Lq#(jA;rTM{w!X&5T)n z4NL>+7i1JDrW6Z5Uy|$rm}S4uAuSWWMmz~b`MmLrT(T~Ud4v_h3L7Ow!Y;}RskoA) z^oR{(PFp85{USo;(_GM#hjUE8a~eU+;&+jihLPPx?IF?C)VNu38M7IW-XA(S&=GLF z&>g-1=Ho`;cHdy=3GWWYq)T)Tjuyq&PgI`;uYpotur`&*6ZPbQrNiUJ^Jw9P4JI$H# zaP*LL`tijNh3+?#mas(d$}Wr`LU!M1M6_Q_En5`c+k$-T`Agsk{IT=V>D31f=b9Mb z21NDB2I5v(1^^+AOes9tqi>q^b|t=0ebep!6V>vH!oDTQI)O7+pIb5(_(q5MuQlJLAPhftsAssI1DCW9W5g`NZYMMt40GiN>*V>UPz5BGqj6YG!OA Siz?PW2SoP+ZgsfBr~eHEFzZbK delta 1768 zcmV*|B!3BTNLh0L01FWS01FWTe`H^g000K6Nklh*#%|$F*c?=MtQ#S34ePh`>jzM z6+3JvQhOQGdr(2|&4tR8BFi_795NH)J6if|iFZHqbVfP8%#LWYxw)x4k5Vp+=fZIu zeyBVqK6g>|7k^czaj?3y%Db7KndYxm&rfg9752kdUo_5hoG0S94>-M-O%}Szt&^xG ziOb0R>I>i7TABOU^EsW|!l0W3DN|EZ{H^JPsA|8qw-#ooR-luh38@t3z#y&!od5v1 z9Q5~Iy7f=&U_u1oHKFpd`kLHncoOrMK^OC9;qM0k0DnRg=v4XU^K9tO1NfOS_90^| zb;el3x>0#qV}k?zLG4<2e{_U@_FL(o?e;p-EN#@^d!yI*dB2yAjM}KEvUvZ=P47Vk zy*HOq`CoqOwSIBm$H&K>E{2AN_cvIbZ zCiH5)mN4V)B!`EG%I>RGf7PFUUaxyqZjH6x!N-_B28S;q5hO4_&XSi6`+ z0)NDjf;qt^JVU#C<1T++C=~eX@uwpFG@s9V+L&hF(7xB#*Lfcs8*lN~j^lWKw=_#A zm&l1d9VwDPG zP3NS}gGt#c|HE*W#Ikpk%3CL2YC34~#74lD zNg{4^!QD+-wj#3 z^|4gl-`%VV>rmS7Tr@VksL%|D!FNPPPo0^Ch>X5H%7;)Y340=ywTr2|X&BGxKW2pu zs7y`6g=`Z(TSwTwf8G6~Kl$k2U2SMb>h-P7_@QiOSrd3$3EizD?^7+QK9x zEa}j!lZ}m8K3rPRLC#EB6A3LIsQT@q3$HPOs_MmJ(WFV@u(?7+U^W0CQGeK+5CH%n zQ3R^YTU+N@ARX{P`s%W-np~^bLJLV&8;=x40ZcuWwAg@L=dhvIRg?I=y#um@F7d++JbY-}d$*|9#8jq?tJ5 z;|qzZU|@5Fh&V(5K%%fYA%7<7p8)^>xXQf!e6bB_h~3m8@R48JXV1hOP3yh6m;{T; zwcsWv|MDNACTZW9f5O{PwMVxD8r}8Gw1oR+aZ`+qA->erJK@KlSd#kjv$`pr~!m zbdQEGQ2WB#o}#iPV@jKpoXDOnyzm_cwUY1b8vFV;F^0P^w zTN*+`p9?uuhaOWs>vADl`d!kZvbw%a$5Sj8;j9G!00000G4em&s9bP9Gj+BA0000< KMNUMnLSTaQO>Kt& diff --git a/src/main/resources/assets/opencomputers/textures/gui/banner.png~ b/src/main/resources/assets/opencomputers/textures/gui/banner.png~ deleted file mode 100644 index 7c337b947816e39a7830605b1986bb28051c1e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1838 zcmV+}2hsS6P)M;ymb@gJGEc5T{Xs7XpR)E!bN_2Mb@@RoKd z8Pb5Wln%uZXfYm~!MM~YkU&MCLopdlhbE9@FkPBOP&bnow@U}RgH7$I;Nl{;u1qYf zx;$ID`@PfM>7@7Md$PZuNqX&6%C@bFMsKE+bX<1#-y_?T5h_~6F3OjDf|Yi!NxI$La?K?i*{AF5M| ztlviT&_68R(cGtVEWwW7>-ha~cF5H4sDDkASzcbYQcFHB+J)zNyi7hNj{E593#-#8 zcr^EjxBKhk*LfS(wV(F3bL{Eu&yU)v=iO8PV9q$_&iL~K000LaA^-rCX+I5`pyu+> z*o>1$dj4FPT4BuPI3jx^rXD|2iurKz!@%*rcf%QNcg9E(GZ@I0y%bQ5Dq*Z-y4EFKs ze$VY#mC>=!qWvegeFh!$*?e;OfBB_-o#MH7cXtC-^z`)b@ARDRxKAlrQi^eD;AO3R z8yiBNy}dnt-NC_u)qCje?d8|W_b==fly%tX^!C?3Da+Oa4MQ>^`)?__FsVj3?cq8u zM~J?;eq^#&dSzWKAOHZI1TKAu|H%)C8885VOKOe~yU%wwOTH>sVOvL%b#>Gf$%w7I zI#b9*`+2==ot>)lZ4K&uB?dJZChQ@@>^T#@;+4Gwk`n|$mXvN@=UO9_O@75 z&pyip+NNZEo6gmXO(Z}RNjiqva6q)H7q9Z~nM{U%9=b19Xr#YJAn z($XvZv*&q%-z{C`Gd(@s@(Ckcju5M9d36E+S{aueqQYbb004K?G?^YYrA~NrlP@PcIFEG1lm^968=S00EhFG2* zrTRAMm%0wBW@1C&$|Vssrr_=hRr>9Jsiqh@{j5HmZ73*Om$%dB=1pPB>Y(QC5t@{q z)I|1~pPyG&xwfXy&qAcT zb?sxTZyLsP@Q+<$1FBQoa3R+;zFJ54zJFc+qv?-vW#X&Q_ZS|Q!fr-I*o`h3E)9k8 zxpu9}U4MkhA4&I|F+s1Z@?EwdE=Pz}=r)Q10DzOgWrwK#+X4UpN7OW#FJFHBNHkls ztqznvM1OIAvhCQ;)g=coA)A~1{W@2rK6J>Id|sILx|JrTupfG^qUSKWmcw-_m{ySJ z+zqDCDhjRJHvgb2Y(m1~4qbJ!v^2rRr3oG6l_?8iK}!H?e*2ihYiyvVdN!N2DH1ze zjt~);4FHH0E;~d30EiVeP3D!A<5eI{n1NKdd0w63Y-4c;&Y#rJVyQziX zJyqE!PedP0^S$}l1dGbK;6_INQj2I5ZPF_sysBR`;aHJHJsqG@>6}-4oya7&xa3P?pKw6|=HY z?1<+YQxXUp|>c{N-?Ovg!-21fhO1-84=3? zCMPF(H6~qAeN$b_zMZMZdVdT>xA5QAA4Km<_1I{52i5WBX8l`PQvC)J5$KzRk+43u zIG}5D^c~yosUo*c+HPqG4Q&^4s17}+YwL0%TKX<&Qdv{ow(?}N*-(?U7$E`xKpAw1 c002 Date: Thu, 13 Aug 2026 08:13:32 +0200 Subject: [PATCH 35/38] fix server crach --- src/main/scala/li/cil/oc/CreativeTab.scala | 64 +------------------ .../scala/li/cil/oc/common/init/OCItems.scala | 8 +-- .../CreativeModeInventoryScreenMixin.scala | 58 ++++++++++++++++- 3 files changed, 60 insertions(+), 70 deletions(-) diff --git a/src/main/scala/li/cil/oc/CreativeTab.scala b/src/main/scala/li/cil/oc/CreativeTab.scala index 405a2635bb..20aeaa32c7 100644 --- a/src/main/scala/li/cil/oc/CreativeTab.scala +++ b/src/main/scala/li/cil/oc/CreativeTab.scala @@ -1,22 +1,13 @@ package li.cil.oc -import com.mojang.blaze3d.systems.RenderSystem import li.cil.oc.common.init.OCItems -import li.cil.oc.common.init.OCItems.SECTION_Y_VALUES -import li.cil.oc.mixin.accessor.AbstractContainerScreenAccess -import net.minecraft.client.Minecraft -import net.minecraft.client.gui.GuiGraphics -import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen import net.minecraft.core.registries.Registries import net.minecraft.network.chat.Component -import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.{CreativeModeTab, CreativeModeTabs} import net.neoforged.bus.api.SubscribeEvent import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent import net.neoforged.neoforge.registries.{DeferredHolder, DeferredRegister} -import scala.jdk.CollectionConverters.MapHasAsScala - object CreativeTab { val CREATIVE_TABS: DeferredRegister[CreativeModeTab] = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, OpenComputers.ID) @@ -30,59 +21,8 @@ object CreativeTab { @SubscribeEvent def onBuildContents(event: BuildCreativeModeTabContentsEvent): Unit = { - if (event.getTabKey == MAIN.getKey) { - //OCItems.decorateCreativeTab(event, ModOpenComputers.hasRedstoneCardT2) - //OpenPrinter.addCreativeItems(event) - } else if (event.getTabKey == CreativeModeTabs.TOOLS_AND_UTILITIES) { + if (event.getTabKey == CreativeModeTabs.TOOLS_AND_UTILITIES) { event.accept(OCItems.createChargedHoverBoots()) } } - - def renderBanners(screen: CreativeModeInventoryScreen, graphics: GuiGraphics, mouseX: Int, mouseY: Int): Unit = { - val ps = graphics.pose - ps.pushPose() - RenderSystem.enableDepthTest() - RenderSystem.setShaderColor(1, 1, 1, 1) - - val left = screen.asInstanceOf[AbstractContainerScreenAccess].getLeftPos + 8 - val top = screen.asInstanceOf[AbstractContainerScreenAccess].getTopPos + 17 - ps.translate(left, top, 0) - - val BannerWidth = 162 - val BannerHeight = 18 - val VisibleRows = 5 - - - for ((id, yValue) <- SECTION_Y_VALUES.asScala - if yValue >= CURRENT_ROW && yValue < CURRENT_ROW + VisibleRows) { - - val bannerTexture = ResourceLocation.fromNamespaceAndPath( - OpenComputers.ID, - s"textures/gui/banner.png" - ) - - //OpenComputers.log.warn("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") - //OpenComputers.log.warn(bannerTexture) - - val y = (yValue - CURRENT_ROW) * BannerHeight - - graphics.blit( - bannerTexture, - 0, - y, - 0, - 0, - BannerWidth, - BannerHeight, - BannerWidth, - BannerHeight - ) - - val font = Minecraft.getInstance.font - graphics.drawString(font, Component.translatable(s"itemGroup.${OpenComputers.Name}.section.$id"), 8, y+6, 0x7, false) - } - - RenderSystem.disableDepthTest(); - ps.popPose(); - } -} \ No newline at end of file +} diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index 9f25a23d2d..6e5590efa0 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -32,8 +32,8 @@ import scala.collection.mutable.ArrayBuffer import scala.jdk.CollectionConverters.CollectionHasAsScala object OCItems extends ItemAPI { - private val ITEM_TO_SECTION = new util.HashMap[String, String] - var SECTION_Y_VALUES = new util.HashMap[String, Int] + val ITEM_TO_SECTION = new mutable.HashMap[String, String] + val SECTION_Y_VALUES = new mutable.HashMap[String, Int] private val ITEMS: DeferredRegister.Items = DeferredRegister.createItems(Settings.resourceDomain) val descriptors = mutable.LinkedHashMap.empty[String, ItemInfo] @@ -551,10 +551,8 @@ object OCItems extends ItemAPI { val sectionMap = new util.HashMap[String, util.List[ItemStack]] for ((id, info) <- descriptors if !excluded.contains(id)){ - val sectionId = ITEM_TO_SECTION.get(id) + val sectionId = ITEM_TO_SECTION.getOrElse(id, "99_misc") val stack = info.createItemStack(1) - if(sectionId == null) - sectionMap.computeIfAbsent("99_misc", (s) => new util.LinkedList).add(stack) sectionMap.computeIfAbsent(sectionId, (s) => new util.LinkedList).add(stack) } diff --git a/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala b/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala index 04703c3409..c9688bd7e0 100644 --- a/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala +++ b/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala @@ -1,9 +1,16 @@ package li.cil.oc.mixin -import li.cil.oc.CreativeTab -import li.cil.oc.mixin.accessor.CreativeModeInventoryScreenAccess +import com.mojang.blaze3d.systems.RenderSystem +import li.cil.oc.{CreativeTab, OpenComputers} +import li.cil.oc.CreativeTab.CURRENT_ROW +import li.cil.oc.common.init.OCItems +import li.cil.oc.common.init.OCItems.SECTION_Y_VALUES +import li.cil.oc.mixin.accessor.{AbstractContainerScreenAccess, CreativeModeInventoryScreenAccess} +import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen +import net.minecraft.network.chat.Component +import net.minecraft.resources.ResourceLocation import org.spongepowered.asm.mixin.Mixin import org.spongepowered.asm.mixin.injection.{At, Inject} import org.spongepowered.asm.mixin.injection.callback.CallbackInfo @@ -28,7 +35,7 @@ class CreativeModeInventoryScreenMixin { ): Unit = { val tab = CreativeModeInventoryScreenAccess.selectedTab if (tab eq CreativeTab.MAIN.get()) { - CreativeTab.renderBanners( + renderBanners( this.asInstanceOf[CreativeModeInventoryScreen], guiGraphics, mouseX, @@ -36,4 +43,49 @@ class CreativeModeInventoryScreenMixin { ) } } + + def renderBanners(screen: CreativeModeInventoryScreen, graphics: GuiGraphics, mouseX: Int, mouseY: Int): Unit = { + val ps = graphics.pose + ps.pushPose() + RenderSystem.enableDepthTest() + RenderSystem.setShaderColor(1, 1, 1, 1) + + val left = screen.asInstanceOf[AbstractContainerScreenAccess].getLeftPos + 8 + val top = screen.asInstanceOf[AbstractContainerScreenAccess].getTopPos + 17 + ps.translate(left, top, 0) + + val BannerWidth = 162 + val BannerHeight = 18 + val VisibleRows = 5 + + + for ((id, yValue) <- OCItems.SECTION_Y_VALUES + if yValue >= CURRENT_ROW && yValue < CURRENT_ROW + VisibleRows) { + + val bannerTexture = ResourceLocation.fromNamespaceAndPath( + OpenComputers.ID, + s"textures/gui/banner.png" + ) + + val y = (yValue - CURRENT_ROW) * BannerHeight + + graphics.blit( + bannerTexture, + 0, + y, + 0, + 0, + BannerWidth, + BannerHeight, + BannerWidth, + BannerHeight + ) + + val font = Minecraft.getInstance.font + graphics.drawString(font, Component.translatable(s"itemGroup.${OpenComputers.Name}.section.$id"), 8, y+6, 0x7, false) + } + + RenderSystem.disableDepthTest(); + ps.popPose(); + } } From e4b7f3503cedfd6dc3742951a23516b1603faa3b Mon Sep 17 00:00:00 2001 From: Grahmindol Date: Thu, 13 Aug 2026 12:37:20 +0200 Subject: [PATCH 36/38] just to test the modificated API, it's not that bad. --- src/main/java/li/cil/oc/api/Items.java | 16 ++++++++++++ .../java/li/cil/oc/api/detail/ItemAPI.java | 12 +++++++++ .../oc/common/openprinter/OpenPrinter.java | 25 +++++++++---------- src/main/scala/li/cil/oc/Constants.scala | 1 - .../scala/li/cil/oc/common/init/OCItems.scala | 20 +++++++-------- .../CreativeModeInventoryScreenMixin.scala | 7 +++--- 6 files changed, 52 insertions(+), 29 deletions(-) diff --git a/src/main/java/li/cil/oc/api/Items.java b/src/main/java/li/cil/oc/api/Items.java index c84202ed9b..146946d38c 100644 --- a/src/main/java/li/cil/oc/api/Items.java +++ b/src/main/java/li/cil/oc/api/Items.java @@ -104,6 +104,22 @@ public static ItemStack registerEEPROM(String name, byte[] code, byte[] data, bo return ItemStack.EMPTY; } + /** + * The stack will be listed in the creative tab of OpenComputers. + * + * Call this in the init phase or later, not in pre-init. + * + * @param stack the stack to add in the creative tab. + * @param name the label of the EEPROM. + * @param section_id the section to put the stack in. + * + */ + public static ItemStack registerStack(ItemStack stack, String name, String section_id) { + if (API.items != null) + return API.items.registerStack(stack, name, section_id); + return ItemStack.EMPTY; + } + // ----------------------------------------------------------------------- // private Items() { diff --git a/src/main/java/li/cil/oc/api/detail/ItemAPI.java b/src/main/java/li/cil/oc/api/detail/ItemAPI.java index 90558f9248..28798867e8 100644 --- a/src/main/java/li/cil/oc/api/detail/ItemAPI.java +++ b/src/main/java/li/cil/oc/api/detail/ItemAPI.java @@ -83,4 +83,16 @@ ItemStack registerFloppy(String name, ResourceLocation loc, DyeColor color, * adding a recipe for your custom BIOS, for example. */ ItemStack registerEEPROM(String name, byte[] code, byte[] data, boolean readonly); + + /** + * The stack will be listed in the creative tab of OpenComputers. + * + * Call this in the init phase or later, not in pre-init. + * + * @param stack the stack to add in the creative tab. + * @param name the label of the EEPROM. + * @param sectionId the section to put the stack in. + * + */ + ItemStack registerStack(ItemStack stack, String name, String sectionId); } diff --git a/src/main/java/li/cil/oc/common/openprinter/OpenPrinter.java b/src/main/java/li/cil/oc/common/openprinter/OpenPrinter.java index c4d0f35b6a..500653803f 100644 --- a/src/main/java/li/cil/oc/common/openprinter/OpenPrinter.java +++ b/src/main/java/li/cil/oc/common/openprinter/OpenPrinter.java @@ -164,20 +164,19 @@ private static void registerOpenComputersIntegration() { } catch (RuntimeException exception) { LOGGER.warn("Could not register the OpenPrinter tools disk", exception); } - } - public static void addCreativeItems(Consumer event) { - event.accept(PRINTER.toStack()); - event.accept(SHREDDER.toStack()); - event.accept(FILE_CABINET.toStack()); - event.accept(BRIEFCASE.toStack()); - event.accept(PRINTED_PAGE.toStack()); - event.accept(BLACK_INK.toStack()); - event.accept(COLOR_INK.toStack()); - event.accept(PAPER_SHREDS.toStack()); - event.accept(FOLDER.toStack()); - // The tools disk is registered through OpenComputers' public floppy API, - // which already adds it to the OpenComputers creative tab. + + li.cil.oc.api.Items.registerStack(PRINTER.toStack(), PRINTER.getRegisteredName(), "25_components"); + + li.cil.oc.api.Items.registerStack(SHREDDER.toStack(), SHREDDER.getRegisteredName(), "49_tools"); + li.cil.oc.api.Items.registerStack(FILE_CABINET.toStack(), FILE_CABINET.getRegisteredName(), "49_tools"); + li.cil.oc.api.Items.registerStack(BRIEFCASE.toStack(), BRIEFCASE.getRegisteredName(), "49_tools"); + li.cil.oc.api.Items.registerStack(PRINTED_PAGE.toStack(), PRINTED_PAGE.getRegisteredName(), "49_tools"); + li.cil.oc.api.Items.registerStack(FOLDER.toStack(), PRINTED_PAGE.getRegisteredName(), "49_tools"); + + li.cil.oc.api.Items.registerStack(BLACK_INK.toStack(), BLACK_INK.getRegisteredName(), "50_materials"); + li.cil.oc.api.Items.registerStack(COLOR_INK.toStack(), COLOR_INK.getRegisteredName(), "50_materials"); + li.cil.oc.api.Items.registerStack(PAPER_SHREDS.toStack(), PAPER_SHREDS.getRegisteredName(), "50_materials"); } /** diff --git a/src/main/scala/li/cil/oc/Constants.scala b/src/main/scala/li/cil/oc/Constants.scala index 732fbeac88..1f5fadca02 100644 --- a/src/main/scala/li/cil/oc/Constants.scala +++ b/src/main/scala/li/cil/oc/Constants.scala @@ -3,7 +3,6 @@ package li.cil.oc import li.cil.oc.util.ItemUtils object Constants { - object BlockName { final val Adapter = "adapter" final val Assembler = "assembler" diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index 6e5590efa0..a21a88e980 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -76,13 +76,13 @@ object OCItems extends ItemAPI { instance } - def registerBlock[T <: Block](instance: T, id: String, itemProps: Properties, section_id: String): T = { + def registerBlock[T <: Block](instance: T, id: String, itemProps: Properties, section_id: String= null): T = { if (!descriptors.contains(id)) { instance match { case simple: SimpleBlock => simple.setUnlocalizedName("oc." + id) - ITEM_TO_SECTION.put(id, section_id); + if (section_id != null) ITEM_TO_SECTION.put(id, section_id); val ro: DeferredItem[Item] = ITEMS.register(id, () => new common.block.Item(simple, itemProps)) descriptors += id -> new ItemInfo { @@ -104,12 +104,12 @@ object OCItems extends ItemAPI { instance } - def registerItem[T <: Item](makeItem: => T, id: String, section_id: String): DeferredItem[T] = { + def registerItem[T <: Item](makeItem: => T, id: String, section_id: String= null): DeferredItem[T] = { if (descriptors.contains(id)) { throw new IllegalArgumentException("Duplicate item " + id) } - ITEM_TO_SECTION.put(id, section_id); + if (section_id != null) ITEM_TO_SECTION.put(id, section_id); // Construct items inside the supplier while the registry is writable. val ro: DeferredItem[T] = ITEMS.register(id, () => { val instance = makeItem @@ -135,8 +135,9 @@ object OCItems extends ItemAPI { private def registerBasicTieredItem(id: String, section_id: String, props: Item.Properties): DeferredItem[Item] = registerItem(new item.BasicTieredItem(props, id), id, section_id) - def registerStack(stack: ItemStack, id: String): ItemStack = { + def registerStack(stack: ItemStack, id: String, section_id: String = null): ItemStack = { val immutableStack = stack.copy() + if (section_id != null) ITEM_TO_SECTION.put(id, section_id); descriptors += id -> new ItemInfo { override def name: String = id @@ -164,13 +165,13 @@ object OCItems extends ItemAPI { override def registerFloppy(name: String, loc: ResourceLocation, color: DyeColor, factory: Callable[FileSystem], doRecipeCycling: Boolean): ItemStack = { val stack = Loot.registerLootDisk(name, loc, color, factory, doRecipeCycling) - OCItems.registerStack(stack, name) + OCItems.registerStack(stack, name, null) stack.copy() } override def registerEEPROM(name: String, code: Array[Byte], data: Array[Byte], readonly: Boolean): ItemStack = { val stack = createEEPROM(name, code, data, readonly) - OCItems.registerStack(stack, name) + OCItems.registerStack(stack, name, null) stack.copy() } @@ -529,7 +530,7 @@ object OCItems extends ItemAPI { val count = OpenComputers.getClass.getResourceAsStream(Settings.scriptPath + "bios.lua").read(code) createEEPROM("EEPROM (Lua BIOS)", code.take(count), null, readonly = false) } - registerStack(luaBios, Constants.ItemName.LuaBios) + registerStack(luaBios, Constants.ItemName.LuaBios, null) } ///////////////////////////////////////////////////////////////// @@ -593,8 +594,5 @@ object OCItems extends ItemAPI { displayItems.accept(OCItems.createConfiguredRobot()) displayItems.accept(OCItems.createConfiguredTablet()) - //TODO: revove this line - OpenPrinter.addCreativeItems(displayItems) - } } diff --git a/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala b/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala index c9688bd7e0..54be6b9c10 100644 --- a/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala +++ b/src/main/scala/li/cil/oc/mixin/CreativeModeInventoryScreenMixin.scala @@ -1,19 +1,18 @@ package li.cil.oc.mixin import com.mojang.blaze3d.systems.RenderSystem -import li.cil.oc.{CreativeTab, OpenComputers} import li.cil.oc.CreativeTab.CURRENT_ROW import li.cil.oc.common.init.OCItems -import li.cil.oc.common.init.OCItems.SECTION_Y_VALUES import li.cil.oc.mixin.accessor.{AbstractContainerScreenAccess, CreativeModeInventoryScreenAccess} +import li.cil.oc.{CreativeTab, OpenComputers} import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import org.spongepowered.asm.mixin.Mixin -import org.spongepowered.asm.mixin.injection.{At, Inject} import org.spongepowered.asm.mixin.injection.callback.CallbackInfo +import org.spongepowered.asm.mixin.injection.{At, Inject} // Inspired by : // https://github.com/Creators-of-Aeronautics/Simulated-Project/blob/main/simulated/common/src/main/java/dev/simulated_team/simulated/mixin/creative_tab_sections/CreativeModeInventoryScreenMixin.java @@ -44,7 +43,7 @@ class CreativeModeInventoryScreenMixin { } } - def renderBanners(screen: CreativeModeInventoryScreen, graphics: GuiGraphics, mouseX: Int, mouseY: Int): Unit = { + private def renderBanners(screen: CreativeModeInventoryScreen, graphics: GuiGraphics, mouseX: Int, mouseY: Int): Unit = { val ps = graphics.pose ps.pushPose() RenderSystem.enableDepthTest() From b3e5759e86758ba695adea1539de1b9c4e36f55c Mon Sep 17 00:00:00 2001 From: Grahmindol Date: Thu, 13 Aug 2026 13:14:44 +0200 Subject: [PATCH 37/38] add constants for section names --- src/main/scala/li/cil/oc/Constants.scala | 8 + .../scala/li/cil/oc/common/init/OCItems.scala | 282 +++++++++--------- 2 files changed, 149 insertions(+), 141 deletions(-) diff --git a/src/main/scala/li/cil/oc/Constants.scala b/src/main/scala/li/cil/oc/Constants.scala index 1f5fadca02..0b80639821 100644 --- a/src/main/scala/li/cil/oc/Constants.scala +++ b/src/main/scala/li/cil/oc/Constants.scala @@ -3,6 +3,14 @@ package li.cil.oc import li.cil.oc.util.ItemUtils object Constants { + object SectionName { + final val Component = "25_components" + final val Tools = "49_tools" + final val Materials = "50_materials" + final val Upgrade = "80_upgrade" + final val Misc = "99_misc" + } + object BlockName { final val Adapter = "adapter" final val Assembler = "assembler" diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index a21a88e980..eb59ce586d 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -345,184 +345,184 @@ object OCItems extends ItemAPI { ///////////////////////////////////////////////////////////////// // Crafting materials. ///////////////////////////////////////////////////////////////// - val CuttingWire: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CuttingWire, "50_materials") - val Acid: DeferredItem[item.Acid] = registerItem(new item.Acid(defaultProps), Constants.ItemName.Acid, "50_materials") - val RawCircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RawCircuitBoard, "50_materials") - val CircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CircuitBoard, "50_materials") - val PrintedCircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.PrintedCircuitBoard, "50_materials") - val Card: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "cardbase"), Constants.ItemName.Card, "50_materials") - val Transistor: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Transistor, "50_materials") - val ChipTier1: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps, Tier.One), Constants.ItemName.ChipTier1, "50_materials") - val ChipTier2: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ChipTier2, "50_materials") - val ChipTier3: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ChipTier3, "50_materials") - val ChipTier4: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ChipTier4, "50_materials") - val Alu: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Alu, "50_materials") - val ControlUnit: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "controlunit"), Constants.ItemName.ControlUnit, "50_materials") - val Disk: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Disk, "50_materials") - val Interweb: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Interweb, "50_materials") - val ButtonGroup: DeferredItem[Item] = registerBasicItem(Constants.ItemName.ButtonGroup, "50_materials", defaultProps) - val ArrowKeys: DeferredItem[Item] = registerBasicItem(Constants.ItemName.ArrowKeys, "50_materials") - val NumPad: DeferredItem[Item] = registerBasicItem(Constants.ItemName.NumPad, "50_materials") - - val TabletCaseTier1: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps, Tier.One), Constants.ItemName.TabletCaseTier1, "50_materials") - val TabletCaseTier2: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.TabletCaseTier2, "50_materials") - val TabletCaseTier3: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.TabletCaseTier3, "50_materials") - val TabletCaseCreative: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.TabletCaseCreative, "50_materials") - val MicrocontrollerCaseTier1: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps, Tier.One), Constants.ItemName.MicrocontrollerCaseTier1, "50_materials") - val MicrocontrollerCaseTier2: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.MicrocontrollerCaseTier2, "50_materials") - val MicrocontrollerCaseTier3: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.MicrocontrollerCaseTier3, "50_materials") - val MicrocontrollerCaseCreative: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.MicrocontrollerCaseCreative, "50_materials") - val DroneCaseTier1: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps, Tier.One), Constants.ItemName.DroneCaseTier1, "50_materials") - val DroneCaseTier2: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DroneCaseTier2, "50_materials") - val DroneCaseTier3: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.DroneCaseTier3, "50_materials") - val DroneCaseCreative: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.DroneCaseCreative, "50_materials") - - val InkCartridgeEmpty: DeferredItem[Item] = registerBasicItem(Constants.ItemName.InkCartridgeEmpty, "50_materials", defaultProps.stacksTo(1)) - val InkCartridge: DeferredItem[item.InkCartridge] = registerItem(new item.InkCartridge(defaultProps.stacksTo(1)), Constants.ItemName.InkCartridge, "50_materials") - val Chamelium: DeferredItem[item.Chamelium] = registerItem(new item.Chamelium(defaultProps), Constants.ItemName.Chamelium, "50_materials") - - val DiamondChip: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "diamondchip"), Constants.ItemName.DiamondChip, "50_materials") - val NetheriteSilicon: DeferredItem[Item] = registerBasicItem(Constants.ItemName.NetheriteSilicon, "50_materials", defaultProps) + val CuttingWire: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CuttingWire, Constants.SectionName.Materials) + val Acid: DeferredItem[item.Acid] = registerItem(new item.Acid(defaultProps), Constants.ItemName.Acid, Constants.SectionName.Materials) + val RawCircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RawCircuitBoard, Constants.SectionName.Materials) + val CircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CircuitBoard, Constants.SectionName.Materials) + val PrintedCircuitBoard: DeferredItem[Item] = registerBasicItem(Constants.ItemName.PrintedCircuitBoard, Constants.SectionName.Materials) + val Card: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "cardbase"), Constants.ItemName.Card, Constants.SectionName.Materials) + val Transistor: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Transistor, Constants.SectionName.Materials) + val ChipTier1: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps, Tier.One), Constants.ItemName.ChipTier1, Constants.SectionName.Materials) + val ChipTier2: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ChipTier2, Constants.SectionName.Materials) + val ChipTier3: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ChipTier3, Constants.SectionName.Materials) + val ChipTier4: DeferredItem[item.Microchip] = registerItem(new item.Microchip(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ChipTier4, Constants.SectionName.Materials) + val Alu: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Alu, Constants.SectionName.Materials) + val ControlUnit: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "controlunit"), Constants.ItemName.ControlUnit, Constants.SectionName.Materials) + val Disk: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Disk, Constants.SectionName.Materials) + val Interweb: DeferredItem[Item] = registerBasicItem(Constants.ItemName.Interweb, Constants.SectionName.Materials) + val ButtonGroup: DeferredItem[Item] = registerBasicItem(Constants.ItemName.ButtonGroup, Constants.SectionName.Materials, defaultProps) + val ArrowKeys: DeferredItem[Item] = registerBasicItem(Constants.ItemName.ArrowKeys, Constants.SectionName.Materials) + val NumPad: DeferredItem[Item] = registerBasicItem(Constants.ItemName.NumPad, Constants.SectionName.Materials) + + val TabletCaseTier1: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps, Tier.One), Constants.ItemName.TabletCaseTier1, Constants.SectionName.Materials) + val TabletCaseTier2: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.TabletCaseTier2, Constants.SectionName.Materials) + val TabletCaseTier3: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.TabletCaseTier3, Constants.SectionName.Materials) + val TabletCaseCreative: DeferredItem[item.TabletCase] = registerItem(new item.TabletCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.TabletCaseCreative, Constants.SectionName.Materials) + val MicrocontrollerCaseTier1: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps, Tier.One), Constants.ItemName.MicrocontrollerCaseTier1, Constants.SectionName.Materials) + val MicrocontrollerCaseTier2: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.MicrocontrollerCaseTier2, Constants.SectionName.Materials) + val MicrocontrollerCaseTier3: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.MicrocontrollerCaseTier3, Constants.SectionName.Materials) + val MicrocontrollerCaseCreative: DeferredItem[item.MicrocontrollerCase] = registerItem(new item.MicrocontrollerCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.MicrocontrollerCaseCreative, Constants.SectionName.Materials) + val DroneCaseTier1: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps, Tier.One), Constants.ItemName.DroneCaseTier1, Constants.SectionName.Materials) + val DroneCaseTier2: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DroneCaseTier2, Constants.SectionName.Materials) + val DroneCaseTier3: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.DroneCaseTier3, Constants.SectionName.Materials) + val DroneCaseCreative: DeferredItem[item.DroneCase] = registerItem(new item.DroneCase(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.DroneCaseCreative, Constants.SectionName.Materials) + + val InkCartridgeEmpty: DeferredItem[Item] = registerBasicItem(Constants.ItemName.InkCartridgeEmpty, Constants.SectionName.Materials, defaultProps.stacksTo(1)) + val InkCartridge: DeferredItem[item.InkCartridge] = registerItem(new item.InkCartridge(defaultProps.stacksTo(1)), Constants.ItemName.InkCartridge, Constants.SectionName.Materials) + val Chamelium: DeferredItem[item.Chamelium] = registerItem(new item.Chamelium(defaultProps), Constants.ItemName.Chamelium, Constants.SectionName.Materials) + + val DiamondChip: DeferredItem[Item] = registerItem(new item.BasicItem(defaultProps, "diamondchip"), Constants.ItemName.DiamondChip, Constants.SectionName.Materials) + val NetheriteSilicon: DeferredItem[Item] = registerBasicItem(Constants.ItemName.NetheriteSilicon, Constants.SectionName.Materials, defaultProps) // All kinds of tools. - val Analyzer: DeferredItem[item.Analyzer] = registerItem(new item.Analyzer(defaultProps), Constants.ItemName.Analyzer, "49_tools") - val Debugger: DeferredItem[item.Debugger] = registerItem(new item.Debugger(defaultProps), Constants.ItemName.Debugger, "49_tools") - val Terminal: DeferredItem[item.Terminal] = registerItem(new item.Terminal(defaultProps.stacksTo(1)), Constants.ItemName.Terminal, "49_tools") - val TexturePicker: DeferredItem[item.TexturePicker] = registerItem(new item.TexturePicker(defaultProps), Constants.ItemName.TexturePicker, "49_tools") - val Manual: DeferredItem[item.Manual] = registerItem(new item.Manual(defaultProps), Constants.ItemName.Manual, "49_tools") - val Wrench: DeferredItem[item.Wrench] = registerItem(new item.Wrench(defaultProps.stacksTo(1)), Constants.ItemName.Wrench, "49_tools") + val Analyzer: DeferredItem[item.Analyzer] = registerItem(new item.Analyzer(defaultProps), Constants.ItemName.Analyzer, Constants.SectionName.Tools) + val Debugger: DeferredItem[item.Debugger] = registerItem(new item.Debugger(defaultProps), Constants.ItemName.Debugger, Constants.SectionName.Tools) + val Terminal: DeferredItem[item.Terminal] = registerItem(new item.Terminal(defaultProps.stacksTo(1)), Constants.ItemName.Terminal, Constants.SectionName.Tools) + val TexturePicker: DeferredItem[item.TexturePicker] = registerItem(new item.TexturePicker(defaultProps), Constants.ItemName.TexturePicker, Constants.SectionName.Tools) + val Manual: DeferredItem[item.Manual] = registerItem(new item.Manual(defaultProps), Constants.ItemName.Manual, Constants.SectionName.Tools) + val Wrench: DeferredItem[item.Wrench] = registerItem(new item.Wrench(defaultProps.stacksTo(1)), Constants.ItemName.Wrench, Constants.SectionName.Tools) // 1.5.11 - val HoverBoots: DeferredItem[item.HoverBoots] = registerItem(new item.HoverBoots(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON).setNoRepair), Constants.ItemName.HoverBoots, "49_tools") + val HoverBoots: DeferredItem[item.HoverBoots] = registerItem(new item.HoverBoots(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON).setNoRepair), Constants.ItemName.HoverBoots, Constants.SectionName.Tools) // 1.5.18 - val Nanomachines: DeferredItem[item.Nanomachines] = registerItem(new item.Nanomachines(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.Nanomachines, "49_tools") + val Nanomachines: DeferredItem[item.Nanomachines] = registerItem(new item.Nanomachines(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.Nanomachines, Constants.SectionName.Tools) ///////////////////////////////////////////////////////////////// // General purpose components. ///////////////////////////////////////////////////////////////// - val CPUTier1: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps, Tier.One), Constants.ItemName.CPUTier1, "25_components") - val CPUTier2: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CPUTier2, "25_components") - val CPUTier3: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CPUTier3, "25_components") - val CPUTier4: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.CPUTier4, "25_components") - - val ComponentBusTier1: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps, Tier.One), Constants.ItemName.ComponentBusTier1, "25_components") - val ComponentBusTier2: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ComponentBusTier2, "25_components") - val ComponentBusTier3: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ComponentBusTier3, "25_components") - val ComponentBusTier4: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ComponentBusTier4, "25_components") - val ComponentBusCreative: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.ComponentBusCreative, "25_components") - - val RAMTier1: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps, Tier.One), Constants.ItemName.RAMTier1, "25_components") - val RAMTier2: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps, Tier.Two), Constants.ItemName.RAMTier2, "25_components") - val RAMTier3: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.UNCOMMON), Tier.Three), Constants.ItemName.RAMTier3, "25_components") - val RAMTier4: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.UNCOMMON), Tier.Four), Constants.ItemName.RAMTier4, "25_components") - val RAMTier5: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.RARE), Tier.Five), Constants.ItemName.RAMTier5, "25_components") - val RAMTier6: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.RARE), Tier.Six), Constants.ItemName.RAMTier6, "25_components") - val RAMTier7: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Seven), Constants.ItemName.RAMTier7, "25_components") - val RAMTier8: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Eight), Constants.ItemName.RAMTier8, "25_components") + val CPUTier1: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps, Tier.One), Constants.ItemName.CPUTier1, Constants.SectionName.Component) + val CPUTier2: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CPUTier2, Constants.SectionName.Component) + val CPUTier3: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CPUTier3, Constants.SectionName.Component) + val CPUTier4: DeferredItem[item.CPU] = registerItem(new item.CPU(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.CPUTier4, Constants.SectionName.Component) + + val ComponentBusTier1: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps, Tier.One), Constants.ItemName.ComponentBusTier1, Constants.SectionName.Component) + val ComponentBusTier2: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ComponentBusTier2, Constants.SectionName.Component) + val ComponentBusTier3: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ComponentBusTier3, Constants.SectionName.Component) + val ComponentBusTier4: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ComponentBusTier4, Constants.SectionName.Component) + val ComponentBusCreative: DeferredItem[item.ComponentBus] = registerItem(new item.ComponentBus(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.ComponentBusCreative, Constants.SectionName.Component) + + val RAMTier1: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps, Tier.One), Constants.ItemName.RAMTier1, Constants.SectionName.Component) + val RAMTier2: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps, Tier.Two), Constants.ItemName.RAMTier2, Constants.SectionName.Component) + val RAMTier3: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.UNCOMMON), Tier.Three), Constants.ItemName.RAMTier3, Constants.SectionName.Component) + val RAMTier4: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.UNCOMMON), Tier.Four), Constants.ItemName.RAMTier4, Constants.SectionName.Component) + val RAMTier5: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.RARE), Tier.Five), Constants.ItemName.RAMTier5, Constants.SectionName.Component) + val RAMTier6: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(Rarity.RARE), Tier.Six), Constants.ItemName.RAMTier6, Constants.SectionName.Component) + val RAMTier7: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Seven), Constants.ItemName.RAMTier7, Constants.SectionName.Component) + val RAMTier8: DeferredItem[item.Memory] = registerItem(new item.Memory(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Eight), Constants.ItemName.RAMTier8, Constants.SectionName.Component) // 1.9 - val RAMCreative: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RAMCreative, "25_components", defaultProps.rarity(Rarity.EPIC)) + val RAMCreative: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RAMCreative, Constants.SectionName.Component, defaultProps.rarity(Rarity.EPIC)) - val ServerTier1: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1), Tier.One), Constants.ItemName.ServerTier1, "25_components") - val ServerTier2: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ServerTier2, "25_components") - val ServerTier3: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ServerTier3, "25_components") - val ServerTier4: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ServerTier4, "25_components") - val ServerCreative: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.ServerCreative, "25_components") + val ServerTier1: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1), Tier.One), Constants.ItemName.ServerTier1, Constants.SectionName.Component) + val ServerTier2: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.ServerTier2, Constants.SectionName.Component) + val ServerTier3: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.RARE), Tier.Three), Constants.ItemName.ServerTier3, Constants.SectionName.Component) + val ServerTier4: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.ServerTier4, Constants.SectionName.Component) + val ServerCreative: DeferredItem[item.Server] = registerItem(new item.Server(defaultProps.stacksTo(1).rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.ServerCreative, Constants.SectionName.Component) - val APUTier1: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.UNCOMMON), Tier.One), Constants.ItemName.APUTier1, "25_components") - val APUTier2: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.RARE), Tier.Two), Constants.ItemName.APUTier2, "25_components") - val APUTier3: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.APUTier3, "25_components") - val APUCreative: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.APUCreative, "25_components") + val APUTier1: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.UNCOMMON), Tier.One), Constants.ItemName.APUTier1, Constants.SectionName.Component) + val APUTier2: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.RARE), Tier.Two), Constants.ItemName.APUTier2, Constants.SectionName.Component) + val APUTier3: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.APUTier3, Constants.SectionName.Component) + val APUCreative: DeferredItem[item.APU] = registerItem(new item.APU(defaultProps.rarity(Rarity.EPIC), Tier.Five), Constants.ItemName.APUCreative, Constants.SectionName.Component) // 1.6 - val TerminalServer: DeferredItem[item.TerminalServer] = registerItem(new item.TerminalServer(defaultProps.stacksTo(1)), Constants.ItemName.TerminalServer, "25_components") - val RackKVM: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RackKVM, "25_components", defaultProps.stacksTo(1)) - val DiskDriveMountable: DeferredItem[item.DiskDriveMountable] = registerItem(new item.DiskDriveMountable(defaultProps.stacksTo(1)), Constants.ItemName.DiskDriveMountable, "25_components") + val TerminalServer: DeferredItem[item.TerminalServer] = registerItem(new item.TerminalServer(defaultProps.stacksTo(1)), Constants.ItemName.TerminalServer, Constants.SectionName.Component) + val RackKVM: DeferredItem[Item] = registerBasicItem(Constants.ItemName.RackKVM, Constants.SectionName.Component, defaultProps.stacksTo(1)) + val DiskDriveMountable: DeferredItem[item.DiskDriveMountable] = registerItem(new item.DiskDriveMountable(defaultProps.stacksTo(1)), Constants.ItemName.DiskDriveMountable, Constants.SectionName.Component) // 1.9 - val CapacitorMountable: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CapacitorMountable, "25_components", defaultProps.stacksTo(1)) + val CapacitorMountable: DeferredItem[Item] = registerBasicItem(Constants.ItemName.CapacitorMountable, Constants.SectionName.Component, defaultProps.stacksTo(1)) // Card components. - val DebugCard: DeferredItem[item.DebugCard] = registerItem(new item.DebugCard(defaultProps), Constants.ItemName.DebugCard, "25_components") - val GraphicsCardTier1: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps, Tier.One), Constants.ItemName.GraphicsCardTier1, "25_components") - val GraphicsCardTier2: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.GraphicsCardTier2, "25_components") - val GraphicsCardTier3: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.GraphicsCardTier3, "25_components") - val GraphicsCardTier4: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.GraphicsCardTier4, "25_components") - val QuadGraphicsCard: DeferredItem[Item] = registerItem(new item.QuadGraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY)), Constants.ItemName.QuadGraphicsCard, "25_components") - val RedstoneCardTier1: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps, Tier.One), Constants.ItemName.RedstoneCardTier1, "25_components") - val RedstoneCardTier2: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.RedstoneCardTier2, "25_components") - val NetworkCard: DeferredItem[Item] = registerItem(new item.BasicTieredComponentItem(defaultProps, "networkcard"), Constants.ItemName.NetworkCard, "25_components") - val WirelessNetworkCardTier2: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.WirelessNetworkCardTier2, "25_components") - val InternetCard: DeferredItem[Item] = registerItem(new item.BasicTieredComponentItem(defaultProps.rarity(Rarity.UNCOMMON), "internetcard"), Constants.ItemName.InternetCard, "25_components") - val LinkedCard: DeferredItem[item.LinkedCard] = registerItem(new item.LinkedCard(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.LinkedCard, "25_components") + val DebugCard: DeferredItem[item.DebugCard] = registerItem(new item.DebugCard(defaultProps), Constants.ItemName.DebugCard, Constants.SectionName.Component) + val GraphicsCardTier1: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps, Tier.One), Constants.ItemName.GraphicsCardTier1, Constants.SectionName.Component) + val GraphicsCardTier2: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.GraphicsCardTier2, Constants.SectionName.Component) + val GraphicsCardTier3: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.GraphicsCardTier3, Constants.SectionName.Component) + val GraphicsCardTier4: DeferredItem[item.GraphicsCard] = registerItem(new item.GraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.GraphicsCardTier4, Constants.SectionName.Component) + val QuadGraphicsCard: DeferredItem[Item] = registerItem(new item.QuadGraphicsCard(defaultProps.rarity(OCRarity.LEGENDARY)), Constants.ItemName.QuadGraphicsCard, Constants.SectionName.Component) + val RedstoneCardTier1: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps, Tier.One), Constants.ItemName.RedstoneCardTier1, Constants.SectionName.Component) + val RedstoneCardTier2: DeferredItem[item.RedstoneCard] = registerItem(new item.RedstoneCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.RedstoneCardTier2, Constants.SectionName.Component) + val NetworkCard: DeferredItem[Item] = registerItem(new item.BasicTieredComponentItem(defaultProps, "networkcard"), Constants.ItemName.NetworkCard, Constants.SectionName.Component) + val WirelessNetworkCardTier2: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.WirelessNetworkCardTier2, Constants.SectionName.Component) + val InternetCard: DeferredItem[Item] = registerItem(new item.BasicTieredComponentItem(defaultProps.rarity(Rarity.UNCOMMON), "internetcard"), Constants.ItemName.InternetCard, Constants.SectionName.Component) + val LinkedCard: DeferredItem[item.LinkedCard] = registerItem(new item.LinkedCard(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.LinkedCard, Constants.SectionName.Component) // 1.5.13 - val DataCardTier1: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps, Tier.One), Constants.ItemName.DataCardTier1, "25_components") + val DataCardTier1: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps, Tier.One), Constants.ItemName.DataCardTier1, Constants.SectionName.Component) // 1.5.15 - val DataCardTier2: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DataCardTier2, "25_components") - val DataCardTier3: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DataCardTier3, "25_components") + val DataCardTier2: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DataCardTier2, Constants.SectionName.Component) + val DataCardTier3: DeferredItem[item.DataCard] = registerItem(new item.DataCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DataCardTier3, Constants.SectionName.Component) // 1.7.2 - val WirelessNetworkCardTier1: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps, Tier.One), Constants.ItemName.WirelessNetworkCardTier1, "25_components") + val WirelessNetworkCardTier1: DeferredItem[item.WirelessNetworkCard] = registerItem(new item.WirelessNetworkCard(defaultProps, Tier.One), Constants.ItemName.WirelessNetworkCardTier1, Constants.SectionName.Component) // 1.9 - val AudioCardTier1: DeferredItem[item.AudioCard] = registerItem(new item.AudioCard(defaultProps), Constants.ItemName.AudioCardTier1, "25_components") + val AudioCardTier1: DeferredItem[item.AudioCard] = registerItem(new item.AudioCard(defaultProps), Constants.ItemName.AudioCardTier1, Constants.SectionName.Component) ///////////////////////////////////////////////////////////////// // Upgrade components. ///////////////////////////////////////////////////////////////// - val AngelUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradeangel"), Constants.ItemName.AngelUpgrade, "80_upgrade") - val BatteryUpgradeTier1: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps, Tier.One), Constants.ItemName.BatteryUpgradeTier1, "80_upgrade") - val BatteryUpgradeTier2: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.BatteryUpgradeTier2, "80_upgrade") - val BatteryUpgradeTier3: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.BatteryUpgradeTier3, "80_upgrade") - val ChunkloaderUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.RARE), "upgradechunkloader"), Constants.ItemName.ChunkloaderUpgrade, "80_upgrade") - val CardContainerTier1: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps, Tier.One), Constants.ItemName.CardContainerTier1, "80_upgrade") - val CardContainerTier2: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CardContainerTier2, "80_upgrade") - val CardContainerTier3: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CardContainerTier3, "80_upgrade") - val UpgradeContainerTier1: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps, Tier.One), Constants.ItemName.UpgradeContainerTier1, "80_upgrade") - val UpgradeContainerTier2: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.UpgradeContainerTier2, "80_upgrade") - val UpgradeContainerTier3: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.UpgradeContainerTier3, "80_upgrade") - val CraftingUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradecrafting"), Constants.ItemName.CraftingUpgrade, "80_upgrade") - val DatabaseUpgradeTier1: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps, Tier.One), Constants.ItemName.DatabaseUpgradeTier1, "80_upgrade") - val DatabaseUpgradeTier2: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DatabaseUpgradeTier2, "80_upgrade") - val DatabaseUpgradeTier3: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DatabaseUpgradeTier3, "80_upgrade") - val ExperienceUpgrade: DeferredItem[item.UpgradeExperience] = registerItem(new item.UpgradeExperience(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.ExperienceUpgrade, "80_upgrade") - val GeneratorUpgrade: DeferredItem[item.UpgradeGenerator] = registerItem(new item.UpgradeGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.GeneratorUpgrade, "80_upgrade") - val InventoryUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradeinventory"), Constants.ItemName.InventoryUpgrade, "80_upgrade") - val InventoryControllerUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradeinventorycontroller"), Constants.ItemName.InventoryControllerUpgrade, "80_upgrade") - val NavigationUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradenavigation"), Constants.ItemName.NavigationUpgrade, "80_upgrade") - val PistonUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradepiston"), Constants.ItemName.PistonUpgrade, "80_upgrade") - val SignUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradesign"), Constants.ItemName.SignUpgrade, "80_upgrade") - val SolarGeneratorUpgrade: DeferredItem[item.UpgradeSolarGenerator] = registerItem(new item.UpgradeSolarGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.SolarGeneratorUpgrade, "80_upgrade") - val TankUpgrade: DeferredItem[item.UpgradeTank] = registerItem(new item.UpgradeTank(defaultProps), Constants.ItemName.TankUpgrade, "80_upgrade") - val TankControllerUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradetankcontroller"), Constants.ItemName.TankControllerUpgrade, "80_upgrade") - val TractorBeamUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.RARE), "upgradetractorbeam"), Constants.ItemName.TractorBeamUpgrade, "80_upgrade") - val LeashUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradeleash"), Constants.ItemName.LeashUpgrade, "80_upgrade") + val AngelUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradeangel"), Constants.ItemName.AngelUpgrade, Constants.SectionName.Upgrade) + val BatteryUpgradeTier1: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps, Tier.One), Constants.ItemName.BatteryUpgradeTier1, Constants.SectionName.Upgrade) + val BatteryUpgradeTier2: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.BatteryUpgradeTier2, Constants.SectionName.Upgrade) + val BatteryUpgradeTier3: DeferredItem[item.UpgradeBattery] = registerItem(new item.UpgradeBattery(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.BatteryUpgradeTier3, Constants.SectionName.Upgrade) + val ChunkloaderUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.RARE), "upgradechunkloader"), Constants.ItemName.ChunkloaderUpgrade, Constants.SectionName.Upgrade) + val CardContainerTier1: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps, Tier.One), Constants.ItemName.CardContainerTier1, Constants.SectionName.Upgrade) + val CardContainerTier2: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.CardContainerTier2, Constants.SectionName.Upgrade) + val CardContainerTier3: DeferredItem[item.UpgradeContainerCard] = registerItem(new item.UpgradeContainerCard(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.CardContainerTier3, Constants.SectionName.Upgrade) + val UpgradeContainerTier1: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps, Tier.One), Constants.ItemName.UpgradeContainerTier1, Constants.SectionName.Upgrade) + val UpgradeContainerTier2: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.UpgradeContainerTier2, Constants.SectionName.Upgrade) + val UpgradeContainerTier3: DeferredItem[item.UpgradeContainerUpgrade] = registerItem(new item.UpgradeContainerUpgrade(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.UpgradeContainerTier3, Constants.SectionName.Upgrade) + val CraftingUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradecrafting"), Constants.ItemName.CraftingUpgrade, Constants.SectionName.Upgrade) + val DatabaseUpgradeTier1: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps, Tier.One), Constants.ItemName.DatabaseUpgradeTier1, Constants.SectionName.Upgrade) + val DatabaseUpgradeTier2: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.DatabaseUpgradeTier2, Constants.SectionName.Upgrade) + val DatabaseUpgradeTier3: DeferredItem[item.UpgradeDatabase] = registerItem(new item.UpgradeDatabase(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.DatabaseUpgradeTier3, Constants.SectionName.Upgrade) + val ExperienceUpgrade: DeferredItem[item.UpgradeExperience] = registerItem(new item.UpgradeExperience(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.ExperienceUpgrade, Constants.SectionName.Upgrade) + val GeneratorUpgrade: DeferredItem[item.UpgradeGenerator] = registerItem(new item.UpgradeGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.GeneratorUpgrade, Constants.SectionName.Upgrade) + val InventoryUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradeinventory"), Constants.ItemName.InventoryUpgrade, Constants.SectionName.Upgrade) + val InventoryControllerUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradeinventorycontroller"), Constants.ItemName.InventoryControllerUpgrade, Constants.SectionName.Upgrade) + val NavigationUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradenavigation"), Constants.ItemName.NavigationUpgrade, Constants.SectionName.Upgrade) + val PistonUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradepiston"), Constants.ItemName.PistonUpgrade, Constants.SectionName.Upgrade) + val SignUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradesign"), Constants.ItemName.SignUpgrade, Constants.SectionName.Upgrade) + val SolarGeneratorUpgrade: DeferredItem[item.UpgradeSolarGenerator] = registerItem(new item.UpgradeSolarGenerator(defaultProps.rarity(Rarity.UNCOMMON)), Constants.ItemName.SolarGeneratorUpgrade, Constants.SectionName.Upgrade) + val TankUpgrade: DeferredItem[item.UpgradeTank] = registerItem(new item.UpgradeTank(defaultProps), Constants.ItemName.TankUpgrade, Constants.SectionName.Upgrade) + val TankControllerUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradetankcontroller"), Constants.ItemName.TankControllerUpgrade, Constants.SectionName.Upgrade) + val TractorBeamUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.RARE), "upgradetractorbeam"), Constants.ItemName.TractorBeamUpgrade, Constants.SectionName.Upgrade) + val LeashUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradeleash"), Constants.ItemName.LeashUpgrade, Constants.SectionName.Upgrade) // 1.5.8 - val HoverUpgradeTier1: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps, Tier.One), Constants.ItemName.HoverUpgradeTier1, "80_upgrade") - val HoverUpgradeTier2: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HoverUpgradeTier2, "80_upgrade") + val HoverUpgradeTier1: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps, Tier.One), Constants.ItemName.HoverUpgradeTier1, Constants.SectionName.Upgrade) + val HoverUpgradeTier2: DeferredItem[item.UpgradeHover] = registerItem(new item.UpgradeHover(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HoverUpgradeTier2, Constants.SectionName.Upgrade) // 1.6 - val TradingUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradetrading"), Constants.ItemName.TradingUpgrade, "80_upgrade") - val MFU: DeferredItem[item.UpgradeMF] = registerItem(new item.UpgradeMF(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.MFU, "80_upgrade") + val TradingUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps.rarity(Rarity.UNCOMMON), "upgradetrading"), Constants.ItemName.TradingUpgrade, Constants.SectionName.Upgrade) + val MFU: DeferredItem[item.UpgradeMF] = registerItem(new item.UpgradeMF(defaultProps.rarity(Rarity.RARE)), Constants.ItemName.MFU, Constants.SectionName.Upgrade) // 1.8 - val StickyPistonUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradestickypiston"), Constants.ItemName.StickyPistonUpgrade, "80_upgrade") + val StickyPistonUpgrade: DeferredItem[Item] = registerItem(new item.BasicTieredItem(defaultProps, "upgradestickypiston"), Constants.ItemName.StickyPistonUpgrade, Constants.SectionName.Upgrade) ///////////////////////////////////////////////////////////////// // Storage media of all kinds. ///////////////////////////////////////////////////////////////// - val EEPROM: DeferredItem[item.EEPROM] = registerItem(new item.EEPROM(defaultProps), Constants.ItemName.EEPROM, "25_components") - val Floppy: DeferredItem[item.FloppyDisk] = registerItem(new item.FloppyDisk(defaultProps), Constants.ItemName.Floppy, "25_components") - val HDDTier1: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps, Tier.One), Constants.ItemName.HDDTier1, "25_components") - val HDDTier2: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HDDTier2, "25_components") - val HDDTier3: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.HDDTier3, "25_components") - val HDDTier4: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.HDDTier4, "25_components") + val EEPROM: DeferredItem[item.EEPROM] = registerItem(new item.EEPROM(defaultProps), Constants.ItemName.EEPROM, Constants.SectionName.Component) + val Floppy: DeferredItem[item.FloppyDisk] = registerItem(new item.FloppyDisk(defaultProps), Constants.ItemName.Floppy, Constants.SectionName.Component) + val HDDTier1: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps, Tier.One), Constants.ItemName.HDDTier1, Constants.SectionName.Component) + val HDDTier2: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(Rarity.UNCOMMON), Tier.Two), Constants.ItemName.HDDTier2, Constants.SectionName.Component) + val HDDTier3: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(Rarity.RARE), Tier.Three), Constants.ItemName.HDDTier3, Constants.SectionName.Component) + val HDDTier4: DeferredItem[item.HardDiskDrive] = registerItem(new item.HardDiskDrive(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Four), Constants.ItemName.HDDTier4, Constants.SectionName.Component) - val SSDTier1: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(Rarity.UNCOMMON), Tier.One), Constants.ItemName.SSDTier1, "25_components") - val SSDTier2: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(Rarity.RARE), Tier.Two), Constants.ItemName.SSDTier2, "25_components") - val SSDTier3: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.SSDTier3, "25_components") + val SSDTier1: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(Rarity.UNCOMMON), Tier.One), Constants.ItemName.SSDTier1, Constants.SectionName.Component) + val SSDTier2: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(Rarity.RARE), Tier.Two), Constants.ItemName.SSDTier2, Constants.SectionName.Component) + val SSDTier3: DeferredItem[item.SolidStateDrive] = registerItem(new item.SolidStateDrive(defaultProps.rarity(OCRarity.LEGENDARY), Tier.Three), Constants.ItemName.SSDTier3, Constants.SectionName.Component) private def initPostStorage(): Unit = { val luaBios = { @@ -536,9 +536,9 @@ object OCItems extends ItemAPI { ///////////////////////////////////////////////////////////////// // Special purpose items that don't fit into any other category. ///////////////////////////////////////////////////////////////// - val Tablet: DeferredItem[item.Tablet] = registerItem(new item.Tablet(defaultProps.stacksTo(1)), Constants.ItemName.Tablet, "99_misc") - val Drone: DeferredItem[item.Drone] = registerItem(new item.Drone(defaultProps), Constants.ItemName.Drone, "99_misc") - val Present: DeferredItem[item.Present] = registerItem(new item.Present(defaultProps), Constants.ItemName.Present, "99_misc") + val Tablet: DeferredItem[item.Tablet] = registerItem(new item.Tablet(defaultProps.stacksTo(1)), Constants.ItemName.Tablet, Constants.SectionName.Misc) + val Drone: DeferredItem[item.Drone] = registerItem(new item.Drone(defaultProps), Constants.ItemName.Drone, Constants.SectionName.Misc) + val Present: DeferredItem[item.Present] = registerItem(new item.Present(defaultProps), Constants.ItemName.Present, Constants.SectionName.Misc) def decorateCreativeTab(displayItems: Consumer[ItemStack], searchItems: Consumer[ItemStack]): Unit = { import Constants.{BlockName => B, ItemName => I} @@ -552,7 +552,7 @@ object OCItems extends ItemAPI { val sectionMap = new util.HashMap[String, util.List[ItemStack]] for ((id, info) <- descriptors if !excluded.contains(id)){ - val sectionId = ITEM_TO_SECTION.getOrElse(id, "99_misc") + val sectionId = ITEM_TO_SECTION.getOrElse(id, Constants.SectionName.Misc) val stack = info.createItemStack(1) sectionMap.computeIfAbsent(sectionId, (s) => new util.LinkedList).add(stack) } From 6141790a17e7335f69cdc4025df253b06113c95b Mon Sep 17 00:00:00 2001 From: Grahmindol Date: Thu, 13 Aug 2026 13:24:57 +0200 Subject: [PATCH 38/38] re-introduce display name for floppy, a rework of floppy is needed --- src/main/java/li/cil/oc/api/Items.java | 2 +- src/main/java/li/cil/oc/api/detail/ItemAPI.java | 5 +++-- src/main/scala/li/cil/oc/common/Loot.scala | 8 ++++---- src/main/scala/li/cil/oc/common/init/OCItems.scala | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/li/cil/oc/api/Items.java b/src/main/java/li/cil/oc/api/Items.java index 146946d38c..6a4675db0e 100644 --- a/src/main/java/li/cil/oc/api/Items.java +++ b/src/main/java/li/cil/oc/api/Items.java @@ -78,7 +78,7 @@ public static ItemStack registerFloppy(String name, ResourceLocation loc, DyeCol Callable factory, boolean doRecipeCycling) { if (API.items != null) - return API.items.registerFloppy(name, loc, color, factory, doRecipeCycling); + return API.items.registerFloppy(name, name, loc, color, factory, doRecipeCycling); return ItemStack.EMPTY; } diff --git a/src/main/java/li/cil/oc/api/detail/ItemAPI.java b/src/main/java/li/cil/oc/api/detail/ItemAPI.java index 28798867e8..6eee1155da 100644 --- a/src/main/java/li/cil/oc/api/detail/ItemAPI.java +++ b/src/main/java/li/cil/oc/api/detail/ItemAPI.java @@ -53,7 +53,8 @@ public interface ItemAPI { *
* Call this in the init phase or later, not in pre-init. * - * @param name the label and identifier to use for the loot disk. + * @param display_name the label to use for the loot disk. + * @param name the identifier to use for the loot disk. * @param loc the location where the disk's contents are stored. * @param color the color of the disk, as a Minecraft color. * @param factory the callable to call for creating file system instances. @@ -61,7 +62,7 @@ public interface ItemAPI { * @return an item stack representing the registered loot disk, to allow * adding a recipe for your loot disk, for example. */ - ItemStack registerFloppy(String name, ResourceLocation loc, DyeColor color, + ItemStack registerFloppy(String display_name, String name, ResourceLocation loc, DyeColor color, Callable factory, boolean doRecipeCycling); /** diff --git a/src/main/scala/li/cil/oc/common/Loot.scala b/src/main/scala/li/cil/oc/common/Loot.scala index d836d89de5..cb179641ab 100644 --- a/src/main/scala/li/cil/oc/common/Loot.scala +++ b/src/main/scala/li/cil/oc/common/Loot.scala @@ -81,10 +81,10 @@ object Loot { if (disksForSampling.nonEmpty) Some(disksForSampling(rng.nextInt(disksForSampling.length))) else None - def registerLootDisk(name: String, loc: ResourceLocation, color: DyeColor, factory: Callable[FileSystem], doRecipeCycling: Boolean): ItemStack = { + def registerLootDisk(display_name:String, name: String, loc: ResourceLocation, color: DyeColor, factory: Callable[FileSystem], doRecipeCycling: Boolean): ItemStack = { val stack = OCItems.get(Constants.ItemName.Floppy).createItemStack(1) stack.set(OCComponents.LABEL, name) - stack.set(DataComponents.CUSTOM_NAME, Component.literal(name)) + stack.set(DataComponents.CUSTOM_NAME, Component.literal(display_name)) stack.set(OCComponents.LOOT_DISK, loc) stack.set(OCComponents.DISK_COLOR, color) @@ -212,7 +212,7 @@ object Loot { datapackPreviousFactories.getOrElseUpdate(id, factories.get(id)) datapackFactories += id -> factory val hadCyclingDisk = disksForCyclingServer.exists(_.get(OCComponents.LOOT_DISK.get()) == id) - val stack = registerLootDisk(label, id, color, factory, recipeCycling) + val stack = registerLootDisk(label, label, id, color, factory, recipeCycling) datapackDisks += ((stack, weight)) if (recipeCycling && !hadCyclingDisk) datapackCyclingDisks += stack } @@ -332,7 +332,7 @@ object Loot { } else new Callable[FileSystem] { override def call(): FileSystem = api.FileSystem.fromResource(ResourceLocation.fromNamespaceAndPath(Settings.resourceDomain, "loot/" + path)) } - val stack = OCItems.registerFloppy(path, ResourceLocation.fromNamespaceAndPath(Settings.resourceDomain, path), color.getOrElse(DyeColor.LIGHT_GRAY), callable, doRecipeCycling = true) + val stack = OCItems.registerFloppy(name, path, ResourceLocation.fromNamespaceAndPath(Settings.resourceDomain, path), color.getOrElse(DyeColor.LIGHT_GRAY), callable, doRecipeCycling = true) lootDiskDescriptorIds += path stack } diff --git a/src/main/scala/li/cil/oc/common/init/OCItems.scala b/src/main/scala/li/cil/oc/common/init/OCItems.scala index eb59ce586d..be64c61848 100644 --- a/src/main/scala/li/cil/oc/common/init/OCItems.scala +++ b/src/main/scala/li/cil/oc/common/init/OCItems.scala @@ -163,8 +163,8 @@ object OCItems extends ItemAPI { // ----------------------------------------------------------------------- // - override def registerFloppy(name: String, loc: ResourceLocation, color: DyeColor, factory: Callable[FileSystem], doRecipeCycling: Boolean): ItemStack = { - val stack = Loot.registerLootDisk(name, loc, color, factory, doRecipeCycling) + override def registerFloppy(display_name:String, name: String, loc: ResourceLocation, color: DyeColor, factory: Callable[FileSystem], doRecipeCycling: Boolean): ItemStack = { + val stack = Loot.registerLootDisk(display_name, name, loc, color, factory, doRecipeCycling) OCItems.registerStack(stack, name, null) stack.copy() }