From cd39f0cdea45e5cd38225bbde56da78a5e125080 Mon Sep 17 00:00:00 2001 From: bl4ckscor3 Date: Mon, 3 Feb 2025 23:42:38 +0100 Subject: [PATCH] Allow blocks to be broken with normal tools --- Changelog.md | 15 +- build.gradle | 10 +- .../tags/block/relocation_not_supported.json | 4 +- .../minecraft/tags/block/dragon_immune.json | 4 +- .../minecraft/tags/block/mineable/axe.json | 21 +- .../minecraft/tags/block/mineable/hoe.json | 11 + .../tags/block/mineable/pickaxe.json | 305 +++- .../minecraft/tags/block/mineable/shovel.json | 17 +- .../tags/block/needs_diamond_tool.json | 6 +- .../minecraft/tags/block/needs_iron_tool.json | 6 +- .../tags/block/needs_stone_tool.json | 57 +- .../data/minecraft/tags/block/walls.json | 26 +- .../minecraft/tags/block/wither_immune.json | 4 +- .../data/minecraft/tags/block/wool.json | 5 + .../tags/block/reinforced/cauldrons.json | 8 + .../tags/block/reinforced/walls.json | 29 + src/generated/resources/pack.mcmeta | 2 +- .../securitycraft/ConfigHandler.java | 29 +- .../geforcemods/securitycraft/SCContent.java | 1424 +++++++++-------- .../securitycraft/SCEventHandler.java | 9 +- .../net/geforcemods/securitycraft/SCTags.java | 2 + .../blocks/AbstractPanelBlock.java | 3 +- .../securitycraft/blocks/AlarmBlock.java | 3 +- .../blocks/DisguisableBlock.java | 10 + .../blocks/DisplayCaseBlock.java | 3 +- .../blocks/KeypadChestBlock.java | 11 + .../blocks/KeypadTrapDoorBlock.java | 10 + .../blocks/MotionActivatedLightBlock.java | 3 +- .../securitycraft/blocks/OwnableBlock.java | 7 + .../blocks/OwnableFenceGateBlock.java | 6 + .../blocks/PanicButtonBlock.java | 6 + .../blocks/PortableRadarBlock.java | 3 +- .../blocks/ScannerTrapDoorBlock.java | 10 + .../blocks/SecretCeilingHangingSignBlock.java | 10 +- .../blocks/SecretStandingSignBlock.java | 10 +- .../blocks/SecretWallHangingSignBlock.java | 10 +- .../blocks/SecretWallSignBlock.java | 10 +- .../blocks/SecurityCameraBlock.java | 5 +- .../blocks/SonicSecuritySystemBlock.java | 3 +- .../blocks/SpecialDoorBlock.java | 14 +- .../blocks/TrophySystemBlock.java | 5 +- .../blocks/mines/ClaymoreBlock.java | 8 +- .../blocks/mines/CreakingHeartMineBlock.java | 5 - .../blocks/mines/ExplosiveBlock.java | 7 - .../securitycraft/blocks/mines/IMSBlock.java | 5 +- .../blocks/mines/TrackMineBlock.java | 2 +- .../reinforced/BaseIronTrapDoorBlock.java | 7 + .../HorizontalReinforcedIronBars.java | 7 +- .../reinforced/ReinforcedButtonBlock.java | 10 +- .../reinforced/ReinforcedCauldronBlock.java | 6 + .../ReinforcedChiseledBookshelfBlock.java | 7 + .../reinforced/ReinforcedCopperBulbBlock.java | 7 + .../reinforced/ReinforcedDispenserBlock.java | 11 + .../reinforced/ReinforcedDropperBlock.java | 8 + .../reinforced/ReinforcedEndRodBlock.java | 7 + .../reinforced/ReinforcedFenceBlock.java | 7 + .../reinforced/ReinforcedGrassBlock.java | 6 + .../reinforced/ReinforcedHopperBlock.java | 11 + .../reinforced/ReinforcedLadderBlock.java | 7 + .../ReinforcedLayeredCauldronBlock.java | 6 + .../reinforced/ReinforcedLecternBlock.java | 7 + .../reinforced/ReinforcedLeverBlock.java | 10 +- .../ReinforcedMovingPistonBlock.java | 7 + ...forcedMud.java => ReinforcedMudBlock.java} | 4 +- .../reinforced/ReinforcedPaneBlock.java | 6 + .../reinforced/ReinforcedPistonBaseBlock.java | 7 + .../reinforced/ReinforcedPistonHeadBlock.java | 7 + .../ReinforcedPressurePlateBlock.java | 10 +- .../ReinforcedScaffoldingBlock.java | 6 + .../reinforced/ReinforcedSnowyDirtBlock.java | 6 + .../ReinforcedStainedGlassBlock.java | 13 +- .../ReinforcedStainedGlassPaneBlock.java | 15 +- .../reinforced/ReinforcedWallBlock.java | 7 + .../datagen/BlockTagGenerator.java | 518 +++++- .../entity/AbstractSecuritySeaBoat.java | 10 +- .../securitycraft/entity/sentry/Sentry.java | 3 +- .../items/UniversalBlockRemoverItem.java | 153 +- .../mixin/cobweb/ShearsItemMixin.java | 31 + .../mixin/cobweb/ToolMaterialMixin.java | 31 + .../securitycraft/util/BlockUtils.java | 21 + .../assets/securitycraft/lang/de_at.json | 25 +- .../assets/securitycraft/lang/de_ch.json | 25 +- .../assets/securitycraft/lang/de_de.json | 25 +- .../assets/securitycraft/lang/en_ud.json | 29 +- .../assets/securitycraft/lang/en_us.json | 29 +- .../assets/securitycraft/lang/es_ar.json | 2 - .../assets/securitycraft/lang/es_cl.json | 2 - .../assets/securitycraft/lang/es_ec.json | 2 - .../assets/securitycraft/lang/es_es.json | 2 - .../assets/securitycraft/lang/es_mx.json | 2 - .../assets/securitycraft/lang/es_uy.json | 2 - .../assets/securitycraft/lang/es_ve.json | 2 - .../assets/securitycraft/lang/fr_ca.json | 2 - .../assets/securitycraft/lang/fr_fr.json | 2 - .../assets/securitycraft/lang/it_it.json | 2 - .../assets/securitycraft/lang/ja_jp.json | 2 - .../assets/securitycraft/lang/ru_ru.json | 2 - .../assets/securitycraft/lang/zh_cn.json | 2 - src/main/resources/securitycraft.mixins.json | 2 + 99 files changed, 2280 insertions(+), 1023 deletions(-) create mode 100644 src/generated/resources/data/minecraft/tags/block/mineable/hoe.json create mode 100644 src/generated/resources/data/minecraft/tags/block/wool.json create mode 100644 src/generated/resources/data/securitycraft/tags/block/reinforced/cauldrons.json create mode 100644 src/generated/resources/data/securitycraft/tags/block/reinforced/walls.json rename src/main/java/net/geforcemods/securitycraft/blocks/reinforced/{ReinforcedMud.java => ReinforcedMudBlock.java} (90%) create mode 100644 src/main/java/net/geforcemods/securitycraft/mixin/cobweb/ShearsItemMixin.java create mode 100644 src/main/java/net/geforcemods/securitycraft/mixin/cobweb/ToolMaterialMixin.java diff --git a/Changelog.md b/Changelog.md index 172598b24f..a03dc0c3c4 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,11 +1,16 @@ --------------------------Changelog for the upcoming version of SecurityCraft-------------------------- +- New: Cameras can now be viewed on Frames within the world (live camera feeds)[1] +- New: Several server and client config settings to control chunk loading in camera feeds +- New: All blocks can now be broken only by the owner with normal tools (axe, shovel, hoe, ...) and the Universal Block Remover has been disabled by default +- New: Config to re-enable the Universal Block Remover and disable normal block breaking +- New: Config to define tool requirement behavior (e.g. does Reinforced Stone always drop, or just when breaking it using a pickaxe?) +- New: Config to allow other players to break anyone's blocks (disallowed by default) +- New: Config for defining how much longer it should take to break another player's block compared to breaking one's own - New: Reinforced Blocks: Pale Oak Log, Stripped Pale Oak Log, Pale Oak Wood, Stripped Pale Oak Wood, Pale Oak Planks, Pale Oak Stairs, Pale Oak Slabs, Pale Oak Button, Pale Oake Pressure Plate, Pale Oak Fence, Pale Oak Fence Gate, Pale Moss Block, Pale Moss Carpet - New: Secret Pale Oak (Hanging) Sign - New: Pale Oak Security Sea Boat - New: Creaking Heart Mine -- New: Cameras can now be viewed on Frames within the world (live camera feeds)[1] -- New: Several server and client config settings to control chunk loading in camera feeds - Change: The block mine overlay now shows in the first person hand models as well - Change: Camera model animations are now synchronized between players - API: IDisguisable has been simplified @@ -17,6 +22,12 @@ - Fix: Items that can have linked positions (e.g. Camera Monitor) show the idle animation even when they have positions and are either dropped, or held by a non-player entity - Fix: The display of items in the SC Manual can change too fast in certain situations - Fix: Potential startup crash +- Fix: The map color, instrument, and more properties of many reinforced blocks don't match their vanilla counterparts +- Fix: Several reinforced blocks can be broken by pistons +- Fix: Wall hanging signs have an incorrect translation key +- Fix: Security sea boats cannot be broken by players like normal boats +- Fix: The claymore does not ignore the owner if the "Ignore Owner" option is true, and vice versa +- Removed: Configuration "ableToBreakMines" [1] Note: Frame blocks that already existed in the world prior to this update will lose their owner. These frames can be broken by anyone so they can be placed down with the proper owner again. diff --git a/build.gradle b/build.gradle index 9782b77c6b..42c25e2472 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java-library' id 'eclipse' id 'idea' - id 'net.neoforged.moddev' version '2.0.71' + id 'net.neoforged.moddev' version '2.0.76' } import groovy.json.JsonOutput @@ -43,24 +43,24 @@ neoForge { logLevel = org.slf4j.event.Level.DEBUG ideName = "SC ${project.mc_version} " + ideName.get() } - + client { client() gameDirectory = project.file('run/client') } - + client2 { client() gameDirectory = project.file('run/client') programArguments.addAll('--username', 'Dev2') } - + server { server() gameDirectory = project.file('run/server') programArgument('-nogui') } - + data { data() gameDirectory = project.file('run/data') diff --git a/src/generated/resources/data/c/tags/block/relocation_not_supported.json b/src/generated/resources/data/c/tags/block/relocation_not_supported.json index b8193b8854..346d950c0e 100644 --- a/src/generated/resources/data/c/tags/block/relocation_not_supported.json +++ b/src/generated/resources/data/c/tags/block/relocation_not_supported.json @@ -568,10 +568,10 @@ "securitycraft:secret_mangrove_wall_hanging_sign", "securitycraft:secret_cherry_hanging_sign", "securitycraft:secret_cherry_wall_hanging_sign", - "securitycraft:secret_bamboo_hanging_sign", - "securitycraft:secret_bamboo_wall_hanging_sign", "securitycraft:secret_pale_oak_hanging_sign", "securitycraft:secret_pale_oak_wall_hanging_sign", + "securitycraft:secret_bamboo_hanging_sign", + "securitycraft:secret_bamboo_wall_hanging_sign", "securitycraft:secret_crimson_hanging_sign", "securitycraft:secret_crimson_wall_hanging_sign", "securitycraft:secret_warped_hanging_sign", diff --git a/src/generated/resources/data/minecraft/tags/block/dragon_immune.json b/src/generated/resources/data/minecraft/tags/block/dragon_immune.json index b8193b8854..346d950c0e 100644 --- a/src/generated/resources/data/minecraft/tags/block/dragon_immune.json +++ b/src/generated/resources/data/minecraft/tags/block/dragon_immune.json @@ -568,10 +568,10 @@ "securitycraft:secret_mangrove_wall_hanging_sign", "securitycraft:secret_cherry_hanging_sign", "securitycraft:secret_cherry_wall_hanging_sign", - "securitycraft:secret_bamboo_hanging_sign", - "securitycraft:secret_bamboo_wall_hanging_sign", "securitycraft:secret_pale_oak_hanging_sign", "securitycraft:secret_pale_oak_wall_hanging_sign", + "securitycraft:secret_bamboo_hanging_sign", + "securitycraft:secret_bamboo_wall_hanging_sign", "securitycraft:secret_crimson_hanging_sign", "securitycraft:secret_crimson_wall_hanging_sign", "securitycraft:secret_warped_hanging_sign", diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/axe.json b/src/generated/resources/data/minecraft/tags/block/mineable/axe.json index eb227401d5..77098442aa 100644 --- a/src/generated/resources/data/minecraft/tags/block/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/block/mineable/axe.json @@ -1,5 +1,24 @@ { "values": [ - "securitycraft:creaking_heart_mine" + "securitycraft:creaking_heart_mine", + "securitycraft:reinforced_bookshelf", + "securitycraft:reinforced_ladder", + "securitycraft:reinforced_lectern", + "securitycraft:reinforced_scaffolding", + "securitycraft:reinforced_bamboo_mosaic", + "securitycraft:reinforced_bamboo_mosaic_slab", + "securitycraft:reinforced_bamboo_mosaic_stairs", + "securitycraft:reinforced_chiseled_bookshelf", + "#securitycraft:reinforced/wooden_fence_gates", + "#securitycraft:reinforced/logs", + "#securitycraft:reinforced/planks", + "#securitycraft:secret_signs", + "#securitycraft:reinforced/wooden_buttons", + "#securitycraft:reinforced/wooden_fences", + "#securitycraft:reinforced/wooden_pressure_plates", + "#securitycraft:reinforced/wooden_slabs", + "#securitycraft:reinforced/wooden_stairs", + "#securitycraft:secret_hanging_signs", + "#securitycraft:reinforced/bamboo_blocks" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/hoe.json b/src/generated/resources/data/minecraft/tags/block/mineable/hoe.json new file mode 100644 index 0000000000..2830466960 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/block/mineable/hoe.json @@ -0,0 +1,11 @@ +{ + "values": [ + "securitycraft:reinforced_nether_wart_block", + "securitycraft:reinforced_warped_wart_block", + "securitycraft:reinforced_shroomlight", + "securitycraft:reinforced_moss_block", + "securitycraft:reinforced_moss_carpet", + "securitycraft:reinforced_pale_moss_block", + "securitycraft:reinforced_pale_moss_carpet" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json index 3ce9d7ce3d..ab4894dedd 100644 --- a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -1,5 +1,48 @@ { "values": [ + "securitycraft:alarm", + "securitycraft:block_change_detector", + "securitycraft:block_pocket_wall", + "securitycraft:block_pocket_manager", + "securitycraft:bouncing_betty", + "securitycraft:cage_trap", + "securitycraft:claymore", + "securitycraft:floor_trap", + "securitycraft:display_case", + "securitycraft:glow_display_case", + "securitycraft:keypad_frame", + "securitycraft:ims", + "securitycraft:inventory_scanner", + "securitycraft:key_panel", + "securitycraft:keycard_lock", + "securitycraft:keycard_reader", + "securitycraft:keypad", + "securitycraft:keypad_barrel", + "securitycraft:keypad_chest", + "securitycraft:keypad_door", + "securitycraft:keypad_trapdoor", + "securitycraft:keypad_furnace", + "securitycraft:keypad_smoker", + "securitycraft:keypad_blast_furnace", + "securitycraft:motion_activated_light", + "securitycraft:laser_block", + "securitycraft:panic_button", + "securitycraft:portable_radar", + "securitycraft:projector", + "securitycraft:protecto", + "securitycraft:iron_door_reinforced", + "securitycraft:electrified_iron_fence", + "securitycraft:reinforced_fence_gate", + "securitycraft:retinal_scanner", + "securitycraft:rift_stabilizer", + "securitycraft:scanner_door", + "securitycraft:scanner_trapdoor", + "securitycraft:security_camera", + "securitycraft:sonic_security_system", + "securitycraft:trophy_system", + "securitycraft:secure_redstone_interface", + "securitycraft:username_logger", + "securitycraft:mine", "securitycraft:crystal_quartz_slab", "securitycraft:smooth_crystal_quartz", "securitycraft:chiseled_crystal_quartz", @@ -37,6 +80,266 @@ "securitycraft:smoker_mine", "securitycraft:blast_furnace_mine", "securitycraft:netherrack_mine", - "securitycraft:end_stone_mine" + "securitycraft:end_stone_mine", + "securitycraft:reinforced_stone", + "securitycraft:reinforced_granite", + "securitycraft:reinforced_polished_granite", + "securitycraft:reinforced_diorite", + "securitycraft:reinforced_polished_diorite", + "securitycraft:reinforced_andesite", + "securitycraft:reinforced_polished_andesite", + "securitycraft:reinforced_cobblestone", + "securitycraft:reinforced_lapis_block", + "securitycraft:reinforced_dispenser", + "securitycraft:reinforced_sandstone", + "securitycraft:reinforced_chiseled_sandstone", + "securitycraft:reinforced_cut_sandstone", + "securitycraft:reinforced_gold_block", + "securitycraft:reinforced_iron_block", + "securitycraft:reinforced_bricks", + "securitycraft:reinforced_mossy_cobblestone", + "securitycraft:reinforced_obsidian", + "securitycraft:reinforced_diamond_block", + "securitycraft:reinforced_cobblestone_stairs", + "securitycraft:reinforced_stone_pressure_plate", + "securitycraft:reinforced_netherrack", + "securitycraft:reinforced_basalt", + "securitycraft:reinforced_polished_basalt", + "securitycraft:reinforced_stone_bricks", + "securitycraft:reinforced_mossy_stone_bricks", + "securitycraft:reinforced_cracked_stone_bricks", + "securitycraft:reinforced_chiseled_stone_bricks", + "securitycraft:reinforced_iron_bars", + "securitycraft:reinforced_chain", + "securitycraft:reinforced_brick_stairs", + "securitycraft:reinforced_stone_brick_stairs", + "securitycraft:reinforced_nether_bricks", + "securitycraft:reinforced_nether_brick_fence", + "securitycraft:reinforced_nether_brick_stairs", + "securitycraft:reinforced_end_stone", + "securitycraft:reinforced_sandstone_stairs", + "securitycraft:reinforced_emerald_block", + "securitycraft:reinforced_redstone_block", + "securitycraft:reinforced_hopper", + "securitycraft:reinforced_quartz_block", + "securitycraft:reinforced_chiseled_quartz_block", + "securitycraft:reinforced_quartz_pillar", + "securitycraft:reinforced_quartz_stairs", + "securitycraft:reinforced_dropper", + "securitycraft:reinforced_white_terracotta", + "securitycraft:reinforced_orange_terracotta", + "securitycraft:reinforced_magenta_terracotta", + "securitycraft:reinforced_light_blue_terracotta", + "securitycraft:reinforced_yellow_terracotta", + "securitycraft:reinforced_lime_terracotta", + "securitycraft:reinforced_pink_terracotta", + "securitycraft:reinforced_gray_terracotta", + "securitycraft:reinforced_light_gray_terracotta", + "securitycraft:reinforced_cyan_terracotta", + "securitycraft:reinforced_purple_terracotta", + "securitycraft:reinforced_blue_terracotta", + "securitycraft:reinforced_brown_terracotta", + "securitycraft:reinforced_green_terracotta", + "securitycraft:reinforced_red_terracotta", + "securitycraft:reinforced_black_terracotta", + "securitycraft:reinforced_iron_trapdoor", + "securitycraft:reinforced_prismarine", + "securitycraft:reinforced_prismarine_bricks", + "securitycraft:reinforced_dark_prismarine", + "securitycraft:reinforced_prismarine_stairs", + "securitycraft:reinforced_prismarine_brick_stairs", + "securitycraft:reinforced_dark_prismarine_stairs", + "securitycraft:reinforced_prismarine_slab", + "securitycraft:reinforced_prismarine_brick_slab", + "securitycraft:reinforced_dark_prismarine_slab", + "securitycraft:reinforced_hardened_clay", + "securitycraft:reinforced_coal_block", + "securitycraft:reinforced_red_sandstone", + "securitycraft:reinforced_chiseled_red_sandstone", + "securitycraft:reinforced_cut_red_sandstone", + "securitycraft:reinforced_red_sandstone_stairs", + "securitycraft:reinforced_normal_stone_slab", + "securitycraft:reinforced_stone_slab", + "securitycraft:reinforced_sandstone_slab", + "securitycraft:reinforced_cut_sandstone_slab", + "securitycraft:reinforced_cobblestone_slab", + "securitycraft:reinforced_brick_slab", + "securitycraft:reinforced_stone_brick_slab", + "securitycraft:reinforced_nether_brick_slab", + "securitycraft:reinforced_quartz_slab", + "securitycraft:reinforced_red_sandstone_slab", + "securitycraft:reinforced_cut_red_sandstone_slab", + "securitycraft:reinforced_purpur_slab", + "securitycraft:reinforced_smooth_stone", + "securitycraft:reinforced_smooth_sandstone", + "securitycraft:reinforced_smooth_quartz", + "securitycraft:reinforced_smooth_red_sandstone", + "securitycraft:reinforced_purpur_block", + "securitycraft:reinforced_purpur_pillar", + "securitycraft:reinforced_purpur_stairs", + "securitycraft:reinforced_end_stone_bricks", + "securitycraft:reinforced_magma_block", + "securitycraft:reinforced_red_nether_bricks", + "securitycraft:reinforced_bone_block", + "securitycraft:reinforced_observer", + "securitycraft:reinforced_white_glazed_terracotta", + "securitycraft:reinforced_orange_glazed_terracotta", + "securitycraft:reinforced_magenta_glazed_terracotta", + "securitycraft:reinforced_light_blue_glazed_terracotta", + "securitycraft:reinforced_yellow_glazed_terracotta", + "securitycraft:reinforced_lime_glazed_terracotta", + "securitycraft:reinforced_pink_glazed_terracotta", + "securitycraft:reinforced_gray_glazed_terracotta", + "securitycraft:reinforced_light_gray_glazed_terracotta", + "securitycraft:reinforced_cyan_glazed_terracotta", + "securitycraft:reinforced_purple_glazed_terracotta", + "securitycraft:reinforced_blue_glazed_terracotta", + "securitycraft:reinforced_brown_glazed_terracotta", + "securitycraft:reinforced_green_glazed_terracotta", + "securitycraft:reinforced_red_glazed_terracotta", + "securitycraft:reinforced_black_glazed_terracotta", + "securitycraft:reinforced_white_concrete", + "securitycraft:reinforced_orange_concrete", + "securitycraft:reinforced_magenta_concrete", + "securitycraft:reinforced_light_blue_concrete", + "securitycraft:reinforced_yellow_concrete", + "securitycraft:reinforced_lime_concrete", + "securitycraft:reinforced_pink_concrete", + "securitycraft:reinforced_gray_concrete", + "securitycraft:reinforced_light_gray_concrete", + "securitycraft:reinforced_cyan_concrete", + "securitycraft:reinforced_purple_concrete", + "securitycraft:reinforced_blue_concrete", + "securitycraft:reinforced_brown_concrete", + "securitycraft:reinforced_green_concrete", + "securitycraft:reinforced_red_concrete", + "securitycraft:reinforced_black_concrete", + "securitycraft:reinforced_polished_granite_stairs", + "securitycraft:reinforced_smooth_red_sandstone_stairs", + "securitycraft:reinforced_mossy_stone_brick_stairs", + "securitycraft:reinforced_polished_diorite_stairs", + "securitycraft:reinforced_mossy_cobblestone_stairs", + "securitycraft:reinforced_end_stone_brick_stairs", + "securitycraft:reinforced_stone_stairs", + "securitycraft:reinforced_smooth_sandstone_stairs", + "securitycraft:reinforced_smooth_quartz_stairs", + "securitycraft:reinforced_granite_stairs", + "securitycraft:reinforced_andesite_stairs", + "securitycraft:reinforced_red_nether_brick_stairs", + "securitycraft:reinforced_polished_andesite_stairs", + "securitycraft:reinforced_diorite_stairs", + "securitycraft:reinforced_polished_granite_slab", + "securitycraft:reinforced_smooth_red_sandstone_slab", + "securitycraft:reinforced_mossy_stone_brick_slab", + "securitycraft:reinforced_polished_diorite_slab", + "securitycraft:reinforced_mossy_cobblestone_slab", + "securitycraft:reinforced_end_stone_brick_slab", + "securitycraft:reinforced_smooth_sandstone_slab", + "securitycraft:reinforced_smooth_quartz_slab", + "securitycraft:reinforced_granite_slab", + "securitycraft:reinforced_andesite_slab", + "securitycraft:reinforced_red_nether_brick_slab", + "securitycraft:reinforced_polished_andesite_slab", + "securitycraft:reinforced_diorite_slab", + "securitycraft:reinforced_lantern", + "securitycraft:reinforced_soul_lantern", + "securitycraft:reinforced_warped_nylium", + "securitycraft:reinforced_crimson_nylium", + "securitycraft:reinforced_netherite_block", + "securitycraft:reinforced_crying_obsidian", + "securitycraft:reinforced_blackstone", + "securitycraft:reinforced_blackstone_stairs", + "securitycraft:reinforced_blackstone_slab", + "securitycraft:reinforced_polished_blackstone", + "securitycraft:reinforced_polished_blackstone_bricks", + "securitycraft:reinforced_cracked_polished_blackstone_bricks", + "securitycraft:reinforced_chiseled_polished_blackstone", + "securitycraft:reinforced_polished_blackstone_brick_slab", + "securitycraft:reinforced_polished_blackstone_brick_stairs", + "securitycraft:reinforced_polished_blackstone_stairs", + "securitycraft:reinforced_polished_blackstone_slab", + "securitycraft:reinforced_polished_blackstone_pressure_plate", + "securitycraft:reinforced_chiseled_nether_bricks", + "securitycraft:reinforced_cracked_nether_bricks", + "securitycraft:reinforced_quartz_bricks", + "securitycraft:reinforced_tuff", + "securitycraft:reinforced_calcite", + "securitycraft:reinforced_oxidized_copper", + "securitycraft:reinforced_weathered_copper", + "securitycraft:reinforced_exposed_copper", + "securitycraft:reinforced_copper_block", + "securitycraft:reinforced_oxidized_cut_copper", + "securitycraft:reinforced_weathered_cut_copper", + "securitycraft:reinforced_exposed_cut_copper", + "securitycraft:reinforced_cut_copper", + "securitycraft:reinforced_oxidized_cut_copper_stairs", + "securitycraft:reinforced_weathered_cut_copper_stairs", + "securitycraft:reinforced_exposed_cut_copper_stairs", + "securitycraft:reinforced_cut_copper_stairs", + "securitycraft:reinforced_oxidized_cut_copper_slab", + "securitycraft:reinforced_weathered_cut_copper_slab", + "securitycraft:reinforced_exposed_cut_copper_slab", + "securitycraft:reinforced_cut_copper_slab", + "securitycraft:reinforced_dripstone_block", + "securitycraft:reinforced_deepslate", + "securitycraft:reinforced_cobbled_deepslate", + "securitycraft:reinforced_cobbled_deepslate_stairs", + "securitycraft:reinforced_cobbled_deepslate_slab", + "securitycraft:reinforced_polished_deepslate", + "securitycraft:reinforced_polished_deepslate_stairs", + "securitycraft:reinforced_polished_deepslate_slab", + "securitycraft:reinforced_deepslate_tiles", + "securitycraft:reinforced_deepslate_tile_stairs", + "securitycraft:reinforced_deepslate_tile_slab", + "securitycraft:reinforced_deepslate_bricks", + "securitycraft:reinforced_deepslate_brick_stairs", + "securitycraft:reinforced_deepslate_brick_slab", + "securitycraft:reinforced_chiseled_deepslate", + "securitycraft:reinforced_cracked_deepslate_bricks", + "securitycraft:reinforced_cracked_deepslate_tiles", + "securitycraft:reinforced_smooth_basalt", + "securitycraft:reinforced_raw_iron_block", + "securitycraft:reinforced_raw_copper_block", + "securitycraft:reinforced_raw_gold_block", + "securitycraft:reinforced_ice", + "securitycraft:reinforced_packed_ice", + "securitycraft:reinforced_blue_ice", + "securitycraft:reinforced_piston", + "securitycraft:reinforced_sticky_piston", + "securitycraft:reinforced_piston_head", + "securitycraft:reinforced_amethyst_block", + "securitycraft:reinforced_mud_bricks", + "securitycraft:reinforced_mud_brick_stairs", + "securitycraft:reinforced_mud_brick_slab", + "securitycraft:reinforced_packed_mud", + "securitycraft:reinforced_tuff_slab", + "securitycraft:reinforced_tuff_stairs", + "securitycraft:reinforced_tuff_wall", + "securitycraft:reinforced_chiseled_tuff", + "securitycraft:reinforced_polished_tuff", + "securitycraft:reinforced_polished_tuff_slab", + "securitycraft:reinforced_polished_tuff_stairs", + "securitycraft:reinforced_polished_tuff_wall", + "securitycraft:reinforced_tuff_bricks", + "securitycraft:reinforced_tuff_brick_slab", + "securitycraft:reinforced_tuff_brick_stairs", + "securitycraft:reinforced_tuff_brick_wall", + "securitycraft:reinforced_chiseled_tuff_bricks", + "securitycraft:reinforced_chiseled_copper", + "securitycraft:reinforced_exposed_chiseled_copper", + "securitycraft:reinforced_weathered_chiseled_copper", + "securitycraft:reinforced_oxidized_chiseled_copper", + "securitycraft:reinforced_copper_grate", + "securitycraft:reinforced_exposed_copper_grate", + "securitycraft:reinforced_weathered_copper_grate", + "securitycraft:reinforced_oxidized_copper_grate", + "securitycraft:reinforced_copper_bulb", + "securitycraft:reinforced_exposed_copper_bulb", + "securitycraft:reinforced_weathered_copper_bulb", + "securitycraft:reinforced_oxidized_copper_bulb", + "securitycraft:reinforced_stone_button", + "securitycraft:reinforced_polished_blackstone_button", + "#securitycraft:reinforced/walls", + "#securitycraft:reinforced/cauldrons" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/shovel.json b/src/generated/resources/data/minecraft/tags/block/mineable/shovel.json index 6e0aaec872..225c0fe01d 100644 --- a/src/generated/resources/data/minecraft/tags/block/mineable/shovel.json +++ b/src/generated/resources/data/minecraft/tags/block/mineable/shovel.json @@ -4,6 +4,21 @@ "securitycraft:gravel_mine", "securitycraft:sand_mine", "securitycraft:suspicious_gravel_mine", - "securitycraft:suspicious_sand_mine" + "securitycraft:suspicious_sand_mine", + "securitycraft:reinforced_clay", + "securitycraft:reinforced_dirt", + "securitycraft:reinforced_coarse_dirt", + "securitycraft:reinforced_podzol", + "securitycraft:reinforced_grass_block", + "securitycraft:reinforced_gravel", + "securitycraft:reinforced_mycelium", + "securitycraft:reinforced_sand", + "securitycraft:reinforced_red_sand", + "securitycraft:reinforced_snow_block", + "securitycraft:reinforced_soul_sand", + "securitycraft:reinforced_grass_path", + "securitycraft:reinforced_soul_soil", + "securitycraft:reinforced_rooted_dirt", + "securitycraft:reinforced_mud" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/needs_diamond_tool.json b/src/generated/resources/data/minecraft/tags/block/needs_diamond_tool.json index cf2ad56fa0..7500e7b427 100644 --- a/src/generated/resources/data/minecraft/tags/block/needs_diamond_tool.json +++ b/src/generated/resources/data/minecraft/tags/block/needs_diamond_tool.json @@ -1,5 +1,9 @@ { "values": [ - "securitycraft:ancient_debris_mine" + "securitycraft:ancient_debris_mine", + "securitycraft:protecto", + "securitycraft:reinforced_obsidian", + "securitycraft:reinforced_crying_obsidian", + "securitycraft:reinforced_netherite_block" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json index 1aa046b2d4..b9f15f75bc 100644 --- a/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json +++ b/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json @@ -7,6 +7,10 @@ "securitycraft:emerald_mine", "securitycraft:deepslate_emerald_mine", "securitycraft:diamond_mine", - "securitycraft:deepslate_diamond_mine" + "securitycraft:deepslate_diamond_mine", + "securitycraft:reinforced_diamond_block", + "securitycraft:reinforced_emerald_block", + "securitycraft:reinforced_gold_block", + "securitycraft:reinforced_raw_gold_block" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json b/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json index 2967629c42..5547826669 100644 --- a/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json +++ b/src/generated/resources/data/minecraft/tags/block/needs_stone_tool.json @@ -5,6 +5,61 @@ "securitycraft:copper_mine", "securitycraft:deepslate_copper_mine", "securitycraft:lapis_mine", - "securitycraft:deepslate_lapis_mine" + "securitycraft:deepslate_lapis_mine", + "securitycraft:block_pocket_manager", + "securitycraft:bouncing_betty", + "securitycraft:cage_trap", + "securitycraft:claymore", + "securitycraft:floor_trap", + "securitycraft:display_case", + "securitycraft:glow_display_case", + "securitycraft:keypad_frame", + "securitycraft:key_panel", + "securitycraft:keypad", + "securitycraft:keypad_barrel", + "securitycraft:keypad_chest", + "securitycraft:keypad_furnace", + "securitycraft:keypad_smoker", + "securitycraft:keypad_blast_furnace", + "securitycraft:motion_activated_light", + "securitycraft:portable_radar", + "securitycraft:projector", + "securitycraft:rift_stabilizer", + "securitycraft:security_camera", + "securitycraft:sonic_security_system", + "securitycraft:trophy_system", + "securitycraft:mine", + "securitycraft:reinforced_iron_block", + "securitycraft:reinforced_raw_iron_block", + "securitycraft:reinforced_lapis_block", + "securitycraft:reinforced_copper_block", + "securitycraft:reinforced_raw_copper_block", + "securitycraft:reinforced_cut_copper_slab", + "securitycraft:reinforced_cut_copper_stairs", + "securitycraft:reinforced_cut_copper", + "securitycraft:reinforced_weathered_copper", + "securitycraft:reinforced_weathered_cut_copper_slab", + "securitycraft:reinforced_weathered_cut_copper_stairs", + "securitycraft:reinforced_weathered_cut_copper", + "securitycraft:reinforced_oxidized_copper", + "securitycraft:reinforced_oxidized_cut_copper_slab", + "securitycraft:reinforced_oxidized_cut_copper_stairs", + "securitycraft:reinforced_oxidized_cut_copper", + "securitycraft:reinforced_exposed_copper", + "securitycraft:reinforced_exposed_cut_copper_slab", + "securitycraft:reinforced_exposed_cut_copper_stairs", + "securitycraft:reinforced_exposed_cut_copper", + "securitycraft:reinforced_chiseled_copper", + "securitycraft:reinforced_exposed_chiseled_copper", + "securitycraft:reinforced_weathered_chiseled_copper", + "securitycraft:reinforced_oxidized_chiseled_copper", + "securitycraft:reinforced_copper_grate", + "securitycraft:reinforced_exposed_copper_grate", + "securitycraft:reinforced_weathered_copper_grate", + "securitycraft:reinforced_oxidized_copper_grate", + "securitycraft:reinforced_copper_bulb", + "securitycraft:reinforced_exposed_copper_bulb", + "securitycraft:reinforced_weathered_copper_bulb", + "securitycraft:reinforced_oxidized_copper_bulb" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/walls.json b/src/generated/resources/data/minecraft/tags/block/walls.json index 3e60b0175e..3a61b769d7 100644 --- a/src/generated/resources/data/minecraft/tags/block/walls.json +++ b/src/generated/resources/data/minecraft/tags/block/walls.json @@ -1,29 +1,5 @@ { "values": [ - "securitycraft:reinforced_cobblestone_wall", - "securitycraft:reinforced_mossy_cobblestone_wall", - "securitycraft:reinforced_brick_wall", - "securitycraft:reinforced_prismarine_wall", - "securitycraft:reinforced_red_sandstone_wall", - "securitycraft:reinforced_mossy_stone_brick_wall", - "securitycraft:reinforced_granite_wall", - "securitycraft:reinforced_stone_brick_wall", - "securitycraft:reinforced_mud_brick_wall", - "securitycraft:reinforced_nether_brick_wall", - "securitycraft:reinforced_andesite_wall", - "securitycraft:reinforced_red_nether_brick_wall", - "securitycraft:reinforced_sandstone_wall", - "securitycraft:reinforced_end_stone_brick_wall", - "securitycraft:reinforced_diorite_wall", - "securitycraft:reinforced_blackstone_wall", - "securitycraft:reinforced_polished_blackstone_wall", - "securitycraft:reinforced_polished_blackstone_brick_wall", - "securitycraft:reinforced_cobbled_deepslate_wall", - "securitycraft:reinforced_polished_deepslate_wall", - "securitycraft:reinforced_deepslate_brick_wall", - "securitycraft:reinforced_deepslate_tile_wall", - "securitycraft:reinforced_tuff_wall", - "securitycraft:reinforced_polished_tuff_wall", - "securitycraft:reinforced_tuff_brick_wall" + "#securitycraft:reinforced/walls" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/wither_immune.json b/src/generated/resources/data/minecraft/tags/block/wither_immune.json index b8193b8854..346d950c0e 100644 --- a/src/generated/resources/data/minecraft/tags/block/wither_immune.json +++ b/src/generated/resources/data/minecraft/tags/block/wither_immune.json @@ -568,10 +568,10 @@ "securitycraft:secret_mangrove_wall_hanging_sign", "securitycraft:secret_cherry_hanging_sign", "securitycraft:secret_cherry_wall_hanging_sign", - "securitycraft:secret_bamboo_hanging_sign", - "securitycraft:secret_bamboo_wall_hanging_sign", "securitycraft:secret_pale_oak_hanging_sign", "securitycraft:secret_pale_oak_wall_hanging_sign", + "securitycraft:secret_bamboo_hanging_sign", + "securitycraft:secret_bamboo_wall_hanging_sign", "securitycraft:secret_crimson_hanging_sign", "securitycraft:secret_crimson_wall_hanging_sign", "securitycraft:secret_warped_hanging_sign", diff --git a/src/generated/resources/data/minecraft/tags/block/wool.json b/src/generated/resources/data/minecraft/tags/block/wool.json new file mode 100644 index 0000000000..cdaec00ef7 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/block/wool.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#securitycraft:reinforced/wool" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/securitycraft/tags/block/reinforced/cauldrons.json b/src/generated/resources/data/securitycraft/tags/block/reinforced/cauldrons.json new file mode 100644 index 0000000000..0227e038df --- /dev/null +++ b/src/generated/resources/data/securitycraft/tags/block/reinforced/cauldrons.json @@ -0,0 +1,8 @@ +{ + "values": [ + "securitycraft:reinforced_cauldron", + "securitycraft:reinforced_lava_cauldron", + "securitycraft:reinforced_powder_snow_cauldron", + "securitycraft:reinforced_water_cauldron" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/securitycraft/tags/block/reinforced/walls.json b/src/generated/resources/data/securitycraft/tags/block/reinforced/walls.json new file mode 100644 index 0000000000..3e60b0175e --- /dev/null +++ b/src/generated/resources/data/securitycraft/tags/block/reinforced/walls.json @@ -0,0 +1,29 @@ +{ + "values": [ + "securitycraft:reinforced_cobblestone_wall", + "securitycraft:reinforced_mossy_cobblestone_wall", + "securitycraft:reinforced_brick_wall", + "securitycraft:reinforced_prismarine_wall", + "securitycraft:reinforced_red_sandstone_wall", + "securitycraft:reinforced_mossy_stone_brick_wall", + "securitycraft:reinforced_granite_wall", + "securitycraft:reinforced_stone_brick_wall", + "securitycraft:reinforced_mud_brick_wall", + "securitycraft:reinforced_nether_brick_wall", + "securitycraft:reinforced_andesite_wall", + "securitycraft:reinforced_red_nether_brick_wall", + "securitycraft:reinforced_sandstone_wall", + "securitycraft:reinforced_end_stone_brick_wall", + "securitycraft:reinforced_diorite_wall", + "securitycraft:reinforced_blackstone_wall", + "securitycraft:reinforced_polished_blackstone_wall", + "securitycraft:reinforced_polished_blackstone_brick_wall", + "securitycraft:reinforced_cobbled_deepslate_wall", + "securitycraft:reinforced_polished_deepslate_wall", + "securitycraft:reinforced_deepslate_brick_wall", + "securitycraft:reinforced_deepslate_tile_wall", + "securitycraft:reinforced_tuff_wall", + "securitycraft:reinforced_polished_tuff_wall", + "securitycraft:reinforced_tuff_brick_wall" + ] +} \ No newline at end of file diff --git a/src/generated/resources/pack.mcmeta b/src/generated/resources/pack.mcmeta index e6418b4442..b1171b3c92 100644 --- a/src/generated/resources/pack.mcmeta +++ b/src/generated/resources/pack.mcmeta @@ -1,7 +1,7 @@ { "pack": { "description": "SecurityCraft resources & data", - "pack_format": 42, + "pack_format": 46, "supported_formats": [ 0, 2147483647 diff --git a/src/main/java/net/geforcemods/securitycraft/ConfigHandler.java b/src/main/java/net/geforcemods/securitycraft/ConfigHandler.java index 638001697a..8712ae2e4d 100644 --- a/src/main/java/net/geforcemods/securitycraft/ConfigHandler.java +++ b/src/main/java/net/geforcemods/securitycraft/ConfigHandler.java @@ -77,7 +77,6 @@ public static class Client { public static class Server { public final BooleanValue allowAdminTool; public final BooleanValue shouldSpawnFire; - public final BooleanValue ableToBreakMines; public final BooleanValue smallerMineExplosion; public final BooleanValue mineExplodesWhenInCreative; public final BooleanValue mineExplosionsBreakBlocks; @@ -106,6 +105,10 @@ public static class Server { public final BooleanValue inWorldUnReinforcing; public final BooleanValue frameFeedViewingEnabled; public final IntValue frameFeedViewDistance; + public final BooleanValue vanillaToolBlockBreaking; + public final BooleanValue alwaysDrop; + public final BooleanValue allowBreakingNonOwnedBlocks; + public final DoubleValue nonOwnedBreakingSlowdown; public final ConfigValue> sentryAttackableEntitiesAllowlist; public final ConfigValue> sentryAttackableEntitiesDenylist; @@ -119,10 +122,6 @@ public static class Server { .comment("Should mines spawn fire after exploding?") .define("shouldSpawnFire", true); - ableToBreakMines = builder - .comment("Should players be able to break a mine without it exploding?") - .define("ableToBreakMines", true); - smallerMineExplosion = builder .comment("Should mines' explosions be smaller than usual?") .define("smallerMineExplosion", false); @@ -240,6 +239,26 @@ public static class Server { .comment("Set the radius in which chunks viewed in a frame camera should be loaded and sent to players. If this config has a higher value than the \"view-distance\" server property or the vanilla \"Render Distance\" option of the player requesting the chunks, the smaller value is used instead.") .defineInRange("frame_feed_view_distance", 16, 2, 32); + vanillaToolBlockBreaking = builder + .comment("Whether SecurityCraft's blocks should be broken using vanilla tools (axe, shovel, hoe, ...), instead of the Universal Block Remover. If set to true, this will disable the Universal Block Remover.") + .define("vanilla_tool_block_breaking", true); + + alwaysDrop = builder + .comment("Whether SecurityCraft's blocks always drop themselves no matter which tool is used. If this is set to false, the correct tool must be used for the block to drop (e.g. pickaxe for reinforced stone, or anything for reinforced dirt).", + "This only applies when \"vanilla_tool_block_breaking\" is set to true.") + .define("always_drop", true); + + allowBreakingNonOwnedBlocks = builder + .comment("Whether players who are not the owner of a block can still destroy it.", + "This applies regardless of what \"vanilla_tool_block_breaking\" is set to.") + .define("allow_breaking_non_owned_blocks", false); + + nonOwnedBreakingSlowdown = builder + .comment("How much slower it should be to break a block that is not owned by the player breaking it.", + "The value is calculated as the normal block breaking speed divided by the non-owned block breaking slowdown. Example: A value of 2.0 means it takes twice as long to break the block.", + "This only applies when \"allow_breaking_non_owned_blocks\" and \"vanilla_tool_block_breaking\" are set to true.") + .defineInRange("non_owned_breaking_slowdown", 1.0D, 0.0D, Double.MAX_VALUE); + sentryAttackableEntitiesAllowlist = builder .comment("Add entities to this list that the Sentry currently does not attack, but that you want the Sentry to attack. The denylist takes priority over the allowlist.") .defineListAllowEmpty("sentry_attackable_entities_allowlist", List.of(), () -> "minecraft:pig", String.class::isInstance); diff --git a/src/main/java/net/geforcemods/securitycraft/SCContent.java b/src/main/java/net/geforcemods/securitycraft/SCContent.java index 78bc148a88..fcc2d7188c 100644 --- a/src/main/java/net/geforcemods/securitycraft/SCContent.java +++ b/src/main/java/net/geforcemods/securitycraft/SCContent.java @@ -3,8 +3,10 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Supplier; +import java.util.function.UnaryOperator; import com.google.common.base.Predicates; import com.mojang.serialization.Codec; @@ -168,7 +170,7 @@ import net.geforcemods.securitycraft.blocks.reinforced.ReinforcedMagmaBlock; import net.geforcemods.securitycraft.blocks.reinforced.ReinforcedMossyCarpetBlock; import net.geforcemods.securitycraft.blocks.reinforced.ReinforcedMovingPistonBlock; -import net.geforcemods.securitycraft.blocks.reinforced.ReinforcedMud; +import net.geforcemods.securitycraft.blocks.reinforced.ReinforcedMudBlock; import net.geforcemods.securitycraft.blocks.reinforced.ReinforcedNyliumBlock; import net.geforcemods.securitycraft.blocks.reinforced.ReinforcedObserverBlock; import net.geforcemods.securitycraft.blocks.reinforced.ReinforcedObsidianBlock; @@ -274,7 +276,6 @@ import net.minecraft.commands.synchronization.ArgumentTypeInfos; import net.minecraft.commands.synchronization.SingletonArgumentInfo; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.NonNullList; import net.minecraft.core.component.DataComponentType; @@ -288,12 +289,10 @@ import net.minecraft.util.Unit; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.flag.FeatureFlag; import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.DoubleHighBlockItem; -import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.HangingSignItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -308,16 +307,15 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ButtonBlock; import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.SignBlock; import net.minecraft.world.level.block.SlabBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.StairBlock; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.ChestBlockEntity; -import net.minecraft.world.level.block.piston.PistonBaseBlock; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockSetType; -import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.MapColor; @@ -396,1894 +394,1894 @@ public class SCContent { //blocks @HasManualPage @RegisterItemBlock - public static final DeferredBlock ALARM = BLOCKS.registerBlock("alarm", AlarmBlock::new, prop(MapColor.METAL).lightLevel(state -> state.getValue(AlarmBlock.LIT) ? 15 : 0)); + public static final DeferredBlock ALARM = BLOCKS.registerBlock("alarm", AlarmBlock::new, prop(MapColor.COLOR_RED, 3.5F).sound(SoundType.METAL).lightLevel(state -> state.getValue(AlarmBlock.LIT) ? 15 : 0)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock BLOCK_CHANGE_DETECTOR = BLOCKS.registerBlock("block_change_detector", BlockChangeDetectorBlock::new, propDisguisable()); + public static final DeferredBlock BLOCK_CHANGE_DETECTOR = BLOCKS.registerBlock("block_change_detector", BlockChangeDetectorBlock::new, propDisguisable(3.5F)); @HasManualPage(designedBy = "Henzoid") @RegisterItemBlock - public static final DeferredBlock BLOCK_POCKET_MANAGER = BLOCKS.registerBlock("block_pocket_manager", BlockPocketManagerBlock::new, prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock BLOCK_POCKET_MANAGER = BLOCKS.registerBlock("block_pocket_manager", BlockPocketManagerBlock::new, prop(MapColor.COLOR_CYAN, 5.0F)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock BLOCK_POCKET_WALL = BLOCKS.registerBlock("block_pocket_wall", BlockPocketWallBlock::new, prop(MapColor.COLOR_CYAN).noCollission().isRedstoneConductor(SCContent::never).isSuffocating(BlockPocketWallBlock::causesSuffocation).isViewBlocking(BlockPocketWallBlock::causesSuffocation).isValidSpawn(SCContent::never)); + public static final DeferredBlock BLOCK_POCKET_WALL = BLOCKS.registerBlock("block_pocket_wall", BlockPocketWallBlock::new, prop(MapColor.COLOR_CYAN, 0.8F).noCollission().isRedstoneConductor(SCContent::never).isSuffocating(BlockPocketWallBlock::causesSuffocation).isViewBlocking(BlockPocketWallBlock::causesSuffocation).isValidSpawn(SCContent::never)); @HasManualPage @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock BOUNCING_BETTY = BLOCKS.registerBlock("bouncing_betty", BouncingBettyBlock::new, prop(MapColor.METAL, 1.0F).forceSolidOn().pushReaction(PushReaction.NORMAL)); + public static final DeferredBlock BOUNCING_BETTY = BLOCKS.registerBlock("bouncing_betty", BouncingBettyBlock::new, prop(MapColor.METAL, 3.5F).sound(SoundType.METAL).forceSolidOn().pushReaction(PushReaction.NORMAL)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock CAGE_TRAP = BLOCKS.registerBlock("cage_trap", CageTrapBlock::new, propDisguisable(MapColor.METAL).sound(SoundType.METAL).noCollission()); + public static final DeferredBlock CAGE_TRAP = BLOCKS.registerBlock("cage_trap", CageTrapBlock::new, propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL).noCollission()); @HasManualPage @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock CLAYMORE = BLOCKS.registerBlock("claymore", ClaymoreBlock::new, prop(MapColor.METAL).forceSolidOn().pushReaction(PushReaction.NORMAL)); + public static final DeferredBlock CLAYMORE = BLOCKS.registerBlock("claymore", ClaymoreBlock::new, prop(MapColor.TERRACOTTA_GREEN, 3.5F).sound(SoundType.METAL).forceSolidOn().pushReaction(PushReaction.NORMAL)); @HasManualPage(PageGroup.DISPLAY_CASES) - public static final DeferredBlock DISPLAY_CASE = BLOCKS.registerBlock(DISPLAY_CASE_PATH, p -> new DisplayCaseBlock(p, false), prop(MapColor.METAL).sound(SoundType.METAL)); + public static final DeferredBlock DISPLAY_CASE = BLOCKS.registerBlock(DISPLAY_CASE_PATH, p -> new DisplayCaseBlock(p, false), prop(MapColor.METAL, 5.0F).sound(SoundType.METAL)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock FLOOR_TRAP = BLOCKS.registerBlock("floor_trap", FloorTrapBlock::new, propDisguisable(MapColor.METAL).sound(SoundType.METAL)); + public static final DeferredBlock FLOOR_TRAP = BLOCKS.registerBlock("floor_trap", FloorTrapBlock::new, propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL)); @HasManualPage @OwnableBE @RegisterItemBlock - public static final DeferredBlock FRAME = BLOCKS.registerBlock("keypad_frame", FrameBlock::new, prop().sound(SoundType.METAL)); + public static final DeferredBlock FRAME = BLOCKS.registerBlock("keypad_frame", FrameBlock::new, prop(5.0F).sound(SoundType.METAL)); @HasManualPage(PageGroup.DISPLAY_CASES) - public static final DeferredBlock GLOW_DISPLAY_CASE = BLOCKS.registerBlock(GLOW_DISPLAY_CASE_PATH, p -> new DisplayCaseBlock(p, true), prop(MapColor.METAL).sound(SoundType.METAL)); + public static final DeferredBlock GLOW_DISPLAY_CASE = BLOCKS.registerBlock(GLOW_DISPLAY_CASE_PATH, p -> new DisplayCaseBlock(p, true), prop(MapColor.METAL, 5.0F).sound(SoundType.METAL)); @HasManualPage @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock IMS = BLOCKS.registerBlock("ims", IMSBlock::new, prop(MapColor.METAL, 0.7F).sound(SoundType.METAL)); + public static final DeferredBlock IMS = BLOCKS.registerBlock("ims", IMSBlock::new, prop(MapColor.TERRACOTTA_GREEN, 3.5F).sound(SoundType.METAL)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock INVENTORY_SCANNER = BLOCKS.registerBlock("inventory_scanner", InventoryScannerBlock::new, propDisguisable()); - public static final DeferredBlock INVENTORY_SCANNER_FIELD = BLOCKS.registerBlock("inventory_scanner_field", InventoryScannerFieldBlock::new, prop(MapColor.NONE).noLootTable()); + public static final DeferredBlock INVENTORY_SCANNER = BLOCKS.registerBlock("inventory_scanner", InventoryScannerBlock::new, propDisguisable(3.5F)); + public static final DeferredBlock INVENTORY_SCANNER_FIELD = BLOCKS.registerBlock("inventory_scanner_field", InventoryScannerFieldBlock::new, prop(MapColor.NONE, -1.0F).noLootTable()); @HasManualPage @RegisterItemBlock - public static final DeferredBlock ELECTRIFIED_IRON_FENCE = BLOCKS.registerBlock("electrified_iron_fence", ElectrifiedIronFenceBlock::new, prop(MapColor.METAL).sound(SoundType.METAL)); - public static final DeferredBlock KEY_PANEL_BLOCK = BLOCKS.registerBlock("key_panel", KeyPanelBlock::new, prop(MapColor.METAL).sound(SoundType.METAL)); + public static final DeferredBlock ELECTRIFIED_IRON_FENCE = BLOCKS.registerBlock("electrified_iron_fence", ElectrifiedIronFenceBlock::new, prop(MapColor.METAL, 5.0F).sound(SoundType.METAL)); + public static final DeferredBlock KEY_PANEL_BLOCK = BLOCKS.registerBlock("key_panel", KeyPanelBlock::new, prop(MapColor.METAL, 3.5F).sound(SoundType.METAL)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock KEYCARD_LOCK = BLOCKS.registerBlock("keycard_lock", KeycardLockBlock::new, prop()); + public static final DeferredBlock KEYCARD_LOCK = BLOCKS.registerBlock("keycard_lock", KeycardLockBlock::new, prop(2.0F)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock KEYCARD_READER = BLOCKS.registerBlock("keycard_reader", KeycardReaderBlock::new, propDisguisable()); + public static final DeferredBlock KEYCARD_READER = BLOCKS.registerBlock("keycard_reader", KeycardReaderBlock::new, propDisguisable(3.5F)); @HasManualPage(hasRecipeDescription = true) @RegisterItemBlock - public static final DeferredBlock KEYPAD = BLOCKS.registerBlock("keypad", KeypadBlock::new, propDisguisable(MapColor.METAL).sound(SoundType.METAL)); + public static final DeferredBlock KEYPAD = BLOCKS.registerBlock("keypad", KeypadBlock::new, propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL)); @HasManualPage(hasRecipeDescription = true) @RegisterItemBlock - public static final DeferredBlock KEYPAD_BARREL = BLOCKS.registerBlock("keypad_barrel", KeypadBarrelBlock::new, propDisguisable(MapColor.METAL).sound(SoundType.METAL)); + public static final DeferredBlock KEYPAD_BARREL = BLOCKS.registerBlock("keypad_barrel", KeypadBarrelBlock::new, propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL)); @HasManualPage(hasRecipeDescription = true) - public static final DeferredBlock KEYPAD_CHEST = BLOCKS.registerBlock(KEYPAD_CHEST_PATH, KeypadChestBlock::new, propDisguisable(MapColor.METAL).sound(SoundType.METAL)); - public static final DeferredBlock KEYPAD_DOOR = BLOCKS.registerBlock("keypad_door", p -> new KeypadDoorBlock(p, BlockSetType.IRON), propDisguisable(MapColor.METAL).sound(SoundType.METAL).pushReaction(PushReaction.BLOCK)); + public static final DeferredBlock KEYPAD_CHEST = BLOCKS.registerBlock(KEYPAD_CHEST_PATH, KeypadChestBlock::new, propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL)); + public static final DeferredBlock KEYPAD_DOOR = BLOCKS.registerBlock("keypad_door", p -> new KeypadDoorBlock(p, BlockSetType.IRON), propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL).pushReaction(PushReaction.BLOCK)); @HasManualPage(hasRecipeDescription = true) @RegisterItemBlock - public static final DeferredBlock KEYPAD_TRAPDOOR = BLOCKS.registerBlock("keypad_trapdoor", p -> new KeypadTrapDoorBlock(p, BlockSetType.IRON), propDisguisable(MapColor.METAL).sound(SoundType.METAL).isValidSpawn(SCContent::never)); + public static final DeferredBlock KEYPAD_TRAPDOOR = BLOCKS.registerBlock("keypad_trapdoor", p -> new KeypadTrapDoorBlock(p, BlockSetType.IRON), propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL).isValidSpawn(SCContent::never)); @HasManualPage(hasRecipeDescription = true) @RegisterItemBlock - public static final DeferredBlock KEYPAD_FURNACE = BLOCKS.registerBlock("keypad_furnace", KeypadFurnaceBlock::new, prop(MapColor.METAL).sound(SoundType.METAL).lightLevel(state -> state.getValue(AbstractKeypadFurnaceBlock.LIT) ? 13 : 0)); + public static final DeferredBlock KEYPAD_FURNACE = BLOCKS.registerBlock("keypad_furnace", KeypadFurnaceBlock::new, prop(MapColor.METAL, 5.0F).sound(SoundType.METAL).lightLevel(state -> state.getValue(AbstractKeypadFurnaceBlock.LIT) ? 13 : 0)); @HasManualPage(hasRecipeDescription = true) @RegisterItemBlock - public static final DeferredBlock KEYPAD_SMOKER = BLOCKS.registerBlock("keypad_smoker", KeypadSmokerBlock::new, prop(MapColor.METAL).sound(SoundType.METAL).lightLevel(state -> state.getValue(AbstractKeypadFurnaceBlock.LIT) ? 13 : 0)); + public static final DeferredBlock KEYPAD_SMOKER = BLOCKS.registerBlock("keypad_smoker", KeypadSmokerBlock::new, prop(MapColor.METAL, 5.0F).sound(SoundType.METAL).lightLevel(state -> state.getValue(AbstractKeypadFurnaceBlock.LIT) ? 13 : 0)); @HasManualPage(hasRecipeDescription = true) @RegisterItemBlock - public static final DeferredBlock KEYPAD_BLAST_FURNACE = BLOCKS.registerBlock("keypad_blast_furnace", KeypadBlastFurnaceBlock::new, prop(MapColor.METAL).sound(SoundType.METAL).lightLevel(state -> state.getValue(AbstractKeypadFurnaceBlock.LIT) ? 13 : 0)); + public static final DeferredBlock KEYPAD_BLAST_FURNACE = BLOCKS.registerBlock("keypad_blast_furnace", KeypadBlastFurnaceBlock::new, prop(MapColor.METAL, 5.0F).sound(SoundType.METAL).lightLevel(state -> state.getValue(AbstractKeypadFurnaceBlock.LIT) ? 13 : 0)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock LASER_BLOCK = BLOCKS.registerBlock("laser_block", LaserBlock::new, propDisguisable()); - public static final DeferredBlock LASER_FIELD = BLOCKS.registerBlock("laser", LaserFieldBlock::new, prop(MapColor.NONE).noLootTable()); + public static final DeferredBlock LASER_BLOCK = BLOCKS.registerBlock("laser_block", LaserBlock::new, propDisguisable(3.5F)); + public static final DeferredBlock LASER_FIELD = BLOCKS.registerBlock("laser", LaserFieldBlock::new, prop(MapColor.NONE, -1.0F).noLootTable()); @HasManualPage @RegisterItemBlock - public static final DeferredBlock MOTION_ACTIVATED_LIGHT = BLOCKS.registerBlock("motion_activated_light", MotionActivatedLightBlock::new, prop(MapColor.NONE).sound(SoundType.GLASS).lightLevel(state -> state.getValue(MotionActivatedLightBlock.LIT) ? 15 : 0)); + public static final DeferredBlock MOTION_ACTIVATED_LIGHT = BLOCKS.registerBlock("motion_activated_light", MotionActivatedLightBlock::new, prop(MapColor.NONE, 5.0F).sound(SoundType.GLASS).lightLevel(state -> state.getValue(MotionActivatedLightBlock.LIT) ? 15 : 0)); @HasManualPage @OwnableBE @RegisterItemBlock - public static final DeferredBlock PANIC_BUTTON = BLOCKS.registerBlock("panic_button", p -> new PanicButtonBlock(p, BlockSetType.STONE, -1), prop().lightLevel(state -> state.getValue(ButtonBlock.POWERED) ? 4 : 0)); + public static final DeferredBlock PANIC_BUTTON = BLOCKS.registerBlock("panic_button", p -> new PanicButtonBlock(p, BlockSetType.STONE, -1), prop(3.5F).lightLevel(state -> state.getValue(ButtonBlock.POWERED) ? 4 : 0)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock PORTABLE_RADAR = BLOCKS.registerBlock("portable_radar", PortableRadarBlock::new, prop(MapColor.METAL)); + public static final DeferredBlock PORTABLE_RADAR = BLOCKS.registerBlock("portable_radar", PortableRadarBlock::new, prop(MapColor.COLOR_BLACK, 5.0F)); @HasManualPage @OwnableBE @RegisterItemBlock - public static final DeferredBlock PROJECTOR = BLOCKS.registerBlock("projector", ProjectorBlock::new, propDisguisable(MapColor.METAL).sound(SoundType.METAL)); + public static final DeferredBlock PROJECTOR = BLOCKS.registerBlock("projector", ProjectorBlock::new, propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock PROTECTO = BLOCKS.registerBlock("protecto", ProtectoBlock::new, propDisguisable(MapColor.METAL).sound(SoundType.METAL).lightLevel(state -> 7)); + public static final DeferredBlock PROTECTO = BLOCKS.registerBlock("protecto", ProtectoBlock::new, propDisguisable(MapColor.METAL, 10.0F).sound(SoundType.METAL).lightLevel(state -> 7)); @OwnableBE - public static final DeferredBlock REINFORCED_DOOR = BLOCKS.registerBlock("iron_door_reinforced", ReinforcedDoorBlock::new, prop(MapColor.METAL).sound(SoundType.METAL).noOcclusion().pushReaction(PushReaction.BLOCK)); + public static final DeferredBlock REINFORCED_DOOR = BLOCKS.registerBlock("iron_door_reinforced", ReinforcedDoorBlock::new, prop(MapColor.METAL, 5.0F).sound(SoundType.METAL).noOcclusion().pushReaction(PushReaction.BLOCK)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock ELECTRIFIED_IRON_FENCE_GATE = BLOCKS.registerBlock("reinforced_fence_gate", ElectrifiedIronFenceGateBlock::new, prop(MapColor.METAL).sound(SoundType.METAL).forceSolidOn()); + public static final DeferredBlock ELECTRIFIED_IRON_FENCE_GATE = BLOCKS.registerBlock("reinforced_fence_gate", ElectrifiedIronFenceGateBlock::new, prop(MapColor.METAL, 5.0F).sound(SoundType.METAL).forceSolidOn()); @HasManualPage @RegisterItemBlock - public static final DeferredBlock RETINAL_SCANNER = BLOCKS.registerBlock("retinal_scanner", RetinalScannerBlock::new, propDisguisable()); - public static final DeferredBlock RIFT_STABILIZER = BLOCKS.registerBlock("rift_stabilizer", RiftStabilizerBlock::new, propDisguisable(MapColor.METAL).sound(SoundType.METAL)); - public static final DeferredBlock SCANNER_DOOR = BLOCKS.registerBlock("scanner_door", p -> new ScannerDoorBlock(p, BlockSetType.IRON), propDisguisable(MapColor.METAL).sound(SoundType.METAL).pushReaction(PushReaction.BLOCK)); + public static final DeferredBlock RETINAL_SCANNER = BLOCKS.registerBlock("retinal_scanner", RetinalScannerBlock::new, propDisguisable(3.5F)); + public static final DeferredBlock RIFT_STABILIZER = BLOCKS.registerBlock("rift_stabilizer", RiftStabilizerBlock::new, propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL)); + public static final DeferredBlock SCANNER_DOOR = BLOCKS.registerBlock("scanner_door", p -> new ScannerDoorBlock(p, BlockSetType.IRON), propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL).pushReaction(PushReaction.BLOCK)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock SCANNER_TRAPDOOR = BLOCKS.registerBlock("scanner_trapdoor", p -> new ScannerTrapDoorBlock(p, BlockSetType.IRON), propDisguisable(MapColor.METAL).sound(SoundType.METAL).isValidSpawn(SCContent::never)); - public static final DeferredBlock SECRET_OAK_SIGN = BLOCKS.registerBlock("secret_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.OAK), prop(MapColor.WOOD).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_sign")); - public static final DeferredBlock SECRET_OAK_WALL_SIGN = BLOCKS.registerBlock("secret_sign_wall", p -> new SecretWallSignBlock(p, WoodType.OAK), prop(MapColor.WOOD).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_sign")); - public static final DeferredBlock SECRET_SPRUCE_SIGN = BLOCKS.registerBlock("secret_spruce_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.SPRUCE), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_spruce_sign")); - public static final DeferredBlock SECRET_SPRUCE_WALL_SIGN = BLOCKS.registerBlock("secret_spruce_sign_wall", p -> new SecretWallSignBlock(p, WoodType.SPRUCE), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_spruce_sign")); - public static final DeferredBlock SECRET_BIRCH_SIGN = BLOCKS.registerBlock("secret_birch_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.BIRCH), prop(MapColor.SAND).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_birch_sign")); - public static final DeferredBlock SECRET_BIRCH_WALL_SIGN = BLOCKS.registerBlock("secret_birch_sign_wall", p -> new SecretWallSignBlock(p, WoodType.BIRCH), prop(MapColor.SAND).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_birch_sign")); - public static final DeferredBlock SECRET_JUNGLE_SIGN = BLOCKS.registerBlock("secret_jungle_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.JUNGLE), prop(MapColor.PODZOL).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_jungle_sign")); - public static final DeferredBlock SECRET_JUNGLE_WALL_SIGN = BLOCKS.registerBlock("secret_jungle_sign_wall", p -> new SecretWallSignBlock(p, WoodType.JUNGLE), prop(MapColor.PODZOL).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_jungle_sign")); - public static final DeferredBlock SECRET_ACACIA_SIGN = BLOCKS.registerBlock("secret_acacia_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.ACACIA), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_acacia_sign")); - public static final DeferredBlock SECRET_ACACIA_WALL_SIGN = BLOCKS.registerBlock("secret_acacia_sign_wall", p -> new SecretWallSignBlock(p, WoodType.ACACIA), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_acacia_sign")); - public static final DeferredBlock SECRET_DARK_OAK_SIGN = BLOCKS.registerBlock("secret_dark_oak_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.DARK_OAK), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_dark_oak_sign")); - public static final DeferredBlock SECRET_DARK_OAK_WALL_SIGN = BLOCKS.registerBlock("secret_dark_oak_sign_wall", p -> new SecretWallSignBlock(p, WoodType.DARK_OAK), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_dark_oak_sign")); - public static final DeferredBlock SECRET_MANGROVE_SIGN = BLOCKS.registerBlock("secret_mangrove_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.MANGROVE), prop(MapColor.PODZOL).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_mangrove_sign")); - public static final DeferredBlock SECRET_MANGROVE_WALL_SIGN = BLOCKS.registerBlock("secret_mangrove_sign_wall", p -> new SecretWallSignBlock(p, WoodType.MANGROVE), prop(MapColor.PODZOL).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_mangrove_sign")); - public static final DeferredBlock SECRET_CRIMSON_SIGN = BLOCKS.registerBlock("secret_crimson_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.CRIMSON), prop(MapColor.CRIMSON_STEM).sound(SoundType.NETHER_WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_crimson_sign")); - public static final DeferredBlock SECRET_CRIMSON_WALL_SIGN = BLOCKS.registerBlock("secret_crimson_sign_wall", p -> new SecretWallSignBlock(p, WoodType.CRIMSON), prop(MapColor.CRIMSON_STEM).sound(SoundType.NETHER_WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_crimson_sign")); - public static final DeferredBlock SECRET_WARPED_SIGN = BLOCKS.registerBlock("secret_warped_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.WARPED), prop(MapColor.WARPED_STEM).sound(SoundType.NETHER_WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_warped_sign")); - public static final DeferredBlock SECRET_WARPED_WALL_SIGN = BLOCKS.registerBlock("secret_warped_sign_wall", p -> new SecretWallSignBlock(p, WoodType.WARPED), prop(MapColor.WARPED_STEM).sound(SoundType.NETHER_WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_warped_sign")); + public static final DeferredBlock SCANNER_TRAPDOOR = BLOCKS.registerBlock("scanner_trapdoor", p -> new ScannerTrapDoorBlock(p, BlockSetType.IRON), propDisguisable(MapColor.METAL, 5.0F).sound(SoundType.METAL).isValidSpawn(SCContent::never)); + public static final DeferredBlock SECRET_OAK_SIGN = secretStandingSign("secret_sign_standing", Blocks.OAK_SIGN, p -> p.overrideDescription("block.securitycraft.secret_sign")); + public static final DeferredBlock SECRET_OAK_WALL_SIGN = secretWallSign("secret_sign_wall", Blocks.OAK_SIGN, p -> p.overrideDescription("block.securitycraft.secret_sign")); + public static final DeferredBlock SECRET_SPRUCE_SIGN = secretStandingSign("secret_spruce_sign_standing", Blocks.SPRUCE_SIGN, p -> p.overrideDescription("block.securitycraft.secret_spruce_sign")); + public static final DeferredBlock SECRET_SPRUCE_WALL_SIGN = secretWallSign("secret_spruce_sign_wall", Blocks.SPRUCE_SIGN, p -> p.overrideDescription("block.securitycraft.secret_spruce_sign")); + public static final DeferredBlock SECRET_BIRCH_SIGN = secretStandingSign("secret_birch_sign_standing", Blocks.BIRCH_SIGN, p -> p.overrideDescription("block.securitycraft.secret_birch_sign")); + public static final DeferredBlock SECRET_BIRCH_WALL_SIGN = secretWallSign("secret_birch_sign_wall", Blocks.BIRCH_SIGN, p -> p.overrideDescription("block.securitycraft.secret_birch_sign")); + public static final DeferredBlock SECRET_JUNGLE_SIGN = secretStandingSign("secret_jungle_sign_standing", Blocks.JUNGLE_SIGN, p -> p.overrideDescription("block.securitycraft.secret_jungle_sign")); + public static final DeferredBlock SECRET_JUNGLE_WALL_SIGN = secretWallSign("secret_jungle_sign_wall", Blocks.JUNGLE_SIGN, p -> p.overrideDescription("block.securitycraft.secret_jungle_sign")); + public static final DeferredBlock SECRET_ACACIA_SIGN = secretStandingSign("secret_acacia_sign_standing", Blocks.ACACIA_SIGN, p -> p.overrideDescription("block.securitycraft.secret_acacia_sign")); + public static final DeferredBlock SECRET_ACACIA_WALL_SIGN = secretWallSign("secret_acacia_sign_wall", Blocks.ACACIA_SIGN, p -> p.overrideDescription("block.securitycraft.secret_acacia_sign")); + public static final DeferredBlock SECRET_DARK_OAK_SIGN = secretStandingSign("secret_dark_oak_sign_standing", Blocks.DARK_OAK_SIGN, p -> p.overrideDescription("block.securitycraft.secret_dark_oak_sign")); + public static final DeferredBlock SECRET_DARK_OAK_WALL_SIGN = secretWallSign("secret_dark_oak_sign_wall", Blocks.DARK_OAK_SIGN, p -> p.overrideDescription("block.securitycraft.secret_dark_oak_sign")); + public static final DeferredBlock SECRET_MANGROVE_SIGN = secretStandingSign("secret_mangrove_sign_standing", Blocks.MANGROVE_SIGN, p -> p.overrideDescription("block.securitycraft.secret_mangrove_sign")); + public static final DeferredBlock SECRET_MANGROVE_WALL_SIGN = secretWallSign("secret_mangrove_sign_wall", Blocks.MANGROVE_SIGN, p -> p.overrideDescription("block.securitycraft.secret_mangrove_sign")); + public static final DeferredBlock SECRET_CRIMSON_SIGN = secretStandingSign("secret_crimson_sign_standing", Blocks.CRIMSON_SIGN, p -> p.overrideDescription("block.securitycraft.secret_crimson_sign")); + public static final DeferredBlock SECRET_CRIMSON_WALL_SIGN = secretWallSign("secret_crimson_sign_wall", Blocks.CRIMSON_SIGN, p -> p.overrideDescription("block.securitycraft.secret_crimson_sign")); + public static final DeferredBlock SECRET_WARPED_SIGN = secretStandingSign("secret_warped_sign_standing", Blocks.WARPED_SIGN, p -> p.overrideDescription("block.securitycraft.secret_warped_sign")); + public static final DeferredBlock SECRET_WARPED_WALL_SIGN = secretWallSign("secret_warped_sign_wall", Blocks.WARPED_SIGN, p -> p.overrideDescription("block.securitycraft.secret_warped_sign")); @HasManualPage @RegisterItemBlock - public static final DeferredBlock SECURE_REDSTONE_INTERFACE = BLOCKS.registerBlock("secure_redstone_interface", SecureRedstoneInterfaceBlock::new, propDisguisable()); + public static final DeferredBlock SECURE_REDSTONE_INTERFACE = BLOCKS.registerBlock("secure_redstone_interface", SecureRedstoneInterfaceBlock::new, propDisguisable(3.5F)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock SECURITY_CAMERA = BLOCKS.registerBlock("security_camera", SecurityCameraBlock::new, propDisguisable(MapColor.METAL, false).noCollission()); + public static final DeferredBlock SECURITY_CAMERA = BLOCKS.registerBlock("security_camera", SecurityCameraBlock::new, propDisguisable(MapColor.METAL, 5.0F, false).noCollission()); @HasManualPage - public static final DeferredBlock SONIC_SECURITY_SYSTEM = BLOCKS.registerBlock("sonic_security_system", SonicSecuritySystemBlock::new, propDisguisable(MapColor.METAL, false).sound(SoundType.METAL).noCollission()); + public static final DeferredBlock SONIC_SECURITY_SYSTEM = BLOCKS.registerBlock("sonic_security_system", SonicSecuritySystemBlock::new, propDisguisable(MapColor.METAL, 5.0F, false).sound(SoundType.METAL).noCollission()); @RegisterItemBlock(SCItemGroup.EXPLOSIVES) public static final DeferredBlock TRACK_MINE = BLOCKS.registerBlock("track_mine", TrackMineBlock::new, prop(MapColor.METAL, 0.7F).noCollission().sound(SoundType.METAL)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock TROPHY_SYSTEM = BLOCKS.registerBlock("trophy_system", TrophySystemBlock::new, propDisguisable(MapColor.METAL, false).sound(SoundType.METAL)); + public static final DeferredBlock TROPHY_SYSTEM = BLOCKS.registerBlock("trophy_system", TrophySystemBlock::new, propDisguisable(MapColor.METAL, 5.0F, false).sound(SoundType.METAL)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock USERNAME_LOGGER = BLOCKS.registerBlock("username_logger", UsernameLoggerBlock::new, propDisguisable()); + public static final DeferredBlock USERNAME_LOGGER = BLOCKS.registerBlock("username_logger", UsernameLoggerBlock::new, propDisguisable(3.5F)); @HasManualPage @OwnableBE @RegisterItemBlock - public static final DeferredBlock MINE = BLOCKS.registerBlock("mine", MineBlock::new, prop(MapColor.METAL, 1.0F).forceSolidOn().pushReaction(PushReaction.NORMAL)); - public static final DeferredBlock FAKE_WATER_BLOCK = BLOCKS.registerBlock("fake_water_block", p -> new FakeWaterBlock(p, FAKE_WATER.get()), prop(MapColor.WATER).replaceable().noLootTable().liquid().sound(SoundType.EMPTY).pushReaction(PushReaction.DESTROY).noCollission()); - public static final DeferredBlock FAKE_LAVA_BLOCK = BLOCKS.registerBlock("fake_lava_block", p -> new FakeLavaBlock(p, FAKE_LAVA.get()), prop(MapColor.FIRE).replaceable().noLootTable().liquid().sound(SoundType.EMPTY).pushReaction(PushReaction.DESTROY).noCollission().randomTicks().lightLevel(state -> 15)); + public static final DeferredBlock MINE = BLOCKS.registerBlock("mine", MineBlock::new, prop(MapColor.METAL, 3.5F).sound(SoundType.METAL).forceSolidOn().pushReaction(PushReaction.NORMAL)); + public static final DeferredBlock FAKE_WATER_BLOCK = BLOCKS.registerBlock("fake_water_block", p -> new FakeWaterBlock(p, FAKE_WATER.get()), reinforcedCopy(Blocks.WATER)); + public static final DeferredBlock FAKE_LAVA_BLOCK = BLOCKS.registerBlock("fake_lava_block", p -> new FakeLavaBlock(p, FAKE_LAVA.get()), reinforcedCopy(Blocks.LAVA)); //block mines @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock STONE_MINE = BLOCKS.registerBlock("stone_mine", p -> new BaseFullMineBlock(p, Blocks.STONE), mineProp(Blocks.STONE)); + public static final DeferredBlock STONE_MINE = blockMine("stone_mine", Blocks.STONE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_MINE = BLOCKS.registerBlock("deepslate_mine", p -> new DeepslateMineBlock(p, Blocks.DEEPSLATE), mineProp(Blocks.DEEPSLATE)); + public static final DeferredBlock DEEPSLATE_MINE = reinforcedBlock("deepslate_mine", Blocks.DEEPSLATE, DeepslateMineBlock::new); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock COBBLED_DEEPSLATE_MINE = BLOCKS.registerBlock("cobbled_deepslate_mine", p -> new BaseFullMineBlock(p, Blocks.COBBLED_DEEPSLATE), mineProp(Blocks.COBBLED_DEEPSLATE)); + public static final DeferredBlock COBBLED_DEEPSLATE_MINE = blockMine("cobbled_deepslate_mine", Blocks.COBBLED_DEEPSLATE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DIRT_MINE = BLOCKS.registerBlock("dirt_mine", p -> new BaseFullMineBlock(p, Blocks.DIRT), mineProp(Blocks.DIRT)); + public static final DeferredBlock DIRT_MINE = blockMine("dirt_mine", Blocks.DIRT); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock COBBLESTONE_MINE = BLOCKS.registerBlock("cobblestone_mine", p -> new BaseFullMineBlock(p, Blocks.COBBLESTONE), mineProp(Blocks.COBBLESTONE)); + public static final DeferredBlock COBBLESTONE_MINE = blockMine("cobblestone_mine", Blocks.COBBLESTONE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock SAND_MINE = BLOCKS.registerBlock("sand_mine", p -> new FallingBlockMineBlock(p, Blocks.SAND), mineProp(Blocks.SAND)); + public static final DeferredBlock SAND_MINE = reinforcedBlock("sand_mine", Blocks.SAND, FallingBlockMineBlock::new); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock GRAVEL_MINE = BLOCKS.registerBlock("gravel_mine", p -> new FallingBlockMineBlock(p, Blocks.GRAVEL), mineProp(Blocks.GRAVEL)); + public static final DeferredBlock GRAVEL_MINE = reinforcedBlock("gravel_mine", Blocks.GRAVEL, FallingBlockMineBlock::new); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock NETHERRACK_MINE = BLOCKS.registerBlock("netherrack_mine", p -> new BaseFullMineBlock(p, Blocks.NETHERRACK), mineProp(Blocks.NETHERRACK)); + public static final DeferredBlock NETHERRACK_MINE = blockMine("netherrack_mine", Blocks.NETHERRACK); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock END_STONE_MINE = BLOCKS.registerBlock("end_stone_mine", p -> new BaseFullMineBlock(p, Blocks.END_STONE), mineProp(Blocks.END_STONE)); + public static final DeferredBlock END_STONE_MINE = blockMine("end_stone_mine", Blocks.END_STONE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock COAL_ORE_MINE = BLOCKS.registerBlock("coal_mine", p -> new BaseFullMineBlock(p, Blocks.COAL_ORE), mineProp(Blocks.COAL_ORE)); + public static final DeferredBlock COAL_ORE_MINE = blockMine("coal_mine", Blocks.COAL_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_COAL_ORE_MINE = BLOCKS.registerBlock("deepslate_coal_mine", p -> new BaseFullMineBlock(p, Blocks.DEEPSLATE_COAL_ORE), mineProp(Blocks.DEEPSLATE_COAL_ORE)); + public static final DeferredBlock DEEPSLATE_COAL_ORE_MINE = blockMine("deepslate_coal_mine", Blocks.DEEPSLATE_COAL_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock IRON_ORE_MINE = BLOCKS.registerBlock("iron_mine", p -> new BaseFullMineBlock(p, Blocks.IRON_ORE), mineProp(Blocks.IRON_ORE)); + public static final DeferredBlock IRON_ORE_MINE = blockMine("iron_mine", Blocks.IRON_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_IRON_ORE_MINE = BLOCKS.registerBlock("deepslate_iron_mine", p -> new BaseFullMineBlock(p, Blocks.DEEPSLATE_IRON_ORE), mineProp(Blocks.DEEPSLATE_IRON_ORE)); + public static final DeferredBlock DEEPSLATE_IRON_ORE_MINE = blockMine("deepslate_iron_mine", Blocks.DEEPSLATE_IRON_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock GOLD_ORE_MINE = BLOCKS.registerBlock("gold_mine", p -> new BaseFullMineBlock(p, Blocks.GOLD_ORE), mineProp(Blocks.GOLD_ORE)); + public static final DeferredBlock GOLD_ORE_MINE = blockMine("gold_mine", Blocks.GOLD_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_GOLD_ORE_MINE = BLOCKS.registerBlock("deepslate_gold_mine", p -> new BaseFullMineBlock(p, Blocks.DEEPSLATE_GOLD_ORE), mineProp(Blocks.DEEPSLATE_GOLD_ORE)); + public static final DeferredBlock DEEPSLATE_GOLD_ORE_MINE = blockMine("deepslate_gold_mine", Blocks.DEEPSLATE_GOLD_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock COPPER_ORE_MINE = BLOCKS.registerBlock("copper_mine", p -> new BaseFullMineBlock(p, Blocks.COPPER_ORE), mineProp(Blocks.COPPER_ORE)); + public static final DeferredBlock COPPER_ORE_MINE = blockMine("copper_mine", Blocks.COPPER_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_COPPER_ORE_MINE = BLOCKS.registerBlock("deepslate_copper_mine", p -> new BaseFullMineBlock(p, Blocks.DEEPSLATE_COPPER_ORE), mineProp(Blocks.DEEPSLATE_COPPER_ORE)); + public static final DeferredBlock DEEPSLATE_COPPER_ORE_MINE = blockMine("deepslate_copper_mine", Blocks.DEEPSLATE_COPPER_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock REDSTONE_ORE_MINE = BLOCKS.registerBlock("redstone_mine", p -> new RedstoneOreMineBlock(p, Blocks.REDSTONE_ORE), mineProp(Blocks.REDSTONE_ORE)); + public static final DeferredBlock REDSTONE_ORE_MINE = reinforcedBlock("redstone_mine", Blocks.REDSTONE_ORE, RedstoneOreMineBlock::new); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_REDSTONE_ORE_MINE = BLOCKS.registerBlock("deepslate_redstone_mine", p -> new RedstoneOreMineBlock(p, Blocks.DEEPSLATE_REDSTONE_ORE), mineProp(Blocks.DEEPSLATE_REDSTONE_ORE)); + public static final DeferredBlock DEEPSLATE_REDSTONE_ORE_MINE = reinforcedBlock("deepslate_redstone_mine", Blocks.DEEPSLATE_REDSTONE_ORE, RedstoneOreMineBlock::new); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock EMERALD_ORE_MINE = BLOCKS.registerBlock("emerald_mine", p -> new BaseFullMineBlock(p, Blocks.EMERALD_ORE), mineProp(Blocks.EMERALD_ORE)); + public static final DeferredBlock EMERALD_ORE_MINE = blockMine("emerald_mine", Blocks.EMERALD_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_EMERALD_ORE_MINE = BLOCKS.registerBlock("deepslate_emerald_mine", p -> new BaseFullMineBlock(p, Blocks.DEEPSLATE_EMERALD_ORE), mineProp(Blocks.DEEPSLATE_EMERALD_ORE)); + public static final DeferredBlock DEEPSLATE_EMERALD_ORE_MINE = blockMine("deepslate_emerald_mine", Blocks.DEEPSLATE_EMERALD_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock LAPIS_ORE_MINE = BLOCKS.registerBlock("lapis_mine", p -> new BaseFullMineBlock(p, Blocks.LAPIS_ORE), mineProp(Blocks.LAPIS_ORE)); + public static final DeferredBlock LAPIS_ORE_MINE = blockMine("lapis_mine", Blocks.LAPIS_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_LAPIS_ORE_MINE = BLOCKS.registerBlock("deepslate_lapis_mine", p -> new BaseFullMineBlock(p, Blocks.DEEPSLATE_LAPIS_ORE), mineProp(Blocks.DEEPSLATE_LAPIS_ORE)); + public static final DeferredBlock DEEPSLATE_LAPIS_ORE_MINE = blockMine("deepslate_lapis_mine", Blocks.DEEPSLATE_LAPIS_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DIAMOND_ORE_MINE = BLOCKS.registerBlock("diamond_mine", p -> new BaseFullMineBlock(p, Blocks.DIAMOND_ORE), mineProp(Blocks.DIAMOND_ORE)); + public static final DeferredBlock DIAMOND_ORE_MINE = blockMine("diamond_mine", Blocks.DIAMOND_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock DEEPSLATE_DIAMOND_ORE_MINE = BLOCKS.registerBlock("deepslate_diamond_mine", p -> new BaseFullMineBlock(p, Blocks.DEEPSLATE_DIAMOND_ORE), mineProp(Blocks.DEEPSLATE_DIAMOND_ORE)); + public static final DeferredBlock DEEPSLATE_DIAMOND_ORE_MINE = blockMine("deepslate_diamond_mine", Blocks.DEEPSLATE_DIAMOND_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock NETHER_GOLD_ORE_MINE = BLOCKS.registerBlock("nether_gold_mine", p -> new BaseFullMineBlock(p, Blocks.NETHER_GOLD_ORE), mineProp(Blocks.NETHER_GOLD_ORE)); + public static final DeferredBlock NETHER_GOLD_ORE_MINE = blockMine("nether_gold_mine", Blocks.NETHER_GOLD_ORE); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock QUARTZ_ORE_MINE = BLOCKS.registerBlock("quartz_mine", p -> new BaseFullMineBlock(p, Blocks.NETHER_QUARTZ_ORE), mineProp(Blocks.NETHER_QUARTZ_ORE)); + public static final DeferredBlock QUARTZ_ORE_MINE = blockMine("quartz_mine", Blocks.NETHER_QUARTZ_ORE); @HasManualPage(PageGroup.BLOCK_MINES) - public static final DeferredBlock ANCIENT_DEBRIS_MINE = BLOCKS.registerBlock("ancient_debris_mine", p -> new BaseFullMineBlock(p, Blocks.ANCIENT_DEBRIS), mineProp(Blocks.ANCIENT_DEBRIS)); + public static final DeferredBlock ANCIENT_DEBRIS_MINE = blockMine("ancient_debris_mine", Blocks.ANCIENT_DEBRIS); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock GILDED_BLACKSTONE_MINE = BLOCKS.registerBlock("gilded_blackstone_mine", p -> new BaseFullMineBlock(p, Blocks.GILDED_BLACKSTONE), mineProp(Blocks.GILDED_BLACKSTONE)); + public static final DeferredBlock GILDED_BLACKSTONE_MINE = blockMine("gilded_blackstone_mine", Blocks.GILDED_BLACKSTONE); @HasManualPage(PageGroup.FURNACE_MINES) @OwnableBE @RegisterItemBlock - public static final DeferredBlock FURNACE_MINE = BLOCKS.registerBlock("furnace_mine", p -> new FurnaceMineBlock(p, Blocks.FURNACE), prop(MapColor.STONE, 3.5F).requiresCorrectToolForDrops()); + public static final DeferredBlock FURNACE_MINE = reinforcedBlock("furnace_mine", Blocks.FURNACE, FurnaceMineBlock::new, p -> p.lightLevel(state -> 0)); @HasManualPage(PageGroup.FURNACE_MINES) @OwnableBE @RegisterItemBlock - public static final DeferredBlock SMOKER_MINE = BLOCKS.registerBlock("smoker_mine", p -> new FurnaceMineBlock(p, Blocks.SMOKER), prop(MapColor.STONE, 3.5F).requiresCorrectToolForDrops()); + public static final DeferredBlock SMOKER_MINE = reinforcedBlock("smoker_mine", Blocks.SMOKER, FurnaceMineBlock::new, p -> p.lightLevel(state -> 0)); @HasManualPage(PageGroup.FURNACE_MINES) @OwnableBE @RegisterItemBlock - public static final DeferredBlock BLAST_FURNACE_MINE = BLOCKS.registerBlock("blast_furnace_mine", p -> new FurnaceMineBlock(p, Blocks.BLAST_FURNACE), prop(MapColor.STONE, 3.5F).requiresCorrectToolForDrops()); + public static final DeferredBlock BLAST_FURNACE_MINE = reinforcedBlock("blast_furnace_mine", Blocks.BLAST_FURNACE, FurnaceMineBlock::new, p -> p.lightLevel(state -> 0)); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock SUSPICIOUS_SAND_MINE = BLOCKS.registerBlock("suspicious_sand_mine", p -> new BrushableMineBlock(p, Blocks.SUSPICIOUS_SAND), mineProp(Blocks.SUSPICIOUS_SAND).pushReaction(PushReaction.DESTROY)); + public static final DeferredBlock SUSPICIOUS_SAND_MINE = reinforcedBlock("suspicious_sand_mine", Blocks.SUSPICIOUS_SAND, BrushableMineBlock::new); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock SUSPICIOUS_GRAVEL_MINE = BLOCKS.registerBlock("suspicious_gravel_mine", p -> new BrushableMineBlock(p, Blocks.SUSPICIOUS_GRAVEL), mineProp(Blocks.SUSPICIOUS_GRAVEL)); + public static final DeferredBlock SUSPICIOUS_GRAVEL_MINE = reinforcedBlock("suspicious_gravel_mine", Blocks.SUSPICIOUS_GRAVEL, BrushableMineBlock::new); @HasManualPage(PageGroup.BLOCK_MINES) @RegisterItemBlock(SCItemGroup.EXPLOSIVES) - public static final DeferredBlock CREAKING_HEART_MINE = BLOCKS.registerBlock("creaking_heart_mine", p -> new CreakingHeartMineBlock(p, Blocks.CREAKING_HEART), mineProp(Blocks.CREAKING_HEART)); + public static final DeferredBlock CREAKING_HEART_MINE = reinforcedBlock("creaking_heart_mine", Blocks.CREAKING_HEART, CreakingHeartMineBlock::new); //reinforced blocks (ordered by vanilla <1.19.3 building blocks creative tab order) @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STONE = BLOCKS.registerBlock("reinforced_stone", p -> new BaseReinforcedBlock(p, Blocks.STONE), prop()); + public static final DeferredBlock REINFORCED_STONE = reinforcedBlock("reinforced_stone", Blocks.STONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRANITE = BLOCKS.registerBlock("reinforced_granite", p -> new BaseReinforcedBlock(p, Blocks.GRANITE), prop(MapColor.DIRT)); + public static final DeferredBlock REINFORCED_GRANITE = reinforcedBlock("reinforced_granite", Blocks.GRANITE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_GRANITE = BLOCKS.registerBlock("reinforced_polished_granite", p -> new BaseReinforcedBlock(p, Blocks.POLISHED_GRANITE), prop(MapColor.DIRT)); + public static final DeferredBlock REINFORCED_POLISHED_GRANITE = reinforcedBlock("reinforced_polished_granite", Blocks.POLISHED_GRANITE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DIORITE = BLOCKS.registerBlock("reinforced_diorite", p -> new BaseReinforcedBlock(p, Blocks.DIORITE), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_DIORITE = reinforcedBlock("reinforced_diorite", Blocks.DIORITE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_DIORITE = BLOCKS.registerBlock("reinforced_polished_diorite", p -> new BaseReinforcedBlock(p, Blocks.POLISHED_DIORITE), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_POLISHED_DIORITE = reinforcedBlock("reinforced_polished_diorite", Blocks.POLISHED_DIORITE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ANDESITE = BLOCKS.registerBlock("reinforced_andesite", p -> new BaseReinforcedBlock(p, Blocks.ANDESITE), prop()); + public static final DeferredBlock REINFORCED_ANDESITE = reinforcedBlock("reinforced_andesite", Blocks.ANDESITE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_ANDESITE = BLOCKS.registerBlock("reinforced_polished_andesite", p -> new BaseReinforcedBlock(p, Blocks.POLISHED_ANDESITE), prop()); + public static final DeferredBlock REINFORCED_POLISHED_ANDESITE = reinforcedBlock("reinforced_polished_andesite", Blocks.POLISHED_ANDESITE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE = BLOCKS.registerBlock("reinforced_deepslate", p -> new ReinforcedRotatedPillarBlock(p, Blocks.DEEPSLATE), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE)); + public static final DeferredBlock REINFORCED_DEEPSLATE = reinforcedBlock("reinforced_deepslate", Blocks.DEEPSLATE, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBBLED_DEEPSLATE = BLOCKS.registerBlock("reinforced_cobbled_deepslate", p -> new BaseReinforcedBlock(p, Blocks.COBBLED_DEEPSLATE), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE)); + public static final DeferredBlock REINFORCED_COBBLED_DEEPSLATE = reinforcedBlock("reinforced_cobbled_deepslate", Blocks.COBBLED_DEEPSLATE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_DEEPSLATE = BLOCKS.registerBlock("reinforced_polished_deepslate", p -> new BaseReinforcedBlock(p, Blocks.POLISHED_DEEPSLATE), prop(MapColor.DEEPSLATE).sound(SoundType.POLISHED_DEEPSLATE)); + public static final DeferredBlock REINFORCED_POLISHED_DEEPSLATE = reinforcedBlock("reinforced_polished_deepslate", Blocks.POLISHED_DEEPSLATE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CALCITE = BLOCKS.registerBlock("reinforced_calcite", p -> new BaseReinforcedBlock(p, Blocks.CALCITE), prop(MapColor.TERRACOTTA_WHITE).sound(SoundType.CALCITE)); + public static final DeferredBlock REINFORCED_CALCITE = reinforcedBlock("reinforced_calcite", Blocks.CALCITE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TUFF = BLOCKS.registerBlock("reinforced_tuff", p -> new BaseReinforcedBlock(p, Blocks.TUFF), prop(MapColor.TERRACOTTA_GRAY).sound(SoundType.TUFF)); + public static final DeferredBlock REINFORCED_TUFF = reinforcedBlock("reinforced_tuff", Blocks.TUFF); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DRIPSTONE_BLOCK = BLOCKS.registerBlock("reinforced_dripstone_block", p -> new BaseReinforcedBlock(p, Blocks.DRIPSTONE_BLOCK), prop(MapColor.TERRACOTTA_BROWN).sound(SoundType.DRIPSTONE_BLOCK)); + public static final DeferredBlock REINFORCED_DRIPSTONE_BLOCK = reinforcedBlock("reinforced_dripstone_block", Blocks.DRIPSTONE_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRASS_BLOCK = BLOCKS.registerBlock("reinforced_grass_block", ReinforcedGrassBlock::new, prop(MapColor.GRASS).sound(SoundType.GRASS)); + public static final DeferredBlock REINFORCED_GRASS_BLOCK = reinforcedBlock("reinforced_grass_block", Blocks.GRASS_BLOCK, (p, b) -> new ReinforcedGrassBlock(p)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DIRT = BLOCKS.registerBlock("reinforced_dirt", p -> new BaseReinforcedBlock(p, Blocks.DIRT), prop(MapColor.DIRT).sound(SoundType.GRAVEL)); + public static final DeferredBlock REINFORCED_DIRT = reinforcedBlock("reinforced_dirt", Blocks.DIRT); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COARSE_DIRT = BLOCKS.registerBlock("reinforced_coarse_dirt", p -> new BaseReinforcedBlock(p, Blocks.COARSE_DIRT), prop(MapColor.DIRT).sound(SoundType.GRAVEL)); + public static final DeferredBlock REINFORCED_COARSE_DIRT = reinforcedBlock("reinforced_coarse_dirt", Blocks.COARSE_DIRT); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PODZOL = BLOCKS.registerBlock("reinforced_podzol", p -> new ReinforcedSnowyDirtBlock(p, Blocks.PODZOL), prop(MapColor.PODZOL).sound(SoundType.GRAVEL)); + public static final DeferredBlock REINFORCED_PODZOL = reinforcedBlock("reinforced_podzol", Blocks.PODZOL, ReinforcedSnowyDirtBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MUD = BLOCKS.registerBlock("reinforced_mud", p -> new ReinforcedMud(p, Blocks.MUD), prop(MapColor.TERRACOTTA_CYAN).isValidSpawn(SCContent::always).isRedstoneConductor(SCContent::always).isViewBlocking(SCContent::always).isSuffocating(SCContent::always).sound(SoundType.MUD)); + public static final DeferredBlock REINFORCED_MUD = reinforcedBlock("reinforced_mud", Blocks.MUD, ReinforcedMudBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRIMSON_NYLIUM = BLOCKS.registerBlock("reinforced_crimson_nylium", p -> new ReinforcedNyliumBlock(p, Blocks.CRIMSON_NYLIUM), prop(MapColor.CRIMSON_NYLIUM).sound(SoundType.NYLIUM)); + public static final DeferredBlock REINFORCED_CRIMSON_NYLIUM = reinforcedBlock("reinforced_crimson_nylium", Blocks.CRIMSON_NYLIUM, ReinforcedNyliumBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WARPED_NYLIUM = BLOCKS.registerBlock("reinforced_warped_nylium", p -> new ReinforcedNyliumBlock(p, Blocks.WARPED_NYLIUM), prop(MapColor.WARPED_NYLIUM).sound(SoundType.NYLIUM)); + public static final DeferredBlock REINFORCED_WARPED_NYLIUM = reinforcedBlock("reinforced_warped_nylium", Blocks.WARPED_NYLIUM, ReinforcedNyliumBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ROOTED_DIRT = BLOCKS.registerBlock("reinforced_rooted_dirt", p -> new ReinforcedRootedDirtBlock(p, Blocks.ROOTED_DIRT), prop(MapColor.DIRT).sound(SoundType.ROOTED_DIRT)); + public static final DeferredBlock REINFORCED_ROOTED_DIRT = reinforcedBlock("reinforced_rooted_dirt", Blocks.ROOTED_DIRT, ReinforcedRootedDirtBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBBLESTONE = BLOCKS.registerBlock("reinforced_cobblestone", p -> new BaseReinforcedBlock(p, Blocks.COBBLESTONE), prop()); + public static final DeferredBlock REINFORCED_COBBLESTONE = reinforcedBlock("reinforced_cobblestone", Blocks.COBBLESTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OAK_PLANKS = BLOCKS.registerBlock("reinforced_oak_planks", p -> new BaseReinforcedBlock(p, Blocks.OAK_PLANKS), prop(MapColor.WOOD).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_OAK_PLANKS = reinforcedBlock("reinforced_oak_planks", Blocks.OAK_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SPRUCE_PLANKS = BLOCKS.registerBlock("reinforced_spruce_planks", p -> new BaseReinforcedBlock(p, Blocks.SPRUCE_PLANKS), prop(MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_SPRUCE_PLANKS = reinforcedBlock("reinforced_spruce_planks", Blocks.SPRUCE_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BIRCH_PLANKS = BLOCKS.registerBlock("reinforced_birch_planks", p -> new BaseReinforcedBlock(p, Blocks.BIRCH_PLANKS), prop(MapColor.SAND).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_BIRCH_PLANKS = reinforcedBlock("reinforced_birch_planks", Blocks.BIRCH_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_JUNGLE_PLANKS = BLOCKS.registerBlock("reinforced_jungle_planks", p -> new BaseReinforcedBlock(p, Blocks.JUNGLE_PLANKS), prop(MapColor.DIRT).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_JUNGLE_PLANKS = reinforcedBlock("reinforced_jungle_planks", Blocks.JUNGLE_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ACACIA_PLANKS = BLOCKS.registerBlock("reinforced_acacia_planks", p -> new BaseReinforcedBlock(p, Blocks.ACACIA_PLANKS), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_ACACIA_PLANKS = reinforcedBlock("reinforced_acacia_planks", Blocks.ACACIA_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_OAK_PLANKS = BLOCKS.registerBlock("reinforced_dark_oak_planks", p -> new BaseReinforcedBlock(p, Blocks.DARK_OAK_PLANKS), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_DARK_OAK_PLANKS = reinforcedBlock("reinforced_dark_oak_planks", Blocks.DARK_OAK_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MANGROVE_PLANKS = BLOCKS.registerBlock("reinforced_mangrove_planks", p -> new BaseReinforcedBlock(p, Blocks.MANGROVE_PLANKS), prop(MapColor.COLOR_RED).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_MANGROVE_PLANKS = reinforcedBlock("reinforced_mangrove_planks", Blocks.MANGROVE_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRIMSON_PLANKS = BLOCKS.registerBlock("reinforced_crimson_planks", p -> new BaseReinforcedBlock(p, Blocks.CRIMSON_PLANKS), prop(MapColor.CRIMSON_STEM).sound(SoundType.NETHER_WOOD)); + public static final DeferredBlock REINFORCED_CRIMSON_PLANKS = reinforcedBlock("reinforced_crimson_planks", Blocks.CRIMSON_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WARPED_PLANKS = BLOCKS.registerBlock("reinforced_warped_planks", p -> new BaseReinforcedBlock(p, Blocks.WARPED_PLANKS), prop(MapColor.WARPED_STEM).sound(SoundType.NETHER_WOOD)); + public static final DeferredBlock REINFORCED_WARPED_PLANKS = reinforcedBlock("reinforced_warped_planks", Blocks.WARPED_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SAND = BLOCKS.registerBlock("reinforced_sand", p -> new ReinforcedFallingBlock(p, Blocks.SAND), prop(MapColor.SAND).sound(SoundType.SAND)); + public static final DeferredBlock REINFORCED_SAND = reinforcedBlock("reinforced_sand", Blocks.SAND, ReinforcedFallingBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_SAND = BLOCKS.registerBlock("reinforced_red_sand", p -> new ReinforcedFallingBlock(p, Blocks.RED_SAND), prop(MapColor.COLOR_ORANGE).sound(SoundType.SAND)); + public static final DeferredBlock REINFORCED_RED_SAND = reinforcedBlock("reinforced_red_sand", Blocks.RED_SAND, ReinforcedFallingBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRAVEL = BLOCKS.registerBlock("reinforced_gravel", p -> new ReinforcedFallingBlock(p, Blocks.GRAVEL), prop().sound(SoundType.GRAVEL)); + public static final DeferredBlock REINFORCED_GRAVEL = reinforcedBlock("reinforced_gravel", Blocks.GRAVEL, ReinforcedFallingBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COAL_BLOCK = BLOCKS.registerBlock("reinforced_coal_block", p -> new BaseReinforcedBlock(p, Blocks.COAL_BLOCK), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_COAL_BLOCK = reinforcedBlock("reinforced_coal_block", Blocks.COAL_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RAW_IRON_BLOCK = BLOCKS.registerBlock("reinforced_raw_iron_block", p -> new BaseReinforcedBlock(p, Blocks.RAW_IRON_BLOCK), prop(MapColor.RAW_IRON)); + public static final DeferredBlock REINFORCED_RAW_IRON_BLOCK = reinforcedBlock("reinforced_raw_iron_block", Blocks.RAW_IRON_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RAW_COPPER_BLOCK = BLOCKS.registerBlock("reinforced_raw_copper_block", p -> new BaseReinforcedBlock(p, Blocks.RAW_COPPER_BLOCK), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_RAW_COPPER_BLOCK = reinforcedBlock("reinforced_raw_copper_block", Blocks.RAW_COPPER_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RAW_GOLD_BLOCK = BLOCKS.registerBlock("reinforced_raw_gold_block", p -> new BaseReinforcedBlock(p, Blocks.RAW_GOLD_BLOCK), prop(MapColor.GOLD)); + public static final DeferredBlock REINFORCED_RAW_GOLD_BLOCK = reinforcedBlock("reinforced_raw_gold_block", Blocks.RAW_GOLD_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_AMETHYST_BLOCK = BLOCKS.registerBlock("reinforced_amethyst_block", p -> new ReinforcedAmethystBlock(p, Blocks.AMETHYST_BLOCK), prop(MapColor.COLOR_PURPLE).sound(SoundType.AMETHYST)); + public static final DeferredBlock REINFORCED_AMETHYST_BLOCK = reinforcedBlock("reinforced_amethyst_block", Blocks.AMETHYST_BLOCK, ReinforcedAmethystBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_IRON_BLOCK = BLOCKS.registerBlock("reinforced_iron_block", p -> new BaseReinforcedBlock(p, Blocks.IRON_BLOCK), prop(MapColor.METAL).sound(SoundType.METAL)); + public static final DeferredBlock REINFORCED_IRON_BLOCK = reinforcedBlock("reinforced_iron_block", Blocks.IRON_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COPPER_BLOCK = BLOCKS.registerBlock("reinforced_copper_block", p -> new BaseReinforcedBlock(p, Blocks.COPPER_BLOCK), prop(MapColor.COLOR_ORANGE).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_COPPER_BLOCK = reinforcedBlock("reinforced_copper_block", Blocks.COPPER_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GOLD_BLOCK = BLOCKS.registerBlock("reinforced_gold_block", p -> new BaseReinforcedBlock(p, Blocks.GOLD_BLOCK), prop(MapColor.GOLD).sound(SoundType.METAL)); + public static final DeferredBlock REINFORCED_GOLD_BLOCK = reinforcedBlock("reinforced_gold_block", Blocks.GOLD_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DIAMOND_BLOCK = BLOCKS.registerBlock("reinforced_diamond_block", p -> new BaseReinforcedBlock(p, Blocks.DIAMOND_BLOCK), prop(MapColor.DIAMOND).sound(SoundType.METAL)); + public static final DeferredBlock REINFORCED_DIAMOND_BLOCK = reinforcedBlock("reinforced_diamond_block", Blocks.DIAMOND_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NETHERITE_BLOCK = BLOCKS.registerBlock("reinforced_netherite_block", p -> new BaseReinforcedBlock(p, Blocks.NETHERITE_BLOCK), prop(MapColor.COLOR_BLACK).sound(SoundType.NETHERITE_BLOCK)); + public static final DeferredBlock REINFORCED_NETHERITE_BLOCK = reinforcedBlock("reinforced_netherite_block", Blocks.NETHERITE_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_EXPOSED_COPPER = BLOCKS.registerBlock("reinforced_exposed_copper", p -> new BaseReinforcedBlock(p, Blocks.EXPOSED_COPPER), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_EXPOSED_COPPER = reinforcedBlock("reinforced_exposed_copper", Blocks.EXPOSED_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WEATHERED_COPPER = BLOCKS.registerBlock("reinforced_weathered_copper", p -> new BaseReinforcedBlock(p, Blocks.WEATHERED_COPPER), prop(MapColor.WARPED_STEM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_WEATHERED_COPPER = reinforcedBlock("reinforced_weathered_copper", Blocks.WEATHERED_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OXIDIZED_COPPER = BLOCKS.registerBlock("reinforced_oxidized_copper", p -> new BaseReinforcedBlock(p, Blocks.OXIDIZED_COPPER), prop(MapColor.WARPED_NYLIUM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_OXIDIZED_COPPER = reinforcedBlock("reinforced_oxidized_copper", Blocks.OXIDIZED_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CUT_COPPER = BLOCKS.registerBlock("reinforced_cut_copper", p -> new BaseReinforcedBlock(p, Blocks.CUT_COPPER), prop(MapColor.COLOR_ORANGE).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_CUT_COPPER = reinforcedBlock("reinforced_cut_copper", Blocks.CUT_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_EXPOSED_CUT_COPPER = BLOCKS.registerBlock("reinforced_exposed_cut_copper", p -> new BaseReinforcedBlock(p, Blocks.EXPOSED_CUT_COPPER), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_EXPOSED_CUT_COPPER = reinforcedBlock("reinforced_exposed_cut_copper", Blocks.EXPOSED_CUT_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WEATHERED_CUT_COPPER = BLOCKS.registerBlock("reinforced_weathered_cut_copper", p -> new BaseReinforcedBlock(p, Blocks.WEATHERED_CUT_COPPER), prop(MapColor.WARPED_STEM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_WEATHERED_CUT_COPPER = reinforcedBlock("reinforced_weathered_cut_copper", Blocks.WEATHERED_CUT_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OXIDIZED_CUT_COPPER = BLOCKS.registerBlock("reinforced_oxidized_cut_copper", p -> new BaseReinforcedBlock(p, Blocks.OXIDIZED_CUT_COPPER), prop(MapColor.WARPED_NYLIUM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_OXIDIZED_CUT_COPPER = reinforcedBlock("reinforced_oxidized_cut_copper", Blocks.OXIDIZED_CUT_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CUT_COPPER_STAIRS = BLOCKS.registerBlock("reinforced_cut_copper_stairs", p -> new ReinforcedStairsBlock(p, Blocks.CUT_COPPER_STAIRS), prop(MapColor.COLOR_ORANGE).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_CUT_COPPER_STAIRS = reinforcedBlock("reinforced_cut_copper_stairs", Blocks.CUT_COPPER_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_EXPOSED_CUT_COPPER_STAIRS = BLOCKS.registerBlock("reinforced_exposed_cut_copper_stairs", p -> new ReinforcedStairsBlock(p, Blocks.EXPOSED_CUT_COPPER_STAIRS), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_EXPOSED_CUT_COPPER_STAIRS = reinforcedBlock("reinforced_exposed_cut_copper_stairs", Blocks.EXPOSED_CUT_COPPER_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WEATHERED_CUT_COPPER_STAIRS = BLOCKS.registerBlock("reinforced_weathered_cut_copper_stairs", p -> new ReinforcedStairsBlock(p, Blocks.WEATHERED_CUT_COPPER_STAIRS), prop(MapColor.WARPED_STEM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_WEATHERED_CUT_COPPER_STAIRS = reinforcedBlock("reinforced_weathered_cut_copper_stairs", Blocks.WEATHERED_CUT_COPPER_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OXIDIZED_CUT_COPPER_STAIRS = BLOCKS.registerBlock("reinforced_oxidized_cut_copper_stairs", p -> new ReinforcedStairsBlock(p, Blocks.OXIDIZED_CUT_COPPER_STAIRS), prop(MapColor.WARPED_NYLIUM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_OXIDIZED_CUT_COPPER_STAIRS = reinforcedBlock("reinforced_oxidized_cut_copper_stairs", Blocks.OXIDIZED_CUT_COPPER_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CUT_COPPER_SLAB = BLOCKS.registerBlock("reinforced_cut_copper_slab", p -> new ReinforcedSlabBlock(p, Blocks.CUT_COPPER_SLAB), prop(MapColor.COLOR_ORANGE).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_CUT_COPPER_SLAB = reinforcedBlock("reinforced_cut_copper_slab", Blocks.CUT_COPPER_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_EXPOSED_CUT_COPPER_SLAB = BLOCKS.registerBlock("reinforced_exposed_cut_copper_slab", p -> new ReinforcedSlabBlock(p, Blocks.EXPOSED_CUT_COPPER_SLAB), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_EXPOSED_CUT_COPPER_SLAB = reinforcedBlock("reinforced_exposed_cut_copper_slab", Blocks.EXPOSED_CUT_COPPER_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WEATHERED_CUT_COPPER_SLAB = BLOCKS.registerBlock("reinforced_weathered_cut_copper_slab", p -> new ReinforcedSlabBlock(p, Blocks.WEATHERED_CUT_COPPER_SLAB), prop(MapColor.WARPED_STEM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_WEATHERED_CUT_COPPER_SLAB = reinforcedBlock("reinforced_weathered_cut_copper_slab", Blocks.WEATHERED_CUT_COPPER_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OXIDIZED_CUT_COPPER_SLAB = BLOCKS.registerBlock("reinforced_oxidized_cut_copper_slab", p -> new ReinforcedSlabBlock(p, Blocks.OXIDIZED_CUT_COPPER_SLAB), prop(MapColor.WARPED_NYLIUM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_OXIDIZED_CUT_COPPER_SLAB = reinforcedBlock("reinforced_oxidized_cut_copper_slab", Blocks.OXIDIZED_CUT_COPPER_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OAK_LOG = BLOCKS.registerBlock("reinforced_oak_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.OAK_LOG), logProp(MapColor.WOOD, MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_OAK_LOG = reinforcedBlock("reinforced_oak_log", Blocks.OAK_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SPRUCE_LOG = BLOCKS.registerBlock("reinforced_spruce_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.SPRUCE_LOG), logProp(MapColor.PODZOL, MapColor.COLOR_BROWN).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_SPRUCE_LOG = reinforcedBlock("reinforced_spruce_log", Blocks.SPRUCE_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BIRCH_LOG = BLOCKS.registerBlock("reinforced_birch_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.BIRCH_LOG), logProp(MapColor.SAND, MapColor.QUARTZ).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_BIRCH_LOG = reinforcedBlock("reinforced_birch_log", Blocks.BIRCH_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_JUNGLE_LOG = BLOCKS.registerBlock("reinforced_jungle_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.JUNGLE_LOG), logProp(MapColor.DIRT, MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_JUNGLE_LOG = reinforcedBlock("reinforced_jungle_log", Blocks.JUNGLE_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ACACIA_LOG = BLOCKS.registerBlock("reinforced_acacia_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.ACACIA_LOG), logProp(MapColor.COLOR_ORANGE, MapColor.STONE).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_ACACIA_LOG = reinforcedBlock("reinforced_acacia_log", Blocks.ACACIA_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_OAK_LOG = BLOCKS.registerBlock("reinforced_dark_oak_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.DARK_OAK_LOG), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_DARK_OAK_LOG = reinforcedBlock("reinforced_dark_oak_log", Blocks.DARK_OAK_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MANGROVE_LOG = BLOCKS.registerBlock("reinforced_mangrove_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.MANGROVE_LOG), logProp(MapColor.COLOR_RED, MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_MANGROVE_LOG = reinforcedBlock("reinforced_mangrove_log", Blocks.MANGROVE_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRIMSON_STEM = BLOCKS.registerBlock("reinforced_crimson_stem", p -> new ReinforcedRotatedPillarBlock(p, Blocks.CRIMSON_STEM), prop(MapColor.CRIMSON_STEM).sound(SoundType.STEM)); + public static final DeferredBlock REINFORCED_CRIMSON_STEM = reinforcedBlock("reinforced_crimson_stem", Blocks.CRIMSON_STEM, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WARPED_STEM = BLOCKS.registerBlock("reinforced_warped_stem", p -> new ReinforcedRotatedPillarBlock(p, Blocks.WARPED_STEM), prop(MapColor.WARPED_STEM).sound(SoundType.STEM)); + public static final DeferredBlock REINFORCED_WARPED_STEM = reinforcedBlock("reinforced_warped_stem", Blocks.WARPED_STEM, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_OAK_LOG = BLOCKS.registerBlock("reinforced_stripped_oak_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_OAK_LOG), prop(MapColor.WOOD).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_OAK_LOG = reinforcedBlock("reinforced_stripped_oak_log", Blocks.STRIPPED_OAK_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_SPRUCE_LOG = BLOCKS.registerBlock("reinforced_stripped_spruce_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_SPRUCE_LOG), prop(MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_SPRUCE_LOG = reinforcedBlock("reinforced_stripped_spruce_log", Blocks.STRIPPED_SPRUCE_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_BIRCH_LOG = BLOCKS.registerBlock("reinforced_stripped_birch_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_BIRCH_LOG), prop(MapColor.SAND).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_BIRCH_LOG = reinforcedBlock("reinforced_stripped_birch_log", Blocks.STRIPPED_BIRCH_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_JUNGLE_LOG = BLOCKS.registerBlock("reinforced_stripped_jungle_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_JUNGLE_LOG), prop(MapColor.DIRT).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_JUNGLE_LOG = reinforcedBlock("reinforced_stripped_jungle_log", Blocks.STRIPPED_JUNGLE_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_ACACIA_LOG = BLOCKS.registerBlock("reinforced_stripped_acacia_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_ACACIA_LOG), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_ACACIA_LOG = reinforcedBlock("reinforced_stripped_acacia_log", Blocks.STRIPPED_ACACIA_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_DARK_OAK_LOG = BLOCKS.registerBlock("reinforced_stripped_dark_oak_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_DARK_OAK_LOG), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_DARK_OAK_LOG = reinforcedBlock("reinforced_stripped_dark_oak_log", Blocks.STRIPPED_DARK_OAK_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_MANGROVE_LOG = BLOCKS.registerBlock("reinforced_stripped_mangrove_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_MANGROVE_LOG), prop(MapColor.COLOR_RED).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_MANGROVE_LOG = reinforcedBlock("reinforced_stripped_mangrove_log", Blocks.STRIPPED_MANGROVE_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_CRIMSON_STEM = BLOCKS.registerBlock("reinforced_stripped_crimson_stem", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_CRIMSON_STEM), prop(MapColor.CRIMSON_STEM).sound(SoundType.STEM)); + public static final DeferredBlock REINFORCED_STRIPPED_CRIMSON_STEM = reinforcedBlock("reinforced_stripped_crimson_stem", Blocks.STRIPPED_CRIMSON_STEM, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_WARPED_STEM = BLOCKS.registerBlock("reinforced_stripped_warped_stem", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_WARPED_STEM), prop(MapColor.WARPED_STEM).sound(SoundType.STEM)); + public static final DeferredBlock REINFORCED_STRIPPED_WARPED_STEM = reinforcedBlock("reinforced_stripped_warped_stem", Blocks.STRIPPED_WARPED_STEM, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_OAK_WOOD = BLOCKS.registerBlock("reinforced_stripped_oak_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_OAK_WOOD), prop(MapColor.WOOD).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_OAK_WOOD = reinforcedBlock("reinforced_stripped_oak_wood", Blocks.STRIPPED_OAK_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_SPRUCE_WOOD = BLOCKS.registerBlock("reinforced_stripped_spruce_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_SPRUCE_WOOD), prop(MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_SPRUCE_WOOD = reinforcedBlock("reinforced_stripped_spruce_wood", Blocks.STRIPPED_SPRUCE_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_BIRCH_WOOD = BLOCKS.registerBlock("reinforced_stripped_birch_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_BIRCH_WOOD), prop(MapColor.SAND).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_BIRCH_WOOD = reinforcedBlock("reinforced_stripped_birch_wood", Blocks.STRIPPED_BIRCH_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_JUNGLE_WOOD = BLOCKS.registerBlock("reinforced_stripped_jungle_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_JUNGLE_WOOD), prop(MapColor.DIRT).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_JUNGLE_WOOD = reinforcedBlock("reinforced_stripped_jungle_wood", Blocks.STRIPPED_JUNGLE_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_ACACIA_WOOD = BLOCKS.registerBlock("reinforced_stripped_acacia_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_ACACIA_WOOD), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_ACACIA_WOOD = reinforcedBlock("reinforced_stripped_acacia_wood", Blocks.STRIPPED_ACACIA_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_DARK_OAK_WOOD = BLOCKS.registerBlock("reinforced_stripped_dark_oak_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_DARK_OAK_WOOD), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_DARK_OAK_WOOD = reinforcedBlock("reinforced_stripped_dark_oak_wood", Blocks.STRIPPED_DARK_OAK_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_MANGROVE_WOOD = BLOCKS.registerBlock("reinforced_stripped_mangrove_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_MANGROVE_WOOD), prop(MapColor.COLOR_RED).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_MANGROVE_WOOD = reinforcedBlock("reinforced_stripped_mangrove_wood", Blocks.STRIPPED_MANGROVE_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_CRIMSON_HYPHAE = BLOCKS.registerBlock("reinforced_stripped_crimson_hyphae", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_CRIMSON_HYPHAE), prop(MapColor.CRIMSON_HYPHAE).sound(SoundType.STEM)); + public static final DeferredBlock REINFORCED_STRIPPED_CRIMSON_HYPHAE = reinforcedBlock("reinforced_stripped_crimson_hyphae", Blocks.STRIPPED_CRIMSON_HYPHAE, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_WARPED_HYPHAE = BLOCKS.registerBlock("reinforced_stripped_warped_hyphae", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_WARPED_HYPHAE), prop(MapColor.WARPED_HYPHAE).sound(SoundType.STEM)); + public static final DeferredBlock REINFORCED_STRIPPED_WARPED_HYPHAE = reinforcedBlock("reinforced_stripped_warped_hyphae", Blocks.STRIPPED_WARPED_HYPHAE, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OAK_WOOD = BLOCKS.registerBlock("reinforced_oak_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.OAK_WOOD), prop(MapColor.WOOD).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_OAK_WOOD = reinforcedBlock("reinforced_oak_wood", Blocks.OAK_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SPRUCE_WOOD = BLOCKS.registerBlock("reinforced_spruce_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.SPRUCE_WOOD), prop(MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_SPRUCE_WOOD = reinforcedBlock("reinforced_spruce_wood", Blocks.SPRUCE_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BIRCH_WOOD = BLOCKS.registerBlock("reinforced_birch_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.BIRCH_WOOD), prop(MapColor.SAND).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_BIRCH_WOOD = reinforcedBlock("reinforced_birch_wood", Blocks.BIRCH_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_JUNGLE_WOOD = BLOCKS.registerBlock("reinforced_jungle_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.JUNGLE_WOOD), prop(MapColor.DIRT).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_JUNGLE_WOOD = reinforcedBlock("reinforced_jungle_wood", Blocks.JUNGLE_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ACACIA_WOOD = BLOCKS.registerBlock("reinforced_acacia_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.ACACIA_WOOD), prop(MapColor.COLOR_GRAY).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_ACACIA_WOOD = reinforcedBlock("reinforced_acacia_wood", Blocks.ACACIA_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_OAK_WOOD = BLOCKS.registerBlock("reinforced_dark_oak_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.DARK_OAK_WOOD), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_DARK_OAK_WOOD = reinforcedBlock("reinforced_dark_oak_wood", Blocks.DARK_OAK_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MANGROVE_WOOD = BLOCKS.registerBlock("reinforced_mangrove_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.MANGROVE_WOOD), prop(MapColor.COLOR_RED).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_MANGROVE_WOOD = reinforcedBlock("reinforced_mangrove_wood", Blocks.MANGROVE_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRIMSON_HYPHAE = BLOCKS.registerBlock("reinforced_crimson_hyphae", p -> new ReinforcedRotatedPillarBlock(p, Blocks.CRIMSON_HYPHAE), prop(MapColor.CRIMSON_HYPHAE).sound(SoundType.STEM)); + public static final DeferredBlock REINFORCED_CRIMSON_HYPHAE = reinforcedBlock("reinforced_crimson_hyphae", Blocks.CRIMSON_HYPHAE, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WARPED_HYPHAE = BLOCKS.registerBlock("reinforced_warped_hyphae", p -> new ReinforcedRotatedPillarBlock(p, Blocks.WARPED_HYPHAE), prop(MapColor.WARPED_HYPHAE).sound(SoundType.STEM)); + public static final DeferredBlock REINFORCED_WARPED_HYPHAE = reinforcedBlock("reinforced_warped_hyphae", Blocks.WARPED_HYPHAE, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_GLASS = BLOCKS.registerBlock("reinforced_glass", p -> new ReinforcedGlassBlock(p, Blocks.GLASS), glassProp(MapColor.NONE)); + public static final DeferredBlock REINFORCED_GLASS = reinforcedBlock("reinforced_glass", Blocks.GLASS, ReinforcedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TINTED_GLASS = BLOCKS.registerBlock("reinforced_tinted_glass", p -> new ReinforcedTintedGlassBlock(p, Blocks.TINTED_GLASS), glassProp(MapColor.COLOR_GRAY)); + public static final DeferredBlock REINFORCED_TINTED_GLASS = reinforcedBlock("reinforced_tinted_glass", Blocks.TINTED_GLASS, ReinforcedTintedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LAPIS_BLOCK = BLOCKS.registerBlock("reinforced_lapis_block", p -> new BaseReinforcedBlock(p, Blocks.LAPIS_BLOCK), prop(MapColor.LAPIS)); + public static final DeferredBlock REINFORCED_LAPIS_BLOCK = reinforcedBlock("reinforced_lapis_block", Blocks.LAPIS_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SANDSTONE = BLOCKS.registerBlock("reinforced_sandstone", p -> new BaseReinforcedBlock(p, Blocks.SANDSTONE), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_SANDSTONE = reinforcedBlock("reinforced_sandstone", Blocks.SANDSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_SANDSTONE = BLOCKS.registerBlock("reinforced_chiseled_sandstone", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_SANDSTONE), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_CHISELED_SANDSTONE = reinforcedBlock("reinforced_chiseled_sandstone", Blocks.CHISELED_SANDSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CUT_SANDSTONE = BLOCKS.registerBlock("reinforced_cut_sandstone", p -> new BaseReinforcedBlock(p, Blocks.CUT_SANDSTONE), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_CUT_SANDSTONE = reinforcedBlock("reinforced_cut_sandstone", Blocks.CUT_SANDSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WHITE_WOOL = BLOCKS.registerBlock("reinforced_white_wool", p -> new BaseReinforcedBlock(p, Blocks.WHITE_WOOL), prop(MapColor.SNOW).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_WHITE_WOOL = reinforcedBlock("reinforced_white_wool", Blocks.WHITE_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ORANGE_WOOL = BLOCKS.registerBlock("reinforced_orange_wool", p -> new BaseReinforcedBlock(p, Blocks.ORANGE_WOOL), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_ORANGE_WOOL = reinforcedBlock("reinforced_orange_wool", Blocks.ORANGE_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MAGENTA_WOOL = BLOCKS.registerBlock("reinforced_magenta_wool", p -> new BaseReinforcedBlock(p, Blocks.MAGENTA_WOOL), prop(MapColor.COLOR_MAGENTA).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_MAGENTA_WOOL = reinforcedBlock("reinforced_magenta_wool", Blocks.MAGENTA_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_BLUE_WOOL = BLOCKS.registerBlock("reinforced_light_blue_wool", p -> new BaseReinforcedBlock(p, Blocks.LIGHT_BLUE_WOOL), prop(MapColor.COLOR_LIGHT_BLUE).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_LIGHT_BLUE_WOOL = reinforcedBlock("reinforced_light_blue_wool", Blocks.LIGHT_BLUE_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_YELLOW_WOOL = BLOCKS.registerBlock("reinforced_yellow_wool", p -> new BaseReinforcedBlock(p, Blocks.YELLOW_WOOL), prop(MapColor.COLOR_YELLOW).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_YELLOW_WOOL = reinforcedBlock("reinforced_yellow_wool", Blocks.YELLOW_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIME_WOOL = BLOCKS.registerBlock("reinforced_lime_wool", p -> new BaseReinforcedBlock(p, Blocks.LIME_WOOL), prop(MapColor.COLOR_LIGHT_GREEN).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_LIME_WOOL = reinforcedBlock("reinforced_lime_wool", Blocks.LIME_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PINK_WOOL = BLOCKS.registerBlock("reinforced_pink_wool", p -> new BaseReinforcedBlock(p, Blocks.PINK_WOOL), prop(MapColor.COLOR_PINK).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_PINK_WOOL = reinforcedBlock("reinforced_pink_wool", Blocks.PINK_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRAY_WOOL = BLOCKS.registerBlock("reinforced_gray_wool", p -> new BaseReinforcedBlock(p, Blocks.GRAY_WOOL), prop(MapColor.COLOR_GRAY).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_GRAY_WOOL = reinforcedBlock("reinforced_gray_wool", Blocks.GRAY_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_GRAY_WOOL = BLOCKS.registerBlock("reinforced_light_gray_wool", p -> new BaseReinforcedBlock(p, Blocks.LIGHT_GRAY_WOOL), prop(MapColor.COLOR_LIGHT_GRAY).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_LIGHT_GRAY_WOOL = reinforcedBlock("reinforced_light_gray_wool", Blocks.LIGHT_GRAY_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CYAN_WOOL = BLOCKS.registerBlock("reinforced_cyan_wool", p -> new BaseReinforcedBlock(p, Blocks.CYAN_WOOL), prop(MapColor.COLOR_CYAN).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_CYAN_WOOL = reinforcedBlock("reinforced_cyan_wool", Blocks.CYAN_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPLE_WOOL = BLOCKS.registerBlock("reinforced_purple_wool", p -> new BaseReinforcedBlock(p, Blocks.PURPLE_WOOL), prop(MapColor.COLOR_PURPLE).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_PURPLE_WOOL = reinforcedBlock("reinforced_purple_wool", Blocks.PURPLE_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLUE_WOOL = BLOCKS.registerBlock("reinforced_blue_wool", p -> new BaseReinforcedBlock(p, Blocks.BLUE_WOOL), prop(MapColor.COLOR_BLUE).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_BLUE_WOOL = reinforcedBlock("reinforced_blue_wool", Blocks.BLUE_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BROWN_WOOL = BLOCKS.registerBlock("reinforced_brown_wool", p -> new BaseReinforcedBlock(p, Blocks.BROWN_WOOL), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_BROWN_WOOL = reinforcedBlock("reinforced_brown_wool", Blocks.BROWN_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GREEN_WOOL = BLOCKS.registerBlock("reinforced_green_wool", p -> new BaseReinforcedBlock(p, Blocks.GREEN_WOOL), prop(MapColor.COLOR_GREEN).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_GREEN_WOOL = reinforcedBlock("reinforced_green_wool", Blocks.GREEN_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_WOOL = BLOCKS.registerBlock("reinforced_red_wool", p -> new BaseReinforcedBlock(p, Blocks.RED_WOOL), prop(MapColor.COLOR_RED).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_RED_WOOL = reinforcedBlock("reinforced_red_wool", Blocks.RED_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACK_WOOL = BLOCKS.registerBlock("reinforced_black_wool", p -> new BaseReinforcedBlock(p, Blocks.BLACK_WOOL), prop(MapColor.COLOR_BLACK).sound(SoundType.WOOL)); + public static final DeferredBlock REINFORCED_BLACK_WOOL = reinforcedBlock("reinforced_black_wool", Blocks.BLACK_WOOL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OAK_SLAB = BLOCKS.registerBlock("reinforced_oak_slab", p -> new ReinforcedSlabBlock(p, Blocks.OAK_SLAB), prop(MapColor.WOOD).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_OAK_SLAB = reinforcedBlock("reinforced_oak_slab", Blocks.OAK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SPRUCE_SLAB = BLOCKS.registerBlock("reinforced_spruce_slab", p -> new ReinforcedSlabBlock(p, Blocks.SPRUCE_SLAB), prop(MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_SPRUCE_SLAB = reinforcedBlock("reinforced_spruce_slab", Blocks.SPRUCE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BIRCH_SLAB = BLOCKS.registerBlock("reinforced_birch_slab", p -> new ReinforcedSlabBlock(p, Blocks.BIRCH_SLAB), prop(MapColor.SAND).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_BIRCH_SLAB = reinforcedBlock("reinforced_birch_slab", Blocks.BIRCH_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_JUNGLE_SLAB = BLOCKS.registerBlock("reinforced_jungle_slab", p -> new ReinforcedSlabBlock(p, Blocks.JUNGLE_SLAB), prop(MapColor.DIRT).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_JUNGLE_SLAB = reinforcedBlock("reinforced_jungle_slab", Blocks.JUNGLE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ACACIA_SLAB = BLOCKS.registerBlock("reinforced_acacia_slab", p -> new ReinforcedSlabBlock(p, Blocks.ACACIA_SLAB), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_ACACIA_SLAB = reinforcedBlock("reinforced_acacia_slab", Blocks.ACACIA_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_OAK_SLAB = BLOCKS.registerBlock("reinforced_dark_oak_slab", p -> new ReinforcedSlabBlock(p, Blocks.DARK_OAK_SLAB), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_DARK_OAK_SLAB = reinforcedBlock("reinforced_dark_oak_slab", Blocks.DARK_OAK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MANGROVE_SLAB = BLOCKS.registerBlock("reinforced_mangrove_slab", p -> new ReinforcedSlabBlock(p, Blocks.MANGROVE_SLAB), prop(MapColor.COLOR_RED).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_MANGROVE_SLAB = reinforcedBlock("reinforced_mangrove_slab", Blocks.MANGROVE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRIMSON_SLAB = BLOCKS.registerBlock("reinforced_crimson_slab", p -> new ReinforcedSlabBlock(p, Blocks.CRIMSON_SLAB), prop(MapColor.CRIMSON_STEM).sound(SoundType.NETHER_WOOD)); + public static final DeferredBlock REINFORCED_CRIMSON_SLAB = reinforcedBlock("reinforced_crimson_slab", Blocks.CRIMSON_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WARPED_SLAB = BLOCKS.registerBlock("reinforced_warped_slab", p -> new ReinforcedSlabBlock(p, Blocks.WARPED_SLAB), prop(MapColor.WARPED_STEM).sound(SoundType.NETHER_WOOD)); + public static final DeferredBlock REINFORCED_WARPED_SLAB = reinforcedBlock("reinforced_warped_slab", Blocks.WARPED_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NORMAL_STONE_SLAB = BLOCKS.registerBlock("reinforced_normal_stone_slab", p -> new ReinforcedSlabBlock(p, Blocks.STONE_SLAB), prop()); + public static final DeferredBlock REINFORCED_NORMAL_STONE_SLAB = reinforcedBlock("reinforced_normal_stone_slab", Blocks.STONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_STONE_SLAB = BLOCKS.registerBlock("reinforced_stone_slab", p -> new ReinforcedSlabBlock(p, Blocks.SMOOTH_STONE_SLAB), prop()); + public static final DeferredBlock REINFORCED_SMOOTH_STONE_SLAB = reinforcedBlock("reinforced_stone_slab", Blocks.SMOOTH_STONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SANDSTONE_SLAB = BLOCKS.registerBlock("reinforced_sandstone_slab", p -> new ReinforcedSlabBlock(p, Blocks.SANDSTONE_SLAB), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_SANDSTONE_SLAB = reinforcedBlock("reinforced_sandstone_slab", Blocks.SANDSTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CUT_SANDSTONE_SLAB = BLOCKS.registerBlock("reinforced_cut_sandstone_slab", p -> new ReinforcedSlabBlock(p, Blocks.CUT_SANDSTONE_SLAB), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_CUT_SANDSTONE_SLAB = reinforcedBlock("reinforced_cut_sandstone_slab", Blocks.CUT_SANDSTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBBLESTONE_SLAB = BLOCKS.registerBlock("reinforced_cobblestone_slab", p -> new ReinforcedSlabBlock(p, Blocks.COBBLESTONE_SLAB), prop()); + public static final DeferredBlock REINFORCED_COBBLESTONE_SLAB = reinforcedBlock("reinforced_cobblestone_slab", Blocks.COBBLESTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BRICK_SLAB = BLOCKS.registerBlock("reinforced_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.BRICK_SLAB), prop(MapColor.COLOR_RED)); + public static final DeferredBlock REINFORCED_BRICK_SLAB = reinforcedBlock("reinforced_brick_slab", Blocks.BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STONE_BRICK_SLAB = BLOCKS.registerBlock("reinforced_stone_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.STONE_BRICK_SLAB), prop()); + public static final DeferredBlock REINFORCED_STONE_BRICK_SLAB = reinforcedBlock("reinforced_stone_brick_slab", Blocks.STONE_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MUD_BRICK_SLAB = BLOCKS.registerBlock("reinforced_mud_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.MUD_BRICK_SLAB), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.MUD_BRICKS)); + public static final DeferredBlock REINFORCED_MUD_BRICK_SLAB = reinforcedBlock("reinforced_mud_brick_slab", Blocks.MUD_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NETHER_BRICK_SLAB = BLOCKS.registerBlock("reinforced_nether_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.NETHER_BRICK_SLAB), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_NETHER_BRICK_SLAB = reinforcedBlock("reinforced_nether_brick_slab", Blocks.NETHER_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_QUARTZ_SLAB = BLOCKS.registerBlock("reinforced_quartz_slab", p -> new ReinforcedSlabBlock(p, Blocks.QUARTZ_SLAB), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_QUARTZ_SLAB = reinforcedBlock("reinforced_quartz_slab", Blocks.QUARTZ_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_SANDSTONE_SLAB = BLOCKS.registerBlock("reinforced_red_sandstone_slab", p -> new ReinforcedSlabBlock(p, Blocks.RED_SANDSTONE_SLAB), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_RED_SANDSTONE_SLAB = reinforcedBlock("reinforced_red_sandstone_slab", Blocks.RED_SANDSTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CUT_RED_SANDSTONE_SLAB = BLOCKS.registerBlock("reinforced_cut_red_sandstone_slab", p -> new ReinforcedSlabBlock(p, Blocks.CUT_RED_SANDSTONE_SLAB), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_CUT_RED_SANDSTONE_SLAB = reinforcedBlock("reinforced_cut_red_sandstone_slab", Blocks.CUT_RED_SANDSTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPUR_SLAB = BLOCKS.registerBlock("reinforced_purpur_slab", p -> new ReinforcedSlabBlock(p, Blocks.PURPUR_SLAB), prop(MapColor.COLOR_MAGENTA)); + public static final DeferredBlock REINFORCED_PURPUR_SLAB = reinforcedBlock("reinforced_purpur_slab", Blocks.PURPUR_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PRISMARINE_SLAB = BLOCKS.registerBlock("reinforced_prismarine_slab", p -> new ReinforcedSlabBlock(p, Blocks.PRISMARINE_SLAB), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_PRISMARINE_SLAB = reinforcedBlock("reinforced_prismarine_slab", Blocks.PRISMARINE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PRISMARINE_BRICK_SLAB = BLOCKS.registerBlock("reinforced_prismarine_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.PRISMARINE_BRICK_SLAB), prop(MapColor.DIAMOND)); + public static final DeferredBlock REINFORCED_PRISMARINE_BRICK_SLAB = reinforcedBlock("reinforced_prismarine_brick_slab", Blocks.PRISMARINE_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_PRISMARINE_SLAB = BLOCKS.registerBlock("reinforced_dark_prismarine_slab", p -> new ReinforcedSlabBlock(p, Blocks.DARK_PRISMARINE_SLAB), prop(MapColor.DIAMOND)); + public static final DeferredBlock REINFORCED_DARK_PRISMARINE_SLAB = reinforcedBlock("reinforced_dark_prismarine_slab", Blocks.DARK_PRISMARINE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_QUARTZ = BLOCKS.registerBlock("reinforced_smooth_quartz", p -> new BaseReinforcedBlock(p, Blocks.SMOOTH_QUARTZ), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_SMOOTH_QUARTZ = reinforcedBlock("reinforced_smooth_quartz", Blocks.SMOOTH_QUARTZ); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_RED_SANDSTONE = BLOCKS.registerBlock("reinforced_smooth_red_sandstone", p -> new BaseReinforcedBlock(p, Blocks.SMOOTH_RED_SANDSTONE), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_SMOOTH_RED_SANDSTONE = reinforcedBlock("reinforced_smooth_red_sandstone", Blocks.SMOOTH_RED_SANDSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_SANDSTONE = BLOCKS.registerBlock("reinforced_smooth_sandstone", p -> new BaseReinforcedBlock(p, Blocks.SMOOTH_SANDSTONE), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_SMOOTH_SANDSTONE = reinforcedBlock("reinforced_smooth_sandstone", Blocks.SMOOTH_SANDSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_STONE = BLOCKS.registerBlock("reinforced_smooth_stone", p -> new BaseReinforcedBlock(p, Blocks.SMOOTH_STONE), prop()); + public static final DeferredBlock REINFORCED_SMOOTH_STONE = reinforcedBlock("reinforced_smooth_stone", Blocks.SMOOTH_STONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BRICKS = BLOCKS.registerBlock("reinforced_bricks", p -> new BaseReinforcedBlock(p, Blocks.BRICKS), prop(MapColor.COLOR_RED)); + public static final DeferredBlock REINFORCED_BRICKS = reinforcedBlock("reinforced_bricks", Blocks.BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BOOKSHELF = BLOCKS.registerBlock("reinforced_bookshelf", p -> new BaseReinforcedBlock(p, Blocks.BOOKSHELF), prop(MapColor.WOOD).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_BOOKSHELF = reinforcedBlock("reinforced_bookshelf", Blocks.BOOKSHELF); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSSY_COBBLESTONE = BLOCKS.registerBlock("reinforced_mossy_cobblestone", p -> new BaseReinforcedBlock(p, Blocks.MOSSY_COBBLESTONE), prop()); + public static final DeferredBlock REINFORCED_MOSSY_COBBLESTONE = reinforcedBlock("reinforced_mossy_cobblestone", Blocks.MOSSY_COBBLESTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OBSIDIAN = BLOCKS.registerBlock("reinforced_obsidian", p -> new ReinforcedObsidianBlock(p, Blocks.OBSIDIAN), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_OBSIDIAN = reinforcedBlock("reinforced_obsidian", Blocks.OBSIDIAN, ReinforcedObsidianBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPUR_BLOCK = BLOCKS.registerBlock("reinforced_purpur_block", p -> new BaseReinforcedBlock(p, Blocks.PURPUR_BLOCK), prop(MapColor.COLOR_MAGENTA)); + public static final DeferredBlock REINFORCED_PURPUR_BLOCK = reinforcedBlock("reinforced_purpur_block", Blocks.PURPUR_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPUR_PILLAR = BLOCKS.registerBlock("reinforced_purpur_pillar", p -> new ReinforcedRotatedPillarBlock(p, Blocks.PURPUR_PILLAR), prop(MapColor.COLOR_MAGENTA)); + public static final DeferredBlock REINFORCED_PURPUR_PILLAR = reinforcedBlock("reinforced_purpur_pillar", Blocks.PURPUR_PILLAR, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPUR_STAIRS = BLOCKS.registerBlock("reinforced_purpur_stairs", p -> new ReinforcedStairsBlock(p, Blocks.PURPUR_STAIRS), prop(MapColor.COLOR_MAGENTA)); + public static final DeferredBlock REINFORCED_PURPUR_STAIRS = reinforcedBlock("reinforced_purpur_stairs", Blocks.PURPUR_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OAK_STAIRS = BLOCKS.registerBlock("reinforced_oak_stairs", p -> new ReinforcedStairsBlock(p, Blocks.OAK_STAIRS), prop(MapColor.WOOD).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_OAK_STAIRS = reinforcedBlock("reinforced_oak_stairs", Blocks.OAK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBBLESTONE_STAIRS = BLOCKS.registerBlock("reinforced_cobblestone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.COBBLESTONE_STAIRS), prop()); + public static final DeferredBlock REINFORCED_COBBLESTONE_STAIRS = reinforcedBlock("reinforced_cobblestone_stairs", Blocks.COBBLESTONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ICE = BLOCKS.registerBlock("reinforced_ice", p -> new BaseReinforcedBlock(p, Blocks.ICE), prop(MapColor.ICE).friction(0.98F).sound(SoundType.GLASS).noOcclusion().isRedstoneConductor(SCContent::never).isValidSpawn((state, level, pos, type) -> type == EntityType.POLAR_BEAR)); + public static final DeferredBlock REINFORCED_ICE = reinforcedBlock("reinforced_ice", Blocks.ICE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SNOW_BLOCK = BLOCKS.registerBlock("reinforced_snow_block", p -> new BaseReinforcedBlock(p, Blocks.SNOW_BLOCK), prop(MapColor.SNOW).sound(SoundType.SNOW)); + public static final DeferredBlock REINFORCED_SNOW_BLOCK = reinforcedBlock("reinforced_snow_block", Blocks.SNOW_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CLAY = BLOCKS.registerBlock("reinforced_clay", p -> new BaseReinforcedBlock(p, Blocks.CLAY), prop(MapColor.CLAY).sound(SoundType.GRAVEL)); + public static final DeferredBlock REINFORCED_CLAY = reinforcedBlock("reinforced_clay", Blocks.CLAY); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NETHERRACK = BLOCKS.registerBlock("reinforced_netherrack", p -> new BaseReinforcedBlock(p, Blocks.NETHERRACK), prop(MapColor.NETHER).sound(SoundType.NETHERRACK)); + public static final DeferredBlock REINFORCED_NETHERRACK = reinforcedBlock("reinforced_netherrack", Blocks.NETHERRACK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SOUL_SAND = BLOCKS.registerBlock("reinforced_soul_sand", p -> new ReinforcedSoulSandBlock(p, Blocks.SOUL_SAND), reinforcedCopy(Blocks.SOUL_SAND)); + public static final DeferredBlock REINFORCED_SOUL_SAND = reinforcedBlock("reinforced_soul_sand", Blocks.SOUL_SAND, ReinforcedSoulSandBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SOUL_SOIL = BLOCKS.registerBlock("reinforced_soul_soil", p -> new BaseReinforcedBlock(p, Blocks.SOUL_SOIL), prop(MapColor.COLOR_BROWN).sound(SoundType.SOUL_SOIL)); + public static final DeferredBlock REINFORCED_SOUL_SOIL = reinforcedBlock("reinforced_soul_soil", Blocks.SOUL_SOIL); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BASALT = BLOCKS.registerBlock("reinforced_basalt", p -> new ReinforcedRotatedPillarBlock(p, Blocks.BASALT), prop(MapColor.COLOR_BLACK).sound(SoundType.BASALT)); + public static final DeferredBlock REINFORCED_BASALT = reinforcedBlock("reinforced_basalt", Blocks.BASALT, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BASALT = BLOCKS.registerBlock("reinforced_polished_basalt", p -> new ReinforcedRotatedPillarBlock(p, Blocks.POLISHED_BASALT), prop(MapColor.COLOR_BLACK).sound(SoundType.BASALT)); + public static final DeferredBlock REINFORCED_POLISHED_BASALT = reinforcedBlock("reinforced_polished_basalt", Blocks.POLISHED_BASALT, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_BASALT = BLOCKS.registerBlock("reinforced_smooth_basalt", p -> new BaseReinforcedBlock(p, Blocks.SMOOTH_BASALT), prop(MapColor.COLOR_BLACK).sound(SoundType.BASALT)); + public static final DeferredBlock REINFORCED_SMOOTH_BASALT = reinforcedBlock("reinforced_smooth_basalt", Blocks.SMOOTH_BASALT); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GLOWSTONE = BLOCKS.registerBlock("reinforced_glowstone", p -> new BaseReinforcedBlock(p, Blocks.GLOWSTONE), prop(MapColor.SAND).sound(SoundType.GLASS).lightLevel(state -> 15).isRedstoneConductor(SCContent::never)); + public static final DeferredBlock REINFORCED_GLOWSTONE = reinforcedBlock("reinforced_glowstone", Blocks.GLOWSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STONE_BRICKS = BLOCKS.registerBlock("reinforced_stone_bricks", p -> new BaseReinforcedBlock(p, Blocks.STONE_BRICKS), prop()); + public static final DeferredBlock REINFORCED_STONE_BRICKS = reinforcedBlock("reinforced_stone_bricks", Blocks.STONE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSSY_STONE_BRICKS = BLOCKS.registerBlock("reinforced_mossy_stone_bricks", p -> new BaseReinforcedBlock(p, Blocks.MOSSY_STONE_BRICKS), prop()); + public static final DeferredBlock REINFORCED_MOSSY_STONE_BRICKS = reinforcedBlock("reinforced_mossy_stone_bricks", Blocks.MOSSY_STONE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRACKED_STONE_BRICKS = BLOCKS.registerBlock("reinforced_cracked_stone_bricks", p -> new BaseReinforcedBlock(p, Blocks.CRACKED_STONE_BRICKS), prop()); + public static final DeferredBlock REINFORCED_CRACKED_STONE_BRICKS = reinforcedBlock("reinforced_cracked_stone_bricks", Blocks.CRACKED_STONE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_STONE_BRICKS = BLOCKS.registerBlock("reinforced_chiseled_stone_bricks", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_STONE_BRICKS), prop()); + public static final DeferredBlock REINFORCED_CHISELED_STONE_BRICKS = reinforcedBlock("reinforced_chiseled_stone_bricks", Blocks.CHISELED_STONE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PACKED_MUD = BLOCKS.registerBlock("reinforced_packed_mud", p -> new BaseReinforcedBlock(p, Blocks.PACKED_MUD), prop(MapColor.DIRT).sound(SoundType.PACKED_MUD)); + public static final DeferredBlock REINFORCED_PACKED_MUD = reinforcedBlock("reinforced_packed_mud", Blocks.PACKED_MUD); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MUD_BRICKS = BLOCKS.registerBlock("reinforced_mud_bricks", p -> new BaseReinforcedBlock(p, Blocks.MUD_BRICKS), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.MUD_BRICKS)); + public static final DeferredBlock REINFORCED_MUD_BRICKS = reinforcedBlock("reinforced_mud_bricks", Blocks.MUD_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE_BRICKS = BLOCKS.registerBlock("reinforced_deepslate_bricks", p -> new BaseReinforcedBlock(p, Blocks.DEEPSLATE_BRICKS), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_BRICKS)); + public static final DeferredBlock REINFORCED_DEEPSLATE_BRICKS = reinforcedBlock("reinforced_deepslate_bricks", Blocks.DEEPSLATE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRACKED_DEEPSLATE_BRICKS = BLOCKS.registerBlock("reinforced_cracked_deepslate_bricks", p -> new BaseReinforcedBlock(p, Blocks.CRACKED_DEEPSLATE_BRICKS), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_BRICKS)); + public static final DeferredBlock REINFORCED_CRACKED_DEEPSLATE_BRICKS = reinforcedBlock("reinforced_cracked_deepslate_bricks", Blocks.CRACKED_DEEPSLATE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE_TILES = BLOCKS.registerBlock("reinforced_deepslate_tiles", p -> new BaseReinforcedBlock(p, Blocks.DEEPSLATE_TILES), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_TILES)); + public static final DeferredBlock REINFORCED_DEEPSLATE_TILES = reinforcedBlock("reinforced_deepslate_tiles", Blocks.DEEPSLATE_TILES); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRACKED_DEEPSLATE_TILES = BLOCKS.registerBlock("reinforced_cracked_deepslate_tiles", p -> new BaseReinforcedBlock(p, Blocks.CRACKED_DEEPSLATE_TILES), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_TILES)); + public static final DeferredBlock REINFORCED_CRACKED_DEEPSLATE_TILES = reinforcedBlock("reinforced_cracked_deepslate_tiles", Blocks.CRACKED_DEEPSLATE_TILES); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_DEEPSLATE = BLOCKS.registerBlock("reinforced_chiseled_deepslate", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_DEEPSLATE), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_BRICKS)); + public static final DeferredBlock REINFORCED_CHISELED_DEEPSLATE = reinforcedBlock("reinforced_chiseled_deepslate", Blocks.CHISELED_DEEPSLATE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.BRICK_STAIRS), prop(MapColor.COLOR_RED)); + public static final DeferredBlock REINFORCED_BRICK_STAIRS = reinforcedBlock("reinforced_brick_stairs", Blocks.BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STONE_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_stone_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.STONE_BRICK_STAIRS), prop()); + public static final DeferredBlock REINFORCED_STONE_BRICK_STAIRS = reinforcedBlock("reinforced_stone_brick_stairs", Blocks.STONE_BRICK_STAIRS, ReinforcedStairsBlock::new); @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MUD_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_mud_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.MUD_BRICK_STAIRS), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.MUD_BRICKS)); + public static final DeferredBlock REINFORCED_MUD_BRICK_STAIRS = reinforcedBlock("reinforced_mud_brick_stairs", Blocks.MUD_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MYCELIUM = BLOCKS.registerBlock("reinforced_mycelium", p -> new ReinforcedSnowyDirtBlock(p, Blocks.MYCELIUM), prop(MapColor.COLOR_PURPLE).sound(SoundType.GRASS)); + public static final DeferredBlock REINFORCED_MYCELIUM = reinforcedBlock("reinforced_mycelium", Blocks.MYCELIUM, ReinforcedSnowyDirtBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NETHER_BRICKS = BLOCKS.registerBlock("reinforced_nether_bricks", p -> new BaseReinforcedBlock(p, Blocks.NETHER_BRICKS), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_NETHER_BRICKS = reinforcedBlock("reinforced_nether_bricks", Blocks.NETHER_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRACKED_NETHER_BRICKS = BLOCKS.registerBlock("reinforced_cracked_nether_bricks", p -> new BaseReinforcedBlock(p, Blocks.CRACKED_NETHER_BRICKS), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_CRACKED_NETHER_BRICKS = reinforcedBlock("reinforced_cracked_nether_bricks", Blocks.CRACKED_NETHER_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_NETHER_BRICKS = BLOCKS.registerBlock("reinforced_chiseled_nether_bricks", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_NETHER_BRICKS), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_CHISELED_NETHER_BRICKS = reinforcedBlock("reinforced_chiseled_nether_bricks", Blocks.CHISELED_NETHER_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NETHER_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_nether_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.NETHER_BRICK_STAIRS), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_NETHER_BRICK_STAIRS = reinforcedBlock("reinforced_nether_brick_stairs", Blocks.NETHER_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_END_STONE = BLOCKS.registerBlock("reinforced_end_stone", p -> new BaseReinforcedBlock(p, Blocks.END_STONE), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_END_STONE = reinforcedBlock("reinforced_end_stone", Blocks.END_STONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_END_STONE_BRICKS = BLOCKS.registerBlock("reinforced_end_stone_bricks", p -> new BaseReinforcedBlock(p, Blocks.END_STONE_BRICKS), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_END_STONE_BRICKS = reinforcedBlock("reinforced_end_stone_bricks", Blocks.END_STONE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SANDSTONE_STAIRS = BLOCKS.registerBlock("reinforced_sandstone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.SANDSTONE_STAIRS), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_SANDSTONE_STAIRS = reinforcedBlock("reinforced_sandstone_stairs", Blocks.SANDSTONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_EMERALD_BLOCK = BLOCKS.registerBlock("reinforced_emerald_block", p -> new BaseReinforcedBlock(p, Blocks.EMERALD_BLOCK), prop(MapColor.EMERALD).sound(SoundType.METAL)); + public static final DeferredBlock REINFORCED_EMERALD_BLOCK = reinforcedBlock("reinforced_emerald_block", Blocks.EMERALD_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SPRUCE_STAIRS = BLOCKS.registerBlock("reinforced_spruce_stairs", p -> new ReinforcedStairsBlock(p, Blocks.SPRUCE_STAIRS), prop(MapColor.PODZOL).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_SPRUCE_STAIRS = reinforcedBlock("reinforced_spruce_stairs", Blocks.SPRUCE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BIRCH_STAIRS = BLOCKS.registerBlock("reinforced_birch_stairs", p -> new ReinforcedStairsBlock(p, Blocks.BIRCH_STAIRS), prop(MapColor.SAND).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_BIRCH_STAIRS = reinforcedBlock("reinforced_birch_stairs", Blocks.BIRCH_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_JUNGLE_STAIRS = BLOCKS.registerBlock("reinforced_jungle_stairs", p -> new ReinforcedStairsBlock(p, Blocks.JUNGLE_STAIRS), prop(MapColor.DIRT).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_JUNGLE_STAIRS = reinforcedBlock("reinforced_jungle_stairs", Blocks.JUNGLE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRIMSON_STAIRS = BLOCKS.registerBlock("reinforced_crimson_stairs", p -> new ReinforcedStairsBlock(p, Blocks.CRIMSON_STAIRS), prop(MapColor.CRIMSON_STEM).sound(SoundType.NETHER_WOOD)); + public static final DeferredBlock REINFORCED_CRIMSON_STAIRS = reinforcedBlock("reinforced_crimson_stairs", Blocks.CRIMSON_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WARPED_STAIRS = BLOCKS.registerBlock("reinforced_warped_stairs", p -> new ReinforcedStairsBlock(p, Blocks.WARPED_STAIRS), prop(MapColor.WARPED_STEM).sound(SoundType.NETHER_WOOD)); + public static final DeferredBlock REINFORCED_WARPED_STAIRS = reinforcedBlock("reinforced_warped_stairs", Blocks.WARPED_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_QUARTZ = BLOCKS.registerBlock("reinforced_chiseled_quartz_block", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_QUARTZ_BLOCK), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_CHISELED_QUARTZ = reinforcedBlock("reinforced_chiseled_quartz_block", Blocks.CHISELED_QUARTZ_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_QUARTZ_BLOCK = BLOCKS.registerBlock("reinforced_quartz_block", p -> new BaseReinforcedBlock(p, Blocks.QUARTZ_BLOCK), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_QUARTZ_BLOCK = reinforcedBlock("reinforced_quartz_block", Blocks.QUARTZ_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_QUARTZ_BRICKS = BLOCKS.registerBlock("reinforced_quartz_bricks", p -> new BaseReinforcedBlock(p, Blocks.QUARTZ_BRICKS), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_QUARTZ_BRICKS = reinforcedBlock("reinforced_quartz_bricks", Blocks.QUARTZ_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_QUARTZ_PILLAR = BLOCKS.registerBlock("reinforced_quartz_pillar", p -> new ReinforcedRotatedPillarBlock(p, Blocks.QUARTZ_PILLAR), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_QUARTZ_PILLAR = reinforcedBlock("reinforced_quartz_pillar", Blocks.QUARTZ_PILLAR, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_QUARTZ_STAIRS = BLOCKS.registerBlock("reinforced_quartz_stairs", p -> new ReinforcedStairsBlock(p, Blocks.QUARTZ_STAIRS), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_QUARTZ_STAIRS = reinforcedBlock("reinforced_quartz_stairs", Blocks.QUARTZ_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WHITE_TERRACOTTA = BLOCKS.registerBlock("reinforced_white_terracotta", p -> new BaseReinforcedBlock(p, Blocks.WHITE_TERRACOTTA), prop(MapColor.TERRACOTTA_WHITE)); + public static final DeferredBlock REINFORCED_WHITE_TERRACOTTA = reinforcedBlock("reinforced_white_terracotta", Blocks.WHITE_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ORANGE_TERRACOTTA = BLOCKS.registerBlock("reinforced_orange_terracotta", p -> new BaseReinforcedBlock(p, Blocks.ORANGE_TERRACOTTA), prop(MapColor.TERRACOTTA_ORANGE)); + public static final DeferredBlock REINFORCED_ORANGE_TERRACOTTA = reinforcedBlock("reinforced_orange_terracotta", Blocks.ORANGE_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MAGENTA_TERRACOTTA = BLOCKS.registerBlock("reinforced_magenta_terracotta", p -> new BaseReinforcedBlock(p, Blocks.MAGENTA_TERRACOTTA), prop(MapColor.TERRACOTTA_MAGENTA)); + public static final DeferredBlock REINFORCED_MAGENTA_TERRACOTTA = reinforcedBlock("reinforced_magenta_terracotta", Blocks.MAGENTA_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_BLUE_TERRACOTTA = BLOCKS.registerBlock("reinforced_light_blue_terracotta", p -> new BaseReinforcedBlock(p, Blocks.LIGHT_BLUE_TERRACOTTA), prop(MapColor.TERRACOTTA_LIGHT_BLUE)); + public static final DeferredBlock REINFORCED_LIGHT_BLUE_TERRACOTTA = reinforcedBlock("reinforced_light_blue_terracotta", Blocks.LIGHT_BLUE_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_YELLOW_TERRACOTTA = BLOCKS.registerBlock("reinforced_yellow_terracotta", p -> new BaseReinforcedBlock(p, Blocks.YELLOW_TERRACOTTA), prop(MapColor.TERRACOTTA_YELLOW)); + public static final DeferredBlock REINFORCED_YELLOW_TERRACOTTA = reinforcedBlock("reinforced_yellow_terracotta", Blocks.YELLOW_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIME_TERRACOTTA = BLOCKS.registerBlock("reinforced_lime_terracotta", p -> new BaseReinforcedBlock(p, Blocks.LIME_TERRACOTTA), prop(MapColor.TERRACOTTA_LIGHT_GREEN)); + public static final DeferredBlock REINFORCED_LIME_TERRACOTTA = reinforcedBlock("reinforced_lime_terracotta", Blocks.LIME_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PINK_TERRACOTTA = BLOCKS.registerBlock("reinforced_pink_terracotta", p -> new BaseReinforcedBlock(p, Blocks.PINK_TERRACOTTA), prop(MapColor.TERRACOTTA_PINK)); + public static final DeferredBlock REINFORCED_PINK_TERRACOTTA = reinforcedBlock("reinforced_pink_terracotta", Blocks.PINK_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRAY_TERRACOTTA = BLOCKS.registerBlock("reinforced_gray_terracotta", p -> new BaseReinforcedBlock(p, Blocks.GRAY_TERRACOTTA), prop(MapColor.TERRACOTTA_GRAY)); + public static final DeferredBlock REINFORCED_GRAY_TERRACOTTA = reinforcedBlock("reinforced_gray_terracotta", Blocks.GRAY_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_GRAY_TERRACOTTA = BLOCKS.registerBlock("reinforced_light_gray_terracotta", p -> new BaseReinforcedBlock(p, Blocks.LIGHT_GRAY_TERRACOTTA), prop(MapColor.TERRACOTTA_LIGHT_GRAY)); + public static final DeferredBlock REINFORCED_LIGHT_GRAY_TERRACOTTA = reinforcedBlock("reinforced_light_gray_terracotta", Blocks.LIGHT_GRAY_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CYAN_TERRACOTTA = BLOCKS.registerBlock("reinforced_cyan_terracotta", p -> new BaseReinforcedBlock(p, Blocks.CYAN_TERRACOTTA), prop(MapColor.TERRACOTTA_CYAN)); + public static final DeferredBlock REINFORCED_CYAN_TERRACOTTA = reinforcedBlock("reinforced_cyan_terracotta", Blocks.CYAN_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPLE_TERRACOTTA = BLOCKS.registerBlock("reinforced_purple_terracotta", p -> new BaseReinforcedBlock(p, Blocks.PURPLE_TERRACOTTA), prop(MapColor.TERRACOTTA_PURPLE)); + public static final DeferredBlock REINFORCED_PURPLE_TERRACOTTA = reinforcedBlock("reinforced_purple_terracotta", Blocks.PURPLE_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLUE_TERRACOTTA = BLOCKS.registerBlock("reinforced_blue_terracotta", p -> new BaseReinforcedBlock(p, Blocks.BLUE_TERRACOTTA), prop(MapColor.TERRACOTTA_BLUE)); + public static final DeferredBlock REINFORCED_BLUE_TERRACOTTA = reinforcedBlock("reinforced_blue_terracotta", Blocks.BLUE_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BROWN_TERRACOTTA = BLOCKS.registerBlock("reinforced_brown_terracotta", p -> new BaseReinforcedBlock(p, Blocks.BROWN_TERRACOTTA), prop(MapColor.TERRACOTTA_BROWN)); + public static final DeferredBlock REINFORCED_BROWN_TERRACOTTA = reinforcedBlock("reinforced_brown_terracotta", Blocks.BROWN_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GREEN_TERRACOTTA = BLOCKS.registerBlock("reinforced_green_terracotta", p -> new BaseReinforcedBlock(p, Blocks.GREEN_TERRACOTTA), prop(MapColor.TERRACOTTA_GREEN)); + public static final DeferredBlock REINFORCED_GREEN_TERRACOTTA = reinforcedBlock("reinforced_green_terracotta", Blocks.GREEN_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_TERRACOTTA = BLOCKS.registerBlock("reinforced_red_terracotta", p -> new BaseReinforcedBlock(p, Blocks.RED_TERRACOTTA), prop(MapColor.TERRACOTTA_RED)); + public static final DeferredBlock REINFORCED_RED_TERRACOTTA = reinforcedBlock("reinforced_red_terracotta", Blocks.RED_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACK_TERRACOTTA = BLOCKS.registerBlock("reinforced_black_terracotta", p -> new BaseReinforcedBlock(p, Blocks.BLACK_TERRACOTTA), prop(MapColor.TERRACOTTA_BLACK)); + public static final DeferredBlock REINFORCED_BLACK_TERRACOTTA = reinforcedBlock("reinforced_black_terracotta", Blocks.BLACK_TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TERRACOTTA = BLOCKS.registerBlock("reinforced_hardened_clay", p -> new BaseReinforcedBlock(p, Blocks.TERRACOTTA), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_TERRACOTTA = reinforcedBlock("reinforced_hardened_clay", Blocks.TERRACOTTA); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PACKED_ICE = BLOCKS.registerBlock("reinforced_packed_ice", p -> new BaseReinforcedBlock(p, Blocks.PACKED_ICE), prop(MapColor.ICE).sound(SoundType.GLASS).friction(0.98F)); + public static final DeferredBlock REINFORCED_PACKED_ICE = reinforcedBlock("reinforced_packed_ice", Blocks.PACKED_ICE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ACACIA_STAIRS = BLOCKS.registerBlock("reinforced_acacia_stairs", p -> new ReinforcedStairsBlock(p, Blocks.ACACIA_STAIRS), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_ACACIA_STAIRS = reinforcedBlock("reinforced_acacia_stairs", Blocks.ACACIA_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_OAK_STAIRS = BLOCKS.registerBlock("reinforced_dark_oak_stairs", p -> new ReinforcedStairsBlock(p, Blocks.DARK_OAK_STAIRS), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_DARK_OAK_STAIRS = reinforcedBlock("reinforced_dark_oak_stairs", Blocks.DARK_OAK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MANGROVE_STAIRS = BLOCKS.registerBlock("reinforced_mangrove_stairs", p -> new ReinforcedStairsBlock(p, Blocks.MANGROVE_STAIRS), prop(MapColor.COLOR_RED).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_MANGROVE_STAIRS = reinforcedBlock("reinforced_mangrove_stairs", Blocks.MANGROVE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_WHITE_STAINED_GLASS = BLOCKS.registerBlock("reinforced_white_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.WHITE, Blocks.WHITE_STAINED_GLASS), glassProp(MapColor.SNOW)); + public static final DeferredBlock REINFORCED_WHITE_STAINED_GLASS = reinforcedBlock("reinforced_white_stained_glass", Blocks.WHITE_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_ORANGE_STAINED_GLASS = BLOCKS.registerBlock("reinforced_orange_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.ORANGE, Blocks.ORANGE_STAINED_GLASS), glassProp(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_ORANGE_STAINED_GLASS = reinforcedBlock("reinforced_orange_stained_glass", Blocks.ORANGE_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_MAGENTA_STAINED_GLASS = BLOCKS.registerBlock("reinforced_magenta_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.MAGENTA, Blocks.MAGENTA_STAINED_GLASS), glassProp(MapColor.COLOR_MAGENTA)); + public static final DeferredBlock REINFORCED_MAGENTA_STAINED_GLASS = reinforcedBlock("reinforced_magenta_stained_glass", Blocks.MAGENTA_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_LIGHT_BLUE_STAINED_GLASS = BLOCKS.registerBlock("reinforced_light_blue_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_STAINED_GLASS), glassProp(MapColor.COLOR_LIGHT_BLUE)); + public static final DeferredBlock REINFORCED_LIGHT_BLUE_STAINED_GLASS = reinforcedBlock("reinforced_light_blue_stained_glass", Blocks.LIGHT_BLUE_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_YELLOW_STAINED_GLASS = BLOCKS.registerBlock("reinforced_yellow_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.YELLOW, Blocks.YELLOW_STAINED_GLASS), glassProp(MapColor.COLOR_YELLOW)); + public static final DeferredBlock REINFORCED_YELLOW_STAINED_GLASS = reinforcedBlock("reinforced_yellow_stained_glass", Blocks.YELLOW_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_LIME_STAINED_GLASS = BLOCKS.registerBlock("reinforced_lime_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.LIME, Blocks.LIME_STAINED_GLASS), glassProp(MapColor.COLOR_LIGHT_GREEN)); + public static final DeferredBlock REINFORCED_LIME_STAINED_GLASS = reinforcedBlock("reinforced_lime_stained_glass", Blocks.LIME_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_PINK_STAINED_GLASS = BLOCKS.registerBlock("reinforced_pink_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.PINK, Blocks.PINK_STAINED_GLASS), glassProp(MapColor.COLOR_PINK)); + public static final DeferredBlock REINFORCED_PINK_STAINED_GLASS = reinforcedBlock("reinforced_pink_stained_glass", Blocks.PINK_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_GRAY_STAINED_GLASS = BLOCKS.registerBlock("reinforced_gray_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.GRAY, Blocks.GRAY_STAINED_GLASS), glassProp(MapColor.COLOR_GRAY)); + public static final DeferredBlock REINFORCED_GRAY_STAINED_GLASS = reinforcedBlock("reinforced_gray_stained_glass", Blocks.GRAY_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_LIGHT_GRAY_STAINED_GLASS = BLOCKS.registerBlock("reinforced_light_gray_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_STAINED_GLASS), glassProp(MapColor.COLOR_LIGHT_GRAY)); + public static final DeferredBlock REINFORCED_LIGHT_GRAY_STAINED_GLASS = reinforcedBlock("reinforced_light_gray_stained_glass", Blocks.LIGHT_GRAY_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_CYAN_STAINED_GLASS = BLOCKS.registerBlock("reinforced_cyan_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.CYAN, Blocks.CYAN_STAINED_GLASS), glassProp(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_CYAN_STAINED_GLASS = reinforcedBlock("reinforced_cyan_stained_glass", Blocks.CYAN_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_PURPLE_STAINED_GLASS = BLOCKS.registerBlock("reinforced_purple_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.PURPLE, Blocks.PURPLE_STAINED_GLASS), glassProp(MapColor.COLOR_PURPLE)); + public static final DeferredBlock REINFORCED_PURPLE_STAINED_GLASS = reinforcedBlock("reinforced_purple_stained_glass", Blocks.PURPLE_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_BLUE_STAINED_GLASS = BLOCKS.registerBlock("reinforced_blue_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.BLUE, Blocks.BLUE_STAINED_GLASS), glassProp(MapColor.COLOR_BLUE)); + public static final DeferredBlock REINFORCED_BLUE_STAINED_GLASS = reinforcedBlock("reinforced_blue_stained_glass", Blocks.BLUE_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_BROWN_STAINED_GLASS = BLOCKS.registerBlock("reinforced_brown_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.BROWN, Blocks.BROWN_STAINED_GLASS), glassProp(MapColor.COLOR_BROWN)); + public static final DeferredBlock REINFORCED_BROWN_STAINED_GLASS = reinforcedBlock("reinforced_brown_stained_glass", Blocks.BROWN_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_GREEN_STAINED_GLASS = BLOCKS.registerBlock("reinforced_green_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.GREEN, Blocks.GREEN_STAINED_GLASS), glassProp(MapColor.COLOR_GREEN)); + public static final DeferredBlock REINFORCED_GREEN_STAINED_GLASS = reinforcedBlock("reinforced_green_stained_glass", Blocks.GREEN_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_RED_STAINED_GLASS = BLOCKS.registerBlock("reinforced_red_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.RED, Blocks.RED_STAINED_GLASS), glassProp(MapColor.COLOR_RED)); + public static final DeferredBlock REINFORCED_RED_STAINED_GLASS = reinforcedBlock("reinforced_red_stained_glass", Blocks.RED_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_BLACK_STAINED_GLASS = BLOCKS.registerBlock("reinforced_black_stained_glass", p -> new ReinforcedStainedGlassBlock(p, DyeColor.BLACK, Blocks.BLACK_STAINED_GLASS), glassProp(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_BLACK_STAINED_GLASS = reinforcedBlock("reinforced_black_stained_glass", Blocks.BLACK_STAINED_GLASS, ReinforcedStainedGlassBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PRISMARINE = BLOCKS.registerBlock("reinforced_prismarine", p -> new BaseReinforcedBlock(p, Blocks.PRISMARINE), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_PRISMARINE = reinforcedBlock("reinforced_prismarine", Blocks.PRISMARINE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PRISMARINE_BRICKS = BLOCKS.registerBlock("reinforced_prismarine_bricks", p -> new BaseReinforcedBlock(p, Blocks.PRISMARINE_BRICKS), prop(MapColor.DIAMOND)); + public static final DeferredBlock REINFORCED_PRISMARINE_BRICKS = reinforcedBlock("reinforced_prismarine_bricks", Blocks.PRISMARINE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_PRISMARINE = BLOCKS.registerBlock("reinforced_dark_prismarine", p -> new BaseReinforcedBlock(p, Blocks.DARK_PRISMARINE), prop(MapColor.DIAMOND)); + public static final DeferredBlock REINFORCED_DARK_PRISMARINE = reinforcedBlock("reinforced_dark_prismarine", Blocks.DARK_PRISMARINE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PRISMARINE_STAIRS = BLOCKS.registerBlock("reinforced_prismarine_stairs", p -> new ReinforcedStairsBlock(p, Blocks.PRISMARINE_STAIRS), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_PRISMARINE_STAIRS = reinforcedBlock("reinforced_prismarine_stairs", Blocks.PRISMARINE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PRISMARINE_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_prismarine_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.PRISMARINE_BRICK_STAIRS), prop(MapColor.DIAMOND)); + public static final DeferredBlock REINFORCED_PRISMARINE_BRICK_STAIRS = reinforcedBlock("reinforced_prismarine_brick_stairs", Blocks.PRISMARINE_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_PRISMARINE_STAIRS = BLOCKS.registerBlock("reinforced_dark_prismarine_stairs", p -> new ReinforcedStairsBlock(p, Blocks.DARK_PRISMARINE_STAIRS), prop(MapColor.DIAMOND)); + public static final DeferredBlock REINFORCED_DARK_PRISMARINE_STAIRS = reinforcedBlock("reinforced_dark_prismarine_stairs", Blocks.DARK_PRISMARINE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SEA_LANTERN = BLOCKS.registerBlock("reinforced_sea_lantern", p -> new BaseReinforcedBlock(p, Blocks.SEA_LANTERN), prop(MapColor.QUARTZ).sound(SoundType.GLASS).lightLevel(state -> 15).isRedstoneConductor(SCContent::never)); + public static final DeferredBlock REINFORCED_SEA_LANTERN = reinforcedBlock("reinforced_sea_lantern", Blocks.SEA_LANTERN); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_SANDSTONE = BLOCKS.registerBlock("reinforced_red_sandstone", p -> new BaseReinforcedBlock(p, Blocks.RED_SANDSTONE), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_RED_SANDSTONE = reinforcedBlock("reinforced_red_sandstone", Blocks.RED_SANDSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_RED_SANDSTONE = BLOCKS.registerBlock("reinforced_chiseled_red_sandstone", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_RED_SANDSTONE), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_CHISELED_RED_SANDSTONE = reinforcedBlock("reinforced_chiseled_red_sandstone", Blocks.CHISELED_RED_SANDSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CUT_RED_SANDSTONE = BLOCKS.registerBlock("reinforced_cut_red_sandstone", p -> new BaseReinforcedBlock(p, Blocks.CUT_RED_SANDSTONE), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_CUT_RED_SANDSTONE = reinforcedBlock("reinforced_cut_red_sandstone", Blocks.CUT_RED_SANDSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_SANDSTONE_STAIRS = BLOCKS.registerBlock("reinforced_red_sandstone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.RED_SANDSTONE_STAIRS), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_RED_SANDSTONE_STAIRS = reinforcedBlock("reinforced_red_sandstone_stairs", Blocks.RED_SANDSTONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MAGMA_BLOCK = BLOCKS.registerBlock("reinforced_magma_block", p -> new ReinforcedMagmaBlock(p, Blocks.MAGMA_BLOCK), reinforcedCopy(Blocks.MAGMA_BLOCK)); + public static final DeferredBlock REINFORCED_MAGMA_BLOCK = reinforcedBlock("reinforced_magma_block", Blocks.MAGMA_BLOCK, ReinforcedMagmaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NETHER_WART_BLOCK = BLOCKS.registerBlock("reinforced_nether_wart_block", p -> new BaseReinforcedBlock(p, Blocks.NETHER_WART_BLOCK), prop(MapColor.COLOR_RED).sound(SoundType.WART_BLOCK)); + public static final DeferredBlock REINFORCED_NETHER_WART_BLOCK = reinforcedBlock("reinforced_nether_wart_block", Blocks.NETHER_WART_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WARPED_WART_BLOCK = BLOCKS.registerBlock("reinforced_warped_wart_block", p -> new BaseReinforcedBlock(p, Blocks.WARPED_WART_BLOCK), prop(MapColor.WARPED_WART_BLOCK).sound(SoundType.WART_BLOCK)); + public static final DeferredBlock REINFORCED_WARPED_WART_BLOCK = reinforcedBlock("reinforced_warped_wart_block", Blocks.WARPED_WART_BLOCK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_NETHER_BRICKS = BLOCKS.registerBlock("reinforced_red_nether_bricks", p -> new BaseReinforcedBlock(p, Blocks.RED_NETHER_BRICKS), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_RED_NETHER_BRICKS = reinforcedBlock("reinforced_red_nether_bricks", Blocks.RED_NETHER_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BONE_BLOCK = BLOCKS.registerBlock("reinforced_bone_block", p -> new ReinforcedRotatedPillarBlock(p, Blocks.BONE_BLOCK), prop(MapColor.SAND).sound(SoundType.BONE_BLOCK)); + public static final DeferredBlock REINFORCED_BONE_BLOCK = reinforcedBlock("reinforced_bone_block", Blocks.BONE_BLOCK, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WHITE_CONCRETE = BLOCKS.registerBlock("reinforced_white_concrete", p -> new BaseReinforcedBlock(p, Blocks.WHITE_CONCRETE), prop(MapColor.SNOW)); + public static final DeferredBlock REINFORCED_WHITE_CONCRETE = reinforcedBlock("reinforced_white_concrete", Blocks.WHITE_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ORANGE_CONCRETE = BLOCKS.registerBlock("reinforced_orange_concrete", p -> new BaseReinforcedBlock(p, Blocks.ORANGE_CONCRETE), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_ORANGE_CONCRETE = reinforcedBlock("reinforced_orange_concrete", Blocks.ORANGE_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MAGENTA_CONCRETE = BLOCKS.registerBlock("reinforced_magenta_concrete", p -> new BaseReinforcedBlock(p, Blocks.MAGENTA_CONCRETE), prop(MapColor.COLOR_MAGENTA)); + public static final DeferredBlock REINFORCED_MAGENTA_CONCRETE = reinforcedBlock("reinforced_magenta_concrete", Blocks.MAGENTA_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_BLUE_CONCRETE = BLOCKS.registerBlock("reinforced_light_blue_concrete", p -> new BaseReinforcedBlock(p, Blocks.LIGHT_BLUE_CONCRETE), prop(MapColor.COLOR_LIGHT_BLUE)); + public static final DeferredBlock REINFORCED_LIGHT_BLUE_CONCRETE = reinforcedBlock("reinforced_light_blue_concrete", Blocks.LIGHT_BLUE_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_YELLOW_CONCRETE = BLOCKS.registerBlock("reinforced_yellow_concrete", p -> new BaseReinforcedBlock(p, Blocks.YELLOW_CONCRETE), prop(MapColor.COLOR_YELLOW)); + public static final DeferredBlock REINFORCED_YELLOW_CONCRETE = reinforcedBlock("reinforced_yellow_concrete", Blocks.YELLOW_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIME_CONCRETE = BLOCKS.registerBlock("reinforced_lime_concrete", p -> new BaseReinforcedBlock(p, Blocks.LIME_CONCRETE), prop(MapColor.COLOR_LIGHT_GREEN)); + public static final DeferredBlock REINFORCED_LIME_CONCRETE = reinforcedBlock("reinforced_lime_concrete", Blocks.LIME_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PINK_CONCRETE = BLOCKS.registerBlock("reinforced_pink_concrete", p -> new BaseReinforcedBlock(p, Blocks.PINK_CONCRETE), prop(MapColor.COLOR_PINK)); + public static final DeferredBlock REINFORCED_PINK_CONCRETE = reinforcedBlock("reinforced_pink_concrete", Blocks.PINK_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRAY_CONCRETE = BLOCKS.registerBlock("reinforced_gray_concrete", p -> new BaseReinforcedBlock(p, Blocks.GRAY_CONCRETE), prop(MapColor.COLOR_GRAY)); + public static final DeferredBlock REINFORCED_GRAY_CONCRETE = reinforcedBlock("reinforced_gray_concrete", Blocks.GRAY_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_GRAY_CONCRETE = BLOCKS.registerBlock("reinforced_light_gray_concrete", p -> new BaseReinforcedBlock(p, Blocks.LIGHT_GRAY_CONCRETE), prop(MapColor.COLOR_LIGHT_GRAY)); + public static final DeferredBlock REINFORCED_LIGHT_GRAY_CONCRETE = reinforcedBlock("reinforced_light_gray_concrete", Blocks.LIGHT_GRAY_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CYAN_CONCRETE = BLOCKS.registerBlock("reinforced_cyan_concrete", p -> new BaseReinforcedBlock(p, Blocks.CYAN_CONCRETE), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_CYAN_CONCRETE = reinforcedBlock("reinforced_cyan_concrete", Blocks.CYAN_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPLE_CONCRETE = BLOCKS.registerBlock("reinforced_purple_concrete", p -> new BaseReinforcedBlock(p, Blocks.PURPLE_CONCRETE), prop(MapColor.COLOR_PURPLE)); + public static final DeferredBlock REINFORCED_PURPLE_CONCRETE = reinforcedBlock("reinforced_purple_concrete", Blocks.PURPLE_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLUE_CONCRETE = BLOCKS.registerBlock("reinforced_blue_concrete", p -> new BaseReinforcedBlock(p, Blocks.BLUE_CONCRETE), prop(MapColor.COLOR_BLUE)); + public static final DeferredBlock REINFORCED_BLUE_CONCRETE = reinforcedBlock("reinforced_blue_concrete", Blocks.BLUE_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BROWN_CONCRETE = BLOCKS.registerBlock("reinforced_brown_concrete", p -> new BaseReinforcedBlock(p, Blocks.BROWN_CONCRETE), prop(MapColor.COLOR_BROWN)); + public static final DeferredBlock REINFORCED_BROWN_CONCRETE = reinforcedBlock("reinforced_brown_concrete", Blocks.BROWN_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GREEN_CONCRETE = BLOCKS.registerBlock("reinforced_green_concrete", p -> new BaseReinforcedBlock(p, Blocks.GREEN_CONCRETE), prop(MapColor.COLOR_GREEN)); + public static final DeferredBlock REINFORCED_GREEN_CONCRETE = reinforcedBlock("reinforced_green_concrete", Blocks.GREEN_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_CONCRETE = BLOCKS.registerBlock("reinforced_red_concrete", p -> new BaseReinforcedBlock(p, Blocks.RED_CONCRETE), prop(MapColor.COLOR_RED)); + public static final DeferredBlock REINFORCED_RED_CONCRETE = reinforcedBlock("reinforced_red_concrete", Blocks.RED_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACK_CONCRETE = BLOCKS.registerBlock("reinforced_black_concrete", p -> new BaseReinforcedBlock(p, Blocks.BLACK_CONCRETE), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_BLACK_CONCRETE = reinforcedBlock("reinforced_black_concrete", Blocks.BLACK_CONCRETE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLUE_ICE = BLOCKS.registerBlock("reinforced_blue_ice", p -> new BaseReinforcedBlock(p, Blocks.BLUE_ICE), prop(MapColor.ICE).sound(SoundType.GLASS).friction(0.989F)); + public static final DeferredBlock REINFORCED_BLUE_ICE = reinforcedBlock("reinforced_blue_ice", Blocks.BLUE_ICE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_GRANITE_STAIRS = BLOCKS.registerBlock("reinforced_polished_granite_stairs", p -> new ReinforcedStairsBlock(p, Blocks.POLISHED_GRANITE_STAIRS), prop(MapColor.DIRT)); + public static final DeferredBlock REINFORCED_POLISHED_GRANITE_STAIRS = reinforcedBlock("reinforced_polished_granite_stairs", Blocks.POLISHED_GRANITE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_RED_SANDSTONE_STAIRS = BLOCKS.registerBlock("reinforced_smooth_red_sandstone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.SMOOTH_RED_SANDSTONE_STAIRS), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_SMOOTH_RED_SANDSTONE_STAIRS = reinforcedBlock("reinforced_smooth_red_sandstone_stairs", Blocks.SMOOTH_RED_SANDSTONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSSY_STONE_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_mossy_stone_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.MOSSY_STONE_BRICK_STAIRS), prop()); + public static final DeferredBlock REINFORCED_MOSSY_STONE_BRICK_STAIRS = reinforcedBlock("reinforced_mossy_stone_brick_stairs", Blocks.MOSSY_STONE_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_DIORITE_STAIRS = BLOCKS.registerBlock("reinforced_polished_diorite_stairs", p -> new ReinforcedStairsBlock(p, Blocks.POLISHED_DIORITE_STAIRS), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_POLISHED_DIORITE_STAIRS = reinforcedBlock("reinforced_polished_diorite_stairs", Blocks.POLISHED_DIORITE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSSY_COBBLESTONE_STAIRS = BLOCKS.registerBlock("reinforced_mossy_cobblestone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.MOSSY_COBBLESTONE_STAIRS), prop()); + public static final DeferredBlock REINFORCED_MOSSY_COBBLESTONE_STAIRS = reinforcedBlock("reinforced_mossy_cobblestone_stairs", Blocks.MOSSY_COBBLESTONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_END_STONE_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_end_stone_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.END_STONE_BRICK_STAIRS), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_END_STONE_BRICK_STAIRS = reinforcedBlock("reinforced_end_stone_brick_stairs", Blocks.END_STONE_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STONE_STAIRS = BLOCKS.registerBlock("reinforced_stone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.STONE_STAIRS), prop()); + public static final DeferredBlock REINFORCED_STONE_STAIRS = reinforcedBlock("reinforced_stone_stairs", Blocks.STONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_SANDSTONE_STAIRS = BLOCKS.registerBlock("reinforced_smooth_sandstone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.SMOOTH_SANDSTONE_STAIRS), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_SMOOTH_SANDSTONE_STAIRS = reinforcedBlock("reinforced_smooth_sandstone_stairs", Blocks.SMOOTH_SANDSTONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_QUARTZ_STAIRS = BLOCKS.registerBlock("reinforced_smooth_quartz_stairs", p -> new ReinforcedStairsBlock(p, Blocks.SMOOTH_QUARTZ_STAIRS), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_SMOOTH_QUARTZ_STAIRS = reinforcedBlock("reinforced_smooth_quartz_stairs", Blocks.SMOOTH_QUARTZ_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRANITE_STAIRS = BLOCKS.registerBlock("reinforced_granite_stairs", p -> new ReinforcedStairsBlock(p, Blocks.GRANITE_STAIRS), prop(MapColor.DIRT)); + public static final DeferredBlock REINFORCED_GRANITE_STAIRS = reinforcedBlock("reinforced_granite_stairs", Blocks.GRANITE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ANDESITE_STAIRS = BLOCKS.registerBlock("reinforced_andesite_stairs", p -> new ReinforcedStairsBlock(p, Blocks.ANDESITE_STAIRS), prop()); + public static final DeferredBlock REINFORCED_ANDESITE_STAIRS = reinforcedBlock("reinforced_andesite_stairs", Blocks.ANDESITE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_NETHER_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_red_nether_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.RED_NETHER_BRICK_STAIRS), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_RED_NETHER_BRICK_STAIRS = reinforcedBlock("reinforced_red_nether_brick_stairs", Blocks.RED_NETHER_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_ANDESITE_STAIRS = BLOCKS.registerBlock("reinforced_polished_andesite_stairs", p -> new ReinforcedStairsBlock(p, Blocks.POLISHED_ANDESITE_STAIRS), prop()); + public static final DeferredBlock REINFORCED_POLISHED_ANDESITE_STAIRS = reinforcedBlock("reinforced_polished_andesite_stairs", Blocks.POLISHED_ANDESITE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DIORITE_STAIRS = BLOCKS.registerBlock("reinforced_diorite_stairs", p -> new ReinforcedStairsBlock(p, Blocks.DIORITE_STAIRS), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_DIORITE_STAIRS = reinforcedBlock("reinforced_diorite_stairs", Blocks.DIORITE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBBLED_DEEPSLATE_STAIRS = BLOCKS.registerBlock("reinforced_cobbled_deepslate_stairs", p -> new ReinforcedStairsBlock(p, Blocks.COBBLED_DEEPSLATE_STAIRS), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE)); + public static final DeferredBlock REINFORCED_COBBLED_DEEPSLATE_STAIRS = reinforcedBlock("reinforced_cobbled_deepslate_stairs", Blocks.COBBLED_DEEPSLATE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_DEEPSLATE_STAIRS = BLOCKS.registerBlock("reinforced_polished_deepslate_stairs", p -> new ReinforcedStairsBlock(p, Blocks.POLISHED_DEEPSLATE_STAIRS), prop(MapColor.DEEPSLATE).sound(SoundType.POLISHED_DEEPSLATE)); + public static final DeferredBlock REINFORCED_POLISHED_DEEPSLATE_STAIRS = reinforcedBlock("reinforced_polished_deepslate_stairs", Blocks.POLISHED_DEEPSLATE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_deepslate_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.DEEPSLATE_BRICK_STAIRS), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_BRICKS)); + public static final DeferredBlock REINFORCED_DEEPSLATE_BRICK_STAIRS = reinforcedBlock("reinforced_deepslate_brick_stairs", Blocks.DEEPSLATE_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE_TILE_STAIRS = BLOCKS.registerBlock("reinforced_deepslate_tile_stairs", p -> new ReinforcedStairsBlock(p, Blocks.DEEPSLATE_TILE_STAIRS), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_TILES)); + public static final DeferredBlock REINFORCED_DEEPSLATE_TILE_STAIRS = reinforcedBlock("reinforced_deepslate_tile_stairs", Blocks.DEEPSLATE_TILE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_GRANITE_SLAB = BLOCKS.registerBlock("reinforced_polished_granite_slab", p -> new ReinforcedSlabBlock(p, Blocks.POLISHED_GRANITE_SLAB), prop(MapColor.DIRT)); + public static final DeferredBlock REINFORCED_POLISHED_GRANITE_SLAB = reinforcedBlock("reinforced_polished_granite_slab", Blocks.POLISHED_GRANITE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_RED_SANDSTONE_SLAB = BLOCKS.registerBlock("reinforced_smooth_red_sandstone_slab", p -> new ReinforcedSlabBlock(p, Blocks.SMOOTH_RED_SANDSTONE_SLAB), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_SMOOTH_RED_SANDSTONE_SLAB = reinforcedBlock("reinforced_smooth_red_sandstone_slab", Blocks.SMOOTH_RED_SANDSTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSSY_STONE_BRICK_SLAB = BLOCKS.registerBlock("reinforced_mossy_stone_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.MOSSY_STONE_BRICK_SLAB), prop()); + public static final DeferredBlock REINFORCED_MOSSY_STONE_BRICK_SLAB = reinforcedBlock("reinforced_mossy_stone_brick_slab", Blocks.MOSSY_STONE_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_DIORITE_SLAB = BLOCKS.registerBlock("reinforced_polished_diorite_slab", p -> new ReinforcedSlabBlock(p, Blocks.POLISHED_DIORITE_SLAB), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_POLISHED_DIORITE_SLAB = reinforcedBlock("reinforced_polished_diorite_slab", Blocks.POLISHED_DIORITE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSSY_COBBLESTONE_SLAB = BLOCKS.registerBlock("reinforced_mossy_cobblestone_slab", p -> new ReinforcedSlabBlock(p, Blocks.MOSSY_COBBLESTONE_SLAB), prop()); + public static final DeferredBlock REINFORCED_MOSSY_COBBLESTONE_SLAB = reinforcedBlock("reinforced_mossy_cobblestone_slab", Blocks.MOSSY_COBBLESTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_END_STONE_BRICK_SLAB = BLOCKS.registerBlock("reinforced_end_stone_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.END_STONE_BRICK_SLAB), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_END_STONE_BRICK_SLAB = reinforcedBlock("reinforced_end_stone_brick_slab", Blocks.END_STONE_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_SANDSTONE_SLAB = BLOCKS.registerBlock("reinforced_smooth_sandstone_slab", p -> new ReinforcedSlabBlock(p, Blocks.SMOOTH_SANDSTONE_SLAB), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_SMOOTH_SANDSTONE_SLAB = reinforcedBlock("reinforced_smooth_sandstone_slab", Blocks.SMOOTH_SANDSTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SMOOTH_QUARTZ_SLAB = BLOCKS.registerBlock("reinforced_smooth_quartz_slab", p -> new ReinforcedSlabBlock(p, Blocks.SMOOTH_QUARTZ_SLAB), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_SMOOTH_QUARTZ_SLAB = reinforcedBlock("reinforced_smooth_quartz_slab", Blocks.SMOOTH_QUARTZ_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRANITE_SLAB = BLOCKS.registerBlock("reinforced_granite_slab", p -> new ReinforcedSlabBlock(p, Blocks.GRANITE_SLAB), prop(MapColor.DIRT)); + public static final DeferredBlock REINFORCED_GRANITE_SLAB = reinforcedBlock("reinforced_granite_slab", Blocks.GRANITE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ANDESITE_SLAB = BLOCKS.registerBlock("reinforced_andesite_slab", p -> new ReinforcedSlabBlock(p, Blocks.ANDESITE_SLAB), prop()); + public static final DeferredBlock REINFORCED_ANDESITE_SLAB = reinforcedBlock("reinforced_andesite_slab", Blocks.ANDESITE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_NETHER_BRICK_SLAB = BLOCKS.registerBlock("reinforced_red_nether_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.RED_NETHER_BRICK_SLAB), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_RED_NETHER_BRICK_SLAB = reinforcedBlock("reinforced_red_nether_brick_slab", Blocks.RED_NETHER_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_ANDESITE_SLAB = BLOCKS.registerBlock("reinforced_polished_andesite_slab", p -> new ReinforcedSlabBlock(p, Blocks.POLISHED_ANDESITE_SLAB), prop()); + public static final DeferredBlock REINFORCED_POLISHED_ANDESITE_SLAB = reinforcedBlock("reinforced_polished_andesite_slab", Blocks.POLISHED_ANDESITE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DIORITE_SLAB = BLOCKS.registerBlock("reinforced_diorite_slab", p -> new ReinforcedSlabBlock(p, Blocks.DIORITE_SLAB), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_DIORITE_SLAB = reinforcedBlock("reinforced_diorite_slab", Blocks.DIORITE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBBLED_DEEPSLATE_SLAB = BLOCKS.registerBlock("reinforced_cobbled_deepslate_slab", p -> new ReinforcedSlabBlock(p, Blocks.COBBLED_DEEPSLATE_SLAB), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE)); + public static final DeferredBlock REINFORCED_COBBLED_DEEPSLATE_SLAB = reinforcedBlock("reinforced_cobbled_deepslate_slab", Blocks.COBBLED_DEEPSLATE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_DEEPSLATE_SLAB = BLOCKS.registerBlock("reinforced_polished_deepslate_slab", p -> new ReinforcedSlabBlock(p, Blocks.POLISHED_DEEPSLATE_SLAB), prop(MapColor.DEEPSLATE).sound(SoundType.POLISHED_DEEPSLATE)); + public static final DeferredBlock REINFORCED_POLISHED_DEEPSLATE_SLAB = reinforcedBlock("reinforced_polished_deepslate_slab", Blocks.POLISHED_DEEPSLATE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE_BRICK_SLAB = BLOCKS.registerBlock("reinforced_deepslate_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.DEEPSLATE_BRICK_SLAB), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_BRICKS)); + public static final DeferredBlock REINFORCED_DEEPSLATE_BRICK_SLAB = reinforcedBlock("reinforced_deepslate_brick_slab", Blocks.DEEPSLATE_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE_TILE_SLAB = BLOCKS.registerBlock("reinforced_deepslate_tile_slab", p -> new ReinforcedSlabBlock(p, Blocks.DEEPSLATE_TILE_SLAB), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_TILES)); + public static final DeferredBlock REINFORCED_DEEPSLATE_TILE_SLAB = reinforcedBlock("reinforced_deepslate_tile_slab", Blocks.DEEPSLATE_TILE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRYING_OBSIDIAN = BLOCKS.registerBlock("reinforced_crying_obsidian", p -> new ReinforcedCryingObsidianBlock(p, Blocks.CRYING_OBSIDIAN), prop(MapColor.COLOR_BLACK).lightLevel(state -> 10)); + public static final DeferredBlock REINFORCED_CRYING_OBSIDIAN = reinforcedBlock("reinforced_crying_obsidian", Blocks.CRYING_OBSIDIAN, ReinforcedCryingObsidianBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACKSTONE = BLOCKS.registerBlock("reinforced_blackstone", p -> new BaseReinforcedBlock(p, Blocks.BLACKSTONE), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_BLACKSTONE = reinforcedBlock("reinforced_blackstone", Blocks.BLACKSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACKSTONE_SLAB = BLOCKS.registerBlock("reinforced_blackstone_slab", p -> new ReinforcedSlabBlock(p, Blocks.BLACKSTONE_SLAB), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_BLACKSTONE_SLAB = reinforcedBlock("reinforced_blackstone_slab", Blocks.BLACKSTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACKSTONE_STAIRS = BLOCKS.registerBlock("reinforced_blackstone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.BLACKSTONE_STAIRS), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_BLACKSTONE_STAIRS = reinforcedBlock("reinforced_blackstone_stairs", Blocks.BLACKSTONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE = BLOCKS.registerBlock("reinforced_polished_blackstone", p -> new BaseReinforcedBlock(p, Blocks.POLISHED_BLACKSTONE), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE = reinforcedBlock("reinforced_polished_blackstone", Blocks.POLISHED_BLACKSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_SLAB = BLOCKS.registerBlock("reinforced_polished_blackstone_slab", p -> new ReinforcedSlabBlock(p, Blocks.POLISHED_BLACKSTONE_SLAB), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_SLAB = reinforcedBlock("reinforced_polished_blackstone_slab", Blocks.POLISHED_BLACKSTONE_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_STAIRS = BLOCKS.registerBlock("reinforced_polished_blackstone_stairs", p -> new ReinforcedStairsBlock(p, Blocks.POLISHED_BLACKSTONE_STAIRS), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_STAIRS = reinforcedBlock("reinforced_polished_blackstone_stairs", Blocks.POLISHED_BLACKSTONE_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_POLISHED_BLACKSTONE = BLOCKS.registerBlock("reinforced_chiseled_polished_blackstone", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_POLISHED_BLACKSTONE), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_CHISELED_POLISHED_BLACKSTONE = reinforcedBlock("reinforced_chiseled_polished_blackstone", Blocks.CHISELED_POLISHED_BLACKSTONE); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_BRICKS = BLOCKS.registerBlock("reinforced_polished_blackstone_bricks", p -> new BaseReinforcedBlock(p, Blocks.POLISHED_BLACKSTONE_BRICKS), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_BRICKS = reinforcedBlock("reinforced_polished_blackstone_bricks", Blocks.POLISHED_BLACKSTONE_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_BRICK_SLAB = BLOCKS.registerBlock("reinforced_polished_blackstone_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.POLISHED_BLACKSTONE_BRICK_SLAB), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_BRICK_SLAB = reinforcedBlock("reinforced_polished_blackstone_brick_slab", Blocks.POLISHED_BLACKSTONE_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_polished_blackstone_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.POLISHED_BLACKSTONE_BRICK_STAIRS), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_BRICK_STAIRS = reinforcedBlock("reinforced_polished_blackstone_brick_stairs", Blocks.POLISHED_BLACKSTONE_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRACKED_POLISHED_BLACKSTONE_BRICKS = BLOCKS.registerBlock("reinforced_cracked_polished_blackstone_bricks", p -> new BaseReinforcedBlock(p, Blocks.CRACKED_POLISHED_BLACKSTONE_BRICKS), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_CRACKED_POLISHED_BLACKSTONE_BRICKS = reinforcedBlock("reinforced_cracked_polished_blackstone_bricks", Blocks.CRACKED_POLISHED_BLACKSTONE_BRICKS); //ordered by vanilla <1.19.3 decoration blocks creative tab order @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBWEB = BLOCKS.registerBlock("reinforced_cobweb", p -> new ReinforcedCobwebBlock(p, Blocks.COBWEB), prop(MapColor.WOOL).sound(SoundType.COBWEB).forceSolidOn().noCollission()); + public static final DeferredBlock REINFORCED_COBWEB = reinforcedBlock("reinforced_cobweb", Blocks.COBWEB, ReinforcedCobwebBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSS_CARPET = BLOCKS.registerBlock("reinforced_moss_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.MOSS_CARPET), prop(MapColor.COLOR_GREEN).sound(SoundType.MOSS_CARPET).forceSolidOn()); + public static final DeferredBlock REINFORCED_MOSS_CARPET = reinforcedBlock("reinforced_moss_carpet", Blocks.MOSS_CARPET, ReinforcedCarpetBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSS_BLOCK = BLOCKS.registerBlock("reinforced_moss_block", p -> new BaseReinforcedBlock(p, Blocks.MOSS_BLOCK), prop(MapColor.COLOR_GREEN).sound(SoundType.MOSS)); + public static final DeferredBlock REINFORCED_MOSS_BLOCK = reinforcedBlock("reinforced_moss_block", Blocks.MOSS_BLOCK, p -> p.pushReaction(PushReaction.NORMAL)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_END_ROD = BLOCKS.registerBlock("reinforced_end_rod", ReinforcedEndRodBlock::new, prop(MapColor.NONE).lightLevel(state -> 14).sound(SoundType.WOOD).noOcclusion()); + public static final DeferredBlock REINFORCED_END_ROD = reinforcedBlock("reinforced_end_rod", Blocks.END_ROD, (p, b) -> new ReinforcedEndRodBlock(p)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_IRON_BARS = BLOCKS.registerBlock("reinforced_iron_bars", p -> new ReinforcedIronBarsBlock(p, Blocks.IRON_BARS), prop(MapColor.NONE).sound(SoundType.METAL)); + public static final DeferredBlock REINFORCED_IRON_BARS = reinforcedBlock("reinforced_iron_bars", Blocks.IRON_BARS, ReinforcedIronBarsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LADDER = BLOCKS.registerBlock("reinforced_ladder", ReinforcedLadderBlock::new, prop().forceSolidOff().sound(SoundType.LADDER).noOcclusion().pushReaction(PushReaction.DESTROY)); + public static final DeferredBlock REINFORCED_LADDER = reinforcedBlock("reinforced_ladder", Blocks.LADDER, (p, b) -> new ReinforcedLadderBlock(p.pushReaction(PushReaction.BLOCK))); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHAIN = BLOCKS.registerBlock("reinforced_chain", p -> new ReinforcedChainBlock(p, Blocks.CHAIN), prop(MapColor.NONE).sound(SoundType.CHAIN)); + public static final DeferredBlock REINFORCED_CHAIN = reinforcedBlock("reinforced_chain", Blocks.CHAIN, ReinforcedChainBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_GLASS_PANE = BLOCKS.registerBlock("reinforced_glass_pane", p -> new ReinforcedPaneBlock(p, Blocks.GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_GLASS_PANE = reinforcedBlock("reinforced_glass_pane", Blocks.GLASS_PANE, ReinforcedPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBBLESTONE_WALL = BLOCKS.registerBlock("reinforced_cobblestone_wall", p -> new ReinforcedWallBlock(p, Blocks.COBBLESTONE_WALL), prop()); + public static final DeferredBlock REINFORCED_COBBLESTONE_WALL = reinforcedBlock("reinforced_cobblestone_wall", Blocks.COBBLESTONE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSSY_COBBLESTONE_WALL = BLOCKS.registerBlock("reinforced_mossy_cobblestone_wall", p -> new ReinforcedWallBlock(p, Blocks.MOSSY_COBBLESTONE_WALL), prop()); + public static final DeferredBlock REINFORCED_MOSSY_COBBLESTONE_WALL = reinforcedBlock("reinforced_mossy_cobblestone_wall", Blocks.MOSSY_COBBLESTONE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BRICK_WALL = BLOCKS.registerBlock("reinforced_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.BRICK_WALL), prop(MapColor.COLOR_RED)); + public static final DeferredBlock REINFORCED_BRICK_WALL = reinforcedBlock("reinforced_brick_wall", Blocks.BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PRISMARINE_WALL = BLOCKS.registerBlock("reinforced_prismarine_wall", p -> new ReinforcedWallBlock(p, Blocks.PRISMARINE_WALL), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_PRISMARINE_WALL = reinforcedBlock("reinforced_prismarine_wall", Blocks.PRISMARINE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_SANDSTONE_WALL = BLOCKS.registerBlock("reinforced_red_sandstone_wall", p -> new ReinforcedWallBlock(p, Blocks.RED_SANDSTONE_WALL), prop(MapColor.COLOR_ORANGE)); + public static final DeferredBlock REINFORCED_RED_SANDSTONE_WALL = reinforcedBlock("reinforced_red_sandstone_wall", Blocks.RED_SANDSTONE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MOSSY_STONE_BRICK_WALL = BLOCKS.registerBlock("reinforced_mossy_stone_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.MOSSY_STONE_BRICK_WALL), prop()); + public static final DeferredBlock REINFORCED_MOSSY_STONE_BRICK_WALL = reinforcedBlock("reinforced_mossy_stone_brick_wall", Blocks.MOSSY_STONE_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRANITE_WALL = BLOCKS.registerBlock("reinforced_granite_wall", p -> new ReinforcedWallBlock(p, Blocks.GRANITE_WALL), prop(MapColor.DIRT)); + public static final DeferredBlock REINFORCED_GRANITE_WALL = reinforcedBlock("reinforced_granite_wall", Blocks.GRANITE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STONE_BRICK_WALL = BLOCKS.registerBlock("reinforced_stone_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.STONE_BRICK_WALL), prop()); + public static final DeferredBlock REINFORCED_STONE_BRICK_WALL = reinforcedBlock("reinforced_stone_brick_wall", Blocks.STONE_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MUD_BRICK_WALL = BLOCKS.registerBlock("reinforced_mud_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.MUD_BRICK_WALL), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.MUD_BRICKS)); + public static final DeferredBlock REINFORCED_MUD_BRICK_WALL = reinforcedBlock("reinforced_mud_brick_wall", Blocks.MUD_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NETHER_BRICK_WALL = BLOCKS.registerBlock("reinforced_nether_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.NETHER_BRICK_WALL), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_NETHER_BRICK_WALL = reinforcedBlock("reinforced_nether_brick_wall", Blocks.NETHER_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ANDESITE_WALL = BLOCKS.registerBlock("reinforced_andesite_wall", p -> new ReinforcedWallBlock(p, Blocks.ANDESITE_WALL), prop()); + public static final DeferredBlock REINFORCED_ANDESITE_WALL = reinforcedBlock("reinforced_andesite_wall", Blocks.ANDESITE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_NETHER_BRICK_WALL = BLOCKS.registerBlock("reinforced_red_nether_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.RED_NETHER_BRICK_WALL), prop(MapColor.NETHER).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_RED_NETHER_BRICK_WALL = reinforcedBlock("reinforced_red_nether_brick_wall", Blocks.RED_NETHER_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SANDSTONE_WALL = BLOCKS.registerBlock("reinforced_sandstone_wall", p -> new ReinforcedWallBlock(p, Blocks.SANDSTONE_WALL), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_SANDSTONE_WALL = reinforcedBlock("reinforced_sandstone_wall", Blocks.SANDSTONE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_END_STONE_BRICK_WALL = BLOCKS.registerBlock("reinforced_end_stone_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.END_STONE_BRICK_WALL), prop(MapColor.SAND)); + public static final DeferredBlock REINFORCED_END_STONE_BRICK_WALL = reinforcedBlock("reinforced_end_stone_brick_wall", Blocks.END_STONE_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DIORITE_WALL = BLOCKS.registerBlock("reinforced_diorite_wall", p -> new ReinforcedWallBlock(p, Blocks.DIORITE_WALL), prop(MapColor.QUARTZ)); + public static final DeferredBlock REINFORCED_DIORITE_WALL = reinforcedBlock("reinforced_diorite_wall", Blocks.DIORITE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACKSTONE_WALL = BLOCKS.registerBlock("reinforced_blackstone_wall", p -> new ReinforcedWallBlock(p, Blocks.BLACKSTONE_WALL), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_BLACKSTONE_WALL = reinforcedBlock("reinforced_blackstone_wall", Blocks.BLACKSTONE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_WALL = BLOCKS.registerBlock("reinforced_polished_blackstone_wall", p -> new ReinforcedWallBlock(p, Blocks.POLISHED_BLACKSTONE_WALL), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_WALL = reinforcedBlock("reinforced_polished_blackstone_wall", Blocks.POLISHED_BLACKSTONE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_BRICK_WALL = BLOCKS.registerBlock("reinforced_polished_blackstone_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.POLISHED_BLACKSTONE_BRICK_WALL), prop(MapColor.COLOR_BLACK)); + public static final DeferredBlock REINFORCED_POLISHED_BLACKSTONE_BRICK_WALL = reinforcedBlock("reinforced_polished_blackstone_brick_wall", Blocks.POLISHED_BLACKSTONE_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COBBLED_DEEPSLATE_WALL = BLOCKS.registerBlock("reinforced_cobbled_deepslate_wall", p -> new ReinforcedWallBlock(p, Blocks.COBBLED_DEEPSLATE_WALL), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE)); + public static final DeferredBlock REINFORCED_COBBLED_DEEPSLATE_WALL = reinforcedBlock("reinforced_cobbled_deepslate_wall", Blocks.COBBLED_DEEPSLATE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_DEEPSLATE_WALL = BLOCKS.registerBlock("reinforced_polished_deepslate_wall", p -> new ReinforcedWallBlock(p, Blocks.POLISHED_DEEPSLATE_WALL), prop(MapColor.DEEPSLATE).sound(SoundType.POLISHED_DEEPSLATE)); + public static final DeferredBlock REINFORCED_POLISHED_DEEPSLATE_WALL = reinforcedBlock("reinforced_polished_deepslate_wall", Blocks.POLISHED_DEEPSLATE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE_BRICK_WALL = BLOCKS.registerBlock("reinforced_deepslate_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.DEEPSLATE_BRICK_WALL), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_BRICKS)); + public static final DeferredBlock REINFORCED_DEEPSLATE_BRICK_WALL = reinforcedBlock("reinforced_deepslate_brick_wall", Blocks.DEEPSLATE_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DEEPSLATE_TILE_WALL = BLOCKS.registerBlock("reinforced_deepslate_tile_wall", p -> new ReinforcedWallBlock(p, Blocks.DEEPSLATE_TILE_WALL), prop(MapColor.DEEPSLATE).sound(SoundType.DEEPSLATE_TILES)); + public static final DeferredBlock REINFORCED_DEEPSLATE_TILE_WALL = reinforcedBlock("reinforced_deepslate_tile_wall", Blocks.DEEPSLATE_TILE_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WHITE_CARPET = BLOCKS.registerBlock("reinforced_white_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.WHITE_CARPET), prop(MapColor.SNOW).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_WHITE_CARPET = reinforcedBlock("reinforced_white_carpet", Blocks.WHITE_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ORANGE_CARPET = BLOCKS.registerBlock("reinforced_orange_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.ORANGE_CARPET), prop(MapColor.COLOR_ORANGE).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_ORANGE_CARPET = reinforcedBlock("reinforced_orange_carpet", Blocks.ORANGE_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MAGENTA_CARPET = BLOCKS.registerBlock("reinforced_magenta_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.MAGENTA_CARPET), prop(MapColor.COLOR_MAGENTA).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_MAGENTA_CARPET = reinforcedBlock("reinforced_magenta_carpet", Blocks.MAGENTA_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_BLUE_CARPET = BLOCKS.registerBlock("reinforced_light_blue_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.LIGHT_BLUE_CARPET), prop(MapColor.COLOR_LIGHT_BLUE).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_LIGHT_BLUE_CARPET = reinforcedBlock("reinforced_light_blue_carpet", Blocks.LIGHT_BLUE_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_YELLOW_CARPET = BLOCKS.registerBlock("reinforced_yellow_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.YELLOW_CARPET), prop(MapColor.COLOR_YELLOW).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_YELLOW_CARPET = reinforcedBlock("reinforced_yellow_carpet", Blocks.YELLOW_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIME_CARPET = BLOCKS.registerBlock("reinforced_lime_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.LIME_CARPET), prop(MapColor.COLOR_LIGHT_GREEN).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_LIME_CARPET = reinforcedBlock("reinforced_lime_carpet", Blocks.LIME_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PINK_CARPET = BLOCKS.registerBlock("reinforced_pink_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.PINK_CARPET), prop(MapColor.COLOR_PINK).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_PINK_CARPET = reinforcedBlock("reinforced_pink_carpet", Blocks.PINK_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRAY_CARPET = BLOCKS.registerBlock("reinforced_gray_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.GRAY_CARPET), prop(MapColor.COLOR_GRAY).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_GRAY_CARPET = reinforcedBlock("reinforced_gray_carpet", Blocks.GRAY_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_GRAY_CARPET = BLOCKS.registerBlock("reinforced_light_gray_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.LIGHT_GRAY_CARPET), prop(MapColor.COLOR_LIGHT_GRAY).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_LIGHT_GRAY_CARPET = reinforcedBlock("reinforced_light_gray_carpet", Blocks.LIGHT_GRAY_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CYAN_CARPET = BLOCKS.registerBlock("reinforced_cyan_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.CYAN_CARPET), prop(MapColor.COLOR_CYAN).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_CYAN_CARPET = reinforcedBlock("reinforced_cyan_carpet", Blocks.CYAN_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPLE_CARPET = BLOCKS.registerBlock("reinforced_purple_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.PURPLE_CARPET), prop(MapColor.COLOR_PURPLE).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_PURPLE_CARPET = reinforcedBlock("reinforced_purple_carpet", Blocks.PURPLE_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLUE_CARPET = BLOCKS.registerBlock("reinforced_blue_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.BLUE_CARPET), prop(MapColor.COLOR_BLUE).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_BLUE_CARPET = reinforcedBlock("reinforced_blue_carpet", Blocks.BLUE_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BROWN_CARPET = BLOCKS.registerBlock("reinforced_brown_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.BROWN_CARPET), prop(MapColor.COLOR_BROWN).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_BROWN_CARPET = reinforcedBlock("reinforced_brown_carpet", Blocks.BROWN_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GREEN_CARPET = BLOCKS.registerBlock("reinforced_green_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.GREEN_CARPET), prop(MapColor.COLOR_GREEN).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_GREEN_CARPET = reinforcedBlock("reinforced_green_carpet", Blocks.GREEN_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_CARPET = BLOCKS.registerBlock("reinforced_red_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.RED_CARPET), prop(MapColor.COLOR_RED).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_RED_CARPET = reinforcedBlock("reinforced_red_carpet", Blocks.RED_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACK_CARPET = BLOCKS.registerBlock("reinforced_black_carpet", p -> new ReinforcedCarpetBlock(p, Blocks.BLACK_CARPET), prop(MapColor.COLOR_BLACK).sound(SoundType.WOOL).forceSolidOn()); + public static final DeferredBlock REINFORCED_BLACK_CARPET = reinforcedBlock("reinforced_black_carpet", Blocks.BLACK_CARPET, ReinforcedCarpetBlock::new, BlockBehaviour.Properties::forceSolidOn); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_WHITE_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_white_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.WHITE, Blocks.WHITE_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_WHITE_STAINED_GLASS_PANE = reinforcedBlock("reinforced_white_stained_glass_pane", Blocks.WHITE_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_ORANGE_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_orange_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.ORANGE, Blocks.ORANGE_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_ORANGE_STAINED_GLASS_PANE = reinforcedBlock("reinforced_orange_stained_glass_pane", Blocks.ORANGE_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_MAGENTA_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_magenta_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.MAGENTA, Blocks.MAGENTA_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_MAGENTA_STAINED_GLASS_PANE = reinforcedBlock("reinforced_magenta_stained_glass_pane", Blocks.MAGENTA_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_LIGHT_BLUE_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_light_blue_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_LIGHT_BLUE_STAINED_GLASS_PANE = reinforcedBlock("reinforced_light_blue_stained_glass_pane", Blocks.LIGHT_BLUE_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_YELLOW_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_yellow_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.YELLOW, Blocks.YELLOW_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_YELLOW_STAINED_GLASS_PANE = reinforcedBlock("reinforced_yellow_stained_glass_pane", Blocks.YELLOW_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_LIME_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_lime_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.LIME, Blocks.LIME_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_LIME_STAINED_GLASS_PANE = reinforcedBlock("reinforced_lime_stained_glass_pane", Blocks.LIME_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_PINK_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_pink_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.PINK, Blocks.PINK_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_PINK_STAINED_GLASS_PANE = reinforcedBlock("reinforced_pink_stained_glass_pane", Blocks.PINK_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_GRAY_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_gray_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.GRAY, Blocks.GRAY_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_GRAY_STAINED_GLASS_PANE = reinforcedBlock("reinforced_gray_stained_glass_pane", Blocks.GRAY_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_LIGHT_GRAY_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_light_gray_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_LIGHT_GRAY_STAINED_GLASS_PANE = reinforcedBlock("reinforced_light_gray_stained_glass_pane", Blocks.LIGHT_GRAY_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_CYAN_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_cyan_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.CYAN, Blocks.CYAN_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_CYAN_STAINED_GLASS_PANE = reinforcedBlock("reinforced_cyan_stained_glass_pane", Blocks.CYAN_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_PURPLE_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_purple_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.PURPLE, Blocks.PURPLE_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_PURPLE_STAINED_GLASS_PANE = reinforcedBlock("reinforced_purple_stained_glass_pane", Blocks.PURPLE_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_BLUE_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_blue_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.BLUE, Blocks.BLUE_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_BLUE_STAINED_GLASS_PANE = reinforcedBlock("reinforced_blue_stained_glass_pane", Blocks.BLUE_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_BROWN_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_brown_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.BROWN, Blocks.BROWN_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_BROWN_STAINED_GLASS_PANE = reinforcedBlock("reinforced_brown_stained_glass_pane", Blocks.BROWN_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_GREEN_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_green_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.GREEN, Blocks.GREEN_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_GREEN_STAINED_GLASS_PANE = reinforcedBlock("reinforced_green_stained_glass_pane", Blocks.GREEN_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_RED_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_red_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.RED, Blocks.RED_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_RED_STAINED_GLASS_PANE = reinforcedBlock("reinforced_red_stained_glass_pane", Blocks.RED_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(hasReinforcedTint = false) - public static final DeferredBlock REINFORCED_BLACK_STAINED_GLASS_PANE = BLOCKS.registerBlock("reinforced_black_stained_glass_pane", p -> new ReinforcedStainedGlassPaneBlock(p, DyeColor.BLACK, Blocks.BLACK_STAINED_GLASS_PANE), prop(MapColor.NONE).sound(SoundType.GLASS)); + public static final DeferredBlock REINFORCED_BLACK_STAINED_GLASS_PANE = reinforcedBlock("reinforced_black_stained_glass_pane", Blocks.BLACK_STAINED_GLASS_PANE, ReinforcedStainedGlassPaneBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WHITE_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_white_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.WHITE_GLAZED_TERRACOTTA), prop(DyeColor.WHITE.getMapColor())); + public static final DeferredBlock REINFORCED_WHITE_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_white_glazed_terracotta", Blocks.WHITE_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ORANGE_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_orange_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.ORANGE_GLAZED_TERRACOTTA), prop(DyeColor.ORANGE.getMapColor())); + public static final DeferredBlock REINFORCED_ORANGE_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_orange_glazed_terracotta", Blocks.ORANGE_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MAGENTA_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_magenta_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.MAGENTA_GLAZED_TERRACOTTA), prop(DyeColor.MAGENTA.getMapColor())); + public static final DeferredBlock REINFORCED_MAGENTA_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_magenta_glazed_terracotta", Blocks.MAGENTA_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_BLUE_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_light_blue_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.LIGHT_BLUE_GLAZED_TERRACOTTA), prop(DyeColor.LIGHT_BLUE.getMapColor())); + public static final DeferredBlock REINFORCED_LIGHT_BLUE_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_light_blue_glazed_terracotta", Blocks.LIGHT_BLUE_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_YELLOW_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_yellow_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.YELLOW_GLAZED_TERRACOTTA), prop(DyeColor.YELLOW.getMapColor())); + public static final DeferredBlock REINFORCED_YELLOW_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_yellow_glazed_terracotta", Blocks.YELLOW_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIME_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_lime_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.LIME_GLAZED_TERRACOTTA), prop(DyeColor.LIME.getMapColor())); + public static final DeferredBlock REINFORCED_LIME_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_lime_glazed_terracotta", Blocks.LIME_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PINK_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_pink_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.PINK_GLAZED_TERRACOTTA), prop(DyeColor.PINK.getMapColor())); + public static final DeferredBlock REINFORCED_PINK_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_pink_glazed_terracotta", Blocks.PINK_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GRAY_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_gray_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.GRAY_GLAZED_TERRACOTTA), prop(DyeColor.GRAY.getMapColor())); + public static final DeferredBlock REINFORCED_GRAY_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_gray_glazed_terracotta", Blocks.GRAY_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LIGHT_GRAY_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_light_gray_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.LIGHT_GRAY_GLAZED_TERRACOTTA), prop(DyeColor.LIGHT_GRAY.getMapColor())); + public static final DeferredBlock REINFORCED_LIGHT_GRAY_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_light_gray_glazed_terracotta", Blocks.LIGHT_GRAY_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CYAN_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_cyan_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.CYAN_GLAZED_TERRACOTTA), prop(DyeColor.CYAN.getMapColor())); + public static final DeferredBlock REINFORCED_CYAN_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_cyan_glazed_terracotta", Blocks.CYAN_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PURPLE_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_purple_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.PURPLE_GLAZED_TERRACOTTA), prop(DyeColor.PURPLE.getMapColor())); + public static final DeferredBlock REINFORCED_PURPLE_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_purple_glazed_terracotta", Blocks.PURPLE_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLUE_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_blue_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.BLUE_GLAZED_TERRACOTTA), prop(DyeColor.BLUE.getMapColor())); + public static final DeferredBlock REINFORCED_BLUE_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_blue_glazed_terracotta", Blocks.BLUE_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BROWN_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_brown_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.BROWN_GLAZED_TERRACOTTA), prop(DyeColor.BROWN.getMapColor())); + public static final DeferredBlock REINFORCED_BROWN_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_brown_glazed_terracotta", Blocks.BROWN_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_GREEN_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_green_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.GREEN_GLAZED_TERRACOTTA), prop(DyeColor.GREEN.getMapColor())); + public static final DeferredBlock REINFORCED_GREEN_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_green_glazed_terracotta", Blocks.GREEN_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_RED_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_red_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.RED_GLAZED_TERRACOTTA), prop(DyeColor.RED.getMapColor())); + public static final DeferredBlock REINFORCED_RED_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_red_glazed_terracotta", Blocks.RED_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BLACK_GLAZED_TERRACOTTA = BLOCKS.registerBlock("reinforced_black_glazed_terracotta", p -> new ReinforcedGlazedTerracottaBlock(p, Blocks.BLACK_GLAZED_TERRACOTTA), prop(DyeColor.BLACK.getMapColor())); + public static final DeferredBlock REINFORCED_BLACK_GLAZED_TERRACOTTA = reinforcedBlock("reinforced_black_glazed_terracotta", Blocks.BLACK_GLAZED_TERRACOTTA, ReinforcedGlazedTerracottaBlock::new); @OwnableBE @Reinforced(registerBlockItem = false) - public static final DeferredBlock REINFORCED_SCAFFOLDING = BLOCKS.registerBlock("reinforced_scaffolding", ReinforcedScaffoldingBlock::new, reinforcedCopy(Blocks.SCAFFOLDING)); + public static final DeferredBlock REINFORCED_SCAFFOLDING = reinforcedBlock("reinforced_scaffolding", Blocks.SCAFFOLDING, (p, b) -> new ReinforcedScaffoldingBlock(p.pushReaction(PushReaction.NORMAL))); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_LANTERN = BLOCKS.registerBlock("reinforced_lantern", p -> new ReinforcedLanternBlock(p, Blocks.LANTERN), prop(MapColor.METAL).sound(SoundType.LANTERN).lightLevel(state -> 15).pushReaction(PushReaction.BLOCK).forceSolidOn()); + public static final DeferredBlock REINFORCED_LANTERN = reinforcedBlock("reinforced_lantern", Blocks.LANTERN, ReinforcedLanternBlock::new, p -> p.pushReaction(PushReaction.BLOCK)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SOUL_LANTERN = BLOCKS.registerBlock("reinforced_soul_lantern", p -> new ReinforcedLanternBlock(p, Blocks.SOUL_LANTERN), prop(MapColor.METAL).sound(SoundType.LANTERN).lightLevel(state -> 10).pushReaction(PushReaction.BLOCK).forceSolidOn()); + public static final DeferredBlock REINFORCED_SOUL_LANTERN = reinforcedBlock("reinforced_soul_lantern", Blocks.SOUL_LANTERN, ReinforcedLanternBlock::new, p -> p.pushReaction(PushReaction.BLOCK)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SHROOMLIGHT = BLOCKS.registerBlock("reinforced_shroomlight", p -> new BaseReinforcedBlock(p, Blocks.SHROOMLIGHT), prop(MapColor.COLOR_RED).sound(SoundType.SHROOMLIGHT).lightLevel(state -> 15)); + public static final DeferredBlock REINFORCED_SHROOMLIGHT = reinforcedBlock("reinforced_shroomlight", Blocks.SHROOMLIGHT); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OCHRE_FROGLIGHT = BLOCKS.registerBlock("reinforced_ochre_froglight", p -> new ReinforcedRotatedPillarBlock(p, Blocks.OCHRE_FROGLIGHT), prop(MapColor.SAND).sound(SoundType.FROGLIGHT).lightLevel(state -> 15)); + public static final DeferredBlock REINFORCED_OCHRE_FROGLIGHT = reinforcedBlock("reinforced_ochre_froglight", Blocks.OCHRE_FROGLIGHT, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_VERDANT_FROGLIGHT = BLOCKS.registerBlock("reinforced_verdant_froglight", p -> new ReinforcedRotatedPillarBlock(p, Blocks.VERDANT_FROGLIGHT), prop(MapColor.GLOW_LICHEN).sound(SoundType.FROGLIGHT).lightLevel(state -> 15)); + public static final DeferredBlock REINFORCED_VERDANT_FROGLIGHT = reinforcedBlock("reinforced_verdant_froglight", Blocks.VERDANT_FROGLIGHT, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PEARLESCENT_FROGLIGHT = BLOCKS.registerBlock("reinforced_pearlescent_froglight", p -> new ReinforcedRotatedPillarBlock(p, Blocks.PEARLESCENT_FROGLIGHT), prop(MapColor.COLOR_PINK).sound(SoundType.FROGLIGHT).lightLevel(state -> 15)); + public static final DeferredBlock REINFORCED_PEARLESCENT_FROGLIGHT = reinforcedBlock("reinforced_pearlescent_froglight", Blocks.PEARLESCENT_FROGLIGHT, ReinforcedRotatedPillarBlock::new); //ordered by vanilla <1.19.3 redstone tab order @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_REDSTONE_BLOCK = BLOCKS.registerBlock("reinforced_redstone_block", p -> new ReinforcedRedstoneBlock(p, Blocks.REDSTONE_BLOCK), prop(MapColor.FIRE).sound(SoundType.METAL).isRedstoneConductor(SCContent::never)); + public static final DeferredBlock REINFORCED_REDSTONE_BLOCK = reinforcedBlock("reinforced_redstone_block", Blocks.REDSTONE_BLOCK, ReinforcedRedstoneBlock::new); @HasManualPage(PageGroup.REINFORCED) @Reinforced - public static final DeferredBlock REINFORCED_PISTON = BLOCKS.registerBlock("reinforced_piston", p -> new ReinforcedPistonBaseBlock(false, p), prop().isRedstoneConductor(SCContent::never).isSuffocating((s, w, p) -> !s.getValue(PistonBaseBlock.EXTENDED)).isViewBlocking((s, w, p) -> !s.getValue(PistonBaseBlock.EXTENDED))); + public static final DeferredBlock REINFORCED_PISTON = reinforcedBlock("reinforced_piston", Blocks.PISTON, (p, b) -> new ReinforcedPistonBaseBlock(false, p)); @HasManualPage(PageGroup.REINFORCED) @Reinforced - public static final DeferredBlock REINFORCED_STICKY_PISTON = BLOCKS.registerBlock("reinforced_sticky_piston", p -> new ReinforcedPistonBaseBlock(true, p), prop().isRedstoneConductor(SCContent::never).isSuffocating((s, w, p) -> !s.getValue(PistonBaseBlock.EXTENDED)).isViewBlocking((s, w, p) -> !s.getValue(PistonBaseBlock.EXTENDED))); + public static final DeferredBlock REINFORCED_STICKY_PISTON = reinforcedBlock("reinforced_sticky_piston", Blocks.STICKY_PISTON, (p, b) -> new ReinforcedPistonBaseBlock(true, p)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OBSERVER = BLOCKS.registerBlock("reinforced_observer", ReinforcedObserverBlock::new, propDisguisable().isRedstoneConductor(SCContent::never)); + public static final DeferredBlock REINFORCED_OBSERVER = reinforcedBlock("reinforced_observer", Blocks.OBSERVER, (p, b) -> new ReinforcedObserverBlock(propDisguisable(p))); @HasManualPage @Reinforced - public static final DeferredBlock REINFORCED_HOPPER = BLOCKS.registerBlock("reinforced_hopper", ReinforcedHopperBlock::new, propDisguisable().sound(SoundType.METAL)); + public static final DeferredBlock REINFORCED_HOPPER = reinforcedBlock("reinforced_hopper", Blocks.HOPPER, (p, b) -> new ReinforcedHopperBlock(propDisguisable(p))); @HasManualPage(PageGroup.REINFORCED) @Reinforced - public static final DeferredBlock REINFORCED_DISPENSER = BLOCKS.registerBlock("reinforced_dispenser", ReinforcedDispenserBlock::new, propDisguisable()); + public static final DeferredBlock REINFORCED_DISPENSER = reinforcedBlock("reinforced_dispenser", Blocks.DISPENSER, (p, b) -> new ReinforcedDispenserBlock(propDisguisable(p))); @HasManualPage(PageGroup.REINFORCED) @Reinforced - public static final DeferredBlock REINFORCED_DROPPER = BLOCKS.registerBlock("reinforced_dropper", ReinforcedDropperBlock::new, propDisguisable()); + public static final DeferredBlock REINFORCED_DROPPER = reinforcedBlock("reinforced_dropper", Blocks.DROPPER, (p, b) -> new ReinforcedDropperBlock(propDisguisable(p))); @HasManualPage(PageGroup.REINFORCED) @Reinforced - public static final DeferredBlock REINFORCED_LECTERN = BLOCKS.registerBlock("reinforced_lectern", ReinforcedLecternBlock::new, prop(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_LECTERN = reinforcedBlock("reinforced_lectern", Blocks.LECTERN, (p, b) -> new ReinforcedLecternBlock(p)); @HasManualPage @Reinforced - public static final DeferredBlock REINFORCED_LEVER = BLOCKS.registerBlock("reinforced_lever", ReinforcedLeverBlock::new, prop(MapColor.NONE).noCollission().sound(SoundType.STONE).pushReaction(PushReaction.BLOCK).forceSolidOn()); + public static final DeferredBlock REINFORCED_LEVER = reinforcedBlock("reinforced_lever", Blocks.LEVER, (p, b) -> new ReinforcedLeverBlock(p.pushReaction(PushReaction.BLOCK).forceSolidOn())); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_REDSTONE_LAMP = BLOCKS.registerBlock("reinforced_redstone_lamp", p -> new ReinforcedRedstoneLampBlock(p, Blocks.REDSTONE_LAMP), prop(MapColor.NONE).sound(SoundType.GLASS).lightLevel(state -> state.getValue(ReinforcedRedstoneLampBlock.LIT) ? 15 : 0)); + public static final DeferredBlock REINFORCED_REDSTONE_LAMP = reinforcedBlock("reinforced_redstone_lamp", Blocks.REDSTONE_LAMP, ReinforcedRedstoneLampBlock::new); @HasManualPage(PageGroup.BUTTONS) @Reinforced public static final DeferredBlock REINFORCED_STONE_BUTTON = stoneButton("reinforced_stone_button", Blocks.STONE_BUTTON, BlockSetType.STONE); @@ -2353,118 +2351,118 @@ public class SCContent { @HasManualPage(hasRecipeDescription = true) @OwnableBE @Reinforced(hasReinforcedTint = false, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_IRON_TRAPDOOR = BLOCKS.registerBlock("reinforced_iron_trapdoor", p -> new ReinforcedIronTrapDoorBlock(p, BlockSetType.IRON), prop(MapColor.METAL).sound(SoundType.METAL).noOcclusion().isValidSpawn(SCContent::never)); + public static final DeferredBlock REINFORCED_IRON_TRAPDOOR = reinforcedBlock("reinforced_iron_trapdoor", Blocks.IRON_TRAPDOOR, (p, b) -> new ReinforcedIronTrapDoorBlock(p, BlockSetType.IRON)); //ordered by vanilla <1.19.3 brewing tab order @Reinforced - public static final DeferredBlock REINFORCED_CAULDRON = BLOCKS.registerBlock("reinforced_cauldron", p -> new ReinforcedCauldronBlock(p, IReinforcedCauldronInteraction.EMPTY), prop(MapColor.STONE).noOcclusion()); + public static final DeferredBlock REINFORCED_CAULDRON = reinforcedBlock("reinforced_cauldron", Blocks.CAULDRON, (p, b) -> new ReinforcedCauldronBlock(p, IReinforcedCauldronInteraction.EMPTY)); @Reinforced(registerBlockItem = false) - public static final DeferredBlock REINFORCED_WATER_CAULDRON = BLOCKS.registerBlock("reinforced_water_cauldron", p -> new ReinforcedLayeredCauldronBlock(Biome.Precipitation.RAIN, IReinforcedCauldronInteraction.WATER, p, Blocks.WATER_CAULDRON), prop(MapColor.STONE).noOcclusion()); + public static final DeferredBlock REINFORCED_WATER_CAULDRON = reinforcedBlock("reinforced_water_cauldron", Blocks.WATER_CAULDRON, (p, b) -> new ReinforcedLayeredCauldronBlock(Biome.Precipitation.RAIN, IReinforcedCauldronInteraction.WATER, p, b)); @Reinforced(registerBlockItem = false) - public static final DeferredBlock REINFORCED_LAVA_CAULDRON = BLOCKS.registerBlock("reinforced_lava_cauldron", ReinforcedLavaCauldronBlock::new, prop(MapColor.STONE).noOcclusion().lightLevel(state -> 15)); + public static final DeferredBlock REINFORCED_LAVA_CAULDRON = reinforcedBlock("reinforced_lava_cauldron", Blocks.LAVA_CAULDRON, (p, b) -> new ReinforcedLavaCauldronBlock(p)); @Reinforced(registerBlockItem = false) - public static final DeferredBlock REINFORCED_POWDER_SNOW_CAULDRON = BLOCKS.registerBlock("reinforced_powder_snow_cauldron", p -> new ReinforcedLayeredCauldronBlock(Biome.Precipitation.SNOW, IReinforcedCauldronInteraction.POWDER_SNOW, p, Blocks.POWDER_SNOW_CAULDRON), prop(MapColor.STONE).noOcclusion()); + public static final DeferredBlock REINFORCED_POWDER_SNOW_CAULDRON = reinforcedBlock("reinforced_powder_snow_cauldron", Blocks.POWDER_SNOW_CAULDRON, (p, b) -> new ReinforcedLayeredCauldronBlock(Biome.Precipitation.SNOW, IReinforcedCauldronInteraction.POWDER_SNOW, p, b)); //1.19.3+ content @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_BLOCK = BLOCKS.registerBlock("reinforced_bamboo_block", p -> new ReinforcedRotatedPillarBlock(p, Blocks.BAMBOO_BLOCK), logProp(MapColor.COLOR_YELLOW, MapColor.PLANT).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_BAMBOO_BLOCK = reinforcedBlock("reinforced_bamboo_block", Blocks.BAMBOO_BLOCK, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_BAMBOO_BLOCK = BLOCKS.registerBlock("reinforced_stripped_bamboo_block", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_BAMBOO_BLOCK), prop(MapColor.COLOR_YELLOW).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_BAMBOO_BLOCK = reinforcedBlock("reinforced_stripped_bamboo_block", Blocks.STRIPPED_BAMBOO_BLOCK, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_PLANKS = BLOCKS.registerBlock("reinforced_bamboo_planks", p -> new BaseReinforcedBlock(p, Blocks.BAMBOO_PLANKS), prop(MapColor.COLOR_YELLOW).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_BAMBOO_PLANKS = reinforcedBlock("reinforced_bamboo_planks", Blocks.BAMBOO_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_MOSAIC = BLOCKS.registerBlock("reinforced_bamboo_mosaic", p -> new BaseReinforcedBlock(p, Blocks.BAMBOO_MOSAIC), prop(MapColor.COLOR_YELLOW).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_BAMBOO_MOSAIC = reinforcedBlock("reinforced_bamboo_mosaic", Blocks.BAMBOO_MOSAIC); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_STAIRS = BLOCKS.registerBlock("reinforced_bamboo_stairs", p -> new ReinforcedStairsBlock(p, Blocks.BAMBOO_STAIRS), prop(MapColor.COLOR_YELLOW).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_BAMBOO_STAIRS = reinforcedBlock("reinforced_bamboo_stairs", Blocks.BAMBOO_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_MOSAIC_STAIRS = BLOCKS.registerBlock("reinforced_bamboo_mosaic_stairs", p -> new ReinforcedStairsBlock(p, Blocks.BAMBOO_MOSAIC_STAIRS), prop(MapColor.COLOR_YELLOW).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_BAMBOO_MOSAIC_STAIRS = reinforcedBlock("reinforced_bamboo_mosaic_stairs", Blocks.BAMBOO_MOSAIC_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_SLAB = BLOCKS.registerBlock("reinforced_bamboo_slab", p -> new ReinforcedSlabBlock(p, Blocks.BAMBOO_SLAB), prop(MapColor.COLOR_YELLOW).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_BAMBOO_SLAB = reinforcedBlock("reinforced_bamboo_slab", Blocks.BAMBOO_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_MOSAIC_SLAB = BLOCKS.registerBlock("reinforced_bamboo_mosaic_slab", p -> new ReinforcedSlabBlock(p, Blocks.BAMBOO_MOSAIC_SLAB), prop(MapColor.COLOR_YELLOW).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_BAMBOO_MOSAIC_SLAB = reinforcedBlock("reinforced_bamboo_mosaic_slab", Blocks.BAMBOO_MOSAIC_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.PRESSURE_PLATES) @Reinforced public static final DeferredBlock REINFORCED_BAMBOO_PRESSURE_PLATE = woodenPressurePlate("reinforced_bamboo_pressure_plate", Blocks.BAMBOO_PRESSURE_PLATE, BlockSetType.BAMBOO); @HasManualPage(PageGroup.BUTTONS) @Reinforced public static final DeferredBlock REINFORCED_BAMBOO_BUTTON = woodenButton("reinforced_bamboo_button", Blocks.BAMBOO_BUTTON, BlockSetType.BAMBOO); - public static final DeferredBlock SECRET_CHERRY_SIGN = BLOCKS.registerBlock("secret_cherry_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.CHERRY), prop(MapColor.TERRACOTTA_WHITE).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_cherry_sign")); - public static final DeferredBlock SECRET_CHERRY_WALL_SIGN = BLOCKS.registerBlock("secret_cherry_sign_wall", p -> new SecretWallSignBlock(p, WoodType.CHERRY), prop(MapColor.TERRACOTTA_WHITE).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_cherry_sign")); - public static final DeferredBlock SECRET_BAMBOO_SIGN = BLOCKS.registerBlock("secret_bamboo_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.BAMBOO), prop(MapColor.COLOR_YELLOW).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_bamboo_sign")); - public static final DeferredBlock SECRET_BAMBOO_WALL_SIGN = BLOCKS.registerBlock("secret_bamboo_sign_wall", p -> new SecretWallSignBlock(p, WoodType.BAMBOO), prop(MapColor.COLOR_YELLOW).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_bamboo_sign")); + public static final DeferredBlock SECRET_CHERRY_SIGN = secretStandingSign("secret_cherry_sign_standing", Blocks.CHERRY_SIGN, p -> p.overrideDescription("block.securitycraft.secret_cherry_sign")); + public static final DeferredBlock SECRET_CHERRY_WALL_SIGN = secretWallSign("secret_cherry_sign_wall", Blocks.CHERRY_SIGN, p -> p.overrideDescription("block.securitycraft.secret_cherry_sign")); + public static final DeferredBlock SECRET_BAMBOO_SIGN = secretStandingSign("secret_bamboo_sign_standing", Blocks.BAMBOO_SIGN, p -> p.overrideDescription("block.securitycraft.secret_bamboo_sign")); + public static final DeferredBlock SECRET_BAMBOO_WALL_SIGN = secretWallSign("secret_bamboo_sign_wall", Blocks.BAMBOO_SIGN, p -> p.overrideDescription("block.securitycraft.secret_bamboo_sign")); //hanging signs - public static final DeferredBlock SECRET_OAK_HANGING_SIGN = BLOCKS.registerBlock("secret_oak_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.OAK), prop(MapColor.WOOD).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_OAK_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_oak_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.OAK), prop(MapColor.WOOD).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_SPRUCE_HANGING_SIGN = BLOCKS.registerBlock("secret_spruce_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.SPRUCE), prop(MapColor.PODZOL).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_SPRUCE_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_spruce_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.SPRUCE), prop(MapColor.PODZOL).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_BIRCH_HANGING_SIGN = BLOCKS.registerBlock("secret_birch_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.BIRCH), prop(MapColor.SAND).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_BIRCH_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_birch_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.BIRCH), prop(MapColor.SAND).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_JUNGLE_HANGING_SIGN = BLOCKS.registerBlock("secret_jungle_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.JUNGLE), prop(MapColor.DIRT).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_JUNGLE_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_jungle_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.JUNGLE), prop(MapColor.DIRT).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_ACACIA_HANGING_SIGN = BLOCKS.registerBlock("secret_acacia_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.ACACIA), prop(MapColor.COLOR_ORANGE).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_ACACIA_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_acacia_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.ACACIA), prop(MapColor.COLOR_ORANGE).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_DARK_OAK_HANGING_SIGN = BLOCKS.registerBlock("secret_dark_oak_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.DARK_OAK), prop(MapColor.COLOR_BROWN).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_DARK_OAK_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_dark_oak_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.DARK_OAK), prop(MapColor.COLOR_BROWN).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_MANGROVE_HANGING_SIGN = BLOCKS.registerBlock("secret_mangrove_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.MANGROVE), prop(MapColor.COLOR_RED).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_MANGROVE_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_mangrove_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.MANGROVE), prop(MapColor.COLOR_RED).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_CHERRY_HANGING_SIGN = BLOCKS.registerBlock("secret_cherry_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.CHERRY), prop(MapColor.TERRACOTTA_PINK).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_CHERRY_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_cherry_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.CHERRY), prop(MapColor.TERRACOTTA_PINK).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_BAMBOO_HANGING_SIGN = BLOCKS.registerBlock("secret_bamboo_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.BAMBOO), prop(MapColor.COLOR_YELLOW).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_BAMBOO_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_bamboo_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.BAMBOO), prop(MapColor.COLOR_YELLOW).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_PALE_OAK_HANGING_SIGN = BLOCKS.registerBlock("secret_pale_oak_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.PALE_OAK), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_PALE_OAK_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_pale_oak_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.PALE_OAK), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_CRIMSON_HANGING_SIGN = BLOCKS.registerBlock("secret_crimson_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.CRIMSON), prop(MapColor.CRIMSON_STEM).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_CRIMSON_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_crimson_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.CRIMSON), prop(MapColor.CRIMSON_STEM).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_WARPED_HANGING_SIGN = BLOCKS.registerBlock("secret_warped_hanging_sign", p -> new SecretCeilingHangingSignBlock(p, WoodType.WARPED), prop(MapColor.WARPED_STEM).noCollission().forceSolidOn()); - public static final DeferredBlock SECRET_WARPED_WALL_HANGING_SIGN = BLOCKS.registerBlock("secret_warped_wall_hanging_sign", p -> new SecretWallHangingSignBlock(p, WoodType.WARPED), prop(MapColor.WARPED_STEM).noCollission().forceSolidOn()); + public static final DeferredBlock SECRET_OAK_HANGING_SIGN = secretCeilingHangingSign("secret_oak_hanging_sign", Blocks.OAK_HANGING_SIGN); + public static final DeferredBlock SECRET_OAK_WALL_HANGING_SIGN = secretWallHangingSign("secret_oak_wall_hanging_sign", Blocks.OAK_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_oak_hanging_sign")); + public static final DeferredBlock SECRET_SPRUCE_HANGING_SIGN = secretCeilingHangingSign("secret_spruce_hanging_sign", Blocks.SPRUCE_HANGING_SIGN); + public static final DeferredBlock SECRET_SPRUCE_WALL_HANGING_SIGN = secretWallHangingSign("secret_spruce_wall_hanging_sign", Blocks.SPRUCE_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_spruce_hanging_sign")); + public static final DeferredBlock SECRET_BIRCH_HANGING_SIGN = secretCeilingHangingSign("secret_birch_hanging_sign", Blocks.BIRCH_HANGING_SIGN); + public static final DeferredBlock SECRET_BIRCH_WALL_HANGING_SIGN = secretWallHangingSign("secret_birch_wall_hanging_sign", Blocks.BIRCH_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_birch_hanging_sign")); + public static final DeferredBlock SECRET_JUNGLE_HANGING_SIGN = secretCeilingHangingSign("secret_jungle_hanging_sign", Blocks.JUNGLE_HANGING_SIGN); + public static final DeferredBlock SECRET_JUNGLE_WALL_HANGING_SIGN = secretWallHangingSign("secret_jungle_wall_hanging_sign", Blocks.JUNGLE_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_jungle_hanging_sign")); + public static final DeferredBlock SECRET_ACACIA_HANGING_SIGN = secretCeilingHangingSign("secret_acacia_hanging_sign", Blocks.ACACIA_HANGING_SIGN); + public static final DeferredBlock SECRET_ACACIA_WALL_HANGING_SIGN = secretWallHangingSign("secret_acacia_wall_hanging_sign", Blocks.ACACIA_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_acacia_hanging_sign")); + public static final DeferredBlock SECRET_DARK_OAK_HANGING_SIGN = secretCeilingHangingSign("secret_dark_oak_hanging_sign", Blocks.DARK_OAK_HANGING_SIGN); + public static final DeferredBlock SECRET_DARK_OAK_WALL_HANGING_SIGN = secretWallHangingSign("secret_dark_oak_wall_hanging_sign", Blocks.DARK_OAK_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_dark_oak_hanging_sign")); + public static final DeferredBlock SECRET_MANGROVE_HANGING_SIGN = secretCeilingHangingSign("secret_mangrove_hanging_sign", Blocks.MANGROVE_HANGING_SIGN); + public static final DeferredBlock SECRET_MANGROVE_WALL_HANGING_SIGN = secretWallHangingSign("secret_mangrove_wall_hanging_sign", Blocks.MANGROVE_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_mangrove_hanging_sign")); + public static final DeferredBlock SECRET_CHERRY_HANGING_SIGN = secretCeilingHangingSign("secret_cherry_hanging_sign", Blocks.CHERRY_HANGING_SIGN); + public static final DeferredBlock SECRET_CHERRY_WALL_HANGING_SIGN = secretWallHangingSign("secret_cherry_wall_hanging_sign", Blocks.CHERRY_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_cherry_hanging_sign")); + public static final DeferredBlock SECRET_PALE_OAK_HANGING_SIGN = secretCeilingHangingSign("secret_pale_oak_hanging_sign", Blocks.PALE_OAK_HANGING_SIGN); + public static final DeferredBlock SECRET_PALE_OAK_WALL_HANGING_SIGN = secretWallHangingSign("secret_pale_oak_wall_hanging_sign", Blocks.PALE_OAK_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_pale_oak_hanging_sign")); + public static final DeferredBlock SECRET_BAMBOO_HANGING_SIGN = secretCeilingHangingSign("secret_bamboo_hanging_sign", Blocks.BAMBOO_HANGING_SIGN); + public static final DeferredBlock SECRET_BAMBOO_WALL_HANGING_SIGN = secretWallHangingSign("secret_bamboo_wall_hanging_sign", Blocks.BAMBOO_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_bamboo_hanging_sign")); + public static final DeferredBlock SECRET_CRIMSON_HANGING_SIGN = secretCeilingHangingSign("secret_crimson_hanging_sign", Blocks.CRIMSON_HANGING_SIGN); + public static final DeferredBlock SECRET_CRIMSON_WALL_HANGING_SIGN = secretWallHangingSign("secret_crimson_wall_hanging_sign", Blocks.CRIMSON_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_crimson_hanging_sign")); + public static final DeferredBlock SECRET_WARPED_HANGING_SIGN = secretCeilingHangingSign("secret_warped_hanging_sign", Blocks.WARPED_HANGING_SIGN); + public static final DeferredBlock SECRET_WARPED_WALL_HANGING_SIGN = secretWallHangingSign("secret_warped_wall_hanging_sign", Blocks.WARPED_HANGING_SIGN, p -> p.overrideDescription("block.securitycraft.secret_warped_hanging_sign")); //end hanging signs @HasManualPage @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_BOOKSHELF = BLOCKS.registerBlock("reinforced_chiseled_bookshelf", ReinforcedChiseledBookshelfBlock::new, prop(MapColor.WOOD).sound(SoundType.CHISELED_BOOKSHELF)); + public static final DeferredBlock REINFORCED_CHISELED_BOOKSHELF = reinforcedBlock("reinforced_chiseled_bookshelf", Blocks.CHISELED_BOOKSHELF, (p, b) -> new ReinforcedChiseledBookshelfBlock(p)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHERRY_LOG = BLOCKS.registerBlock("reinforced_cherry_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.CHERRY_LOG), logProp(MapColor.TERRACOTTA_WHITE, MapColor.TERRACOTTA_GRAY).sound(SoundType.CHERRY_WOOD)); + public static final DeferredBlock REINFORCED_CHERRY_LOG = reinforcedBlock("reinforced_cherry_log", Blocks.CHERRY_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHERRY_WOOD = BLOCKS.registerBlock("reinforced_cherry_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.CHERRY_WOOD), prop(MapColor.TERRACOTTA_GRAY).sound(SoundType.CHERRY_WOOD)); + public static final DeferredBlock REINFORCED_CHERRY_WOOD = reinforcedBlock("reinforced_cherry_wood", Blocks.CHERRY_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_CHERRY_LOG = BLOCKS.registerBlock("reinforced_stripped_cherry_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_CHERRY_LOG), logProp(MapColor.TERRACOTTA_WHITE, MapColor.TERRACOTTA_PINK).sound(SoundType.CHERRY_WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_CHERRY_LOG = reinforcedBlock("reinforced_stripped_cherry_log", Blocks.STRIPPED_CHERRY_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_CHERRY_WOOD = BLOCKS.registerBlock("reinforced_stripped_cherry_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_CHERRY_WOOD), prop(MapColor.TERRACOTTA_PINK).sound(SoundType.CHERRY_WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_CHERRY_WOOD = reinforcedBlock("reinforced_stripped_cherry_wood", Blocks.STRIPPED_CHERRY_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHERRY_PLANKS = BLOCKS.registerBlock("reinforced_cherry_planks", p -> new BaseReinforcedBlock(p, Blocks.CHERRY_PLANKS), prop(MapColor.TERRACOTTA_WHITE).sound(SoundType.CHERRY_WOOD)); + public static final DeferredBlock REINFORCED_CHERRY_PLANKS = reinforcedBlock("reinforced_cherry_planks", Blocks.CHERRY_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHERRY_STAIRS = BLOCKS.registerBlock("reinforced_cherry_stairs", p -> new ReinforcedStairsBlock(p, Blocks.CHERRY_STAIRS), prop(MapColor.TERRACOTTA_WHITE).sound(SoundType.CHERRY_WOOD)); + public static final DeferredBlock REINFORCED_CHERRY_STAIRS = reinforcedBlock("reinforced_cherry_stairs", Blocks.CHERRY_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHERRY_SLAB = BLOCKS.registerBlock("reinforced_cherry_slab", p -> new ReinforcedSlabBlock(p, Blocks.CHERRY_SLAB), prop(MapColor.TERRACOTTA_WHITE).sound(SoundType.CHERRY_WOOD)); + public static final DeferredBlock REINFORCED_CHERRY_SLAB = reinforcedBlock("reinforced_cherry_slab", Blocks.CHERRY_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.PRESSURE_PLATES) @Reinforced public static final DeferredBlock REINFORCED_CHERRY_PRESSURE_PLATE = woodenPressurePlate("reinforced_cherry_pressure_plate", Blocks.CHERRY_PRESSURE_PLATE, BlockSetType.CHERRY); @@ -2474,303 +2472,303 @@ public class SCContent { @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OAK_FENCE = BLOCKS.registerBlock("reinforced_oak_fence", p -> new ReinforcedFenceBlock(p, Blocks.OAK_FENCE), prop(Blocks.OAK_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_OAK_FENCE = reinforcedBlock("reinforced_oak_fence", Blocks.OAK_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_SPRUCE_FENCE = BLOCKS.registerBlock("reinforced_spruce_fence", p -> new ReinforcedFenceBlock(p, Blocks.SPRUCE_FENCE), prop(Blocks.SPRUCE_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_SPRUCE_FENCE = reinforcedBlock("reinforced_spruce_fence", Blocks.SPRUCE_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BIRCH_FENCE = BLOCKS.registerBlock("reinforced_birch_fence", p -> new ReinforcedFenceBlock(p, Blocks.BIRCH_FENCE), prop(Blocks.BIRCH_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_BIRCH_FENCE = reinforcedBlock("reinforced_birch_fence", Blocks.BIRCH_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_JUNGLE_FENCE = BLOCKS.registerBlock("reinforced_jungle_fence", p -> new ReinforcedFenceBlock(p, Blocks.JUNGLE_FENCE), prop(Blocks.JUNGLE_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_JUNGLE_FENCE = reinforcedBlock("reinforced_jungle_fence", Blocks.JUNGLE_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_ACACIA_FENCE = BLOCKS.registerBlock("reinforced_acacia_fence", p -> new ReinforcedFenceBlock(p, Blocks.ACACIA_FENCE), prop(Blocks.ACACIA_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_ACACIA_FENCE = reinforcedBlock("reinforced_acacia_fence", Blocks.ACACIA_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DARK_OAK_FENCE = BLOCKS.registerBlock("reinforced_dark_oak_fence", p -> new ReinforcedFenceBlock(p, Blocks.DARK_OAK_FENCE), prop(Blocks.DARK_OAK_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_DARK_OAK_FENCE = reinforcedBlock("reinforced_dark_oak_fence", Blocks.DARK_OAK_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_MANGROVE_FENCE = BLOCKS.registerBlock("reinforced_mangrove_fence", p -> new ReinforcedFenceBlock(p, Blocks.MANGROVE_FENCE), prop(Blocks.MANGROVE_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_MANGROVE_FENCE = reinforcedBlock("reinforced_mangrove_fence", Blocks.MANGROVE_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHERRY_FENCE = BLOCKS.registerBlock("reinforced_cherry_fence", p -> new ReinforcedFenceBlock(p, Blocks.CHERRY_FENCE), prop(Blocks.CHERRY_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.CHERRY_WOOD)); + public static final DeferredBlock REINFORCED_CHERRY_FENCE = reinforcedBlock("reinforced_cherry_fence", Blocks.CHERRY_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_FENCE = BLOCKS.registerBlock("reinforced_pale_oak_fence", p -> new ReinforcedFenceBlock(p, Blocks.PALE_OAK_FENCE), prop(Blocks.PALE_OAK_PLANKS.defaultMapColor(), FeatureFlags.WINTER_DROP).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_PALE_OAK_FENCE = reinforcedBlock("reinforced_pale_oak_fence", Blocks.PALE_OAK_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_FENCE = BLOCKS.registerBlock("reinforced_bamboo_fence", p -> new ReinforcedFenceBlock(p, Blocks.BAMBOO_FENCE), prop(Blocks.BAMBOO_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.BAMBOO_WOOD)); + public static final DeferredBlock REINFORCED_BAMBOO_FENCE = reinforcedBlock("reinforced_bamboo_fence", Blocks.BAMBOO_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CRIMSON_FENCE = BLOCKS.registerBlock("reinforced_crimson_fence", p -> new ReinforcedFenceBlock(p, Blocks.CRIMSON_FENCE), prop(Blocks.CRIMSON_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.NETHER_WOOD)); + public static final DeferredBlock REINFORCED_CRIMSON_FENCE = reinforcedBlock("reinforced_crimson_fence", Blocks.CRIMSON_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WARPED_FENCE = BLOCKS.registerBlock("reinforced_warped_fence", p -> new ReinforcedFenceBlock(p, Blocks.WARPED_FENCE), prop(Blocks.WARPED_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).sound(SoundType.NETHER_WOOD)); + public static final DeferredBlock REINFORCED_WARPED_FENCE = reinforcedBlock("reinforced_warped_fence", Blocks.WARPED_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_NETHER_BRICK_FENCE = BLOCKS.registerBlock("reinforced_nether_brick_fence", p -> new ReinforcedFenceBlock(p, Blocks.NETHER_BRICK_FENCE), prop(MapColor.NETHER).instrument(NoteBlockInstrument.BASEDRUM).sound(SoundType.NETHER_BRICKS)); + public static final DeferredBlock REINFORCED_NETHER_BRICK_FENCE = reinforcedBlock("reinforced_nether_brick_fence", Blocks.NETHER_BRICK_FENCE, ReinforcedFenceBlock::new); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_OAK_FENCE_GATE = BLOCKS.registerBlock("reinforced_oak_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.OAK, Blocks.OAK_FENCE_GATE), prop(Blocks.OAK_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_OAK_FENCE_GATE = reinforcedFenceGateBlock("reinforced_oak_fence_gate", Blocks.OAK_FENCE_GATE, WoodType.OAK); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_SPRUCE_FENCE_GATE = BLOCKS.registerBlock("reinforced_spruce_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.SPRUCE, Blocks.SPRUCE_FENCE_GATE), prop(Blocks.SPRUCE_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_SPRUCE_FENCE_GATE = reinforcedFenceGateBlock("reinforced_spruce_fence_gate", Blocks.SPRUCE_FENCE_GATE, WoodType.SPRUCE); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_BIRCH_FENCE_GATE = BLOCKS.registerBlock("reinforced_birch_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.BIRCH, Blocks.BIRCH_FENCE_GATE), prop(Blocks.BIRCH_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_BIRCH_FENCE_GATE = reinforcedFenceGateBlock("reinforced_birch_fence_gate", Blocks.BIRCH_FENCE_GATE, WoodType.BIRCH); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_JUNGLE_FENCE_GATE = BLOCKS.registerBlock("reinforced_jungle_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.JUNGLE, Blocks.JUNGLE_FENCE_GATE), prop(Blocks.JUNGLE_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_JUNGLE_FENCE_GATE = reinforcedFenceGateBlock("reinforced_jungle_fence_gate", Blocks.JUNGLE_FENCE_GATE, WoodType.JUNGLE); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_ACACIA_FENCE_GATE = BLOCKS.registerBlock("reinforced_acacia_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.ACACIA, Blocks.ACACIA_FENCE_GATE), prop(Blocks.ACACIA_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_ACACIA_FENCE_GATE = reinforcedFenceGateBlock("reinforced_acacia_fence_gate", Blocks.ACACIA_FENCE_GATE, WoodType.ACACIA); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_DARK_OAK_FENCE_GATE = BLOCKS.registerBlock("reinforced_dark_oak_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.DARK_OAK, Blocks.DARK_OAK_FENCE_GATE), prop(Blocks.DARK_OAK_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_DARK_OAK_FENCE_GATE = reinforcedFenceGateBlock("reinforced_dark_oak_fence_gate", Blocks.DARK_OAK_FENCE_GATE, WoodType.DARK_OAK); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_MANGROVE_FENCE_GATE = BLOCKS.registerBlock("reinforced_mangrove_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.MANGROVE, Blocks.MANGROVE_FENCE_GATE), prop(Blocks.MANGROVE_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_MANGROVE_FENCE_GATE = reinforcedFenceGateBlock("reinforced_mangrove_fence_gate", Blocks.MANGROVE_FENCE_GATE, WoodType.MANGROVE); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_CHERRY_FENCE_GATE = BLOCKS.registerBlock("reinforced_cherry_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.CHERRY, Blocks.CHERRY_FENCE_GATE), prop(Blocks.CHERRY_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_CHERRY_FENCE_GATE = reinforcedFenceGateBlock("reinforced_cherry_fence_gate", Blocks.CHERRY_FENCE_GATE, WoodType.CHERRY); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_FENCE_GATE = BLOCKS.registerBlock("reinforced_pale_oak_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.PALE_OAK, Blocks.PALE_OAK_FENCE_GATE), prop(Blocks.PALE_OAK_PLANKS.defaultMapColor(), FeatureFlags.WINTER_DROP).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_PALE_OAK_FENCE_GATE = reinforcedFenceGateBlock("reinforced_pale_oak_fence_gate", Blocks.PALE_OAK_FENCE_GATE, WoodType.PALE_OAK); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_BAMBOO_FENCE_GATE = BLOCKS.registerBlock("reinforced_bamboo_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.BAMBOO, Blocks.BAMBOO_FENCE_GATE), prop(Blocks.BAMBOO_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_BAMBOO_FENCE_GATE = reinforcedFenceGateBlock("reinforced_bamboo_fence_gate", Blocks.BAMBOO_FENCE_GATE, WoodType.BAMBOO); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_CRIMSON_FENCE_GATE = BLOCKS.registerBlock("reinforced_crimson_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.CRIMSON, Blocks.CRIMSON_FENCE_GATE), prop(Blocks.CRIMSON_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_CRIMSON_FENCE_GATE = reinforcedFenceGateBlock("reinforced_crimson_fence_gate", Blocks.CRIMSON_FENCE_GATE, WoodType.CRIMSON); @HasManualPage(PageGroup.FENCE_GATES) @Reinforced - public static final DeferredBlock REINFORCED_WARPED_FENCE_GATE = BLOCKS.registerBlock("reinforced_warped_fence_gate", p -> new ReinforcedFenceGateBlock(p, WoodType.WARPED, Blocks.WARPED_FENCE_GATE), prop(Blocks.WARPED_PLANKS.defaultMapColor()).instrument(NoteBlockInstrument.BASS).forceSolidOn()); + public static final DeferredBlock REINFORCED_WARPED_FENCE_GATE = reinforcedFenceGateBlock("reinforced_warped_fence_gate", Blocks.WARPED_FENCE_GATE, WoodType.WARPED); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_COPPER = BLOCKS.registerBlock("reinforced_chiseled_copper", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_COPPER), prop(MapColor.COLOR_ORANGE).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_CHISELED_COPPER = reinforcedBlock("reinforced_chiseled_copper", Blocks.CHISELED_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_EXPOSED_CHISELED_COPPER = BLOCKS.registerBlock("reinforced_exposed_chiseled_copper", p -> new BaseReinforcedBlock(p, Blocks.EXPOSED_CHISELED_COPPER), prop(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_EXPOSED_CHISELED_COPPER = reinforcedBlock("reinforced_exposed_chiseled_copper", Blocks.EXPOSED_CHISELED_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WEATHERED_CHISELED_COPPER = BLOCKS.registerBlock("reinforced_weathered_chiseled_copper", p -> new BaseReinforcedBlock(p, Blocks.WEATHERED_CHISELED_COPPER), prop(MapColor.WARPED_STEM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_WEATHERED_CHISELED_COPPER = reinforcedBlock("reinforced_weathered_chiseled_copper", Blocks.WEATHERED_CHISELED_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OXIDIZED_CHISELED_COPPER = BLOCKS.registerBlock("reinforced_oxidized_chiseled_copper", p -> new BaseReinforcedBlock(p, Blocks.OXIDIZED_CHISELED_COPPER), prop(MapColor.WARPED_NYLIUM).sound(SoundType.COPPER)); + public static final DeferredBlock REINFORCED_OXIDIZED_CHISELED_COPPER = reinforcedBlock("reinforced_oxidized_chiseled_copper", Blocks.OXIDIZED_CHISELED_COPPER); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COPPER_GRATE = BLOCKS.registerBlock("reinforced_copper_grate", p -> new ReinforcedCopperGrateBlock(p, Blocks.COPPER_GRATE), reinforcedCopy(Blocks.COPPER_GRATE)); + public static final DeferredBlock REINFORCED_COPPER_GRATE = reinforcedBlock("reinforced_copper_grate", Blocks.COPPER_GRATE, ReinforcedCopperGrateBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_EXPOSED_COPPER_GRATE = BLOCKS.registerBlock("reinforced_exposed_copper_grate", p -> new ReinforcedCopperGrateBlock(p, Blocks.EXPOSED_COPPER_GRATE), reinforcedCopy(Blocks.EXPOSED_COPPER_GRATE)); + public static final DeferredBlock REINFORCED_EXPOSED_COPPER_GRATE = reinforcedBlock("reinforced_exposed_copper_grate", Blocks.EXPOSED_COPPER_GRATE, ReinforcedCopperGrateBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WEATHERED_COPPER_GRATE = BLOCKS.registerBlock("reinforced_weathered_copper_grate", p -> new ReinforcedCopperGrateBlock(p, Blocks.WEATHERED_COPPER_GRATE), reinforcedCopy(Blocks.WEATHERED_COPPER_GRATE)); + public static final DeferredBlock REINFORCED_WEATHERED_COPPER_GRATE = reinforcedBlock("reinforced_weathered_copper_grate", Blocks.WEATHERED_COPPER_GRATE, ReinforcedCopperGrateBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OXIDIZED_COPPER_GRATE = BLOCKS.registerBlock("reinforced_oxidized_copper_grate", p -> new ReinforcedCopperGrateBlock(p, Blocks.OXIDIZED_COPPER_GRATE), reinforcedCopy(Blocks.OXIDIZED_COPPER_GRATE)); + public static final DeferredBlock REINFORCED_OXIDIZED_COPPER_GRATE = reinforcedBlock("reinforced_oxidized_copper_grate", Blocks.OXIDIZED_COPPER_GRATE, ReinforcedCopperGrateBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_COPPER_BULB = BLOCKS.registerBlock("reinforced_copper_bulb", p -> new ReinforcedCopperBulbBlock(p, Blocks.COPPER_BULB), reinforcedCopy(Blocks.COPPER_BULB)); + public static final DeferredBlock REINFORCED_COPPER_BULB = reinforcedBlock("reinforced_copper_bulb", Blocks.COPPER_BULB, ReinforcedCopperBulbBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_EXPOSED_COPPER_BULB = BLOCKS.registerBlock("reinforced_exposed_copper_bulb", p -> new ReinforcedCopperBulbBlock(p, Blocks.EXPOSED_COPPER_BULB), reinforcedCopy(Blocks.EXPOSED_COPPER_BULB)); + public static final DeferredBlock REINFORCED_EXPOSED_COPPER_BULB = reinforcedBlock("reinforced_exposed_copper_bulb", Blocks.EXPOSED_COPPER_BULB, ReinforcedCopperBulbBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_WEATHERED_COPPER_BULB = BLOCKS.registerBlock("reinforced_weathered_copper_bulb", p -> new ReinforcedCopperBulbBlock(p, Blocks.WEATHERED_COPPER_BULB), reinforcedCopy(Blocks.WEATHERED_COPPER_BULB)); + public static final DeferredBlock REINFORCED_WEATHERED_COPPER_BULB = reinforcedBlock("reinforced_weathered_copper_bulb", Blocks.WEATHERED_COPPER_BULB, ReinforcedCopperBulbBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_OXIDIZED_COPPER_BULB = BLOCKS.registerBlock("reinforced_oxidized_copper_bulb", p -> new ReinforcedCopperBulbBlock(p, Blocks.OXIDIZED_COPPER_BULB), reinforcedCopy(Blocks.OXIDIZED_COPPER_BULB)); + public static final DeferredBlock REINFORCED_OXIDIZED_COPPER_BULB = reinforcedBlock("reinforced_oxidized_copper_bulb", Blocks.OXIDIZED_COPPER_BULB, ReinforcedCopperBulbBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_TUFF = BLOCKS.registerBlock("reinforced_chiseled_tuff", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_TUFF), reinforcedCopy(Blocks.CHISELED_TUFF)); + public static final DeferredBlock REINFORCED_CHISELED_TUFF = reinforcedBlock("reinforced_chiseled_tuff", Blocks.CHISELED_TUFF); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TUFF_STAIRS = BLOCKS.registerBlock("reinforced_tuff_stairs", p -> new ReinforcedStairsBlock(p, Blocks.TUFF_STAIRS), reinforcedCopy(Blocks.TUFF_STAIRS)); + public static final DeferredBlock REINFORCED_TUFF_STAIRS = reinforcedBlock("reinforced_tuff_stairs", Blocks.TUFF_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TUFF_SLAB = BLOCKS.registerBlock("reinforced_tuff_slab", p -> new ReinforcedSlabBlock(p, Blocks.TUFF_SLAB), reinforcedCopy(Blocks.TUFF_SLAB)); + public static final DeferredBlock REINFORCED_TUFF_SLAB = reinforcedBlock("reinforced_tuff_slab", Blocks.TUFF_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TUFF_WALL = BLOCKS.registerBlock("reinforced_tuff_wall", p -> new ReinforcedWallBlock(p, Blocks.TUFF_WALL), reinforcedCopy(Blocks.TUFF_WALL)); + public static final DeferredBlock REINFORCED_TUFF_WALL = reinforcedBlock("reinforced_tuff_wall", Blocks.TUFF_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_TUFF = BLOCKS.registerBlock("reinforced_polished_tuff", p -> new BaseReinforcedBlock(p, Blocks.POLISHED_TUFF), reinforcedCopy(Blocks.POLISHED_TUFF)); + public static final DeferredBlock REINFORCED_POLISHED_TUFF = reinforcedBlock("reinforced_polished_tuff", Blocks.POLISHED_TUFF); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_TUFF_STAIRS = BLOCKS.registerBlock("reinforced_polished_tuff_stairs", p -> new ReinforcedStairsBlock(p, Blocks.POLISHED_TUFF_STAIRS), reinforcedCopy(Blocks.POLISHED_TUFF_STAIRS)); + public static final DeferredBlock REINFORCED_POLISHED_TUFF_STAIRS = reinforcedBlock("reinforced_polished_tuff_stairs", Blocks.POLISHED_TUFF_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_TUFF_SLAB = BLOCKS.registerBlock("reinforced_polished_tuff_slab", p -> new ReinforcedSlabBlock(p, Blocks.POLISHED_TUFF_SLAB), reinforcedCopy(Blocks.POLISHED_TUFF_SLAB)); + public static final DeferredBlock REINFORCED_POLISHED_TUFF_SLAB = reinforcedBlock("reinforced_polished_tuff_slab", Blocks.POLISHED_TUFF_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_POLISHED_TUFF_WALL = BLOCKS.registerBlock("reinforced_polished_tuff_wall", p -> new ReinforcedWallBlock(p, Blocks.POLISHED_TUFF_WALL), reinforcedCopy(Blocks.POLISHED_TUFF_WALL)); + public static final DeferredBlock REINFORCED_POLISHED_TUFF_WALL = reinforcedBlock("reinforced_polished_tuff_wall", Blocks.POLISHED_TUFF_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TUFF_BRICKS = BLOCKS.registerBlock("reinforced_tuff_bricks", p -> new BaseReinforcedBlock(p, Blocks.TUFF_BRICKS), reinforcedCopy(Blocks.TUFF_BRICKS)); + public static final DeferredBlock REINFORCED_TUFF_BRICKS = reinforcedBlock("reinforced_tuff_bricks", Blocks.TUFF_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TUFF_BRICK_STAIRS = BLOCKS.registerBlock("reinforced_tuff_brick_stairs", p -> new ReinforcedStairsBlock(p, Blocks.TUFF_BRICK_STAIRS), reinforcedCopy(Blocks.TUFF_BRICK_STAIRS)); + public static final DeferredBlock REINFORCED_TUFF_BRICK_STAIRS = reinforcedBlock("reinforced_tuff_brick_stairs", Blocks.TUFF_BRICK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TUFF_BRICK_SLAB = BLOCKS.registerBlock("reinforced_tuff_brick_slab", p -> new ReinforcedSlabBlock(p, Blocks.TUFF_BRICK_SLAB), reinforcedCopy(Blocks.TUFF_BRICK_SLAB)); + public static final DeferredBlock REINFORCED_TUFF_BRICK_SLAB = reinforcedBlock("reinforced_tuff_brick_slab", Blocks.TUFF_BRICK_SLAB, ReinforcedSlabBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_TUFF_BRICK_WALL = BLOCKS.registerBlock("reinforced_tuff_brick_wall", p -> new ReinforcedWallBlock(p, Blocks.TUFF_BRICK_WALL), reinforcedCopy(Blocks.TUFF_BRICK_WALL)); + public static final DeferredBlock REINFORCED_TUFF_BRICK_WALL = reinforcedBlock("reinforced_tuff_brick_wall", Blocks.TUFF_BRICK_WALL, ReinforcedWallBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_CHISELED_TUFF_BRICKS = BLOCKS.registerBlock("reinforced_chiseled_tuff_bricks", p -> new BaseReinforcedBlock(p, Blocks.CHISELED_TUFF_BRICKS), reinforcedCopy(Blocks.CHISELED_TUFF_BRICKS)); + public static final DeferredBlock REINFORCED_CHISELED_TUFF_BRICKS = reinforcedBlock("reinforced_chiseled_tuff_bricks", Blocks.CHISELED_TUFF_BRICKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_LOG = BLOCKS.registerBlock("reinforced_pale_oak_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.PALE_OAK_LOG), logProp(MapColor.QUARTZ, MapColor.STONE, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_PALE_OAK_LOG = reinforcedBlock("reinforced_pale_oak_log", Blocks.PALE_OAK_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_PALE_OAK_LOG = BLOCKS.registerBlock("reinforced_stripped_pale_oak_log", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_PALE_OAK_LOG), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_PALE_OAK_LOG = reinforcedBlock("reinforced_stripped_pale_oak_log", Blocks.STRIPPED_PALE_OAK_LOG, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_STRIPPED_PALE_OAK_WOOD = BLOCKS.registerBlock("reinforced_stripped_pale_oak_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.STRIPPED_PALE_OAK_WOOD), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_STRIPPED_PALE_OAK_WOOD = reinforcedBlock("reinforced_stripped_pale_oak_wood", Blocks.STRIPPED_PALE_OAK_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_WOOD = BLOCKS.registerBlock("reinforced_pale_oak_wood", p -> new ReinforcedRotatedPillarBlock(p, Blocks.PALE_OAK_WOOD), prop(MapColor.STONE, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_PALE_OAK_WOOD = reinforcedBlock("reinforced_pale_oak_wood", Blocks.PALE_OAK_WOOD, ReinforcedRotatedPillarBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_PLANKS = BLOCKS.registerBlock("reinforced_pale_oak_planks", p -> new BaseReinforcedBlock(p, Blocks.PALE_OAK_PLANKS), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_PALE_OAK_PLANKS = reinforcedBlock("reinforced_pale_oak_planks", Blocks.PALE_OAK_PLANKS); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_STAIRS = BLOCKS.registerBlock("reinforced_pale_oak_stairs", p -> new ReinforcedStairsBlock(p, Blocks.PALE_OAK_STAIRS), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD)); + public static final DeferredBlock REINFORCED_PALE_OAK_STAIRS = reinforcedBlock("reinforced_pale_oak_stairs", Blocks.PALE_OAK_STAIRS, ReinforcedStairsBlock::new); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_SLAB = BLOCKS.registerBlock("reinforced_pale_oak_slab", p -> new ReinforcedSlabBlock(p, Blocks.PALE_OAK_SLAB), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD)); - public static final DeferredBlock SECRET_PALE_OAK_SIGN = BLOCKS.registerBlock("secret_pale_oak_sign_standing", p -> new SecretStandingSignBlock(p, WoodType.PALE_OAK), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_pale_oak_sign")); - public static final DeferredBlock SECRET_PALE_OAK_WALL_SIGN = BLOCKS.registerBlock("secret_pale_oak_sign_wall", p -> new SecretWallSignBlock(p, WoodType.PALE_OAK), prop(MapColor.QUARTZ, FeatureFlags.WINTER_DROP).sound(SoundType.WOOD).noCollission().forceSolidOn().overrideDescription("block.securitycraft.secret_pale_oak_sign")); + public static final DeferredBlock REINFORCED_PALE_OAK_SLAB = reinforcedBlock("reinforced_pale_oak_slab", Blocks.PALE_OAK_SLAB, ReinforcedSlabBlock::new); + public static final DeferredBlock SECRET_PALE_OAK_SIGN = secretStandingSign("secret_pale_oak_sign_standing", Blocks.PALE_OAK_SIGN, p -> p.overrideDescription("block.securitycraft.secret_pale_oak_sign")); + public static final DeferredBlock SECRET_PALE_OAK_WALL_SIGN = secretWallSign("secret_pale_oak_sign_wall", Blocks.PALE_OAK_SIGN, p -> p.overrideDescription("block.securitycraft.secret_pale_oak_sign")); @HasManualPage(PageGroup.BUTTONS) @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_BUTTON = woodenButton("reinforced_pale_oak_button", Blocks.PALE_OAK_BUTTON, BlockSetType.PALE_OAK, FeatureFlags.WINTER_DROP); + public static final DeferredBlock REINFORCED_PALE_OAK_BUTTON = woodenButton("reinforced_pale_oak_button", Blocks.PALE_OAK_BUTTON, BlockSetType.PALE_OAK); @HasManualPage(PageGroup.PRESSURE_PLATES) @Reinforced - public static final DeferredBlock REINFORCED_PALE_OAK_PRESSURE_PLATE = woodenPressurePlate("reinforced_pale_oak_pressure_plate", Blocks.PALE_OAK_PRESSURE_PLATE, BlockSetType.PALE_OAK, FeatureFlags.WINTER_DROP); + public static final DeferredBlock REINFORCED_PALE_OAK_PRESSURE_PLATE = woodenPressurePlate("reinforced_pale_oak_pressure_plate", Blocks.PALE_OAK_PRESSURE_PLATE, BlockSetType.PALE_OAK); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PALE_MOSS_CARPET = BLOCKS.registerBlock("reinforced_pale_moss_carpet", p -> new ReinforcedMossyCarpetBlock(p, Blocks.PALE_MOSS_CARPET), reinforcedCopy(Blocks.PALE_MOSS_CARPET).pushReaction(PushReaction.NORMAL).forceSolidOn()); + public static final DeferredBlock REINFORCED_PALE_MOSS_CARPET = reinforcedBlock("reinforced_pale_moss_carpet", Blocks.PALE_MOSS_CARPET, ReinforcedMossyCarpetBlock::new, p -> p.pushReaction(PushReaction.NORMAL)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_PALE_MOSS_BLOCK = BLOCKS.registerBlock("reinforced_pale_moss_block", p -> new BaseReinforcedBlock(p, Blocks.PALE_MOSS_BLOCK), reinforcedCopy(Blocks.PALE_MOSS_BLOCK).pushReaction(PushReaction.NORMAL)); + public static final DeferredBlock REINFORCED_PALE_MOSS_BLOCK = reinforcedBlock("reinforced_pale_moss_block", Blocks.PALE_MOSS_BLOCK, p -> p.pushReaction(PushReaction.NORMAL)); //misc @RegisterItemBlock - public static final DeferredBlock CRYSTAL_QUARTZ_SLAB = BLOCKS.registerBlock("crystal_quartz_slab", SlabBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(2.0F, 6.0F).requiresCorrectToolForDrops()); + public static final DeferredBlock CRYSTAL_QUARTZ_SLAB = BLOCKS.registerBlock("crystal_quartz_slab", SlabBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_SLAB).mapColor(MapColor.COLOR_CYAN)); @RegisterItemBlock - public static final DeferredBlock SMOOTH_CRYSTAL_QUARTZ = BLOCKS.registerSimpleBlock("smooth_crystal_quartz", BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(2.0F, 6.0F).requiresCorrectToolForDrops()); + public static final DeferredBlock SMOOTH_CRYSTAL_QUARTZ = BLOCKS.registerSimpleBlock("smooth_crystal_quartz", BlockBehaviour.Properties.ofFullCopy(Blocks.SMOOTH_QUARTZ).mapColor(MapColor.COLOR_CYAN)); @RegisterItemBlock - public static final DeferredBlock CHISELED_CRYSTAL_QUARTZ = BLOCKS.registerSimpleBlock("chiseled_crystal_quartz", BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(0.8F).requiresCorrectToolForDrops()); + public static final DeferredBlock CHISELED_CRYSTAL_QUARTZ = BLOCKS.registerSimpleBlock("chiseled_crystal_quartz", BlockBehaviour.Properties.ofFullCopy(Blocks.CHISELED_QUARTZ_BLOCK).mapColor(MapColor.COLOR_CYAN)); @HasManualPage @RegisterItemBlock - public static final DeferredBlock CRYSTAL_QUARTZ_BLOCK = BLOCKS.registerSimpleBlock("crystal_quartz", BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(0.8F).requiresCorrectToolForDrops()); + public static final DeferredBlock CRYSTAL_QUARTZ_BLOCK = BLOCKS.registerSimpleBlock("crystal_quartz", BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_BLOCK).mapColor(MapColor.COLOR_CYAN)); @RegisterItemBlock - public static final DeferredBlock CRYSTAL_QUARTZ_BRICKS = BLOCKS.registerSimpleBlock("crystal_quartz_bricks", BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(0.8F).requiresCorrectToolForDrops()); + public static final DeferredBlock CRYSTAL_QUARTZ_BRICKS = BLOCKS.registerSimpleBlock("crystal_quartz_bricks", BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_BRICKS).mapColor(MapColor.COLOR_CYAN)); @RegisterItemBlock - public static final DeferredBlock CRYSTAL_QUARTZ_PILLAR = BLOCKS.registerBlock("crystal_quartz_pillar", RotatedPillarBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(0.8F).requiresCorrectToolForDrops()); + public static final DeferredBlock CRYSTAL_QUARTZ_PILLAR = BLOCKS.registerBlock("crystal_quartz_pillar", RotatedPillarBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_PILLAR).mapColor(MapColor.COLOR_CYAN)); @RegisterItemBlock - public static final DeferredBlock CRYSTAL_QUARTZ_STAIRS = BLOCKS.registerBlock("crystal_quartz_stairs", p -> new StairBlock(CRYSTAL_QUARTZ_BLOCK.get().defaultBlockState(), p), BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(0.8F).requiresCorrectToolForDrops()); + public static final DeferredBlock CRYSTAL_QUARTZ_STAIRS = BLOCKS.registerBlock("crystal_quartz_stairs", p -> new StairBlock(CRYSTAL_QUARTZ_BLOCK.get().defaultBlockState(), p), BlockBehaviour.Properties.ofFullCopy(Blocks.QUARTZ_STAIRS).mapColor(MapColor.COLOR_CYAN)); @RegisterItemBlock - public static final DeferredBlock SMOOTH_CRYSTAL_QUARTZ_STAIRS = BLOCKS.registerBlock("smooth_crystal_quartz_stairs", p -> new StairBlock(SMOOTH_CRYSTAL_QUARTZ.get().defaultBlockState(), p), BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(2.0F, 6.0F).requiresCorrectToolForDrops()); + public static final DeferredBlock SMOOTH_CRYSTAL_QUARTZ_STAIRS = BLOCKS.registerBlock("smooth_crystal_quartz_stairs", p -> new StairBlock(SMOOTH_CRYSTAL_QUARTZ.get().defaultBlockState(), p), BlockBehaviour.Properties.ofFullCopy(Blocks.SMOOTH_QUARTZ_STAIRS).mapColor(MapColor.COLOR_CYAN)); @RegisterItemBlock - public static final DeferredBlock SMOOTH_CRYSTAL_QUARTZ_SLAB = BLOCKS.registerBlock("smooth_crystal_quartz_slab", SlabBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_CYAN).strength(2.0F, 6.0F).requiresCorrectToolForDrops()); + public static final DeferredBlock SMOOTH_CRYSTAL_QUARTZ_SLAB = BLOCKS.registerBlock("smooth_crystal_quartz_slab", SlabBlock::new, BlockBehaviour.Properties.ofFullCopy(Blocks.SMOOTH_QUARTZ_SLAB).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_SLAB = BLOCKS.registerBlock("reinforced_crystal_quartz_slab", p -> new ReinforcedSlabBlock(p, SCContent.CRYSTAL_QUARTZ_SLAB), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_SLAB = BLOCKS.registerBlock("reinforced_crystal_quartz_slab", p -> new ReinforcedSlabBlock(p, SCContent.CRYSTAL_QUARTZ_SLAB), reinforcedCopy(Blocks.QUARTZ_SLAB).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_SMOOTH_CRYSTAL_QUARTZ = BLOCKS.registerBlock("reinforced_smooth_crystal_quartz", p -> new BaseReinforcedBlock(p, SCContent.SMOOTH_CRYSTAL_QUARTZ), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_SMOOTH_CRYSTAL_QUARTZ = BLOCKS.registerBlock("reinforced_smooth_crystal_quartz", p -> new BaseReinforcedBlock(p, SCContent.SMOOTH_CRYSTAL_QUARTZ), reinforcedCopy(Blocks.SMOOTH_QUARTZ).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_CHISELED_CRYSTAL_QUARTZ = BLOCKS.registerBlock("reinforced_chiseled_crystal_quartz_block", p -> new BlockPocketBlock(p, SCContent.CHISELED_CRYSTAL_QUARTZ), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_CHISELED_CRYSTAL_QUARTZ = BLOCKS.registerBlock("reinforced_chiseled_crystal_quartz_block", p -> new BlockPocketBlock(p, SCContent.CHISELED_CRYSTAL_QUARTZ), reinforcedCopy(Blocks.CHISELED_QUARTZ_BLOCK).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_BLOCK = BLOCKS.registerBlock("reinforced_crystal_quartz_block", p -> new BlockPocketBlock(p, SCContent.CRYSTAL_QUARTZ_BLOCK), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_BLOCK = BLOCKS.registerBlock("reinforced_crystal_quartz_block", p -> new BlockPocketBlock(p, SCContent.CRYSTAL_QUARTZ_BLOCK), reinforcedCopy(Blocks.QUARTZ_BLOCK).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_BRICKS = BLOCKS.registerBlock("reinforced_crystal_quartz_bricks", p -> new BaseReinforcedBlock(p, SCContent.CRYSTAL_QUARTZ_BRICKS), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_BRICKS = BLOCKS.registerBlock("reinforced_crystal_quartz_bricks", p -> new BaseReinforcedBlock(p, SCContent.CRYSTAL_QUARTZ_BRICKS), reinforcedCopy(Blocks.QUARTZ_BRICKS).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_PILLAR = BLOCKS.registerBlock("reinforced_crystal_quartz_pillar", p -> new ReinforcedRotatedCrystalQuartzPillar(p, SCContent.CRYSTAL_QUARTZ_PILLAR), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_PILLAR = BLOCKS.registerBlock("reinforced_crystal_quartz_pillar", p -> new ReinforcedRotatedCrystalQuartzPillar(p, SCContent.CRYSTAL_QUARTZ_PILLAR), reinforcedCopy(Blocks.QUARTZ_PILLAR).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_STAIRS = BLOCKS.registerBlock("reinforced_crystal_quartz_stairs", p -> new ReinforcedStairsBlock(p, SCContent.CRYSTAL_QUARTZ_STAIRS), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_CRYSTAL_QUARTZ_STAIRS = BLOCKS.registerBlock("reinforced_crystal_quartz_stairs", p -> new ReinforcedStairsBlock(p, SCContent.CRYSTAL_QUARTZ_STAIRS), reinforcedCopy(Blocks.QUARTZ_STAIRS).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_SMOOTH_CRYSTAL_QUARTZ_STAIRS = BLOCKS.registerBlock("reinforced_smooth_crystal_quartz_stairs", p -> new ReinforcedStairsBlock(p, SCContent.SMOOTH_CRYSTAL_QUARTZ_STAIRS), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_SMOOTH_CRYSTAL_QUARTZ_STAIRS = BLOCKS.registerBlock("reinforced_smooth_crystal_quartz_stairs", p -> new ReinforcedStairsBlock(p, SCContent.SMOOTH_CRYSTAL_QUARTZ_STAIRS), reinforcedCopy(Blocks.SMOOTH_QUARTZ_STAIRS).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced(customTint = CRYSTAL_QUARTZ_TINT, itemGroup = SCItemGroup.MANUAL) - public static final DeferredBlock REINFORCED_SMOOTH_CRYSTAL_QUARTZ_SLAB = BLOCKS.registerBlock("reinforced_smooth_crystal_quartz_slab", p -> new ReinforcedSlabBlock(p, SCContent.SMOOTH_CRYSTAL_QUARTZ_SLAB), prop(MapColor.COLOR_CYAN)); + public static final DeferredBlock REINFORCED_SMOOTH_CRYSTAL_QUARTZ_SLAB = BLOCKS.registerBlock("reinforced_smooth_crystal_quartz_slab", p -> new ReinforcedSlabBlock(p, SCContent.SMOOTH_CRYSTAL_QUARTZ_SLAB), reinforcedCopy(Blocks.SMOOTH_QUARTZ_SLAB).mapColor(MapColor.COLOR_CYAN)); @HasManualPage(PageGroup.REINFORCED) @OwnableBE - public static final DeferredBlock HORIZONTAL_REINFORCED_IRON_BARS = BLOCKS.registerBlock("horizontal_reinforced_iron_bars", p -> new HorizontalReinforcedIronBars(p, Blocks.IRON_BLOCK), prop(MapColor.METAL).sound(SoundType.METAL).noLootTable()); + public static final DeferredBlock HORIZONTAL_REINFORCED_IRON_BARS = BLOCKS.registerBlock("horizontal_reinforced_iron_bars", HorizontalReinforcedIronBars::new, reinforcedCopy(Blocks.IRON_BARS).noLootTable()); @HasManualPage(PageGroup.REINFORCED) @OwnableBE @Reinforced - public static final DeferredBlock REINFORCED_DIRT_PATH = BLOCKS.registerBlock("reinforced_grass_path", p -> new ReinforcedDirtPathBlock(p, Blocks.DIRT_PATH), prop(MapColor.DIRT).sound(SoundType.GRASS)); + public static final DeferredBlock REINFORCED_DIRT_PATH = reinforcedBlock("reinforced_grass_path", Blocks.DIRT_PATH, ReinforcedDirtPathBlock::new); @OwnableBE - public static final DeferredBlock REINFORCED_MOVING_PISTON = BLOCKS.registerBlock("reinforced_moving_piston", ReinforcedMovingPistonBlock::new, prop().dynamicShape().noLootTable().noOcclusion().isRedstoneConductor(SCContent::never).isSuffocating(SCContent::never).isViewBlocking(SCContent::never)); + public static final DeferredBlock REINFORCED_MOVING_PISTON = reinforcedBlock("reinforced_moving_piston", Blocks.MOVING_PISTON, (p, b) -> new ReinforcedMovingPistonBlock(p)); @OwnableBE @Reinforced(registerBlockItem = false) - public static final DeferredBlock REINFORCED_PISTON_HEAD = BLOCKS.registerBlock("reinforced_piston_head", ReinforcedPistonHeadBlock::new, prop().noLootTable().pushReaction(PushReaction.BLOCK)); - public static final DeferredBlock SENTRY_DISGUISE = BLOCKS.registerBlock("sentry_disguise", SometimesVisibleBlock::new, propDisguisable().noLootTable().pushReaction(PushReaction.BLOCK)); + public static final DeferredBlock REINFORCED_PISTON_HEAD = reinforcedBlock("reinforced_piston_head", Blocks.PISTON_HEAD, (p, b) -> new ReinforcedPistonHeadBlock(p)); + public static final DeferredBlock SENTRY_DISGUISE = BLOCKS.registerBlock("sentry_disguise", SometimesVisibleBlock::new, propDisguisable(-1.0F).noLootTable().pushReaction(PushReaction.BLOCK)); //items @HasManualPage(hasRecipeDescription = true) @@ -3249,63 +3247,43 @@ else if (state.is(BOUNCING_BETTY)) public static final DeferredHolder, MenuType> LASER_BLOCK_MENU = MENU_TYPES.register("laser_block", () -> IMenuTypeExtension.create((windowId, inv, data) -> new LaserBlockMenu(windowId, inv.player.level(), data.readBlockPos(), LaserBlockBlockEntity.loadSideConfig(data.readNbt()), inv))); public static final DeferredHolder, MenuType> REINFORCED_LECTERN_MENU = MENU_TYPES.register("reinforced_lectern", () -> IMenuTypeExtension.create((windowId, inv, data) -> new ReinforcedLecternMenu(windowId, inv.player.level(), data.readBlockPos()))); - private static final BlockBehaviour.Properties prop() { - return prop(MapColor.STONE); - } - - @SuppressWarnings("unused") - private static final BlockBehaviour.Properties prop(FeatureFlag... requiredFeatures) { - return prop().requiredFeatures(requiredFeatures); - } - - private static final BlockBehaviour.Properties prop(MapColor color, float hardness) { - return BlockBehaviour.Properties.of().mapColor(color).strength(hardness, Float.MAX_VALUE); + public static final BlockBehaviour.Properties reinforcedCopy(Block block) { + return reinforcedCopy(block, UnaryOperator.identity()); } - private static final BlockBehaviour.Properties prop(MapColor color) { - return BlockBehaviour.Properties.of().mapColor(color).strength(-1.0F, Float.MAX_VALUE); + public static final BlockBehaviour.Properties reinforcedCopy(Block block, UnaryOperator propertyEditor) { + return propertyEditor.apply(BlockBehaviour.Properties.ofFullCopy(block).explosionResistance(Float.MAX_VALUE)); } - public static final BlockBehaviour.Properties reinforcedCopy(Block block) { - return BlockBehaviour.Properties.ofFullCopy(block).strength(-1.0F, Float.MAX_VALUE); + private static final BlockBehaviour.Properties prop(float hardness) { + return prop(MapColor.STONE, hardness); } - @SuppressWarnings("unused") - private static final BlockBehaviour.Properties prop(MapColor color, FeatureFlag... requiredFeatures) { - return prop(color).requiredFeatures(requiredFeatures); + private static final BlockBehaviour.Properties prop(MapColor color, float hardness) { + return BlockBehaviour.Properties.of().mapColor(color).strength(hardness, Float.MAX_VALUE).requiresCorrectToolForDrops(); } - private static final BlockBehaviour.Properties logProp(MapColor topColor, MapColor sideColor) { - return BlockBehaviour.Properties.of().mapColor(state -> state.getValue(RotatedPillarBlock.AXIS) == Direction.Axis.Y ? topColor : sideColor).strength(-1.0F, Float.MAX_VALUE); + private static final BlockBehaviour.Properties propDisguisable(float hardness) { + return propDisguisable(MapColor.STONE, hardness, true); } - private static final BlockBehaviour.Properties logProp(MapColor topColor, MapColor sideColor, FeatureFlag... requiredFeatures) { - return logProp(topColor, sideColor).requiredFeatures(requiredFeatures); + private static final BlockBehaviour.Properties propDisguisable(MapColor color, float hardness) { + return propDisguisable(color, hardness, true); } - private static final BlockBehaviour.Properties propDisguisable() { - return propDisguisable(MapColor.STONE, true); + private static final BlockBehaviour.Properties propDisguisable(MapColor color, float hardness, boolean forceSolidOn) { + return propDisguisable(prop(color, hardness), forceSolidOn); } - private static final BlockBehaviour.Properties propDisguisable(MapColor color) { - return propDisguisable(color, true); + private static final BlockBehaviour.Properties propDisguisable(BlockBehaviour.Properties properties) { + return propDisguisable(properties, true); } - private static final BlockBehaviour.Properties propDisguisable(MapColor color, boolean forceSolidOn) { - BlockBehaviour.Properties props = prop(color).noOcclusion().dynamicShape().isRedstoneConductor(DisguisableBlock::isNormalCube).isSuffocating(DisguisableBlock::isSuffocating); - + private static final BlockBehaviour.Properties propDisguisable(BlockBehaviour.Properties properties, boolean forceSolidOn) { if (forceSolidOn) - props = props.forceSolidOn(); - - return props; - } - - private static final BlockBehaviour.Properties glassProp(MapColor color) { - return prop().mapColor(color).sound(SoundType.GLASS).noOcclusion().isValidSpawn(SCContent::never).isRedstoneConductor(SCContent::never).isSuffocating(SCContent::never).isViewBlocking(SCContent::never); - } + properties.forceSolidOn(); - private static BlockBehaviour.Properties mineProp(Block block) { - return BlockBehaviour.Properties.ofLegacyCopy(block).explosionResistance(Float.MAX_VALUE).pushReaction(PushReaction.NORMAL); + return properties.noOcclusion().dynamicShape().isRedstoneConductor(DisguisableBlock::isNormalCube).isSuffocating(DisguisableBlock::isSuffocating); } private static final Item.Properties itemProp() { @@ -3316,14 +3294,6 @@ private static final Item.Properties itemProp(int stackSize) { return itemProp().stacksTo(stackSize); } - private static boolean always(BlockState state, BlockGetter level, BlockPos pos) { - return true; - } - - private static boolean always(BlockState state, BlockGetter level, BlockPos pos, EntityType entityType) { - return true; - } - private static boolean never(BlockState state, BlockGetter level, BlockPos pos) { return false; } @@ -3340,30 +3310,64 @@ private static BaseFlowingFluid.Properties fakeLavaProperties() { return new BaseFlowingFluid.Properties(() -> NeoForgeMod.LAVA_TYPE.value(), FAKE_LAVA, FLOWING_FAKE_LAVA).block(FAKE_LAVA_BLOCK).bucket(FAKE_LAVA_BUCKET); } - private static DeferredBlock woodenButton(String id, Block vanillaBlock, BlockSetType blockSetType) { - return BLOCKS.registerBlock(id, p -> new ReinforcedButtonBlock(p, vanillaBlock, blockSetType, 30), setId(id, prop().mapColor(MapColor.NONE).noCollission().pushReaction(PushReaction.BLOCK).forceSolidOn())); + private static DeferredBlock reinforcedBlock(String name, Block vanillaBlock) { + return reinforcedBlock(name, vanillaBlock, UnaryOperator.identity()); + } + + private static DeferredBlock reinforcedBlock(String name, Block vanillaBlock, UnaryOperator propertyEditor) { + return BLOCKS.registerBlock(name, p -> new BaseReinforcedBlock(p, vanillaBlock), reinforcedCopy(vanillaBlock, propertyEditor)); } - @SuppressWarnings("unused") - private static DeferredBlock woodenButton(String id, Block vanillaBlock, BlockSetType blockSetType, FeatureFlag... requiredFeatures) { - return BLOCKS.registerBlock(id, p -> new ReinforcedButtonBlock(p, vanillaBlock, blockSetType, 30), setId(id, prop().mapColor(MapColor.NONE).noCollission().pushReaction(PushReaction.BLOCK).forceSolidOn().requiredFeatures(requiredFeatures))); + private static DeferredBlock reinforcedBlock(String name, Block vanillaBlock, BiFunction constructor) { + return reinforcedBlock(name, vanillaBlock, constructor, UnaryOperator.identity()); + } + + private static DeferredBlock reinforcedBlock(String name, Block vanillaBlock, BiFunction constructor, UnaryOperator propertyEditor) { + return BLOCKS.registerBlock(name, p -> constructor.apply(p, vanillaBlock), reinforcedCopy(vanillaBlock, propertyEditor)); + } + + private static DeferredBlock blockMine(String name, Block vanillaBlock) { + return reinforcedBlock(name, vanillaBlock, BaseFullMineBlock::new); + } + + private static DeferredBlock woodenButton(String id, Block vanillaBlock, BlockSetType blockSetType) { + return reinforcedBlock(id, vanillaBlock, (p, _vanillaBlock) -> new ReinforcedButtonBlock(p, vanillaBlock, blockSetType, 30), p -> p.pushReaction(PushReaction.BLOCK).forceSolidOn()); } private static DeferredBlock stoneButton(String id, Block vanillaBlock, BlockSetType blockSetType) { - return BLOCKS.registerBlock(id, p -> new ReinforcedButtonBlock(p, vanillaBlock, blockSetType, 20), setId(id, prop().mapColor(MapColor.NONE).noCollission().pushReaction(PushReaction.BLOCK).forceSolidOn())); + return reinforcedBlock(id, vanillaBlock, (p, _vanillaBlock) -> new ReinforcedButtonBlock(p, vanillaBlock, blockSetType, 20), p -> p.pushReaction(PushReaction.BLOCK).forceSolidOn()); } private static DeferredBlock woodenPressurePlate(String id, Block vanillaBlock, BlockSetType blockSetType) { - return BLOCKS.registerBlock(id, p -> new ReinforcedPressurePlateBlock(p, vanillaBlock, blockSetType), setId(id, prop().mapColor(vanillaBlock.defaultMapColor()).noCollission().pushReaction(PushReaction.BLOCK).forceSolidOn())); + return reinforcedBlock(id, vanillaBlock, (p, _vanillaBlock) -> new ReinforcedPressurePlateBlock(p, vanillaBlock, blockSetType), p -> p.pushReaction(PushReaction.BLOCK).forceSolidOn()); } - @SuppressWarnings("unused") - private static DeferredBlock woodenPressurePlate(String id, Block vanillaBlock, BlockSetType blockSetType, FeatureFlag... requiredFeatures) { - return BLOCKS.registerBlock(id, p -> new ReinforcedPressurePlateBlock(p, vanillaBlock, blockSetType), setId(id, prop().mapColor(vanillaBlock.defaultMapColor()).noCollission().requiredFeatures(requiredFeatures).pushReaction(PushReaction.BLOCK).forceSolidOn())); + private static DeferredBlock stonePressurePlate(String id, Block vanillaBlock, BlockSetType blockSetType) { + return reinforcedBlock(id, vanillaBlock, (p, _vanillaBlock) -> new ReinforcedPressurePlateBlock(p, vanillaBlock, blockSetType), p -> p.pushReaction(PushReaction.BLOCK).forceSolidOn()); } - private static DeferredBlock stonePressurePlate(String id, Block vanillaBlock, BlockSetType blockSetType) { - return BLOCKS.registerBlock(id, p -> new ReinforcedPressurePlateBlock(p, vanillaBlock, blockSetType), setId(id, prop().mapColor(vanillaBlock.defaultMapColor()).noCollission().pushReaction(PushReaction.BLOCK).forceSolidOn())); + private static DeferredBlock reinforcedFenceGateBlock(String id, Block vanillaBlock, WoodType woodType) { + return reinforcedBlock(id, vanillaBlock, (p, _vanillaBlock) -> new ReinforcedFenceGateBlock(p, woodType, vanillaBlock)); + } + + private static DeferredBlock secretStandingSign(String id, Block standingSign, UnaryOperator propertyEditor) { + return secretSign(id, SecretStandingSignBlock::new, standingSign, propertyEditor); + } + + private static DeferredBlock secretWallSign(String id, Block standingSign, UnaryOperator propertyEditor) { + return secretSign(id, SecretWallSignBlock::new, standingSign, propertyEditor); + } + + private static DeferredBlock secretCeilingHangingSign(String id, Block ceilingSign) { + return secretSign(id, SecretCeilingHangingSignBlock::new, ceilingSign, UnaryOperator.identity()); + } + + private static DeferredBlock secretWallHangingSign(String id, Block ceilingSign, UnaryOperator propertyEditor) { + return secretSign(id, SecretWallHangingSignBlock::new, ceilingSign, propertyEditor); + } + + private static DeferredBlock secretSign(String id, BiFunction signConstructor, Block baseSign, UnaryOperator propertyEditor) { + return BLOCKS.registerBlock(id, p -> signConstructor.apply(p, SignBlock.getWoodType(baseSign)), propertyEditor.apply(reinforcedCopy(baseSign))); } private static DeferredItem registerItem(String name, Function func, Supplier props) { diff --git a/src/main/java/net/geforcemods/securitycraft/SCEventHandler.java b/src/main/java/net/geforcemods/securitycraft/SCEventHandler.java index 6f753517be..54315954ec 100644 --- a/src/main/java/net/geforcemods/securitycraft/SCEventHandler.java +++ b/src/main/java/net/geforcemods/securitycraft/SCEventHandler.java @@ -102,6 +102,7 @@ import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; import net.neoforged.neoforge.event.entity.living.LivingDestroyBlockEvent; import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent.LeftClickBlock; @@ -237,7 +238,7 @@ public static void onServerStop(ServerStoppedEvent event) { @SubscribeEvent public static void onEntityInvulnerabilityCheck(EntityInvulnerabilityCheckEvent event) { if (event.getEntity() instanceof AbstractSecuritySeaBoat && event.getSource().is(SCTags.DamageTypes.SECURITY_SEA_BOAT_VULNERABLE_TO)) - event.setInvulnerable(true); + event.setInvulnerable(false); } @SubscribeEvent @@ -502,6 +503,12 @@ public static void onBlockEventPlace(BlockEvent.EntityPlaceEvent event) { } } + @SubscribeEvent + public static void onPlayerHarvestCheck(PlayerEvent.HarvestCheck event) { + if (ConfigHandler.SERVER.alwaysDrop.get() && event.getLevel().getBlockEntity(event.getPos()) instanceof IOwnable) + event.setCanHarvest(true); + } + @SubscribeEvent public static void onOwnership(OwnershipEvent event) { if (event.getLevel().getBlockEntity(event.getPos()) instanceof IOwnable ownable) { diff --git a/src/main/java/net/geforcemods/securitycraft/SCTags.java b/src/main/java/net/geforcemods/securitycraft/SCTags.java index 8ff79390f5..4976c6a1f5 100644 --- a/src/main/java/net/geforcemods/securitycraft/SCTags.java +++ b/src/main/java/net/geforcemods/securitycraft/SCTags.java @@ -19,6 +19,7 @@ private Blocks() {} public static final TagKey REINFORCED_BAMBOO_BLOCKS = tag("reinforced/bamboo_blocks"); public static final TagKey REINFORCED_BIRCH_LOGS = tag("reinforced/birch_logs"); public static final TagKey REINFORCED_BUTTONS = tag("reinforced/buttons"); + public static final TagKey REINFORCED_CAULDRONS = tag("reinforced/cauldrons"); public static final TagKey REINFORCED_CHERRY_LOGS = tag("reinforced/cherry_logs"); public static final TagKey REINFORCED_COBBLESTONE = tag("reinforced/cobblestone"); public static final TagKey REINFORCED_CONCRETE = tag("reinforced/concrete"); @@ -47,6 +48,7 @@ private Blocks() {} public static final TagKey REINFORCED_STONE_BRICKS = tag("reinforced/stone_bricks"); public static final TagKey REINFORCED_STONE_PRESSURE_PLATES = tag("reinforced/stone_pressure_plates"); public static final TagKey REINFORCED_TERRACOTTA = tag("reinforced/terracotta"); + public static final TagKey REINFORCED_WALLS = tag("reinforced/walls"); public static final TagKey REINFORCED_WARPED_STEMS = tag("reinforced/warped_stems"); public static final TagKey REINFORCED_WOODEN_BUTTONS = tag("reinforced/wooden_buttons"); public static final TagKey REINFORCED_WOODEN_FENCES = tag("reinforced/wooden_fences"); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/AbstractPanelBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/AbstractPanelBlock.java index ab9e012e35..2aa5dc8f6c 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/AbstractPanelBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/AbstractPanelBlock.java @@ -1,5 +1,6 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.api.IPasscodeProtected; import net.geforcemods.securitycraft.misc.SaltData; @@ -111,7 +112,7 @@ public void onRemove(BlockState state, Level level, BlockPos pos, BlockState new if (!state.is(newState.getBlock())) { BlockEntity be = level.getBlockEntity(pos); - if (be instanceof IModuleInventory inv) + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && be instanceof IModuleInventory inv) inv.dropAllModules(); if (state.getValue(POWERED)) { diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/AlarmBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/AlarmBlock.java index 637308b18e..9a69274669 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/AlarmBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/AlarmBlock.java @@ -1,5 +1,6 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.blockentities.AlarmBlockEntity; @@ -194,7 +195,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/DisguisableBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/DisguisableBlock.java index 5f2ae9d7e8..e770126d02 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/DisguisableBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/DisguisableBlock.java @@ -52,6 +52,16 @@ public static boolean isSuffocating(BlockState state, BlockGetter level, BlockPo return state.blocksMotion() && state.isCollisionShapeFullBlock(level, pos); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); + + if (disguisedState.getBlock() != state.getBlock()) + return disguisedState.getDestroyProgress(player, level, pos); + else + return super.getDestroyProgress(state, player, level, pos); + } + @Override public int getLightEmission(BlockState state, BlockGetter level, BlockPos pos) { AuxiliaryLightManager lightManager = level.getAuxLightManager(pos); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/DisplayCaseBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/DisplayCaseBlock.java index afee713d68..7622a73ff7 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/DisplayCaseBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/DisplayCaseBlock.java @@ -1,5 +1,6 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.api.IPasscodeProtected; @@ -201,7 +202,7 @@ public void onRemove(BlockState state, Level level, BlockPos pos, BlockState new if (be instanceof DisplayCaseBlockEntity displayCase) Block.popResource(level, pos, displayCase.getDisplayedStack()); - if (be instanceof IModuleInventory inv) + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && be instanceof IModuleInventory inv) inv.dropAllModules(); if (be instanceof IPasscodeProtected passcodeProtected) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/KeypadChestBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/KeypadChestBlock.java index d64c75c0ac..063ad4b7d0 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/KeypadChestBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/KeypadChestBlock.java @@ -13,6 +13,7 @@ import net.geforcemods.securitycraft.misc.ModuleType; import net.geforcemods.securitycraft.misc.OwnershipEvent; import net.geforcemods.securitycraft.misc.SaltData; +import net.geforcemods.securitycraft.util.BlockUtils; import net.geforcemods.securitycraft.util.PlayerUtils; import net.geforcemods.securitycraft.util.Utils; import net.minecraft.ChatFormatting; @@ -110,6 +111,16 @@ public KeypadChestBlock(BlockBehaviour.Properties properties) { super(SCContent.KEYPAD_CHEST_BLOCK_ENTITY, properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); + + if (disguisedState.getBlock() != state.getBlock()) + return disguisedState.getDestroyProgress(player, level, pos); + else + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hit) { if (!level.isClientSide && !isBlocked(level, pos)) { diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/KeypadTrapDoorBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/KeypadTrapDoorBlock.java index 21d3b0cf60..c3ca433784 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/KeypadTrapDoorBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/KeypadTrapDoorBlock.java @@ -46,6 +46,16 @@ public KeypadTrapDoorBlock(BlockBehaviour.Properties properties, BlockSetType bl super(properties, blockSetType); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); + + if (disguisedState.getBlock() != state.getBlock()) + return disguisedState.getDestroyProgress(player, level, pos); + else + return super.getDestroyProgress(state, player, level, pos); + } + @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext ctx) { BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/MotionActivatedLightBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/MotionActivatedLightBlock.java index 3c3416c815..dd803802e0 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/MotionActivatedLightBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/MotionActivatedLightBlock.java @@ -1,5 +1,6 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.blockentities.MotionActivatedLightBlockEntity; @@ -108,7 +109,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/OwnableBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/OwnableBlock.java index bbf4b90851..4e03cb8fa4 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/OwnableBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/OwnableBlock.java @@ -4,10 +4,12 @@ import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.RenderShape; @@ -21,6 +23,11 @@ public OwnableBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/OwnableFenceGateBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/OwnableFenceGateBlock.java index d967249b0f..d4ac5fbfaf 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/OwnableFenceGateBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/OwnableFenceGateBlock.java @@ -13,6 +13,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -35,6 +36,11 @@ public OwnableFenceGateBlock(BlockBehaviour.Properties properties, SoundEvent op super(properties, openSound, closeSound); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void onExplosionHit(BlockState state, ServerLevel level, BlockPos pos, Explosion explosion, BiConsumer dropConsumer) {} //disallow wind charges to open the gate diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/PanicButtonBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/PanicButtonBlock.java index 2f5d68fcfd..544629f47a 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/PanicButtonBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/PanicButtonBlock.java @@ -2,6 +2,7 @@ import net.geforcemods.securitycraft.blockentities.PanicButtonBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; @@ -57,6 +58,11 @@ public PanicButtonBlock(BlockBehaviour.Properties properties, BlockSetType block registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { BlockState superState = super.getStateForPlacement(ctx); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/PortableRadarBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/PortableRadarBlock.java index 940fd74476..e7a5c4cb0e 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/PortableRadarBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/PortableRadarBlock.java @@ -1,5 +1,6 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.blockentities.PortableRadarBlockEntity; @@ -111,7 +112,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/ScannerTrapDoorBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/ScannerTrapDoorBlock.java index bacd8183aa..48946cfdf0 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/ScannerTrapDoorBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/ScannerTrapDoorBlock.java @@ -42,6 +42,16 @@ public ScannerTrapDoorBlock(BlockBehaviour.Properties properties, BlockSetType b super(properties, blockSetType); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); + + if (disguisedState.getBlock() != state.getBlock()) + return disguisedState.getDestroyProgress(player, level, pos); + else + return super.getDestroyProgress(state, player, level, pos); + } + @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext ctx) { BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/SecretCeilingHangingSignBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/SecretCeilingHangingSignBlock.java index 08ea836034..41bab20c45 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/SecretCeilingHangingSignBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/SecretCeilingHangingSignBlock.java @@ -1,13 +1,16 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.blockentities.SecretHangingSignBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.CeilingHangingSignBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -22,6 +25,11 @@ public SecretCeilingHangingSignBlock(BlockBehaviour.Properties properties, WoodT super(woodType, properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) @@ -39,7 +47,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/SecretStandingSignBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/SecretStandingSignBlock.java index 0d37554440..d95f070563 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/SecretStandingSignBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/SecretStandingSignBlock.java @@ -1,13 +1,16 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.blockentities.SecretSignBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.StandingSignBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -22,6 +25,11 @@ public SecretStandingSignBlock(BlockBehaviour.Properties properties, WoodType wo super(woodType, properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) @@ -39,7 +47,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/SecretWallHangingSignBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/SecretWallHangingSignBlock.java index c868fdbdf0..f53b4fe791 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/SecretWallHangingSignBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/SecretWallHangingSignBlock.java @@ -1,13 +1,16 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.blockentities.SecretHangingSignBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.WallHangingSignBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -22,6 +25,11 @@ public SecretWallHangingSignBlock(BlockBehaviour.Properties properties, WoodType super(woodType, properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) @@ -39,7 +47,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/SecretWallSignBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/SecretWallSignBlock.java index 982bd8bc40..925e95448d 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/SecretWallSignBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/SecretWallSignBlock.java @@ -1,13 +1,16 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.blockentities.SecretSignBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.WallSignBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -22,6 +25,11 @@ public SecretWallSignBlock(BlockBehaviour.Properties properties, WoodType woodTy super(woodType, properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) @@ -39,7 +47,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/SecurityCameraBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/SecurityCameraBlock.java index 8575246c57..e86d74eb27 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/SecurityCameraBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/SecurityCameraBlock.java @@ -1,5 +1,6 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.SecurityCraft; import net.geforcemods.securitycraft.api.IDisguisable; @@ -99,7 +100,9 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof SecurityCameraBlockEntity be) { - be.dropAllModules(); + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get()) + be.dropAllModules(); + Containers.dropContents(level, pos, be.getLensContainer()); } diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/SonicSecuritySystemBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/SonicSecuritySystemBlock.java index 6bd25e5bda..ad9b6dc601 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/SonicSecuritySystemBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/SonicSecuritySystemBlock.java @@ -2,6 +2,7 @@ import java.util.stream.Stream; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IDisguisable; import net.geforcemods.securitycraft.api.IModuleInventory; @@ -87,7 +88,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/SpecialDoorBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/SpecialDoorBlock.java index e3d110a16d..bc1c066b90 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/SpecialDoorBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/SpecialDoorBlock.java @@ -1,11 +1,13 @@ package net.geforcemods.securitycraft.blocks; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IDisguisable; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.api.IPasscodeProtected; import net.geforcemods.securitycraft.api.LinkableBlockEntity; import net.geforcemods.securitycraft.compat.IOverlayDisplay; import net.geforcemods.securitycraft.misc.SaltData; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -42,6 +44,16 @@ protected SpecialDoorBlock(BlockBehaviour.Properties properties, BlockSetType bl super(blockSetType, properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); + + if (disguisedState.getBlock() != state.getBlock()) + return disguisedState.getDestroyProgress(player, level, pos); + else + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext ctx) { BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); @@ -135,7 +147,7 @@ public void onRemove(BlockState state, Level level, BlockPos pos, BlockState new if (!state.is(newState.getBlock())) { BlockEntity be = level.getBlockEntity(pos); - if (be instanceof IModuleInventory inv && state.getValue(HALF) == DoubleBlockHalf.LOWER) + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && be instanceof IModuleInventory inv && state.getValue(HALF) == DoubleBlockHalf.LOWER) inv.dropAllModules(); if (be instanceof IPasscodeProtected passcodeProtected) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/TrophySystemBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/TrophySystemBlock.java index 72189e9cc5..19b222e012 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/TrophySystemBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/TrophySystemBlock.java @@ -2,6 +2,7 @@ import java.util.stream.Stream; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IDisguisable; import net.geforcemods.securitycraft.blockentities.TrophySystemBlockEntity; @@ -101,8 +102,10 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof TrophySystemBlockEntity be) { + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get()) + be.dropAllModules(); + Containers.dropContents(level, pos, be.getLensContainer()); - be.dropAllModules(); level.updateNeighbourForOutputSignal(pos, this); } diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/mines/ClaymoreBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/mines/ClaymoreBlock.java index aea2a8d001..6f91fac74d 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/mines/ClaymoreBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/mines/ClaymoreBlock.java @@ -97,9 +97,7 @@ public FluidState getFluidState(BlockState state) { @Override public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) { if (!player.isCreative() && !level.isClientSide && !level.getBlockState(pos).getValue(ClaymoreBlock.DEACTIVATED)) { - level.destroyBlock(pos, false); - - if (level.getBlockEntity(pos) instanceof ClaymoreBlockEntity claymore && claymore.getTargetingMode().allowsPlayers() && (!claymore.isOwnedBy(player) || claymore.ignoresOwner())) + if (level.getBlockEntity(pos) instanceof ClaymoreBlockEntity claymore && claymore.getTargetingMode().allowsPlayers() && (!claymore.isOwnedBy(player) || !claymore.ignoresOwner())) explode(level, pos); } @@ -167,7 +165,9 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof ClaymoreBlockEntity be) { - be.dropAllModules(); + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get()) + be.dropAllModules(); + Containers.dropContents(level, pos, be.getLensContainer()); } diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/mines/CreakingHeartMineBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/mines/CreakingHeartMineBlock.java index 500939e9c3..815dbf5ba6 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/mines/CreakingHeartMineBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/mines/CreakingHeartMineBlock.java @@ -108,11 +108,6 @@ else if (!(level.getBlockEntity(pos) instanceof IOwnable ownable && ownable.isOw return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); } - @Override - public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { - return !ConfigHandler.SERVER.ableToBreakMines.get() ? -1F : super.getDestroyProgress(state, player, level, pos); - } - @Override public boolean activateMine(Level level, BlockPos pos) { return false; diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/mines/ExplosiveBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/mines/ExplosiveBlock.java index dda7141f3d..981be29c4d 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/mines/ExplosiveBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/mines/ExplosiveBlock.java @@ -1,6 +1,5 @@ package net.geforcemods.securitycraft.blocks.mines; -import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IExplosive; import net.geforcemods.securitycraft.blocks.OwnableBlock; import net.minecraft.core.BlockPos; @@ -8,7 +7,6 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; @@ -19,11 +17,6 @@ protected ExplosiveBlock(BlockBehaviour.Properties properties) { super(properties); } - @Override - public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { - return !ConfigHandler.SERVER.ableToBreakMines.get() ? -1F : super.getDestroyProgress(state, player, level, pos); - } - @Override public InteractionResult useItemOn(ItemStack heldItem, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { return exUseItemOn(heldItem, state, level, pos, player, hand, hit); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/mines/IMSBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/mines/IMSBlock.java index f936f538e8..58af726511 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/mines/IMSBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/mines/IMSBlock.java @@ -7,6 +7,7 @@ import net.geforcemods.securitycraft.api.IOwnable; import net.geforcemods.securitycraft.blockentities.IMSBlockEntity; import net.geforcemods.securitycraft.blocks.OwnableBlock; +import net.geforcemods.securitycraft.util.BlockUtils; import net.geforcemods.securitycraft.util.LevelUtils; import net.geforcemods.securitycraft.util.Utils; import net.minecraft.core.BlockPos; @@ -57,7 +58,7 @@ public IMSBlock(BlockBehaviour.Properties properties) { @Override public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { - return !ConfigHandler.SERVER.ableToBreakMines.get() ? -1F : super.getDestroyProgress(state, player, level, pos); + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); } @Override @@ -88,7 +89,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.is(newState.getBlock()) && level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!state.is(newState.getBlock()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); super.onRemove(state, level, pos, newState, isMoving); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/mines/TrackMineBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/mines/TrackMineBlock.java index cc89e6e676..5e7af67781 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/mines/TrackMineBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/mines/TrackMineBlock.java @@ -36,7 +36,7 @@ public InteractionResult useItemOn(ItemStack heldItem, BlockState state, Level l @Override public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { - return !ConfigHandler.SERVER.ableToBreakMines.get() ? -1F : super.getDestroyProgress(state, player, level, pos); + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); } @Override diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/BaseIronTrapDoorBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/BaseIronTrapDoorBlock.java index b677242231..f3a6974b0c 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/BaseIronTrapDoorBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/BaseIronTrapDoorBlock.java @@ -2,11 +2,13 @@ import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.TrapDoorBlock; @@ -22,6 +24,11 @@ public BaseIronTrapDoorBlock(BlockBehaviour.Properties properties, BlockSetType super(blockSetType, properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/HorizontalReinforcedIronBars.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/HorizontalReinforcedIronBars.java index 043e497c95..ba26c978c9 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/HorizontalReinforcedIronBars.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/HorizontalReinforcedIronBars.java @@ -3,6 +3,7 @@ import javax.annotation.Nullable; import net.geforcemods.securitycraft.SCContent; +import net.geforcemods.securitycraft.blocks.OwnableBlock; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; @@ -26,12 +27,12 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class HorizontalReinforcedIronBars extends BaseReinforcedBlock implements SimpleWaterloggedBlock { +public class HorizontalReinforcedIronBars extends OwnableBlock implements SimpleWaterloggedBlock { public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; protected static final VoxelShape SHAPE = Block.box(-8.0D, 14.0D, -8.0D, 24.0D, 16.0D, 24.0D); - public HorizontalReinforcedIronBars(BlockBehaviour.Properties properties, Block vB) { - super(properties, vB); + public HorizontalReinforcedIronBars(BlockBehaviour.Properties properties) { + super(properties); registerDefaultState(stateDefinition.any().setValue(WATERLOGGED, false)); } diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedButtonBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedButtonBlock.java index e066a872ae..bb03de3fb1 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedButtonBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedButtonBlock.java @@ -1,15 +1,18 @@ package net.geforcemods.securitycraft.blocks.reinforced; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.blockentities.AllowlistOnlyBlockEntity; import net.geforcemods.securitycraft.misc.CommonDoorActivator; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.ButtonBlock; @@ -30,6 +33,11 @@ public ReinforcedButtonBlock(BlockBehaviour.Properties properties, Block vb, Blo CommonDoorActivator.addActivator(this); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult rayTrace) { if (isAllowedToPress((AllowlistOnlyBlockEntity) level.getBlockEntity(pos), player)) @@ -50,7 +58,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { if (!state.is(newState.getBlock())) { - if (level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); if (!isMoving && state.getValue(POWERED)) { diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedCauldronBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedCauldronBlock.java index 6672a304fc..32d5517ecd 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedCauldronBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedCauldronBlock.java @@ -9,6 +9,7 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.blockentities.ReinforcedCauldronBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.core.cauldron.CauldronInteraction; @@ -70,6 +71,11 @@ protected MapCodec codec() { return CODEC; } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext collisionContext) { if (collisionContext instanceof EntityCollisionContext ctx && ctx.getEntity() != null) { diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedChiseledBookshelfBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedChiseledBookshelfBlock.java index ac36e5f590..f1b970a955 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedChiseledBookshelfBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedChiseledBookshelfBlock.java @@ -3,12 +3,14 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.blockentities.ReinforcedChiseledBookshelfBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -25,6 +27,11 @@ public ReinforcedChiseledBookshelfBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public InteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (level.getBlockEntity(pos) instanceof ReinforcedChiseledBookshelfBlockEntity be && (be.isOwnedBy(player) || be.isAllowed(player))) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedCopperBulbBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedCopperBulbBlock.java index c7c2a83579..7b8184a49d 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedCopperBulbBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedCopperBulbBlock.java @@ -3,10 +3,12 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.CopperBulbBlock; @@ -24,6 +26,11 @@ public ReinforcedCopperBulbBlock(BlockBehaviour.Properties properties, Block van this.vanillaBlock = vanillaBlock; } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedDispenserBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedDispenserBlock.java index b0e4ccbeb7..1b6335b5e6 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedDispenserBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedDispenserBlock.java @@ -5,6 +5,7 @@ import net.geforcemods.securitycraft.blockentities.ReinforcedDispenserBlockEntity; import net.geforcemods.securitycraft.compat.IOverlayDisplay; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.dispenser.BlockSource; @@ -52,6 +53,16 @@ public ReinforcedDispenserBlock(BlockBehaviour.Properties properties) { registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); + + if (disguisedState.getBlock() != state.getBlock()) + return disguisedState.getDestroyProgress(player, level, pos); + else + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedDropperBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedDropperBlock.java index 2167d69ef4..32d74e9c2f 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedDropperBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedDropperBlock.java @@ -1,14 +1,17 @@ package net.geforcemods.securitycraft.blocks.reinforced; import net.geforcemods.securitycraft.blockentities.ReinforcedDropperBlockEntity; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.dispenser.BlockSource; import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; import net.minecraft.core.dispenser.DispenseItemBehavior; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -26,6 +29,11 @@ public ReinforcedDropperBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public DispenseItemBehavior getDispenseMethod(Level level, ItemStack stack) { return DISPENSE_BEHAVIOUR; diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedEndRodBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedEndRodBlock.java index 4fb10c0a61..5937e841e6 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedEndRodBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedEndRodBlock.java @@ -3,10 +3,12 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -22,6 +24,11 @@ public ReinforcedEndRodBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedFenceBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedFenceBlock.java index 6247ebd722..eb69d11b8b 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedFenceBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedFenceBlock.java @@ -3,10 +3,12 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; @@ -24,6 +26,11 @@ public ReinforcedFenceBlock(BlockBehaviour.Properties properties, Block vanillaB this.vanillaBlock = vanillaBlock; } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedGrassBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedGrassBlock.java index 64bb105d26..453e1f3b62 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedGrassBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedGrassBlock.java @@ -6,6 +6,7 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -32,6 +33,11 @@ public ReinforcedGrassBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource randomSource) {} diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedHopperBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedHopperBlock.java index 9b17131be3..10c13c5214 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedHopperBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedHopperBlock.java @@ -9,6 +9,7 @@ import net.geforcemods.securitycraft.blockentities.ReinforcedHopperBlockEntity; import net.geforcemods.securitycraft.compat.IOverlayDisplay; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionResult; @@ -42,6 +43,16 @@ public ReinforcedHopperBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + BlockState disguisedState = IDisguisable.getDisguisedBlockState(level.getBlockEntity(pos)).orElse(state); + + if (disguisedState.getBlock() != state.getBlock()) + return disguisedState.getDestroyProgress(player, level, pos); + else + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLadderBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLadderBlock.java index 7388dae5b2..d47b5128c6 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLadderBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLadderBlock.java @@ -3,10 +3,12 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -22,6 +24,11 @@ public ReinforcedLadderBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLayeredCauldronBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLayeredCauldronBlock.java index 2f7e504368..5bb1e87636 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLayeredCauldronBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLayeredCauldronBlock.java @@ -3,6 +3,7 @@ import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.blockentities.ReinforcedCauldronBlockEntity; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.cauldron.CauldronInteraction; import net.minecraft.world.InteractionHand; @@ -36,6 +37,11 @@ public ReinforcedLayeredCauldronBlock(Precipitation precipitation, CauldronInter this.vanillaBlock = vanillaBlock; } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext collisionContext) { if (collisionContext instanceof EntityCollisionContext ctx && ctx.getEntity() != null) { diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLecternBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLecternBlock.java index e628f3521d..12baba72e1 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLecternBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLecternBlock.java @@ -3,6 +3,7 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.blockentities.ReinforcedLecternBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; @@ -10,6 +11,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -25,6 +27,11 @@ public ReinforcedLecternBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLeverBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLeverBlock.java index f9a56133f9..9b2aa880fb 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLeverBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedLeverBlock.java @@ -1,14 +1,17 @@ package net.geforcemods.securitycraft.blocks.reinforced; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.blockentities.AllowlistOnlyBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -25,6 +28,11 @@ public ReinforcedLeverBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult result) { if (isAllowedToPress((AllowlistOnlyBlockEntity) level.getBlockEntity(pos), player)) @@ -45,7 +53,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { if (!state.is(newState.getBlock())) { - if (level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); if (!isMoving && state.getValue(POWERED)) { diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMovingPistonBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMovingPistonBlock.java index 8ab51b0bc7..daf2355678 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMovingPistonBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMovingPistonBlock.java @@ -5,9 +5,11 @@ import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.blockentities.ReinforcedPistonMovingBlockEntity; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -30,6 +32,11 @@ public ReinforcedMovingPistonBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + public static BlockEntity newMovingBlockEntity(BlockPos pos, BlockState state, BlockState movedState, CompoundTag tag, Direction direction, boolean extending, boolean shouldHeadBeRendered) { return new ReinforcedPistonMovingBlockEntity(pos, state, movedState, tag, direction, extending, shouldHeadBeRendered); } diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMud.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMudBlock.java similarity index 90% rename from src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMud.java rename to src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMudBlock.java index e7ce3d453e..d34f8e657e 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMud.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedMudBlock.java @@ -10,10 +10,10 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -public class ReinforcedMud extends BaseReinforcedBlock { +public class ReinforcedMudBlock extends BaseReinforcedBlock { protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 14.0D, 16.0D); - public ReinforcedMud(BlockBehaviour.Properties properties, Block vB) { + public ReinforcedMudBlock(BlockBehaviour.Properties properties, Block vB) { super(properties, vB); } diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPaneBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPaneBlock.java index 50b963b559..6e37c0bc66 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPaneBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPaneBlock.java @@ -3,6 +3,7 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.LivingEntity; @@ -30,6 +31,11 @@ public ReinforcedPaneBlock(BlockBehaviour.Properties properties, Block vB) { vanillaBlock = vB; } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public BlockState getStateForPlacement(BlockPlaceContext context) { return getStateForPlacement(context.getLevel(), context.getClickedPos()); diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPistonBaseBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPistonBaseBlock.java index 7462504dbd..e4b5f79799 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPistonBaseBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPistonBaseBlock.java @@ -16,6 +16,7 @@ import net.geforcemods.securitycraft.blocks.ElectrifiedIronFenceBlock; import net.geforcemods.securitycraft.blocks.ElectrifiedIronFenceGateBlock; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.geforcemods.securitycraft.util.ReinforcedPistonStructureResolver; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -27,6 +28,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -50,6 +52,11 @@ public ReinforcedPistonBaseBlock(boolean sticky, BlockBehaviour.Properties prope super(sticky, properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPistonHeadBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPistonHeadBlock.java index 8951ee5e57..4fa4bed5fc 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPistonHeadBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPistonHeadBlock.java @@ -4,10 +4,12 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; @@ -26,6 +28,11 @@ public ReinforcedPistonHeadBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPressurePlateBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPressurePlateBlock.java index 9164d1f4e6..6bdbe3d7be 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPressurePlateBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedPressurePlateBlock.java @@ -3,17 +3,20 @@ import java.util.ArrayList; import java.util.List; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.api.IDoorActivator; import net.geforcemods.securitycraft.api.IModuleInventory; import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.blockentities.AllowlistOnlyBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; @@ -34,6 +37,11 @@ public ReinforcedPressurePlateBlock(BlockBehaviour.Properties properties, Block DoorActivator.addActivator(this); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { int redstoneStrength = getSignalForState(state); @@ -69,7 +77,7 @@ public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, @Override public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { if (!state.is(newState.getBlock())) { - if (level.getBlockEntity(pos) instanceof IModuleInventory inv) + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && level.getBlockEntity(pos) instanceof IModuleInventory inv) inv.dropAllModules(); if (!isMoving && getSignalForState(state) > 0) { diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedScaffoldingBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedScaffoldingBlock.java index 60bc144b6f..a5ffb748e8 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedScaffoldingBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedScaffoldingBlock.java @@ -5,6 +5,7 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -38,6 +39,11 @@ public ReinforcedScaffoldingBlock(BlockBehaviour.Properties properties) { super(properties); } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { if (placer instanceof Player player) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedSnowyDirtBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedSnowyDirtBlock.java index 2004a0f5fc..aac50d3d55 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedSnowyDirtBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedSnowyDirtBlock.java @@ -6,6 +6,7 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; @@ -34,6 +35,11 @@ public ReinforcedSnowyDirtBlock(BlockBehaviour.Properties properties, Block vB) this.vanillaBlock = vB; } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { if (this == SCContent.REINFORCED_MYCELIUM.get()) diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedStainedGlassBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedStainedGlassBlock.java index 1addf26ebb..dda86d7c44 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedStainedGlassBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedStainedGlassBlock.java @@ -4,23 +4,14 @@ import net.minecraft.core.Direction; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.BeaconBeamBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; public class ReinforcedStainedGlassBlock extends ReinforcedGlassBlock implements BeaconBeamBlock { - private final DyeColor color; - - public ReinforcedStainedGlassBlock(BlockBehaviour.Properties properties, DyeColor color, Block vB) { + public ReinforcedStainedGlassBlock(BlockBehaviour.Properties properties, Block vB) { super(properties, vB); - this.color = color; - } - - @Override - public Integer getBeaconColorMultiplier(BlockState state, LevelReader level, BlockPos pos, BlockPos beaconPos) { - return color.getTextureDiffuseColor(); } @Override @@ -30,7 +21,7 @@ public boolean propagatesSkylightDown(BlockState state) { @Override public DyeColor getColor() { - return color; + return getVanillaBlock() instanceof BeaconBeamBlock beaconBeamBlock ? beaconBeamBlock.getColor() : DyeColor.WHITE; } @Override diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedStainedGlassPaneBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedStainedGlassPaneBlock.java index fcf38357f8..c8e907e71f 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedStainedGlassPaneBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedStainedGlassPaneBlock.java @@ -1,28 +1,17 @@ package net.geforcemods.securitycraft.blocks.reinforced; -import net.minecraft.core.BlockPos; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.BeaconBeamBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; public class ReinforcedStainedGlassPaneBlock extends ReinforcedPaneBlock implements BeaconBeamBlock { - private final DyeColor color; - - public ReinforcedStainedGlassPaneBlock(BlockBehaviour.Properties properties, DyeColor color, Block vB) { + public ReinforcedStainedGlassPaneBlock(BlockBehaviour.Properties properties, Block vB) { super(properties, vB); - this.color = color; - } - - @Override - public Integer getBeaconColorMultiplier(BlockState state, LevelReader level, BlockPos pos, BlockPos beaconPos) { - return color.getTextureDiffuseColor(); } @Override public DyeColor getColor() { - return color; + return getVanillaBlock() instanceof BeaconBeamBlock beaconBeamBlock ? beaconBeamBlock.getColor() : DyeColor.WHITE; } } diff --git a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedWallBlock.java b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedWallBlock.java index b551caa2f3..158988db74 100644 --- a/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedWallBlock.java +++ b/src/main/java/net/geforcemods/securitycraft/blocks/reinforced/ReinforcedWallBlock.java @@ -5,10 +5,12 @@ import net.geforcemods.securitycraft.api.IReinforcedBlock; import net.geforcemods.securitycraft.api.OwnableBlockEntity; import net.geforcemods.securitycraft.misc.OwnershipEvent; +import net.geforcemods.securitycraft.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; @@ -26,6 +28,11 @@ public ReinforcedWallBlock(BlockBehaviour.Properties properties, Block vanillaBl vanillaBlockSupplier = () -> vanillaBlock; } + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) { + return BlockUtils.getDestroyProgress(super::getDestroyProgress, state, player, level, pos); + } + @Override public Block getVanillaBlock() { return vanillaBlockSupplier.get(); diff --git a/src/main/java/net/geforcemods/securitycraft/datagen/BlockTagGenerator.java b/src/main/java/net/geforcemods/securitycraft/datagen/BlockTagGenerator.java index 339e1901b0..c78b2a9e62 100644 --- a/src/main/java/net/geforcemods/securitycraft/datagen/BlockTagGenerator.java +++ b/src/main/java/net/geforcemods/securitycraft/datagen/BlockTagGenerator.java @@ -74,6 +74,11 @@ protected void addTags(HolderLookup.Provider provider) { tag(SCTags.Blocks.REINFORCED_BUTTONS).addTag(SCTags.Blocks.REINFORCED_WOODEN_BUTTONS).add( SCContent.REINFORCED_STONE_BUTTON.get(), SCContent.REINFORCED_POLISHED_BLACKSTONE_BUTTON.get()); + tag(SCTags.Blocks.REINFORCED_CAULDRONS).add( + SCContent.REINFORCED_CAULDRON.get(), + SCContent.REINFORCED_LAVA_CAULDRON.get(), + SCContent.REINFORCED_POWDER_SNOW_CAULDRON.get(), + SCContent.REINFORCED_WATER_CAULDRON.get()); tag(SCTags.Blocks.REINFORCED_CHERRY_LOGS).add( SCContent.REINFORCED_CHERRY_LOG.get(), SCContent.REINFORCED_CHERRY_WOOD.get(), @@ -463,52 +468,6 @@ protected void addTags(HolderLookup.Provider provider) { SCContent.REINFORCED_RED_STAINED_GLASS.get(), SCContent.REINFORCED_BLACK_STAINED_GLASS.get()); tag(BlockTags.INFINIBURN_OVERWORLD).add(SCContent.REINFORCED_NETHERRACK.get(), SCContent.REINFORCED_MAGMA_BLOCK.get()); - tag(BlockTags.MINEABLE_WITH_AXE).add(SCContent.CREAKING_HEART_MINE.get()); - tag(BlockTags.MINEABLE_WITH_PICKAXE).add( - SCContent.CRYSTAL_QUARTZ_SLAB.get(), - SCContent.SMOOTH_CRYSTAL_QUARTZ.get(), - SCContent.CHISELED_CRYSTAL_QUARTZ.get(), - SCContent.CRYSTAL_QUARTZ_BLOCK.get(), - SCContent.CRYSTAL_QUARTZ_BRICKS.get(), - SCContent.CRYSTAL_QUARTZ_PILLAR.get(), - SCContent.CRYSTAL_QUARTZ_STAIRS.get(), - SCContent.SMOOTH_CRYSTAL_QUARTZ_STAIRS.get(), - SCContent.SMOOTH_CRYSTAL_QUARTZ_SLAB.get(), - SCContent.STONE_MINE.get(), - SCContent.DEEPSLATE_MINE.get(), - SCContent.COBBLED_DEEPSLATE_MINE.get(), - SCContent.COBBLESTONE_MINE.get(), - SCContent.COAL_ORE_MINE.get(), - SCContent.DEEPSLATE_COAL_ORE_MINE.get(), - SCContent.IRON_ORE_MINE.get(), - SCContent.DEEPSLATE_IRON_ORE_MINE.get(), - SCContent.GOLD_ORE_MINE.get(), - SCContent.DEEPSLATE_GOLD_ORE_MINE.get(), - SCContent.COPPER_ORE_MINE.get(), - SCContent.DEEPSLATE_COPPER_ORE_MINE.get(), - SCContent.REDSTONE_ORE_MINE.get(), - SCContent.DEEPSLATE_REDSTONE_ORE_MINE.get(), - SCContent.EMERALD_ORE_MINE.get(), - SCContent.DEEPSLATE_EMERALD_ORE_MINE.get(), - SCContent.LAPIS_ORE_MINE.get(), - SCContent.DEEPSLATE_LAPIS_ORE_MINE.get(), - SCContent.DIAMOND_ORE_MINE.get(), - SCContent.DEEPSLATE_DIAMOND_ORE_MINE.get(), - SCContent.NETHER_GOLD_ORE_MINE.get(), - SCContent.QUARTZ_ORE_MINE.get(), - SCContent.ANCIENT_DEBRIS_MINE.get(), - SCContent.GILDED_BLACKSTONE_MINE.get(), - SCContent.FURNACE_MINE.get(), - SCContent.SMOKER_MINE.get(), - SCContent.BLAST_FURNACE_MINE.get(), - SCContent.NETHERRACK_MINE.get(), - SCContent.END_STONE_MINE.get()); - tag(BlockTags.MINEABLE_WITH_SHOVEL).add( - SCContent.DIRT_MINE.get(), - SCContent.GRAVEL_MINE.get(), - SCContent.SAND_MINE.get(), - SCContent.SUSPICIOUS_GRAVEL_MINE.get(), - SCContent.SUSPICIOUS_SAND_MINE.get()); tag(BlockTags.MUSHROOM_GROW_BLOCK).add( SCContent.REINFORCED_MYCELIUM.get(), SCContent.REINFORCED_PODZOL.get(), @@ -581,10 +540,13 @@ protected void addTags(HolderLookup.Provider provider) { tag(BlockTags.VIBRATION_RESONATORS).add(SCContent.REINFORCED_AMETHYST_BLOCK.get()); tag(BlockTags.WALL_SIGNS).addTag(SCTags.Blocks.SECRET_WALL_SIGNS); tag(BlockTags.WALL_HANGING_SIGNS).addTag(SCTags.Blocks.SECRET_WALL_HANGING_SIGNS); + tag(BlockTags.WALLS).addTag(SCTags.Blocks.REINFORCED_WALLS); tag(BlockTags.WITHER_SUMMON_BASE_BLOCKS).add(SCContent.REINFORCED_SOUL_SAND.get(), SCContent.REINFORCED_SOUL_SOIL.get()); tag(BlockTags.WOODEN_FENCES).addTag(SCTags.Blocks.REINFORCED_WOODEN_FENCES); + tag(BlockTags.WOOL).addTag(SCTags.Blocks.REINFORCED_WOOL); tag(BlockTags.WOOL_CARPETS).addTag(SCTags.Blocks.REINFORCED_WOOL_CARPETS); //@formatter:on + miningRelatedTags(); //NeoForge tags tag(Tags.Blocks.CONCRETES).addTag(SCTags.Blocks.REINFORCED_CONCRETE); @@ -608,13 +570,475 @@ protected void addTags(HolderLookup.Provider provider) { switch (block) { case ReinforcedSlabBlock slab when !woodenSlabs.contains(block) -> tag(SCTags.Blocks.REINFORCED_SLABS).add(block); case ReinforcedStairsBlock stairs when !woodenStairs.contains(block) -> tag(SCTags.Blocks.REINFORCED_STAIRS).add(block); - case ReinforcedWallBlock wall -> tag(BlockTags.WALLS).add(block); + case ReinforcedWallBlock wall -> tag(SCTags.Blocks.REINFORCED_WALLS).add(block); default -> { } } } } + private void miningRelatedTags() { + //@formatter:off + tag(BlockTags.MINEABLE_WITH_AXE).add( + SCContent.CREAKING_HEART_MINE.get(), + SCContent.REINFORCED_BOOKSHELF.get(), + SCContent.REINFORCED_LADDER.get(), + SCContent.REINFORCED_LECTERN.get(), + SCContent.REINFORCED_SCAFFOLDING.get(), + SCContent.REINFORCED_BAMBOO_MOSAIC.get(), + SCContent.REINFORCED_BAMBOO_MOSAIC_SLAB.get(), + SCContent.REINFORCED_BAMBOO_MOSAIC_STAIRS.get(), + SCContent.REINFORCED_CHISELED_BOOKSHELF.get()) + .addTag(SCTags.Blocks.REINFORCED_WOODEN_FENCE_GATES) + .addTag(SCTags.Blocks.REINFORCED_LOGS) + .addTag(SCTags.Blocks.REINFORCED_PLANKS) + .addTag(SCTags.Blocks.SECRET_SIGNS) + .addTag(SCTags.Blocks.REINFORCED_WOODEN_BUTTONS) + .addTag(SCTags.Blocks.REINFORCED_WOODEN_FENCES) + .addTag(SCTags.Blocks.REINFORCED_WOODEN_PRESSURE_PLATES) + .addTag(SCTags.Blocks.REINFORCED_WOODEN_SLABS) + .addTag(SCTags.Blocks.REINFORCED_WOODEN_STAIRS) + .addTag(SCTags.Blocks.SECRET_HANGING_SIGNS) + .addTag(SCTags.Blocks.REINFORCED_BAMBOO_BLOCKS); + tag(BlockTags.MINEABLE_WITH_HOE).add( + SCContent.REINFORCED_NETHER_WART_BLOCK.get(), + SCContent.REINFORCED_WARPED_WART_BLOCK.get(), + SCContent.REINFORCED_SHROOMLIGHT.get(), + SCContent.REINFORCED_MOSS_BLOCK.get(), + SCContent.REINFORCED_MOSS_CARPET.get(), + SCContent.REINFORCED_PALE_MOSS_BLOCK.get(), + SCContent.REINFORCED_PALE_MOSS_CARPET.get()); + tag(BlockTags.MINEABLE_WITH_PICKAXE).add( + SCContent.ALARM.get(), + SCContent.BLOCK_CHANGE_DETECTOR.get(), + SCContent.BLOCK_POCKET_WALL.get(), + SCContent.BLOCK_POCKET_MANAGER.get(), + SCContent.BOUNCING_BETTY.get(), + SCContent.CAGE_TRAP.get(), + SCContent.CLAYMORE.get(), + SCContent.FLOOR_TRAP.get(), + SCContent.DISPLAY_CASE.get(), + SCContent.GLOW_DISPLAY_CASE.get(), + SCContent.FRAME.get(), + SCContent.IMS.get(), + SCContent.INVENTORY_SCANNER.get(), + SCContent.KEY_PANEL_BLOCK.get(), + SCContent.KEYCARD_LOCK.get(), + SCContent.KEYCARD_READER.get(), + SCContent.KEYPAD.get(), + SCContent.KEYPAD_BARREL.get(), + SCContent.KEYPAD_CHEST.get(), + SCContent.KEYPAD_DOOR.get(), + SCContent.KEYPAD_TRAPDOOR.get(), + SCContent.KEYPAD_FURNACE.get(), + SCContent.KEYPAD_SMOKER.get(), + SCContent.KEYPAD_BLAST_FURNACE.get(), + SCContent.MOTION_ACTIVATED_LIGHT.get(), + SCContent.LASER_BLOCK.get(), + SCContent.PANIC_BUTTON.get(), + SCContent.PORTABLE_RADAR.get(), + SCContent.PROJECTOR.get(), + SCContent.PROTECTO.get(), + SCContent.REINFORCED_DOOR.get(), + SCContent.ELECTRIFIED_IRON_FENCE.get(), + SCContent.ELECTRIFIED_IRON_FENCE_GATE.get(), + SCContent.RETINAL_SCANNER.get(), + SCContent.RIFT_STABILIZER.get(), + SCContent.SCANNER_DOOR.get(), + SCContent.SCANNER_TRAPDOOR.get(), + SCContent.SECURITY_CAMERA.get(), + SCContent.SONIC_SECURITY_SYSTEM.get(), + SCContent.TROPHY_SYSTEM.get(), + SCContent.SECURE_REDSTONE_INTERFACE.get(), + SCContent.USERNAME_LOGGER.get(), + SCContent.MINE.get(), + SCContent.CRYSTAL_QUARTZ_SLAB.get(), + SCContent.SMOOTH_CRYSTAL_QUARTZ.get(), + SCContent.CHISELED_CRYSTAL_QUARTZ.get(), + SCContent.CRYSTAL_QUARTZ_BLOCK.get(), + SCContent.CRYSTAL_QUARTZ_BRICKS.get(), + SCContent.CRYSTAL_QUARTZ_PILLAR.get(), + SCContent.CRYSTAL_QUARTZ_STAIRS.get(), + SCContent.SMOOTH_CRYSTAL_QUARTZ_STAIRS.get(), + SCContent.SMOOTH_CRYSTAL_QUARTZ_SLAB.get(), + SCContent.STONE_MINE.get(), + SCContent.DEEPSLATE_MINE.get(), + SCContent.COBBLED_DEEPSLATE_MINE.get(), + SCContent.COBBLESTONE_MINE.get(), + SCContent.COAL_ORE_MINE.get(), + SCContent.DEEPSLATE_COAL_ORE_MINE.get(), + SCContent.IRON_ORE_MINE.get(), + SCContent.DEEPSLATE_IRON_ORE_MINE.get(), + SCContent.GOLD_ORE_MINE.get(), + SCContent.DEEPSLATE_GOLD_ORE_MINE.get(), + SCContent.COPPER_ORE_MINE.get(), + SCContent.DEEPSLATE_COPPER_ORE_MINE.get(), + SCContent.REDSTONE_ORE_MINE.get(), + SCContent.DEEPSLATE_REDSTONE_ORE_MINE.get(), + SCContent.EMERALD_ORE_MINE.get(), + SCContent.DEEPSLATE_EMERALD_ORE_MINE.get(), + SCContent.LAPIS_ORE_MINE.get(), + SCContent.DEEPSLATE_LAPIS_ORE_MINE.get(), + SCContent.DIAMOND_ORE_MINE.get(), + SCContent.DEEPSLATE_DIAMOND_ORE_MINE.get(), + SCContent.NETHER_GOLD_ORE_MINE.get(), + SCContent.QUARTZ_ORE_MINE.get(), + SCContent.ANCIENT_DEBRIS_MINE.get(), + SCContent.GILDED_BLACKSTONE_MINE.get(), + SCContent.FURNACE_MINE.get(), + SCContent.SMOKER_MINE.get(), + SCContent.BLAST_FURNACE_MINE.get(), + SCContent.NETHERRACK_MINE.get(), + SCContent.END_STONE_MINE.get(), + SCContent.REINFORCED_STONE.get(), + SCContent.REINFORCED_GRANITE.get(), + SCContent.REINFORCED_POLISHED_GRANITE.get(), + SCContent.REINFORCED_DIORITE.get(), + SCContent.REINFORCED_POLISHED_DIORITE.get(), + SCContent.REINFORCED_ANDESITE.get(), + SCContent.REINFORCED_POLISHED_ANDESITE.get(), + SCContent.REINFORCED_COBBLESTONE.get(), + SCContent.REINFORCED_LAPIS_BLOCK.get(), + SCContent.REINFORCED_DISPENSER.get(), + SCContent.REINFORCED_SANDSTONE.get(), + SCContent.REINFORCED_CHISELED_SANDSTONE.get(), + SCContent.REINFORCED_CUT_SANDSTONE.get(), + SCContent.REINFORCED_GOLD_BLOCK.get(), + SCContent.REINFORCED_IRON_BLOCK.get(), + SCContent.REINFORCED_BRICKS.get(), + SCContent.REINFORCED_MOSSY_COBBLESTONE.get(), + SCContent.REINFORCED_OBSIDIAN.get(), + SCContent.REINFORCED_DIAMOND_BLOCK.get(), + SCContent.REINFORCED_COBBLESTONE_STAIRS.get(), + SCContent.REINFORCED_STONE_PRESSURE_PLATE.get(), + SCContent.REINFORCED_NETHERRACK.get(), + SCContent.REINFORCED_BASALT.get(), + SCContent.REINFORCED_POLISHED_BASALT.get(), + SCContent.REINFORCED_STONE_BRICKS.get(), + SCContent.REINFORCED_MOSSY_STONE_BRICKS.get(), + SCContent.REINFORCED_CRACKED_STONE_BRICKS.get(), + SCContent.REINFORCED_CHISELED_STONE_BRICKS.get(), + SCContent.REINFORCED_IRON_BARS.get(), + SCContent.REINFORCED_CHAIN.get(), + SCContent.REINFORCED_BRICK_STAIRS.get(), + SCContent.REINFORCED_STONE_BRICK_STAIRS.get(), + SCContent.REINFORCED_NETHER_BRICKS.get(), + SCContent.REINFORCED_NETHER_BRICK_FENCE.get(), + SCContent.REINFORCED_NETHER_BRICK_STAIRS.get(), + SCContent.REINFORCED_END_STONE.get(), + SCContent.REINFORCED_SANDSTONE_STAIRS.get(), + SCContent.REINFORCED_EMERALD_BLOCK.get(), + SCContent.REINFORCED_REDSTONE_BLOCK.get(), + SCContent.REINFORCED_HOPPER.get(), + SCContent.REINFORCED_QUARTZ_BLOCK.get(), + SCContent.REINFORCED_CHISELED_QUARTZ.get(), + SCContent.REINFORCED_QUARTZ_PILLAR.get(), + SCContent.REINFORCED_QUARTZ_STAIRS.get(), + SCContent.REINFORCED_DROPPER.get(), + SCContent.REINFORCED_WHITE_TERRACOTTA.get(), + SCContent.REINFORCED_ORANGE_TERRACOTTA.get(), + SCContent.REINFORCED_MAGENTA_TERRACOTTA.get(), + SCContent.REINFORCED_LIGHT_BLUE_TERRACOTTA.get(), + SCContent.REINFORCED_YELLOW_TERRACOTTA.get(), + SCContent.REINFORCED_LIME_TERRACOTTA.get(), + SCContent.REINFORCED_PINK_TERRACOTTA.get(), + SCContent.REINFORCED_GRAY_TERRACOTTA.get(), + SCContent.REINFORCED_LIGHT_GRAY_TERRACOTTA.get(), + SCContent.REINFORCED_CYAN_TERRACOTTA.get(), + SCContent.REINFORCED_PURPLE_TERRACOTTA.get(), + SCContent.REINFORCED_BLUE_TERRACOTTA.get(), + SCContent.REINFORCED_BROWN_TERRACOTTA.get(), + SCContent.REINFORCED_GREEN_TERRACOTTA.get(), + SCContent.REINFORCED_RED_TERRACOTTA.get(), + SCContent.REINFORCED_BLACK_TERRACOTTA.get(), + SCContent.REINFORCED_IRON_TRAPDOOR.get(), + SCContent.REINFORCED_PRISMARINE.get(), + SCContent.REINFORCED_PRISMARINE_BRICKS.get(), + SCContent.REINFORCED_DARK_PRISMARINE.get(), + SCContent.REINFORCED_PRISMARINE_STAIRS.get(), + SCContent.REINFORCED_PRISMARINE_BRICK_STAIRS.get(), + SCContent.REINFORCED_DARK_PRISMARINE_STAIRS.get(), + SCContent.REINFORCED_PRISMARINE_SLAB.get(), + SCContent.REINFORCED_PRISMARINE_BRICK_SLAB.get(), + SCContent.REINFORCED_DARK_PRISMARINE_SLAB.get(), + SCContent.REINFORCED_TERRACOTTA.get(), + SCContent.REINFORCED_COAL_BLOCK.get(), + SCContent.REINFORCED_RED_SANDSTONE.get(), + SCContent.REINFORCED_CHISELED_RED_SANDSTONE.get(), + SCContent.REINFORCED_CUT_RED_SANDSTONE.get(), + SCContent.REINFORCED_RED_SANDSTONE_STAIRS.get(), + SCContent.REINFORCED_NORMAL_STONE_SLAB.get(), + SCContent.REINFORCED_SMOOTH_STONE_SLAB.get(), + SCContent.REINFORCED_SANDSTONE_SLAB.get(), + SCContent.REINFORCED_CUT_SANDSTONE_SLAB.get(), + SCContent.REINFORCED_COBBLESTONE_SLAB.get(), + SCContent.REINFORCED_BRICK_SLAB.get(), + SCContent.REINFORCED_STONE_BRICK_SLAB.get(), + SCContent.REINFORCED_NETHER_BRICK_SLAB.get(), + SCContent.REINFORCED_QUARTZ_SLAB.get(), + SCContent.REINFORCED_RED_SANDSTONE_SLAB.get(), + SCContent.REINFORCED_CUT_RED_SANDSTONE_SLAB.get(), + SCContent.REINFORCED_PURPUR_SLAB.get(), + SCContent.REINFORCED_SMOOTH_STONE.get(), + SCContent.REINFORCED_SMOOTH_SANDSTONE.get(), + SCContent.REINFORCED_SMOOTH_QUARTZ.get(), + SCContent.REINFORCED_SMOOTH_RED_SANDSTONE.get(), + SCContent.REINFORCED_PURPUR_BLOCK.get(), + SCContent.REINFORCED_PURPUR_PILLAR.get(), + SCContent.REINFORCED_PURPUR_STAIRS.get(), + SCContent.REINFORCED_END_STONE_BRICKS.get(), + SCContent.REINFORCED_MAGMA_BLOCK.get(), + SCContent.REINFORCED_RED_NETHER_BRICKS.get(), + SCContent.REINFORCED_BONE_BLOCK.get(), + SCContent.REINFORCED_OBSERVER.get(), + SCContent.REINFORCED_WHITE_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_ORANGE_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_MAGENTA_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_LIGHT_BLUE_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_YELLOW_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_LIME_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_PINK_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_GRAY_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_LIGHT_GRAY_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_CYAN_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_PURPLE_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_BLUE_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_BROWN_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_GREEN_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_RED_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_BLACK_GLAZED_TERRACOTTA.get(), + SCContent.REINFORCED_WHITE_CONCRETE.get(), + SCContent.REINFORCED_ORANGE_CONCRETE.get(), + SCContent.REINFORCED_MAGENTA_CONCRETE.get(), + SCContent.REINFORCED_LIGHT_BLUE_CONCRETE.get(), + SCContent.REINFORCED_YELLOW_CONCRETE.get(), + SCContent.REINFORCED_LIME_CONCRETE.get(), + SCContent.REINFORCED_PINK_CONCRETE.get(), + SCContent.REINFORCED_GRAY_CONCRETE.get(), + SCContent.REINFORCED_LIGHT_GRAY_CONCRETE.get(), + SCContent.REINFORCED_CYAN_CONCRETE.get(), + SCContent.REINFORCED_PURPLE_CONCRETE.get(), + SCContent.REINFORCED_BLUE_CONCRETE.get(), + SCContent.REINFORCED_BROWN_CONCRETE.get(), + SCContent.REINFORCED_GREEN_CONCRETE.get(), + SCContent.REINFORCED_RED_CONCRETE.get(), + SCContent.REINFORCED_BLACK_CONCRETE.get(), + SCContent.REINFORCED_POLISHED_GRANITE_STAIRS.get(), + SCContent.REINFORCED_SMOOTH_RED_SANDSTONE_STAIRS.get(), + SCContent.REINFORCED_MOSSY_STONE_BRICK_STAIRS.get(), + SCContent.REINFORCED_POLISHED_DIORITE_STAIRS.get(), + SCContent.REINFORCED_MOSSY_COBBLESTONE_STAIRS.get(), + SCContent.REINFORCED_END_STONE_BRICK_STAIRS.get(), + SCContent.REINFORCED_STONE_STAIRS.get(), + SCContent.REINFORCED_SMOOTH_SANDSTONE_STAIRS.get(), + SCContent.REINFORCED_SMOOTH_QUARTZ_STAIRS.get(), + SCContent.REINFORCED_GRANITE_STAIRS.get(), + SCContent.REINFORCED_ANDESITE_STAIRS.get(), + SCContent.REINFORCED_RED_NETHER_BRICK_STAIRS.get(), + SCContent.REINFORCED_POLISHED_ANDESITE_STAIRS.get(), + SCContent.REINFORCED_DIORITE_STAIRS.get(), + SCContent.REINFORCED_POLISHED_GRANITE_SLAB.get(), + SCContent.REINFORCED_SMOOTH_RED_SANDSTONE_SLAB.get(), + SCContent.REINFORCED_MOSSY_STONE_BRICK_SLAB.get(), + SCContent.REINFORCED_POLISHED_DIORITE_SLAB.get(), + SCContent.REINFORCED_MOSSY_COBBLESTONE_SLAB.get(), + SCContent.REINFORCED_END_STONE_BRICK_SLAB.get(), + SCContent.REINFORCED_SMOOTH_SANDSTONE_SLAB.get(), + SCContent.REINFORCED_SMOOTH_QUARTZ_SLAB.get(), + SCContent.REINFORCED_GRANITE_SLAB.get(), + SCContent.REINFORCED_ANDESITE_SLAB.get(), + SCContent.REINFORCED_RED_NETHER_BRICK_SLAB.get(), + SCContent.REINFORCED_POLISHED_ANDESITE_SLAB.get(), + SCContent.REINFORCED_DIORITE_SLAB.get(), + SCContent.REINFORCED_LANTERN.get(), + SCContent.REINFORCED_SOUL_LANTERN.get(), + SCContent.REINFORCED_WARPED_NYLIUM.get(), + SCContent.REINFORCED_CRIMSON_NYLIUM.get(), + SCContent.REINFORCED_NETHERITE_BLOCK.get(), + SCContent.REINFORCED_CRYING_OBSIDIAN.get(), + SCContent.REINFORCED_BLACKSTONE.get(), + SCContent.REINFORCED_BLACKSTONE_STAIRS.get(), + SCContent.REINFORCED_BLACKSTONE_SLAB.get(), + SCContent.REINFORCED_POLISHED_BLACKSTONE.get(), + SCContent.REINFORCED_POLISHED_BLACKSTONE_BRICKS.get(), + SCContent.REINFORCED_CRACKED_POLISHED_BLACKSTONE_BRICKS.get(), + SCContent.REINFORCED_CHISELED_POLISHED_BLACKSTONE.get(), + SCContent.REINFORCED_POLISHED_BLACKSTONE_BRICK_SLAB.get(), + SCContent.REINFORCED_POLISHED_BLACKSTONE_BRICK_STAIRS.get(), + SCContent.REINFORCED_POLISHED_BLACKSTONE_STAIRS.get(), + SCContent.REINFORCED_POLISHED_BLACKSTONE_SLAB.get(), + SCContent.REINFORCED_POLISHED_BLACKSTONE_PRESSURE_PLATE.get(), + SCContent.REINFORCED_CHISELED_NETHER_BRICKS.get(), + SCContent.REINFORCED_CRACKED_NETHER_BRICKS.get(), + SCContent.REINFORCED_QUARTZ_BRICKS.get(), + SCContent.REINFORCED_TUFF.get(), + SCContent.REINFORCED_CALCITE.get(), + SCContent.REINFORCED_OXIDIZED_COPPER.get(), + SCContent.REINFORCED_WEATHERED_COPPER.get(), + SCContent.REINFORCED_EXPOSED_COPPER.get(), + SCContent.REINFORCED_COPPER_BLOCK.get(), + SCContent.REINFORCED_OXIDIZED_CUT_COPPER.get(), + SCContent.REINFORCED_WEATHERED_CUT_COPPER.get(), + SCContent.REINFORCED_EXPOSED_CUT_COPPER.get(), + SCContent.REINFORCED_CUT_COPPER.get(), + SCContent.REINFORCED_OXIDIZED_CUT_COPPER_STAIRS.get(), + SCContent.REINFORCED_WEATHERED_CUT_COPPER_STAIRS.get(), + SCContent.REINFORCED_EXPOSED_CUT_COPPER_STAIRS.get(), + SCContent.REINFORCED_CUT_COPPER_STAIRS.get(), + SCContent.REINFORCED_OXIDIZED_CUT_COPPER_SLAB.get(), + SCContent.REINFORCED_WEATHERED_CUT_COPPER_SLAB.get(), + SCContent.REINFORCED_EXPOSED_CUT_COPPER_SLAB.get(), + SCContent.REINFORCED_CUT_COPPER_SLAB.get(), + SCContent.REINFORCED_DRIPSTONE_BLOCK.get(), + SCContent.REINFORCED_DEEPSLATE.get(), + SCContent.REINFORCED_COBBLED_DEEPSLATE.get(), + SCContent.REINFORCED_COBBLED_DEEPSLATE_STAIRS.get(), + SCContent.REINFORCED_COBBLED_DEEPSLATE_SLAB.get(), + SCContent.REINFORCED_POLISHED_DEEPSLATE.get(), + SCContent.REINFORCED_POLISHED_DEEPSLATE_STAIRS.get(), + SCContent.REINFORCED_POLISHED_DEEPSLATE_SLAB.get(), + SCContent.REINFORCED_DEEPSLATE_TILES.get(), + SCContent.REINFORCED_DEEPSLATE_TILE_STAIRS.get(), + SCContent.REINFORCED_DEEPSLATE_TILE_SLAB.get(), + SCContent.REINFORCED_DEEPSLATE_BRICKS.get(), + SCContent.REINFORCED_DEEPSLATE_BRICK_STAIRS.get(), + SCContent.REINFORCED_DEEPSLATE_BRICK_SLAB.get(), + SCContent.REINFORCED_CHISELED_DEEPSLATE.get(), + SCContent.REINFORCED_CRACKED_DEEPSLATE_BRICKS.get(), + SCContent.REINFORCED_CRACKED_DEEPSLATE_TILES.get(), + SCContent.REINFORCED_SMOOTH_BASALT.get(), + SCContent.REINFORCED_RAW_IRON_BLOCK.get(), + SCContent.REINFORCED_RAW_COPPER_BLOCK.get(), + SCContent.REINFORCED_RAW_GOLD_BLOCK.get(), + SCContent.REINFORCED_ICE.get(), + SCContent.REINFORCED_PACKED_ICE.get(), + SCContent.REINFORCED_BLUE_ICE.get(), + SCContent.REINFORCED_PISTON.get(), + SCContent.REINFORCED_STICKY_PISTON.get(), + SCContent.REINFORCED_PISTON_HEAD.get(), + SCContent.REINFORCED_AMETHYST_BLOCK.get(), + SCContent.REINFORCED_MUD_BRICKS.get(), + SCContent.REINFORCED_MUD_BRICK_STAIRS.get(), + SCContent.REINFORCED_MUD_BRICK_SLAB.get(), + SCContent.REINFORCED_PACKED_MUD.get(), + SCContent.REINFORCED_TUFF_SLAB.get(), + SCContent.REINFORCED_TUFF_STAIRS.get(), + SCContent.REINFORCED_TUFF_WALL.get(), + SCContent.REINFORCED_CHISELED_TUFF.get(), + SCContent.REINFORCED_POLISHED_TUFF.get(), + SCContent.REINFORCED_POLISHED_TUFF_SLAB.get(), + SCContent.REINFORCED_POLISHED_TUFF_STAIRS.get(), + SCContent.REINFORCED_POLISHED_TUFF_WALL.get(), + SCContent.REINFORCED_TUFF_BRICKS.get(), + SCContent.REINFORCED_TUFF_BRICK_SLAB.get(), + SCContent.REINFORCED_TUFF_BRICK_STAIRS.get(), + SCContent.REINFORCED_TUFF_BRICK_WALL.get(), + SCContent.REINFORCED_CHISELED_TUFF_BRICKS.get(), + SCContent.REINFORCED_CHISELED_COPPER.get(), + SCContent.REINFORCED_EXPOSED_CHISELED_COPPER.get(), + SCContent.REINFORCED_WEATHERED_CHISELED_COPPER.get(), + SCContent.REINFORCED_OXIDIZED_CHISELED_COPPER.get(), + SCContent.REINFORCED_COPPER_GRATE.get(), + SCContent.REINFORCED_EXPOSED_COPPER_GRATE.get(), + SCContent.REINFORCED_WEATHERED_COPPER_GRATE.get(), + SCContent.REINFORCED_OXIDIZED_COPPER_GRATE.get(), + SCContent.REINFORCED_COPPER_BULB.get(), + SCContent.REINFORCED_EXPOSED_COPPER_BULB.get(), + SCContent.REINFORCED_WEATHERED_COPPER_BULB.get(), + SCContent.REINFORCED_OXIDIZED_COPPER_BULB.get(), + SCContent.REINFORCED_STONE_BUTTON.get(), + SCContent.REINFORCED_POLISHED_BLACKSTONE_BUTTON.get()) + .addTag(SCTags.Blocks.REINFORCED_WALLS) + .addTag(SCTags.Blocks.REINFORCED_CAULDRONS); + tag(BlockTags.MINEABLE_WITH_SHOVEL).add( + SCContent.DIRT_MINE.get(), + SCContent.GRAVEL_MINE.get(), + SCContent.SAND_MINE.get(), + SCContent.SUSPICIOUS_GRAVEL_MINE.get(), + SCContent.SUSPICIOUS_SAND_MINE.get(), + SCContent.REINFORCED_CLAY.get(), + SCContent.REINFORCED_DIRT.get(), + SCContent.REINFORCED_COARSE_DIRT.get(), + SCContent.REINFORCED_PODZOL.get(), + SCContent.REINFORCED_GRASS_BLOCK.get(), + SCContent.REINFORCED_GRAVEL.get(), + SCContent.REINFORCED_MYCELIUM.get(), + SCContent.REINFORCED_SAND.get(), + SCContent.REINFORCED_RED_SAND.get(), + SCContent.REINFORCED_SNOW_BLOCK.get(), + SCContent.REINFORCED_SOUL_SAND.get(), + SCContent.REINFORCED_DIRT_PATH.get(), + SCContent.REINFORCED_SOUL_SOIL.get(), + SCContent.REINFORCED_ROOTED_DIRT.get(), + SCContent.REINFORCED_MUD.get()); + tag(BlockTags.NEEDS_DIAMOND_TOOL).add( + SCContent.PROTECTO.get(), + SCContent.REINFORCED_OBSIDIAN.get(), + SCContent.REINFORCED_CRYING_OBSIDIAN.get(), + SCContent.REINFORCED_NETHERITE_BLOCK.get()); + tag(BlockTags.NEEDS_IRON_TOOL).add( + SCContent.REINFORCED_DIAMOND_BLOCK.get(), + SCContent.REINFORCED_EMERALD_BLOCK.get(), + SCContent.REINFORCED_GOLD_BLOCK.get(), + SCContent.REINFORCED_RAW_GOLD_BLOCK.get()); + tag(BlockTags.NEEDS_STONE_TOOL).add( + SCContent.BLOCK_POCKET_MANAGER.get(), + SCContent.BOUNCING_BETTY.get(), + SCContent.CAGE_TRAP.get(), + SCContent.CLAYMORE.get(), + SCContent.FLOOR_TRAP.get(), + SCContent.DISPLAY_CASE.get(), + SCContent.GLOW_DISPLAY_CASE.get(), + SCContent.FRAME.get(), + SCContent.KEY_PANEL_BLOCK.get(), + SCContent.KEYPAD.get(), + SCContent.KEYPAD_BARREL.get(), + SCContent.KEYPAD_CHEST.get(), + SCContent.KEYPAD_FURNACE.get(), + SCContent.KEYPAD_SMOKER.get(), + SCContent.KEYPAD_BLAST_FURNACE.get(), + SCContent.MOTION_ACTIVATED_LIGHT.get(), + SCContent.PORTABLE_RADAR.get(), + SCContent.PROJECTOR.get(), + SCContent.RIFT_STABILIZER.get(), + SCContent.SECURITY_CAMERA.get(), + SCContent.SONIC_SECURITY_SYSTEM.get(), + SCContent.TROPHY_SYSTEM.get(), + SCContent.MINE.get(), + SCContent.REINFORCED_IRON_BLOCK.get(), + SCContent.REINFORCED_RAW_IRON_BLOCK.get(), + SCContent.REINFORCED_LAPIS_BLOCK.get(), + SCContent.REINFORCED_COPPER_BLOCK.get(), + SCContent.REINFORCED_RAW_COPPER_BLOCK.get(), + SCContent.REINFORCED_CUT_COPPER_SLAB.get(), + SCContent.REINFORCED_CUT_COPPER_STAIRS.get(), + SCContent.REINFORCED_CUT_COPPER.get(), + SCContent.REINFORCED_WEATHERED_COPPER.get(), + SCContent.REINFORCED_WEATHERED_CUT_COPPER_SLAB.get(), + SCContent.REINFORCED_WEATHERED_CUT_COPPER_STAIRS.get(), + SCContent.REINFORCED_WEATHERED_CUT_COPPER.get(), + SCContent.REINFORCED_OXIDIZED_COPPER.get(), + SCContent.REINFORCED_OXIDIZED_CUT_COPPER_SLAB.get(), + SCContent.REINFORCED_OXIDIZED_CUT_COPPER_STAIRS.get(), + SCContent.REINFORCED_OXIDIZED_CUT_COPPER.get(), + SCContent.REINFORCED_EXPOSED_COPPER.get(), + SCContent.REINFORCED_EXPOSED_CUT_COPPER_SLAB.get(), + SCContent.REINFORCED_EXPOSED_CUT_COPPER_STAIRS.get(), + SCContent.REINFORCED_EXPOSED_CUT_COPPER.get(), + SCContent.REINFORCED_CHISELED_COPPER.get(), + SCContent.REINFORCED_EXPOSED_CHISELED_COPPER.get(), + SCContent.REINFORCED_WEATHERED_CHISELED_COPPER.get(), + SCContent.REINFORCED_OXIDIZED_CHISELED_COPPER.get(), + SCContent.REINFORCED_COPPER_GRATE.get(), + SCContent.REINFORCED_EXPOSED_COPPER_GRATE.get(), + SCContent.REINFORCED_WEATHERED_COPPER_GRATE.get(), + SCContent.REINFORCED_OXIDIZED_COPPER_GRATE.get(), + SCContent.REINFORCED_COPPER_BULB.get(), + SCContent.REINFORCED_EXPOSED_COPPER_BULB.get(), + SCContent.REINFORCED_WEATHERED_COPPER_BULB.get(), + SCContent.REINFORCED_OXIDIZED_COPPER_BULB.get()); + } + @Override public String getName() { return "SecurityCraft Block Tags"; diff --git a/src/main/java/net/geforcemods/securitycraft/entity/AbstractSecuritySeaBoat.java b/src/main/java/net/geforcemods/securitycraft/entity/AbstractSecuritySeaBoat.java index 00773c4fd6..6cbe1d6991 100644 --- a/src/main/java/net/geforcemods/securitycraft/entity/AbstractSecuritySeaBoat.java +++ b/src/main/java/net/geforcemods/securitycraft/entity/AbstractSecuritySeaBoat.java @@ -5,6 +5,7 @@ import java.util.UUID; import java.util.function.Supplier; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.ICustomizable; import net.geforcemods.securitycraft.api.IModuleInventory; @@ -167,7 +168,7 @@ public Component getDisplayName() { return InteractionResult.SUCCESS; } - else if (stack.is(SCContent.UNIVERSAL_BLOCK_REMOVER.get()) && !level.isClientSide) { + else if (stack.is(SCContent.UNIVERSAL_BLOCK_REMOVER.get()) && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get() && !level.isClientSide) { if (isOwnedBy(player) || player.isCreative()) destroy((ServerLevel) level, damageSources().playerAttack(player)); else @@ -271,12 +272,7 @@ public void tick() { @Override public boolean hurtServer(ServerLevel level, DamageSource source, float amount) { - Entity entity = source.getEntity(); - - if (!(entity instanceof Player player) || isOwnedBy(player) || player.isCreative()) - return super.hurtServer(level, source, amount); - else - return false; + return source.getEntity() instanceof Player player && isOwnedBy(player) && super.hurtServer(level, source, amount); } @Override diff --git a/src/main/java/net/geforcemods/securitycraft/entity/sentry/Sentry.java b/src/main/java/net/geforcemods/securitycraft/entity/sentry/Sentry.java index c935781205..a1b40d6885 100644 --- a/src/main/java/net/geforcemods/securitycraft/entity/sentry/Sentry.java +++ b/src/main/java/net/geforcemods/securitycraft/entity/sentry/Sentry.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Optional; +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IEMPAffected; import net.geforcemods.securitycraft.api.IOwnable; @@ -191,7 +192,7 @@ else if (item == Items.REDSTONE && isShutDown()) { if (!player.isCreative()) player.getMainHandItem().shrink(1); } - else if (item == SCContent.UNIVERSAL_BLOCK_REMOVER.get()) { + else if (item == SCContent.UNIVERSAL_BLOCK_REMOVER.get() && !ConfigHandler.SERVER.vanillaToolBlockBreaking.get()) { kill(null); if (!player.isCreative()) diff --git a/src/main/java/net/geforcemods/securitycraft/items/UniversalBlockRemoverItem.java b/src/main/java/net/geforcemods/securitycraft/items/UniversalBlockRemoverItem.java index ccbac1db2f..d303f1064b 100644 --- a/src/main/java/net/geforcemods/securitycraft/items/UniversalBlockRemoverItem.java +++ b/src/main/java/net/geforcemods/securitycraft/items/UniversalBlockRemoverItem.java @@ -1,5 +1,8 @@ package net.geforcemods.securitycraft.items; +import java.util.List; + +import net.geforcemods.securitycraft.ConfigHandler; import net.geforcemods.securitycraft.SCContent; import net.geforcemods.securitycraft.api.IBlockMine; import net.geforcemods.securitycraft.api.IDisguisable; @@ -21,12 +24,14 @@ import net.geforcemods.securitycraft.util.Utils; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -36,94 +41,106 @@ import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; public class UniversalBlockRemoverItem extends Item { + private static final Component DISABLED_ITEM_TOOLTIP = Component.translatable("tooltip.securitycraft:universal_block_remover.disabled").withStyle(ChatFormatting.RED); + public UniversalBlockRemoverItem(Properties properties) { super(properties); } @Override public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext ctx) { - Level level = ctx.getLevel(); - BlockPos pos = ctx.getClickedPos(); - BlockState state = level.getBlockState(pos); - Block block = state.getBlock(); - BlockEntity be = level.getBlockEntity(pos); - Player player = ctx.getPlayer(); - - if (be != null && isOwnableBlock(block, be)) { - if (be instanceof DisplayCaseBlockEntity displayCase && (displayCase.isOpen() && displayCase.getDisplayedStack().isEmpty())) - return InteractionResult.PASS; - - IOwnable ownable = (IOwnable) be; - Owner owner = ownable.getOwner(); - boolean isDefault = owner.getName().equals("owner") && owner.getUUID().equals("ownerUUID"); - - if (!(isDefault && state.is(SCContent.FRAME.get())) && !ownable.isOwnedBy(player)) { - if (!(block instanceof IBlockMine) && (!(be.getBlockState().getBlock() instanceof IDisguisable db) || (((BlockItem) db.getDisguisedStack(level, pos).getItem()).getBlock() instanceof IDisguisable))) - PlayerUtils.sendMessageToPlayer(player, Utils.localize(SCContent.UNIVERSAL_BLOCK_REMOVER.get().getDescriptionId()), Utils.localize("messages.securitycraft:notOwned", PlayerUtils.getOwnerComponent(owner)), ChatFormatting.RED); - - return InteractionResult.FAIL; - } + if (!ConfigHandler.SERVER.vanillaToolBlockBreaking.get()) { + Level level = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + BlockState state = level.getBlockState(pos); + Block block = state.getBlock(); + BlockEntity be = level.getBlockEntity(pos); + Player player = ctx.getPlayer(); + + if (be != null && isOwnableBlock(block, be)) { + if (be instanceof DisplayCaseBlockEntity displayCase && (displayCase.isOpen() && displayCase.getDisplayedStack().isEmpty())) + return InteractionResult.PASS; + + IOwnable ownable = (IOwnable) be; + Owner owner = ownable.getOwner(); + boolean isDefault = owner.getName().equals("owner") && owner.getUUID().equals("ownerUUID"); + + if (!ConfigHandler.SERVER.allowBreakingNonOwnedBlocks.get() && !(isDefault && state.is(SCContent.FRAME.get())) && !ownable.isOwnedBy(player)) { + if (!(block instanceof IBlockMine) && (!(be.getBlockState().getBlock() instanceof IDisguisable db) || (((BlockItem) db.getDisguisedStack(level, pos).getItem()).getBlock() instanceof IDisguisable))) + PlayerUtils.sendMessageToPlayer(player, Utils.localize(getDescriptionId()), Utils.localize("messages.securitycraft:notOwned", PlayerUtils.getOwnerComponent(owner)), ChatFormatting.RED); + + return InteractionResult.FAIL; + } - if (be instanceof IModuleInventory inv) - inv.dropAllModules(); + if (be instanceof IModuleInventory inv) + inv.dropAllModules(); - if (block == SCContent.LASER_BLOCK.get()) { - LinkableBlockEntity laser = (LinkableBlockEntity) be; + if (block == SCContent.LASER_BLOCK.get()) { + LinkableBlockEntity laser = (LinkableBlockEntity) be; - for (ItemStack module : laser.getInventory()) { - if (!module.isEmpty()) - laser.propagate(new ILinkedAction.ModuleRemoved(((ModuleItem) module.getItem()).getModuleType(), false), laser); - } + for (ItemStack module : laser.getInventory()) { + if (!module.isEmpty()) + laser.propagate(new ILinkedAction.ModuleRemoved(((ModuleItem) module.getItem()).getModuleType(), false), laser); + } - if (!level.isClientSide) { - level.destroyBlock(pos, true); - LaserBlock.destroyAdjacentLasers(level, pos); - stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(ctx.getHand())); + if (!level.isClientSide) { + level.destroyBlock(pos, true); + LaserBlock.destroyAdjacentLasers(level, pos); + stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(ctx.getHand())); + } } - } - else if (block == SCContent.CAGE_TRAP.get() && state.getValue(CageTrapBlock.DEACTIVATED)) { - BlockPos originalPos = pos; - BlockPos middlePos = originalPos.above(4); - - if (!level.isClientSide) { - CageTrapBlock.loopIronBarPositions(originalPos.mutable(), barPos -> { - BlockEntity barBe = level.getBlockEntity(barPos); - - if (barBe instanceof IOwnable ownableBar && owner.owns(ownableBar)) { - Block barBlock = level.getBlockState(barPos).getBlock(); - - if (barBlock == SCContent.REINFORCED_IRON_BARS.get() || (barPos.equals(middlePos) && barBlock == SCContent.HORIZONTAL_REINFORCED_IRON_BARS.get())) - level.destroyBlock(barPos, false); - } - }); - level.destroyBlock(originalPos, true); - stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(ctx.getHand())); + else if (block == SCContent.CAGE_TRAP.get() && state.getValue(CageTrapBlock.DEACTIVATED)) { + BlockPos originalPos = pos; + BlockPos middlePos = originalPos.above(4); + + if (!level.isClientSide) { + CageTrapBlock.loopIronBarPositions(originalPos.mutable(), barPos -> { + BlockEntity barBe = level.getBlockEntity(barPos); + + if (barBe instanceof IOwnable ownableBar && owner.owns(ownableBar)) { + Block barBlock = level.getBlockState(barPos).getBlock(); + + if (barBlock == SCContent.REINFORCED_IRON_BARS.get() || (barPos.equals(middlePos) && barBlock == SCContent.HORIZONTAL_REINFORCED_IRON_BARS.get())) + level.destroyBlock(barPos, false); + } + }); + level.destroyBlock(originalPos, true); + stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(ctx.getHand())); + } } - } - else { - if ((block instanceof ReinforcedDoorBlock || block instanceof SpecialDoorBlock) && state.getValue(BlockStateProperties.DOUBLE_BLOCK_HALF) == DoubleBlockHalf.UPPER) - pos = pos.below(); - - if (block == SCContent.INVENTORY_SCANNER.get()) { - InventoryScannerBlockEntity inventoryScanner = InventoryScannerBlock.getConnectedInventoryScanner(level, pos); - - if (inventoryScanner != null) - inventoryScanner.getInventory().clear(); + else { + if ((block instanceof ReinforcedDoorBlock || block instanceof SpecialDoorBlock) && state.getValue(BlockStateProperties.DOUBLE_BLOCK_HALF) == DoubleBlockHalf.UPPER) + pos = pos.below(); + + if (block == SCContent.INVENTORY_SCANNER.get()) { + InventoryScannerBlockEntity inventoryScanner = InventoryScannerBlock.getConnectedInventoryScanner(level, pos); + + if (inventoryScanner != null) + inventoryScanner.getInventory().clear(); + } + + if (!level.isClientSide) { + level.destroyBlock(pos, true); //this also removes the BlockEntity + block.destroy(level, pos, state); + stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(ctx.getHand())); + } } - if (!level.isClientSide) { - level.destroyBlock(pos, true); //this also removes the BlockEntity - block.destroy(level, pos, state); - stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(ctx.getHand())); - } + return InteractionResult.SUCCESS; } - - return InteractionResult.SUCCESS; } return InteractionResult.PASS; } + @Override + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + if (ConfigHandler.SERVER.vanillaToolBlockBreaking.get()) + tooltipComponents.add(DISABLED_ITEM_TOOLTIP); + + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + } + private static boolean isOwnableBlock(Block block, BlockEntity be) { return be instanceof OwnableBlockEntity || be instanceof IOwnable || block instanceof OwnableBlock; } diff --git a/src/main/java/net/geforcemods/securitycraft/mixin/cobweb/ShearsItemMixin.java b/src/main/java/net/geforcemods/securitycraft/mixin/cobweb/ShearsItemMixin.java new file mode 100644 index 0000000000..595ed7c536 --- /dev/null +++ b/src/main/java/net/geforcemods/securitycraft/mixin/cobweb/ShearsItemMixin.java @@ -0,0 +1,31 @@ +package net.geforcemods.securitycraft.mixin.cobweb; + +import java.util.ArrayList; +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import net.geforcemods.securitycraft.SCContent; +import net.minecraft.core.HolderSet; +import net.minecraft.world.item.ShearsItem; +import net.minecraft.world.item.component.Tool; + +/** + * Allows reinforced cobweb to be mined faster using shears + */ +@Mixin(ShearsItem.class) +public class ShearsItemMixin { + @SuppressWarnings("rawtypes") + @WrapOperation(method = "createToolProperties", at = @At(value = "INVOKE", target = "Ljava/util/List;of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;")) + private static List securitycraft$addReinforcedCobwebToSwordProperties(Object minesAndDropsCobweb, Object overrideLeavesSpeed, Object overrideWoolSpeed, Object overrideVineAndGlowLichenSpeed, Operation original) { + List list = new ArrayList(); + + list.add(Tool.Rule.minesAndDrops(HolderSet.direct(SCContent.REINFORCED_COBWEB.getDelegate()), 15.0F)); + list.addAll(original.call(minesAndDropsCobweb, overrideLeavesSpeed, overrideWoolSpeed, overrideVineAndGlowLichenSpeed)); + return list; + } +} diff --git a/src/main/java/net/geforcemods/securitycraft/mixin/cobweb/ToolMaterialMixin.java b/src/main/java/net/geforcemods/securitycraft/mixin/cobweb/ToolMaterialMixin.java new file mode 100644 index 0000000000..4299270496 --- /dev/null +++ b/src/main/java/net/geforcemods/securitycraft/mixin/cobweb/ToolMaterialMixin.java @@ -0,0 +1,31 @@ +package net.geforcemods.securitycraft.mixin.cobweb; + +import java.util.ArrayList; +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import net.geforcemods.securitycraft.SCContent; +import net.minecraft.core.HolderSet; +import net.minecraft.world.item.ToolMaterial; +import net.minecraft.world.item.component.Tool; + +/** + * Allows reinforced cobweb to be mined faster using swords + */ +@Mixin(ToolMaterial.class) +public class ToolMaterialMixin { + @SuppressWarnings("rawtypes") + @WrapOperation(method = "applySwordProperties", at = @At(value = "INVOKE", target = "Ljava/util/List;of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;")) + private static List securitycraft$addReinforcedCobwebToSwordProperties(Object minesAndDropsCobweb, Object overrideSwordEfficientSpeed, Operation original) { + List list = new ArrayList(); + + list.add(Tool.Rule.minesAndDrops(HolderSet.direct(SCContent.REINFORCED_COBWEB.getDelegate()), 15.0F)); + list.addAll(original.call(minesAndDropsCobweb, overrideSwordEfficientSpeed)); + return list; + } +} diff --git a/src/main/java/net/geforcemods/securitycraft/util/BlockUtils.java b/src/main/java/net/geforcemods/securitycraft/util/BlockUtils.java index 0fe3dacb65..449cb271a6 100644 --- a/src/main/java/net/geforcemods/securitycraft/util/BlockUtils.java +++ b/src/main/java/net/geforcemods/securitycraft/util/BlockUtils.java @@ -3,6 +3,7 @@ import java.util.function.BiPredicate; import net.geforcemods.securitycraft.ConfigHandler; +import net.geforcemods.securitycraft.api.IBlockMine; import net.geforcemods.securitycraft.api.IDoorActivator; import net.geforcemods.securitycraft.api.IExtractionBlock; import net.geforcemods.securitycraft.api.IOwnable; @@ -11,6 +12,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.Level.ExplosionInteraction; import net.minecraft.world.level.LevelAccessor; @@ -127,4 +129,23 @@ public static void removeInSequence(BiPredicate stateMatc } } } + + public static float getDestroyProgress(DestroyProgress destroyProgress, BlockState state, Player player, BlockGetter level, BlockPos pos) { + if (state.getBlock() instanceof IBlockMine) + return destroyProgress.get(state, player, level, pos); + + if (ConfigHandler.SERVER.vanillaToolBlockBreaking.get()) { + if (level.getBlockEntity(pos) instanceof IOwnable ownable && ownable.isOwnedBy(player)) + return destroyProgress.get(state, player, level, pos); + else if (ConfigHandler.SERVER.allowBreakingNonOwnedBlocks.get()) + return destroyProgress.get(state, player, level, pos) / (float) ConfigHandler.SERVER.nonOwnedBreakingSlowdown.getAsDouble(); + } + + return 0.0F; + } + + @FunctionalInterface + public static interface DestroyProgress { + float get(BlockState state, Player player, BlockGetter level, BlockPos pos); + } } diff --git a/src/main/resources/assets/securitycraft/lang/de_at.json b/src/main/resources/assets/securitycraft/lang/de_at.json index 878faa0fc3..1d32df28fb 100644 --- a/src/main/resources/assets/securitycraft/lang/de_at.json +++ b/src/main/resources/assets/securitycraft/lang/de_at.json @@ -818,7 +818,7 @@ "gui.securitycraft:scManual.lockable": "Sperrbar: Dieser Block kann durch ein Schallsicherheitssystem gesperrt werden.", "gui.securitycraft:scManual.modules": "Verfügbare Module:", "gui.securitycraft:scManual.options": "Verfügbare Einstellungen:", - "gui.securitycraft:scManual.ownableBlock": "Besitzbar: Dies ist resistent gegenüber Explosionen und kann nur vom Besitzer mit einem Universellen Blockentferner entfernt werden.", + "gui.securitycraft:scManual.ownableBlock": "Besitzbar: Dies ist resistent gegenüber Explosionen und kann nur vom Besitzer entfernt werden.", "gui.securitycraft:scManual.passcodeProtectedBlock": "Passwortgesichert: Dies kann nur benutzt werden, wenn das korrekte Passwort eingegeben wird.", "gui.securitycraft:scManual.patreon.error": "Fehler beim Laden der Patrons!", "gui.securitycraft:scManual.patreon.loading": "Lade...", @@ -919,8 +919,8 @@ "help.securitycraft.crystal_quartz_item.info": "Kristallquarz wird benutzt, um Kristallquarz-Blöcke herzustellen.", "help.securitycraft.disguise_module.info": "Das Tarnmodul tarnt bestimmte Blöcke, wenn es hinzugefügt wird.", "help.securitycraft.display_cases.info": "Die Vitrine kann ein Item ausstellen, ähnlich zu einem Vanilla-Rahmen, wobei das Item nicht gedreht werden kann. Um die Vitrine zu öffnen, benötigt man einen numerischen Code, wie das Nummernschloss und andere ähnliche Blöcke. Sobald es offen ist, kann ein Item mit einem Rechtsklick eingefügt werden. Um das Item wieder herauszunehmen, schleich-rechtsklicke die Vitrine. Um die Vitrine zu schließen, rechtsklicke sie mit einer leeren Hand. Während die Vitrine offen ist, kann jeder mit ihr interagieren. Die Leuchtvitrine leuchtet im Dunkeln, ganz wie der Vanilla-Leuchtrahmen.", - "help.securitycraft.door_indestructible_iron_item.info": "Die verstärkte Eisentür ist wie eine normale Eisentür, jedoch kann sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt und durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", - "help.securitycraft.electrified_iron_fence.info": "Der elektrische Eisenzaun ist wie ein normaler Zaun, jedoch können sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", + "help.securitycraft.door_indestructible_iron_item.info": "Die verstärkte Eisentür ist wie eine normale Eisentür, jedoch kann sie nur von dem Besitzer entfernt und durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", + "help.securitycraft.electrified_iron_fence.info": "Der elektrische Eisenzaun ist wie ein normaler Zaun, jedoch kann er nur von dem Besitzer entfernt werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", "help.securitycraft.floor_trap.info": "Die Bodenfalle ist ein Block, der für eine kurze Zeit verschwindet, sobald ein Spieler oder Mob über ihn läuft. Mit dem universellen Blockmodifizierer können einige Einstellungen, unter anderem die Zeit bis zum Verschwinden, oder wer die Falle auslösen kann, vorgenommen werden.", "help.securitycraft.furnace_mines.info": "Ofenminen funktionieren wie normale Minen, jedoch können sie nur explodieren, wenn sie von einem Spieler gerechtsklickt oder abgebaut werden, der nicht der Besitzer ist.", "help.securitycraft.harming_module.info": "Das Schadensmodul schadet Spielern, die nicht auf dem Zulassungslisten-Modul sind, wenn diese z.B. durch einen Laser laufen.", @@ -951,15 +951,15 @@ "help.securitycraft.projector.info": "Der Projektor projiziert holographische Versionen eines Blockes deiner Wahl in die Welt. Dies kann genutzt werden, um Gebäude und andere Bereiche von Interesse von anderen Spielern zu verstecken. Der Entfernung und die Breite der Projektion kann im GUI des Projektors verändert werden.", "help.securitycraft.protecto.info": "Der Protecto, inspiriert von dem Spiel \"Megaman: Battle Network 2\" von Capcom, attackiert jeden Mob innerhalb eines 10 Blöcke Radius mit einem Blitz alle 10 Sekunden. Der Protecto darf keinen Block über sich haben und es muss regnen oder schneien, damit er angreift.", "help.securitycraft.redstone_module.info": "Das Redstone-Modul fügt die Eigenschaft, ein Redstonesignal abzugeben, zu einem Block hinzu.", - "help.securitycraft.reinforced.info": "Verstärkte Blöcke sind unzerstörbare Blöcke Varianten von Vanilla Blöcken, jedoch können sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced.info": "Verstärkte Blöcke sind unzerstörbare Varianten von Vanilla Blöcken, jedoch können sie nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_buttons.info": "Die verstärkten Knöpfe können nur von ihrem Besitzer oder zugelassenen Spielern aktiviert werden.", "help.securitycraft.reinforced_chiseled_bookshelf.info": "Das Verstärkte gearbeitete Bücherregal hat die gleichen Eigenschaften wie sein Vanilla-Gegenstück, wobei nur der Besitzer oder Spieler auf der Zulassungsliste Bücher hinzufügen und entfernen können.", "help.securitycraft.reinforced_crystal_quartz.info": "Verstärkte Kristallquarz-Blöcke werden benutzt, um die Blocktasche zu bauen. Mehr Infos auf der Seite des Blocktaschenverwalters.", "help.securitycraft.reinforced_fence_gate.info": "Das elektrische Eisenzauntor ist wie das normale Zauntor, jedoch kann es nur durch Nummernschlösser, Inventarscanner, etc. geöffnet werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", "help.securitycraft.reinforced_fence_gates.info": "Die verstärkten Zauntore können nur von ihrem Besitzer oder zugelassenen Spielern geöffnet werden.", - "help.securitycraft.reinforced_glass_pane.info": "Die verstärkte Glasscheibe ist wie eine normale Glasscheibe, jedoch kann sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced_glass_pane.info": "Die verstärkte Glasscheibe ist wie eine normale Glasscheibe, jedoch kann sie nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_hopper.info": "Der verstärkte Trichter ist der einzige Block, der benutzt werden kann, um Items aus einer passwortgesicherten Truhe oder Fass zu extrahieren. Sonst verhält er sich wie ein normaler Trichter.", - "help.securitycraft.reinforced_iron_bars.info": "Das verstärkte Eisengitter ist wie ein normales Eisengitter, jedoch kann es nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced_iron_bars.info": "Das verstärkte Eisengitter ist wie ein normales Eisengitter, jedoch kann es nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_iron_trapdoor.info": "Die verstärkte Eisenfalltür funktioniert wie die normale Eisenfalltür. Sie kann jedoch nur durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", "help.securitycraft.reinforced_lever.info": "Der verstärkte Hebel kann nur von seinem Besitzer oder zugelassenen Spielern aktiviert werden.", "help.securitycraft.reinforced_pressure_plates.info": "Die verstärkten Druckplatten können nur von ihrem Besitzer oder zugelassenen Spielern aktiviert werden.", @@ -983,7 +983,7 @@ "help.securitycraft.track_mine.info": "Die Schienenmine explodiert, wenn ein Lore darüber fährt.", "help.securitycraft.trophy_system.info": "Das Trophy-System, inspiriert von dem gleichnamigen Gegenstand in \"Call of Duty: Modern Warfare 3\" publiziert von Activision, visiert gegnerische Pfeile und Feuerbälle an und zerstört sie von Weitem nach einer halbsekündigen Aufladezeit.", "help.securitycraft.universal_block_modifier.info": "Der Universelle Blockmodifizierer kann bestimmte SecurityCraft Blöcke mit Modulen ausrüsten. Ein Rechtsklick auf so einen Block öffnet das Modul-GUI. Nun kannst du die entsprechenden Module installieren.", - "help.securitycraft.universal_block_remover.info": "Der Universelle Blockentferner wird benutzt, um verstärkte Blöcke durch einen Rechtsklick zu entfernen. Nur der Spieler, der den Block platziert hat, kann ihn auch entfernen.", + "help.securitycraft.universal_block_remover.info": "Wenn er aktiviert ist, wird der Universelle Blockentferner benutzt, um verstärkte Blöcke durch einen Rechtsklick zu entfernen. Nur der Spieler, der den Block platziert hat, kann ihn auch entfernen.", "help.securitycraft.universal_key_changer.info": "Der Universelle Passwortwechsler erlaubt dir, das Passwort deiner passwortgesicherten Blöcke zu ändern. Rechtsklicke einen passwortgesicherten Block, um das GUI zu öffnen, dann gib das neue Passwort ein.", "help.securitycraft.universal_owner_changer.info": "Der Universelle Besitzeränderer kann den Besitzer eines Blockes ändern. Benenne ihn in einem Amboss in den Namen des neuen Besitzers um, und rechtsklicke einen oder mehrere deiner Blöcke, um den Besitzer zu ändern. Sofern aktiviert, können Blöcke ohne Besitzer mit einem nicht benannten Besitzeränderer in Besitz genommen werden.", "help.securitycraft.username_logger.info": "Der Nutzernamen-Protokollierer protokolliert jeden Spieler, der sich ihm in einem Radius von 3 Blöcken nähert, wenn er mit Redstone gepowert ist.", @@ -1401,14 +1401,16 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Wie viele Sekunden verstreichen müssen, bis derselbe Spieler wieder protokolliert werden kann.", "option.securitycraft.username_logger.searchRadius": "Suchradius: %s", "option.securitycraft.username_logger.searchRadius.description": "Der Radius in Blöcken, in dem der Protokollierer nach Spielern sucht.", - "securitycraft.configuration.ableToBreakMines": "Minen können zerbrochen werden", - "securitycraft.configuration.ableToBreakMines.tooltip": "Sollen Spieler Minen zerbrechen können, ohne dass sie explodieren?", "securitycraft.configuration.allowAdminTool": "Admin-Werkzeug erlauben", "securitycraft.configuration.allowAdminTool.tooltip": "Kann das Admin-Werkzeug benutzt werden?", "securitycraft.configuration.allowBlockClaim": "Besitzbeanspruchung von Blöcken erlauben", "securitycraft.configuration.allowBlockClaim.tooltip": "Erlaubt es, Blöcke, die keinen Besitzer haben, durch einen Rechtsklick mit dem Universellen Besitzeränderer in den Besitz zu nehmen.", + "securitycraft.configuration.allow_breaking_non_owned_blocks": "Erlauben, Blöcke anderer Besitzer zu zerbrechen", + "securitycraft.configuration.allow_breaking_non_owned_blocks.tooltip": "Ob Spieler, die nicht der Besitzer eines Blockes sind, diesen Block trotzdem zerbrechen können.\nDieser Wert hat Auswirkungen, egal welchen Wert \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" hat.", "securitycraft.configuration.allow_camera_night_vision": "Kamera-Nachtsicht erlauben", "securitycraft.configuration.allow_camera_night_vision.tooltip": "Wenn deaktiviert, können Spieler den Nachtsichteffekt der Überwachungskamera nicht ohne einen Trank der Nachtsicht verwenden.", + "securitycraft.configuration.always_drop": "Blöcke immer droppen lassen", + "securitycraft.configuration.always_drop.tooltip": "Ob SecurityCrafts Blöcke immer sich selbst droppen, egal welches Werkzeug verwendet wird. Wenn dies deaktiviert ist, muss das korrekte Werkzeug zum Zerbrechen des Blockes verwendet werden (bspw. eine Spitzhacke für verstärkten Stein, oder irgendetwas für verstärkte Erde).\nDies hat nur Auswirkungen, wenn \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" aktiviert ist.", "securitycraft.configuration.disable_thanks_message": "Nachricht beim Betreten der Welt deaktivieren", "securitycraft.configuration.disable_thanks_message.tooltip": "Wenn aktiviert, wird die Nachricht, die SecurityCraft beitretenden Spielern sendet, nicht gesendet.\nBeachte, dass die Nachricht für jeden Spieler deaktiviert wird, selbst für diejenigen, die sie sehen wollen.", "securitycraft.configuration.enable_team_ownership": "Teameigentum aktivieren", @@ -1441,6 +1443,8 @@ "securitycraft.configuration.mineExplodesWhenInCreative.tooltip": "Sollen Minen explodieren, wenn sie im Kreativmodus zerbrochen werden?", "securitycraft.configuration.mineExplosionsBreakBlocks": "Minenexplosionen zerstören Blöcke", "securitycraft.configuration.mineExplosionsBreakBlocks.tooltip": "Wenn deaktiviert, zerstören Minenexplosionen keine Blöcke. Wenn aktiviert, wird die \"blockExplosionDropDecay\"-Spielregel beachtet.", + "securitycraft.configuration.non_owned_breaking_slowdown": "Verzögerung beim Zerbrechen von Blöcken anderer Besitzer", + "securitycraft.configuration.non_owned_breaking_slowdown.tooltip": "Wie viel langsamer das Zerbrechen eines Blockes, der einem nicht selbst gehört, sein soll.\nDer Wert wird wie folgt berechnet: Normale Zerbrechgeschwindigkeit geteilt durch den Verzögerungswert. Beispiel: Ein Wert von 2.0 bedeutet, dass es doppelt so viel Zeit braucht, den Block zu zerbrechen.\nDiese Wert hat nur eine Auswirkung, wenn \"Erlauben, Blöcke anderer Besitzer zu zerbrechen\" und \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" aktiviert sind.", "securitycraft.configuration.passcode_check_cooldown": "Abklingzeit nach Passwortüberprüfung", "securitycraft.configuration.passcode_check_cooldown.tooltip": "Bestimmt den Wert in Millisekunden, der zwischen zwei Versuchen eines Spielers, ein Passwort einzugeben, verstreichen muss.", "securitycraft.configuration.passcode_spam_log_warning": "Passwort-Spam Log-Warnung", @@ -1482,6 +1486,8 @@ "securitycraft.configuration.title": "SecurityCraft-Konfiguration", "securitycraft.configuration.trick_scanners_with_player_heads": "Augenscanner mit Spielerköpfen austricksen", "securitycraft.configuration.trick_scanners_with_player_heads.tooltip": "Wenn aktiviert, können Spieler den Kopf eines anderen Spielers tragen, um deren Augenscanner hinters Licht zu führen.", + "securitycraft.configuration.vanilla_tool_block_breaking": "Blöcke mit Vanilla-Werkzeugen zerbrechen", + "securitycraft.configuration.vanilla_tool_block_breaking.tooltip": "Ob SecurityCrafts Blöcke mit Vanilla-Werkzeugen (Axt, Schaufel, Harke, ...) zerbrochen werden können, anstatt dem Universellen Blockentferner. Wenn aktiviert, wird der Universelle Blockentferner deaktiviert.", "securitycraft.option.default": "(Standardmäßig %s)", "securitycraft.option.default_with_range": "(Standardmäßig %s, mit einem Intervall von %s bis %s)", "securitycraft.subtitle.alarm": "Alarm geht los", @@ -1517,6 +1523,7 @@ "tooltip.securitycraft:projector": "Projiziert falsche Blöcke in die Welt.", "tooltip.securitycraft:sentry": "Geschütz %s", "tooltip.securitycraft:sonicSecuritySystem.linkedTo": "Anzahl an verbundenen Blöcken: %s", + "tooltip.securitycraft:universal_block_remover.disabled": "Deaktiviert. Nutze Vanilla-Werkzeuge, um verstärkte Blöcke zu zerbrechen.", "waila.securitycraft:customName": "Benutzerdefinierter Name: %s", "waila.securitycraft:equipped": "Installierte Module:", "waila.securitycraft:owner": "Besitzer: %s" diff --git a/src/main/resources/assets/securitycraft/lang/de_ch.json b/src/main/resources/assets/securitycraft/lang/de_ch.json index 878faa0fc3..1d32df28fb 100644 --- a/src/main/resources/assets/securitycraft/lang/de_ch.json +++ b/src/main/resources/assets/securitycraft/lang/de_ch.json @@ -818,7 +818,7 @@ "gui.securitycraft:scManual.lockable": "Sperrbar: Dieser Block kann durch ein Schallsicherheitssystem gesperrt werden.", "gui.securitycraft:scManual.modules": "Verfügbare Module:", "gui.securitycraft:scManual.options": "Verfügbare Einstellungen:", - "gui.securitycraft:scManual.ownableBlock": "Besitzbar: Dies ist resistent gegenüber Explosionen und kann nur vom Besitzer mit einem Universellen Blockentferner entfernt werden.", + "gui.securitycraft:scManual.ownableBlock": "Besitzbar: Dies ist resistent gegenüber Explosionen und kann nur vom Besitzer entfernt werden.", "gui.securitycraft:scManual.passcodeProtectedBlock": "Passwortgesichert: Dies kann nur benutzt werden, wenn das korrekte Passwort eingegeben wird.", "gui.securitycraft:scManual.patreon.error": "Fehler beim Laden der Patrons!", "gui.securitycraft:scManual.patreon.loading": "Lade...", @@ -919,8 +919,8 @@ "help.securitycraft.crystal_quartz_item.info": "Kristallquarz wird benutzt, um Kristallquarz-Blöcke herzustellen.", "help.securitycraft.disguise_module.info": "Das Tarnmodul tarnt bestimmte Blöcke, wenn es hinzugefügt wird.", "help.securitycraft.display_cases.info": "Die Vitrine kann ein Item ausstellen, ähnlich zu einem Vanilla-Rahmen, wobei das Item nicht gedreht werden kann. Um die Vitrine zu öffnen, benötigt man einen numerischen Code, wie das Nummernschloss und andere ähnliche Blöcke. Sobald es offen ist, kann ein Item mit einem Rechtsklick eingefügt werden. Um das Item wieder herauszunehmen, schleich-rechtsklicke die Vitrine. Um die Vitrine zu schließen, rechtsklicke sie mit einer leeren Hand. Während die Vitrine offen ist, kann jeder mit ihr interagieren. Die Leuchtvitrine leuchtet im Dunkeln, ganz wie der Vanilla-Leuchtrahmen.", - "help.securitycraft.door_indestructible_iron_item.info": "Die verstärkte Eisentür ist wie eine normale Eisentür, jedoch kann sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt und durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", - "help.securitycraft.electrified_iron_fence.info": "Der elektrische Eisenzaun ist wie ein normaler Zaun, jedoch können sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", + "help.securitycraft.door_indestructible_iron_item.info": "Die verstärkte Eisentür ist wie eine normale Eisentür, jedoch kann sie nur von dem Besitzer entfernt und durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", + "help.securitycraft.electrified_iron_fence.info": "Der elektrische Eisenzaun ist wie ein normaler Zaun, jedoch kann er nur von dem Besitzer entfernt werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", "help.securitycraft.floor_trap.info": "Die Bodenfalle ist ein Block, der für eine kurze Zeit verschwindet, sobald ein Spieler oder Mob über ihn läuft. Mit dem universellen Blockmodifizierer können einige Einstellungen, unter anderem die Zeit bis zum Verschwinden, oder wer die Falle auslösen kann, vorgenommen werden.", "help.securitycraft.furnace_mines.info": "Ofenminen funktionieren wie normale Minen, jedoch können sie nur explodieren, wenn sie von einem Spieler gerechtsklickt oder abgebaut werden, der nicht der Besitzer ist.", "help.securitycraft.harming_module.info": "Das Schadensmodul schadet Spielern, die nicht auf dem Zulassungslisten-Modul sind, wenn diese z.B. durch einen Laser laufen.", @@ -951,15 +951,15 @@ "help.securitycraft.projector.info": "Der Projektor projiziert holographische Versionen eines Blockes deiner Wahl in die Welt. Dies kann genutzt werden, um Gebäude und andere Bereiche von Interesse von anderen Spielern zu verstecken. Der Entfernung und die Breite der Projektion kann im GUI des Projektors verändert werden.", "help.securitycraft.protecto.info": "Der Protecto, inspiriert von dem Spiel \"Megaman: Battle Network 2\" von Capcom, attackiert jeden Mob innerhalb eines 10 Blöcke Radius mit einem Blitz alle 10 Sekunden. Der Protecto darf keinen Block über sich haben und es muss regnen oder schneien, damit er angreift.", "help.securitycraft.redstone_module.info": "Das Redstone-Modul fügt die Eigenschaft, ein Redstonesignal abzugeben, zu einem Block hinzu.", - "help.securitycraft.reinforced.info": "Verstärkte Blöcke sind unzerstörbare Blöcke Varianten von Vanilla Blöcken, jedoch können sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced.info": "Verstärkte Blöcke sind unzerstörbare Varianten von Vanilla Blöcken, jedoch können sie nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_buttons.info": "Die verstärkten Knöpfe können nur von ihrem Besitzer oder zugelassenen Spielern aktiviert werden.", "help.securitycraft.reinforced_chiseled_bookshelf.info": "Das Verstärkte gearbeitete Bücherregal hat die gleichen Eigenschaften wie sein Vanilla-Gegenstück, wobei nur der Besitzer oder Spieler auf der Zulassungsliste Bücher hinzufügen und entfernen können.", "help.securitycraft.reinforced_crystal_quartz.info": "Verstärkte Kristallquarz-Blöcke werden benutzt, um die Blocktasche zu bauen. Mehr Infos auf der Seite des Blocktaschenverwalters.", "help.securitycraft.reinforced_fence_gate.info": "Das elektrische Eisenzauntor ist wie das normale Zauntor, jedoch kann es nur durch Nummernschlösser, Inventarscanner, etc. geöffnet werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", "help.securitycraft.reinforced_fence_gates.info": "Die verstärkten Zauntore können nur von ihrem Besitzer oder zugelassenen Spielern geöffnet werden.", - "help.securitycraft.reinforced_glass_pane.info": "Die verstärkte Glasscheibe ist wie eine normale Glasscheibe, jedoch kann sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced_glass_pane.info": "Die verstärkte Glasscheibe ist wie eine normale Glasscheibe, jedoch kann sie nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_hopper.info": "Der verstärkte Trichter ist der einzige Block, der benutzt werden kann, um Items aus einer passwortgesicherten Truhe oder Fass zu extrahieren. Sonst verhält er sich wie ein normaler Trichter.", - "help.securitycraft.reinforced_iron_bars.info": "Das verstärkte Eisengitter ist wie ein normales Eisengitter, jedoch kann es nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced_iron_bars.info": "Das verstärkte Eisengitter ist wie ein normales Eisengitter, jedoch kann es nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_iron_trapdoor.info": "Die verstärkte Eisenfalltür funktioniert wie die normale Eisenfalltür. Sie kann jedoch nur durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", "help.securitycraft.reinforced_lever.info": "Der verstärkte Hebel kann nur von seinem Besitzer oder zugelassenen Spielern aktiviert werden.", "help.securitycraft.reinforced_pressure_plates.info": "Die verstärkten Druckplatten können nur von ihrem Besitzer oder zugelassenen Spielern aktiviert werden.", @@ -983,7 +983,7 @@ "help.securitycraft.track_mine.info": "Die Schienenmine explodiert, wenn ein Lore darüber fährt.", "help.securitycraft.trophy_system.info": "Das Trophy-System, inspiriert von dem gleichnamigen Gegenstand in \"Call of Duty: Modern Warfare 3\" publiziert von Activision, visiert gegnerische Pfeile und Feuerbälle an und zerstört sie von Weitem nach einer halbsekündigen Aufladezeit.", "help.securitycraft.universal_block_modifier.info": "Der Universelle Blockmodifizierer kann bestimmte SecurityCraft Blöcke mit Modulen ausrüsten. Ein Rechtsklick auf so einen Block öffnet das Modul-GUI. Nun kannst du die entsprechenden Module installieren.", - "help.securitycraft.universal_block_remover.info": "Der Universelle Blockentferner wird benutzt, um verstärkte Blöcke durch einen Rechtsklick zu entfernen. Nur der Spieler, der den Block platziert hat, kann ihn auch entfernen.", + "help.securitycraft.universal_block_remover.info": "Wenn er aktiviert ist, wird der Universelle Blockentferner benutzt, um verstärkte Blöcke durch einen Rechtsklick zu entfernen. Nur der Spieler, der den Block platziert hat, kann ihn auch entfernen.", "help.securitycraft.universal_key_changer.info": "Der Universelle Passwortwechsler erlaubt dir, das Passwort deiner passwortgesicherten Blöcke zu ändern. Rechtsklicke einen passwortgesicherten Block, um das GUI zu öffnen, dann gib das neue Passwort ein.", "help.securitycraft.universal_owner_changer.info": "Der Universelle Besitzeränderer kann den Besitzer eines Blockes ändern. Benenne ihn in einem Amboss in den Namen des neuen Besitzers um, und rechtsklicke einen oder mehrere deiner Blöcke, um den Besitzer zu ändern. Sofern aktiviert, können Blöcke ohne Besitzer mit einem nicht benannten Besitzeränderer in Besitz genommen werden.", "help.securitycraft.username_logger.info": "Der Nutzernamen-Protokollierer protokolliert jeden Spieler, der sich ihm in einem Radius von 3 Blöcken nähert, wenn er mit Redstone gepowert ist.", @@ -1401,14 +1401,16 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Wie viele Sekunden verstreichen müssen, bis derselbe Spieler wieder protokolliert werden kann.", "option.securitycraft.username_logger.searchRadius": "Suchradius: %s", "option.securitycraft.username_logger.searchRadius.description": "Der Radius in Blöcken, in dem der Protokollierer nach Spielern sucht.", - "securitycraft.configuration.ableToBreakMines": "Minen können zerbrochen werden", - "securitycraft.configuration.ableToBreakMines.tooltip": "Sollen Spieler Minen zerbrechen können, ohne dass sie explodieren?", "securitycraft.configuration.allowAdminTool": "Admin-Werkzeug erlauben", "securitycraft.configuration.allowAdminTool.tooltip": "Kann das Admin-Werkzeug benutzt werden?", "securitycraft.configuration.allowBlockClaim": "Besitzbeanspruchung von Blöcken erlauben", "securitycraft.configuration.allowBlockClaim.tooltip": "Erlaubt es, Blöcke, die keinen Besitzer haben, durch einen Rechtsklick mit dem Universellen Besitzeränderer in den Besitz zu nehmen.", + "securitycraft.configuration.allow_breaking_non_owned_blocks": "Erlauben, Blöcke anderer Besitzer zu zerbrechen", + "securitycraft.configuration.allow_breaking_non_owned_blocks.tooltip": "Ob Spieler, die nicht der Besitzer eines Blockes sind, diesen Block trotzdem zerbrechen können.\nDieser Wert hat Auswirkungen, egal welchen Wert \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" hat.", "securitycraft.configuration.allow_camera_night_vision": "Kamera-Nachtsicht erlauben", "securitycraft.configuration.allow_camera_night_vision.tooltip": "Wenn deaktiviert, können Spieler den Nachtsichteffekt der Überwachungskamera nicht ohne einen Trank der Nachtsicht verwenden.", + "securitycraft.configuration.always_drop": "Blöcke immer droppen lassen", + "securitycraft.configuration.always_drop.tooltip": "Ob SecurityCrafts Blöcke immer sich selbst droppen, egal welches Werkzeug verwendet wird. Wenn dies deaktiviert ist, muss das korrekte Werkzeug zum Zerbrechen des Blockes verwendet werden (bspw. eine Spitzhacke für verstärkten Stein, oder irgendetwas für verstärkte Erde).\nDies hat nur Auswirkungen, wenn \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" aktiviert ist.", "securitycraft.configuration.disable_thanks_message": "Nachricht beim Betreten der Welt deaktivieren", "securitycraft.configuration.disable_thanks_message.tooltip": "Wenn aktiviert, wird die Nachricht, die SecurityCraft beitretenden Spielern sendet, nicht gesendet.\nBeachte, dass die Nachricht für jeden Spieler deaktiviert wird, selbst für diejenigen, die sie sehen wollen.", "securitycraft.configuration.enable_team_ownership": "Teameigentum aktivieren", @@ -1441,6 +1443,8 @@ "securitycraft.configuration.mineExplodesWhenInCreative.tooltip": "Sollen Minen explodieren, wenn sie im Kreativmodus zerbrochen werden?", "securitycraft.configuration.mineExplosionsBreakBlocks": "Minenexplosionen zerstören Blöcke", "securitycraft.configuration.mineExplosionsBreakBlocks.tooltip": "Wenn deaktiviert, zerstören Minenexplosionen keine Blöcke. Wenn aktiviert, wird die \"blockExplosionDropDecay\"-Spielregel beachtet.", + "securitycraft.configuration.non_owned_breaking_slowdown": "Verzögerung beim Zerbrechen von Blöcken anderer Besitzer", + "securitycraft.configuration.non_owned_breaking_slowdown.tooltip": "Wie viel langsamer das Zerbrechen eines Blockes, der einem nicht selbst gehört, sein soll.\nDer Wert wird wie folgt berechnet: Normale Zerbrechgeschwindigkeit geteilt durch den Verzögerungswert. Beispiel: Ein Wert von 2.0 bedeutet, dass es doppelt so viel Zeit braucht, den Block zu zerbrechen.\nDiese Wert hat nur eine Auswirkung, wenn \"Erlauben, Blöcke anderer Besitzer zu zerbrechen\" und \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" aktiviert sind.", "securitycraft.configuration.passcode_check_cooldown": "Abklingzeit nach Passwortüberprüfung", "securitycraft.configuration.passcode_check_cooldown.tooltip": "Bestimmt den Wert in Millisekunden, der zwischen zwei Versuchen eines Spielers, ein Passwort einzugeben, verstreichen muss.", "securitycraft.configuration.passcode_spam_log_warning": "Passwort-Spam Log-Warnung", @@ -1482,6 +1486,8 @@ "securitycraft.configuration.title": "SecurityCraft-Konfiguration", "securitycraft.configuration.trick_scanners_with_player_heads": "Augenscanner mit Spielerköpfen austricksen", "securitycraft.configuration.trick_scanners_with_player_heads.tooltip": "Wenn aktiviert, können Spieler den Kopf eines anderen Spielers tragen, um deren Augenscanner hinters Licht zu führen.", + "securitycraft.configuration.vanilla_tool_block_breaking": "Blöcke mit Vanilla-Werkzeugen zerbrechen", + "securitycraft.configuration.vanilla_tool_block_breaking.tooltip": "Ob SecurityCrafts Blöcke mit Vanilla-Werkzeugen (Axt, Schaufel, Harke, ...) zerbrochen werden können, anstatt dem Universellen Blockentferner. Wenn aktiviert, wird der Universelle Blockentferner deaktiviert.", "securitycraft.option.default": "(Standardmäßig %s)", "securitycraft.option.default_with_range": "(Standardmäßig %s, mit einem Intervall von %s bis %s)", "securitycraft.subtitle.alarm": "Alarm geht los", @@ -1517,6 +1523,7 @@ "tooltip.securitycraft:projector": "Projiziert falsche Blöcke in die Welt.", "tooltip.securitycraft:sentry": "Geschütz %s", "tooltip.securitycraft:sonicSecuritySystem.linkedTo": "Anzahl an verbundenen Blöcken: %s", + "tooltip.securitycraft:universal_block_remover.disabled": "Deaktiviert. Nutze Vanilla-Werkzeuge, um verstärkte Blöcke zu zerbrechen.", "waila.securitycraft:customName": "Benutzerdefinierter Name: %s", "waila.securitycraft:equipped": "Installierte Module:", "waila.securitycraft:owner": "Besitzer: %s" diff --git a/src/main/resources/assets/securitycraft/lang/de_de.json b/src/main/resources/assets/securitycraft/lang/de_de.json index 878faa0fc3..1d32df28fb 100644 --- a/src/main/resources/assets/securitycraft/lang/de_de.json +++ b/src/main/resources/assets/securitycraft/lang/de_de.json @@ -818,7 +818,7 @@ "gui.securitycraft:scManual.lockable": "Sperrbar: Dieser Block kann durch ein Schallsicherheitssystem gesperrt werden.", "gui.securitycraft:scManual.modules": "Verfügbare Module:", "gui.securitycraft:scManual.options": "Verfügbare Einstellungen:", - "gui.securitycraft:scManual.ownableBlock": "Besitzbar: Dies ist resistent gegenüber Explosionen und kann nur vom Besitzer mit einem Universellen Blockentferner entfernt werden.", + "gui.securitycraft:scManual.ownableBlock": "Besitzbar: Dies ist resistent gegenüber Explosionen und kann nur vom Besitzer entfernt werden.", "gui.securitycraft:scManual.passcodeProtectedBlock": "Passwortgesichert: Dies kann nur benutzt werden, wenn das korrekte Passwort eingegeben wird.", "gui.securitycraft:scManual.patreon.error": "Fehler beim Laden der Patrons!", "gui.securitycraft:scManual.patreon.loading": "Lade...", @@ -919,8 +919,8 @@ "help.securitycraft.crystal_quartz_item.info": "Kristallquarz wird benutzt, um Kristallquarz-Blöcke herzustellen.", "help.securitycraft.disguise_module.info": "Das Tarnmodul tarnt bestimmte Blöcke, wenn es hinzugefügt wird.", "help.securitycraft.display_cases.info": "Die Vitrine kann ein Item ausstellen, ähnlich zu einem Vanilla-Rahmen, wobei das Item nicht gedreht werden kann. Um die Vitrine zu öffnen, benötigt man einen numerischen Code, wie das Nummernschloss und andere ähnliche Blöcke. Sobald es offen ist, kann ein Item mit einem Rechtsklick eingefügt werden. Um das Item wieder herauszunehmen, schleich-rechtsklicke die Vitrine. Um die Vitrine zu schließen, rechtsklicke sie mit einer leeren Hand. Während die Vitrine offen ist, kann jeder mit ihr interagieren. Die Leuchtvitrine leuchtet im Dunkeln, ganz wie der Vanilla-Leuchtrahmen.", - "help.securitycraft.door_indestructible_iron_item.info": "Die verstärkte Eisentür ist wie eine normale Eisentür, jedoch kann sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt und durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", - "help.securitycraft.electrified_iron_fence.info": "Der elektrische Eisenzaun ist wie ein normaler Zaun, jedoch können sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", + "help.securitycraft.door_indestructible_iron_item.info": "Die verstärkte Eisentür ist wie eine normale Eisentür, jedoch kann sie nur von dem Besitzer entfernt und durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", + "help.securitycraft.electrified_iron_fence.info": "Der elektrische Eisenzaun ist wie ein normaler Zaun, jedoch kann er nur von dem Besitzer entfernt werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", "help.securitycraft.floor_trap.info": "Die Bodenfalle ist ein Block, der für eine kurze Zeit verschwindet, sobald ein Spieler oder Mob über ihn läuft. Mit dem universellen Blockmodifizierer können einige Einstellungen, unter anderem die Zeit bis zum Verschwinden, oder wer die Falle auslösen kann, vorgenommen werden.", "help.securitycraft.furnace_mines.info": "Ofenminen funktionieren wie normale Minen, jedoch können sie nur explodieren, wenn sie von einem Spieler gerechtsklickt oder abgebaut werden, der nicht der Besitzer ist.", "help.securitycraft.harming_module.info": "Das Schadensmodul schadet Spielern, die nicht auf dem Zulassungslisten-Modul sind, wenn diese z.B. durch einen Laser laufen.", @@ -951,15 +951,15 @@ "help.securitycraft.projector.info": "Der Projektor projiziert holographische Versionen eines Blockes deiner Wahl in die Welt. Dies kann genutzt werden, um Gebäude und andere Bereiche von Interesse von anderen Spielern zu verstecken. Der Entfernung und die Breite der Projektion kann im GUI des Projektors verändert werden.", "help.securitycraft.protecto.info": "Der Protecto, inspiriert von dem Spiel \"Megaman: Battle Network 2\" von Capcom, attackiert jeden Mob innerhalb eines 10 Blöcke Radius mit einem Blitz alle 10 Sekunden. Der Protecto darf keinen Block über sich haben und es muss regnen oder schneien, damit er angreift.", "help.securitycraft.redstone_module.info": "Das Redstone-Modul fügt die Eigenschaft, ein Redstonesignal abzugeben, zu einem Block hinzu.", - "help.securitycraft.reinforced.info": "Verstärkte Blöcke sind unzerstörbare Blöcke Varianten von Vanilla Blöcken, jedoch können sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced.info": "Verstärkte Blöcke sind unzerstörbare Varianten von Vanilla Blöcken, jedoch können sie nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_buttons.info": "Die verstärkten Knöpfe können nur von ihrem Besitzer oder zugelassenen Spielern aktiviert werden.", "help.securitycraft.reinforced_chiseled_bookshelf.info": "Das Verstärkte gearbeitete Bücherregal hat die gleichen Eigenschaften wie sein Vanilla-Gegenstück, wobei nur der Besitzer oder Spieler auf der Zulassungsliste Bücher hinzufügen und entfernen können.", "help.securitycraft.reinforced_crystal_quartz.info": "Verstärkte Kristallquarz-Blöcke werden benutzt, um die Blocktasche zu bauen. Mehr Infos auf der Seite des Blocktaschenverwalters.", "help.securitycraft.reinforced_fence_gate.info": "Das elektrische Eisenzauntor ist wie das normale Zauntor, jedoch kann es nur durch Nummernschlösser, Inventarscanner, etc. geöffnet werden. Es gibt jedem außer dem Besitzer einen Stromschlag (tödlich!).", "help.securitycraft.reinforced_fence_gates.info": "Die verstärkten Zauntore können nur von ihrem Besitzer oder zugelassenen Spielern geöffnet werden.", - "help.securitycraft.reinforced_glass_pane.info": "Die verstärkte Glasscheibe ist wie eine normale Glasscheibe, jedoch kann sie nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced_glass_pane.info": "Die verstärkte Glasscheibe ist wie eine normale Glasscheibe, jedoch kann sie nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_hopper.info": "Der verstärkte Trichter ist der einzige Block, der benutzt werden kann, um Items aus einer passwortgesicherten Truhe oder Fass zu extrahieren. Sonst verhält er sich wie ein normaler Trichter.", - "help.securitycraft.reinforced_iron_bars.info": "Das verstärkte Eisengitter ist wie ein normales Eisengitter, jedoch kann es nur von dem Besitzer mit einem Universellen Blockentferner entfernt werden.", + "help.securitycraft.reinforced_iron_bars.info": "Das verstärkte Eisengitter ist wie ein normales Eisengitter, jedoch kann es nur von dem Besitzer entfernt werden.", "help.securitycraft.reinforced_iron_trapdoor.info": "Die verstärkte Eisenfalltür funktioniert wie die normale Eisenfalltür. Sie kann jedoch nur durch Nummernschlösser, Inventarscanner, etc. geöffnet werden.", "help.securitycraft.reinforced_lever.info": "Der verstärkte Hebel kann nur von seinem Besitzer oder zugelassenen Spielern aktiviert werden.", "help.securitycraft.reinforced_pressure_plates.info": "Die verstärkten Druckplatten können nur von ihrem Besitzer oder zugelassenen Spielern aktiviert werden.", @@ -983,7 +983,7 @@ "help.securitycraft.track_mine.info": "Die Schienenmine explodiert, wenn ein Lore darüber fährt.", "help.securitycraft.trophy_system.info": "Das Trophy-System, inspiriert von dem gleichnamigen Gegenstand in \"Call of Duty: Modern Warfare 3\" publiziert von Activision, visiert gegnerische Pfeile und Feuerbälle an und zerstört sie von Weitem nach einer halbsekündigen Aufladezeit.", "help.securitycraft.universal_block_modifier.info": "Der Universelle Blockmodifizierer kann bestimmte SecurityCraft Blöcke mit Modulen ausrüsten. Ein Rechtsklick auf so einen Block öffnet das Modul-GUI. Nun kannst du die entsprechenden Module installieren.", - "help.securitycraft.universal_block_remover.info": "Der Universelle Blockentferner wird benutzt, um verstärkte Blöcke durch einen Rechtsklick zu entfernen. Nur der Spieler, der den Block platziert hat, kann ihn auch entfernen.", + "help.securitycraft.universal_block_remover.info": "Wenn er aktiviert ist, wird der Universelle Blockentferner benutzt, um verstärkte Blöcke durch einen Rechtsklick zu entfernen. Nur der Spieler, der den Block platziert hat, kann ihn auch entfernen.", "help.securitycraft.universal_key_changer.info": "Der Universelle Passwortwechsler erlaubt dir, das Passwort deiner passwortgesicherten Blöcke zu ändern. Rechtsklicke einen passwortgesicherten Block, um das GUI zu öffnen, dann gib das neue Passwort ein.", "help.securitycraft.universal_owner_changer.info": "Der Universelle Besitzeränderer kann den Besitzer eines Blockes ändern. Benenne ihn in einem Amboss in den Namen des neuen Besitzers um, und rechtsklicke einen oder mehrere deiner Blöcke, um den Besitzer zu ändern. Sofern aktiviert, können Blöcke ohne Besitzer mit einem nicht benannten Besitzeränderer in Besitz genommen werden.", "help.securitycraft.username_logger.info": "Der Nutzernamen-Protokollierer protokolliert jeden Spieler, der sich ihm in einem Radius von 3 Blöcken nähert, wenn er mit Redstone gepowert ist.", @@ -1401,14 +1401,16 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Wie viele Sekunden verstreichen müssen, bis derselbe Spieler wieder protokolliert werden kann.", "option.securitycraft.username_logger.searchRadius": "Suchradius: %s", "option.securitycraft.username_logger.searchRadius.description": "Der Radius in Blöcken, in dem der Protokollierer nach Spielern sucht.", - "securitycraft.configuration.ableToBreakMines": "Minen können zerbrochen werden", - "securitycraft.configuration.ableToBreakMines.tooltip": "Sollen Spieler Minen zerbrechen können, ohne dass sie explodieren?", "securitycraft.configuration.allowAdminTool": "Admin-Werkzeug erlauben", "securitycraft.configuration.allowAdminTool.tooltip": "Kann das Admin-Werkzeug benutzt werden?", "securitycraft.configuration.allowBlockClaim": "Besitzbeanspruchung von Blöcken erlauben", "securitycraft.configuration.allowBlockClaim.tooltip": "Erlaubt es, Blöcke, die keinen Besitzer haben, durch einen Rechtsklick mit dem Universellen Besitzeränderer in den Besitz zu nehmen.", + "securitycraft.configuration.allow_breaking_non_owned_blocks": "Erlauben, Blöcke anderer Besitzer zu zerbrechen", + "securitycraft.configuration.allow_breaking_non_owned_blocks.tooltip": "Ob Spieler, die nicht der Besitzer eines Blockes sind, diesen Block trotzdem zerbrechen können.\nDieser Wert hat Auswirkungen, egal welchen Wert \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" hat.", "securitycraft.configuration.allow_camera_night_vision": "Kamera-Nachtsicht erlauben", "securitycraft.configuration.allow_camera_night_vision.tooltip": "Wenn deaktiviert, können Spieler den Nachtsichteffekt der Überwachungskamera nicht ohne einen Trank der Nachtsicht verwenden.", + "securitycraft.configuration.always_drop": "Blöcke immer droppen lassen", + "securitycraft.configuration.always_drop.tooltip": "Ob SecurityCrafts Blöcke immer sich selbst droppen, egal welches Werkzeug verwendet wird. Wenn dies deaktiviert ist, muss das korrekte Werkzeug zum Zerbrechen des Blockes verwendet werden (bspw. eine Spitzhacke für verstärkten Stein, oder irgendetwas für verstärkte Erde).\nDies hat nur Auswirkungen, wenn \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" aktiviert ist.", "securitycraft.configuration.disable_thanks_message": "Nachricht beim Betreten der Welt deaktivieren", "securitycraft.configuration.disable_thanks_message.tooltip": "Wenn aktiviert, wird die Nachricht, die SecurityCraft beitretenden Spielern sendet, nicht gesendet.\nBeachte, dass die Nachricht für jeden Spieler deaktiviert wird, selbst für diejenigen, die sie sehen wollen.", "securitycraft.configuration.enable_team_ownership": "Teameigentum aktivieren", @@ -1441,6 +1443,8 @@ "securitycraft.configuration.mineExplodesWhenInCreative.tooltip": "Sollen Minen explodieren, wenn sie im Kreativmodus zerbrochen werden?", "securitycraft.configuration.mineExplosionsBreakBlocks": "Minenexplosionen zerstören Blöcke", "securitycraft.configuration.mineExplosionsBreakBlocks.tooltip": "Wenn deaktiviert, zerstören Minenexplosionen keine Blöcke. Wenn aktiviert, wird die \"blockExplosionDropDecay\"-Spielregel beachtet.", + "securitycraft.configuration.non_owned_breaking_slowdown": "Verzögerung beim Zerbrechen von Blöcken anderer Besitzer", + "securitycraft.configuration.non_owned_breaking_slowdown.tooltip": "Wie viel langsamer das Zerbrechen eines Blockes, der einem nicht selbst gehört, sein soll.\nDer Wert wird wie folgt berechnet: Normale Zerbrechgeschwindigkeit geteilt durch den Verzögerungswert. Beispiel: Ein Wert von 2.0 bedeutet, dass es doppelt so viel Zeit braucht, den Block zu zerbrechen.\nDiese Wert hat nur eine Auswirkung, wenn \"Erlauben, Blöcke anderer Besitzer zu zerbrechen\" und \"Blöcke mit Vanilla-Werkzeugen zerbrechen\" aktiviert sind.", "securitycraft.configuration.passcode_check_cooldown": "Abklingzeit nach Passwortüberprüfung", "securitycraft.configuration.passcode_check_cooldown.tooltip": "Bestimmt den Wert in Millisekunden, der zwischen zwei Versuchen eines Spielers, ein Passwort einzugeben, verstreichen muss.", "securitycraft.configuration.passcode_spam_log_warning": "Passwort-Spam Log-Warnung", @@ -1482,6 +1486,8 @@ "securitycraft.configuration.title": "SecurityCraft-Konfiguration", "securitycraft.configuration.trick_scanners_with_player_heads": "Augenscanner mit Spielerköpfen austricksen", "securitycraft.configuration.trick_scanners_with_player_heads.tooltip": "Wenn aktiviert, können Spieler den Kopf eines anderen Spielers tragen, um deren Augenscanner hinters Licht zu führen.", + "securitycraft.configuration.vanilla_tool_block_breaking": "Blöcke mit Vanilla-Werkzeugen zerbrechen", + "securitycraft.configuration.vanilla_tool_block_breaking.tooltip": "Ob SecurityCrafts Blöcke mit Vanilla-Werkzeugen (Axt, Schaufel, Harke, ...) zerbrochen werden können, anstatt dem Universellen Blockentferner. Wenn aktiviert, wird der Universelle Blockentferner deaktiviert.", "securitycraft.option.default": "(Standardmäßig %s)", "securitycraft.option.default_with_range": "(Standardmäßig %s, mit einem Intervall von %s bis %s)", "securitycraft.subtitle.alarm": "Alarm geht los", @@ -1517,6 +1523,7 @@ "tooltip.securitycraft:projector": "Projiziert falsche Blöcke in die Welt.", "tooltip.securitycraft:sentry": "Geschütz %s", "tooltip.securitycraft:sonicSecuritySystem.linkedTo": "Anzahl an verbundenen Blöcken: %s", + "tooltip.securitycraft:universal_block_remover.disabled": "Deaktiviert. Nutze Vanilla-Werkzeuge, um verstärkte Blöcke zu zerbrechen.", "waila.securitycraft:customName": "Benutzerdefinierter Name: %s", "waila.securitycraft:equipped": "Installierte Module:", "waila.securitycraft:owner": "Besitzer: %s" diff --git a/src/main/resources/assets/securitycraft/lang/en_ud.json b/src/main/resources/assets/securitycraft/lang/en_ud.json index db3dc65301..27e929fa95 100644 --- a/src/main/resources/assets/securitycraft/lang/en_ud.json +++ b/src/main/resources/assets/securitycraft/lang/en_ud.json @@ -826,7 +826,7 @@ "gui.securitycraft:scManual.modules": ":sǝꞁnpoɯ ǝꞁqɐꞁᴉɐʌⱯ", "gui.securitycraft:scManual.option_text": "%s %s -", "gui.securitycraft:scManual.options": ":suoᴉʇdo ǝꞁqɐꞁᴉɐʌⱯ", - "gui.securitycraft:scManual.ownableBlock": "˙ɹǝʌoɯǝᴚ ʞɔoꞁᗺ ꞁɐsɹǝʌᴉu∩ ǝɥʇ ᵷuᴉsn uʍop ʇᴉ pǝɔɐꞁd oɥʍ ɹǝʎɐꞁd ǝɥʇ ʎq uǝʞoɹq ǝq ʎꞁuo uɐɔ puɐ 'suoᴉsoꞁdxǝ oʇ ʇuɐʇsᴉsǝɹ sᴉ sᴉɥ⟘ :ǝꞁqɐuʍO", + "gui.securitycraft:scManual.ownableBlock": "˙uʍop ʇᴉ pǝɔɐꞁd oɥʍ ɹǝʎɐꞁd ǝɥʇ ʎq uǝʞoɹq ǝq ʎꞁuo uɐɔ puɐ 'suoᴉsoꞁdxǝ oʇ ʇuɐʇsᴉsǝɹ sᴉ sᴉɥ⟘ :ǝꞁqɐuʍO", "gui.securitycraft:scManual.passcodeProtectedBlock": "˙pǝɹǝʇuǝ ʎꞁʇɔǝɹɹoɔ sᴉ ɹǝuʍo ǝɥʇ ʎq ʇǝs ǝpoɔssɐd ɐ ɟᴉ pǝsn ǝq ʎꞁuo uɐɔ sᴉɥ⟘ :pǝʇɔǝʇoɹd ǝpoɔssɐԀ", "gui.securitycraft:scManual.patreon.error": "¡suoɹʇɐԀ ᵷuᴉɥɔʇǝɟ ɹoɹɹƎ", "gui.securitycraft:scManual.patreon.loading": "˙˙˙ᵷuᴉpɐoꞀ", @@ -927,7 +927,7 @@ "help.securitycraft.crystal_quartz_item.info": "˙sʞɔoꞁq zʇɹɐnꝹ ꞁɐʇsʎɹƆ ʇɟɐɹɔ oʇ pǝsn sᴉ zʇɹɐnꝹ ꞁɐʇsʎɹƆ", "help.securitycraft.disguise_module.info": "˙ɯǝɥʇ oʇ pǝppɐ uǝɥʍ sʞɔoꞁq uᴉɐʇɹǝɔ sǝsᴉnᵷsᴉp ǝꞁnpoɯ ǝsᴉnᵷsᴉp ǝɥ⟘", "help.securitycraft.display_cases.info": "˙sǝɯɐɹɟ ɯǝʇᴉ ʍoꞁᵷ s,ɐꞁꞁᴉuɐʌ oʇ uᴉʞɐ 'ʞɹɐp ǝɥʇ uᴉ sʍoꞁᵷ ʇuɐᴉɹɐʌ ʍoꞁᵷ ǝɥ⟘ ˙ʇᴉ ɥʇᴉʍ ʇɔɐɹǝʇuᴉ uɐɔ ǝuoʎuɐ 'uǝdo sᴉ ǝsɐɔ ǝɥʇ ǝꞁᴉɥM ˙puɐɥ ʎʇdɯǝ uɐ ɥʇᴉʍ ʇᴉ ʞɔᴉꞁɔʇɥᵷᴉɹ 'ǝsɐɔ ǝɥʇ ǝsoꞁɔ o⟘ ˙ǝsɐɔ ǝɥʇ ʞɔᴉꞁɔʇɥᵷᴉɹ-ʞɐǝus 'ɯǝʇᴉ ǝɥʇ ǝʌǝᴉɹʇǝɹ o⟘ ˙ɯǝʇᴉ ǝɥʇ ɥʇᴉʍ ǝsɐɔ ǝɥʇ ᵷuᴉʞɔᴉꞁɔʇɥᵷᴉɹ ʎq pǝʇɹǝsuᴉ ǝq uɐɔ ɯǝʇᴉ uɐ 'uǝdo ǝɔuO ˙op sʞɔoꞁq ɹɐꞁᴉɯᴉs ɹǝɥʇo puɐ pɐdʎǝꞰ ǝɥʇ ǝʞᴉꞁ ʇsnɾ 'ǝpoɔssɐd ɐ ᵷuᴉʇɹǝsuᴉ sǝɹᴉnbǝɹ ǝsɐɔ ǝɥʇ ᵷuᴉuǝdO ˙pǝʇɐʇoɹ ǝq ʇouuɐɔ ɯǝʇᴉ ǝɥʇ ɥᵷnoɥʇꞁɐ 'ǝɯɐɹɟ ɯǝʇᴉ ɐꞁꞁᴉuɐʌ ɐ oʇ ɹɐꞁᴉɯᴉs 'ɯǝʇᴉ ǝuo ʎɐꞁdsᴉp uɐɔ ǝsɐƆ ʎɐꞁdsᴉᗡ ǝɥ⟘", - "help.securitycraft.door_indestructible_iron_item.info": "˙uʍop ʇᴉ ʞɐǝɹq oʇ ɹǝʌoɯǝɹ ʞɔoꞁq ꞁɐsɹǝʌᴉun ǝɥʇ ǝsn uɐɔ ɹoop ǝɥʇ ɟo ɹǝuʍo ǝɥ⟘ ˙ɔʇǝ 'sɹǝuuɐɔS ʎɹoʇuǝʌuI 'spɐdʎǝꞰ ʎq pǝuǝdo ǝq ʎꞁuo uɐɔ ʇI ˙ǝꞁqɐʞɐǝɹqun sᴉ ʇᴉ ʇdǝɔxǝ 'ɹoop uoɹᴉ ɐꞁꞁᴉuɐʌ ǝɥʇ sɐ ǝɯɐs ǝɥʇ sᴉ ɹoop uoɹᴉ pǝɔɹoɟuᴉǝɹ ǝɥ⟘", + "help.securitycraft.door_indestructible_iron_item.info": "˙ɔʇǝ 'sɹǝuuɐɔS ʎɹoʇuǝʌuI 'spɐdʎǝꞰ ʎq pǝuǝdo ǝq ʎꞁuo uɐɔ ʇI ˙ǝꞁqɐʞɐǝɹqun sᴉ ʇᴉ ʇdǝɔxǝ 'ɹoop uoɹᴉ ɐꞁꞁᴉuɐʌ ǝɥʇ sɐ ǝɯɐs ǝɥʇ sᴉ ɹoop uoɹᴉ pǝɔɹoɟuᴉǝɹ ǝɥ⟘", "help.securitycraft.electrified_iron_fence.info": "˙ʇᴉ ɥʇᴉʍ ʇɔɐʇuoɔ uᴉ ʇǝᵷ ʎǝɥʇ uǝɥʍ ɹǝuʍo ǝɥʇ ʇnq ǝuoʎuɐ ʇɹnɥ ꞁꞁᴉʍ puɐ 'ǝꞁqɐʞɐǝɹqun sᴉ ʇᴉ ʇdǝɔxǝ 'ǝɔuǝɟ ɐꞁꞁᴉuɐʌ ɐ sɐ ǝɯɐs ǝɥʇ sʇɔɐ ǝɔuǝɟ uoɹᴉ pǝᴉɟᴉɹʇɔǝꞁǝ ǝɥ⟘", "help.securitycraft.floor_trap.info": "˙ɹǝᴉɟᴉpoɯ ʞɔoꞁq ꞁɐsɹǝʌᴉun ǝɥʇ ɥʇᴉʍ ǝꞁqɐɹnᵷᴉɟuoɔ ǝɹɐ 'dɐɹʇ ǝɥʇ ɹǝᵷᵷᴉɹʇ uɐɔ oɥʍ ɹo 'ɹɐǝddɐsᴉp oʇ ʇᴉ ɹoɟ sǝʞɐʇ ʇᴉ ǝɯᴉʇ ǝɥʇ ǝʞᴉꞁ sᵷuᴉʇʇǝs ʎuɐW ˙ʇᴉ uo sdǝʇs qoɯ ɹo ɹǝʎɐꞁd ɐ uǝɥʍ ǝɯᴉʇ ɟo ʇunoɯɐ ʇɹoɥs ɐ ɹoɟ ɹɐǝddɐsᴉp ꞁꞁᴉʍ ʇɐɥʇ ʞɔoꞁq ɐ sᴉ dɐɹʇ ɹooꞁɟ ǝɥ⟘", "help.securitycraft.furnace_mines.info": "˙ɹǝuʍo ǝɥʇ uɐɥʇ ɹǝɥʇo ǝuoǝɯos ʎq uǝʞoɹq ɹo pǝʞɔᴉꞁɔʇɥᵷᴉɹ uǝɥʍ ǝpoꞁdxǝ ʎꞁuo ʎǝɥʇ ʇdǝɔxǝ 'sǝuᴉɯ pɹɐpuɐʇs ǝɥʇ ǝʞᴉꞁ ʇsnɾ uoᴉʇɔunɟ sǝuᴉɯ ǝɔɐuɹnℲ", @@ -959,15 +959,15 @@ "help.securitycraft.projector.info": "˙I∩⅁ s,ɹoʇɔǝɾoɹԀ ǝɥʇ uᴉɥʇᴉʍ pǝᵷuɐɥɔ ǝq uɐɔ uoᴉʇɔǝɾoɹd ǝɥʇ ɟo ɥʇpᴉʍ puɐ ǝᵷuɐɹ ǝɥ⟘ ˙sɹǝʎɐꞁd ɹǝɥʇo ɯoɹɟ ʇsǝɹǝʇuᴉ ɟo sɐǝɹɐ ɹǝɥʇo puɐ sᵷuᴉpꞁᴉnq ǝpᴉɥ oʇ pǝsn ǝq uɐɔ ɥɔᴉɥʍ 'pꞁɹoʍ ǝɥʇ oʇuᴉ ǝɔᴉoɥɔ ɹnoʎ ɟo ʞɔoꞁq ɐ ɟo suoᴉsɹǝʌ ɔᴉɥdɐɹᵷoꞁoɥ sʇɔǝɾoɹd ɹoʇɔǝɾoɹԀ ǝɥ⟘", "help.securitycraft.protecto.info": "˙ʎʞs ǝɥʇ ɟo ʍǝᴉʌ ɹɐǝꞁɔ ɐ ɥʇᴉʍ ᵷuᴉʍous ɹo ᵷuᴉuᴉɐɹ s,ʇᴉ ǝꞁᴉɥʍ spuoɔǝs 0⥝ ʎɹǝʌǝ sʇꞁoq ᵷuᴉuʇɥᵷᴉꞁ ɥʇᴉʍ snᴉpɐɹ ʞɔoꞁq-0⥝ ɐ uᴉ qoɯ ʎuɐ ʞɔɐʇʇɐ ꞁꞁᴉʍ 'ɯoɔdɐƆ ʎq ǝpɐɯ ,,ᘔ ʞɹoʍʇǝN ǝꞁʇʇɐᗺ :uɐɯɐᵷǝW,, ǝɯɐᵷ ǝɥʇ ɯoɹɟ ʎɯǝuǝ ǝɥʇ ʎq pǝɹᴉdsuᴉ 'oʇɔǝʇoɹd ǝɥ⟘", "help.securitycraft.redstone_module.info": "˙ʞɔoꞁq ɐ oʇ sǝᴉʇɹǝdoɹd ɹǝʍod sppɐ ǝꞁnpoɯ ǝuoʇspǝɹ ǝɥ⟘", - "help.securitycraft.reinforced.info": "˙ɹǝʌoɯǝɹ ʞɔoꞁq ꞁɐsɹǝʌᴉun ǝɥʇ ᵷuᴉsn ɯǝɥʇ ʎoɹʇsǝp uɐɔ uʍop ɯǝɥʇ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎꞁuO ˙sʇuǝꞁɐʌᴉnbǝ ɐꞁꞁᴉuɐʌ ɥʇᴉʍ sʞɔoꞁq ᵷuᴉpꞁᴉnq ǝꞁqɐʞɐǝɹqun ǝɹɐ sʞɔoꞁq pǝɔɹoɟuᴉǝᴚ", + "help.securitycraft.reinforced.info": "˙ɯǝɥʇ ʎoɹʇsǝp uɐɔ uʍop ɯǝɥʇ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎꞁuO ˙sʇuǝꞁɐʌᴉnbǝ ɐꞁꞁᴉuɐʌ ɥʇᴉʍ sʞɔoꞁq ᵷuᴉpꞁᴉnq ǝꞁqɐʞɐǝɹqun ǝɹɐ sʞɔoꞁq pǝɔɹoɟuᴉǝᴚ", "help.securitycraft.reinforced_buttons.info": "˙ʇsᴉꞁʍoꞁꞁɐ ǝɥʇ uo sɹǝʎɐꞁd ɹo ɹǝuʍo ɹᴉǝɥʇ ʎq pǝʇɐʌᴉʇɔɐ ǝq ʎꞁuo uɐɔ suoʇʇnq pǝɔɹoɟuᴉǝɹ ǝɥ⟘", "help.securitycraft.reinforced_chiseled_bookshelf.info": "˙sʞooq ǝʌoɯǝɹ puɐ ppɐ uɐɔ ʇsᴉꞁʍoꞁꞁɐ ǝɥʇ uo sɹǝʎɐꞁd puɐ ɹǝuʍo ǝɥʇ ʎꞁuo ɥᵷnoɥʇ 'ʇɹɐdɹǝʇunoɔ ɐꞁꞁᴉuɐʌ sʇᴉ sɐ sǝɹnʇɐǝɟ ǝɯɐs ǝɥʇ sɐɥ ɟꞁǝɥsʞooᗺ pǝꞁǝsᴉɥƆ pǝɔɹoɟuᴉǝᴚ ǝɥ⟘", "help.securitycraft.reinforced_crystal_quartz.info": "˙ǝᵷɐd s,ɹǝᵷɐuɐW ʇǝʞɔoԀ ʞɔoꞁᗺ ǝɥʇ uo oɟuᴉ ǝɹoW ˙ʇǝʞɔoԀ ʞɔoꞁᗺ ǝɥʇ pꞁᴉnq oʇ pǝsn ǝɹɐ sʞɔoꞁᗺ zʇɹɐnꝹ ꞁɐʇsʎɹƆ pǝɔɹoɟuᴉǝᴚ", "help.securitycraft.reinforced_fence_gate.info": "˙ʇᴉ ɥʇᴉʍ ʇɔɐʇuoɔ uᴉ ʇǝᵷ ʎǝɥʇ uǝɥʍ ɹǝuʍo ǝɥʇ ʇnq ǝuoʎuɐ ʇɹnɥ osꞁɐ ꞁꞁᴉʍ ʇI ˙˙ɔʇǝ 'sɹǝuuɐɔS ʎɹoʇuǝʌuI 'spɐdʎǝꞰ ʎq pǝuǝdo ǝq ʎꞁuo uɐɔ puɐ 'ǝꞁqɐʞɐǝɹqun sᴉ ʇᴉ ʇdǝɔxǝ 'ǝʇɐᵷ ǝɔuǝɟ ɐꞁꞁᴉuɐʌ ɐ sɐ ǝɯɐs ǝɥʇ sʇɔɐ ǝʇɐᵷ ǝɔuǝɟ uoɹᴉ pǝᴉɟᴉɹʇɔǝꞁǝ ǝɥ⟘", "help.securitycraft.reinforced_fence_gates.info": "˙ʇsᴉꞁʍoꞁꞁɐ ǝɥʇ uo sɹǝʎɐꞁd ɹo ɹǝuʍo ɹᴉǝɥʇ ʎq pǝuǝdo ǝq ʎꞁuo uɐɔ sǝʇɐᵷ ǝɔuǝɟ pǝɔɹoɟuᴉǝɹ ǝɥ⟘", - "help.securitycraft.reinforced_glass_pane.info": "˙ɹǝʌoɯǝɹ ʞɔoꞁq ꞁɐsɹǝʌᴉun ǝɥʇ ᵷuᴉsn ʇᴉ ʎoɹʇsǝp uɐɔ uʍop ʇᴉ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎꞁuo ʇdǝɔxǝ 'ssɐꞁᵷ ɐꞁꞁᴉuɐʌ ɐ sɐ ǝɯɐs ǝɥʇ sᴉ ǝuɐd ssɐꞁᵷ pǝɔɹoɟuᴉǝɹ ǝɥ⟘", + "help.securitycraft.reinforced_glass_pane.info": "˙ʇᴉ ʎoɹʇsǝp uɐɔ uʍop ʇᴉ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎꞁuo ʇdǝɔxǝ 'ssɐꞁᵷ ɐꞁꞁᴉuɐʌ ɐ sɐ ǝɯɐs ǝɥʇ sᴉ ǝuɐd ssɐꞁᵷ pǝɔɹoɟuᴉǝɹ ǝɥ⟘", "help.securitycraft.reinforced_hopper.info": "˙ɹǝddoɥ ɐꞁꞁᴉuɐʌ ɐ ǝʞᴉꞁ ʇɔɐ ǝsᴉʍɹǝɥʇo ꞁꞁᴉʍ ʇI ˙ɹǝʎɐꞁd ǝɯɐs ǝɥʇ ʎq pǝuʍo ǝɹɐ ɥʇoq ɟᴉ ꞁǝɹɹɐq ɹo ʇsǝɥɔ pǝʇɔǝʇoɹd ǝpoɔssɐd ɐ ɟo ʇno sɯǝʇᴉ ʇɔɐɹʇxǝ oʇ pǝsn ǝq uɐɔ ʇɐɥʇ ʞɔoꞁq ʎꞁuo ǝɥʇ sᴉ ɹǝddoH pǝɔɹoɟuᴉǝᴚ ǝɥ⟘", - "help.securitycraft.reinforced_iron_bars.info": "˙ɹǝʌoɯǝɹ ʞɔoꞁq ꞁɐsɹǝʌᴉun ǝɥʇ ᵷuᴉsn ɯǝɥʇ ʎoɹʇsǝp uɐɔ uʍop ɯǝɥʇ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎꞁuo ʇdǝɔxǝ 'sɹɐq uoɹᴉ ɐꞁꞁᴉuɐʌ ɐ sɐ ǝɯɐs ǝɥʇ ǝɹɐ sɹɐq uoɹᴉ pǝɔɹoɟuᴉǝɹ ǝɥ⟘", + "help.securitycraft.reinforced_iron_bars.info": "˙ɯǝɥʇ ʎoɹʇsǝp uɐɔ uʍop ɯǝɥʇ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎꞁuo ʇdǝɔxǝ 'sɹɐq uoɹᴉ ɐꞁꞁᴉuɐʌ ɐ sɐ ǝɯɐs ǝɥʇ ǝɹɐ sɹɐq uoɹᴉ pǝɔɹoɟuᴉǝɹ ǝɥ⟘", "help.securitycraft.reinforced_iron_trapdoor.info": "˙uʍop ʇᴉ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎq uǝʞoɹq ǝq ʎꞁuo puɐ '˙ɔʇǝ 'sɹǝuuɐɔS ʎɹoʇuǝʌuI 'spɐdʎǝꞰ ʎq pǝuǝdo ǝq ʎꞁuo uɐɔ ʇᴉ ʇdǝɔxǝ 'ɹoopdɐɹʇ ɐꞁꞁᴉuɐʌ ɐ sɐ ǝɯɐs ǝɥʇ sᴉ ɹoopdɐɹʇ uoɹᴉ pǝɔɹoɟuᴉǝɹ ǝɥ⟘", "help.securitycraft.reinforced_lever.info": "˙ʇsᴉꞁʍoꞁꞁɐ ǝɥʇ uo sɹǝʎɐꞁd ɹo ɹǝuʍo sʇᴉ ʎq pǝʇɐʌᴉʇɔɐ ǝq ʎꞁuo uɐɔ ɹǝʌǝꞀ pǝɔɹoɟuᴉǝᴚ ǝɥ⟘", "help.securitycraft.reinforced_pressure_plates.info": "˙ʇsᴉꞁʍoꞁꞁɐ ǝɥʇ uo sɹǝʎɐꞁd ɹo ɹǝuʍo ɹᴉǝɥʇ ʎq pǝʇɐʌᴉʇɔɐ ǝq ʎꞁuo uɐɔ sǝʇɐꞁd ǝɹnssǝɹd pǝɔɹoɟuᴉǝɹ ǝɥ⟘", @@ -991,7 +991,7 @@ "help.securitycraft.track_mine.info": "˙ʇᴉ ɟo doʇ uo sǝssɐd ʇɹɐɔǝuᴉɯ ɐ uǝɥʍ sǝpoꞁdxǝ ǝuᴉɯ ʞɔɐɹʇ ǝɥ⟘", "help.securitycraft.trophy_system.info": "˙ǝɯᴉʇ ǝᵷɹɐɥɔ puoɔǝs-ɟꞁɐɥ ɐ ɹǝʇɟɐ ǝᵷuɐɹ ɯoɹɟ ɯǝɥʇ ʎoɹʇsǝp ꞁꞁᴉʍ puɐ sꞁꞁɐqǝɹᴉɟ puɐ sʍoɹɹɐ ʎɯǝuǝ sʇǝᵷɹɐʇ 'uoᴉsᴉʌᴉʇɔⱯ ʎq pǝɥsᴉꞁqnd ,,Ɛ ǝɹɐɟɹɐM uɹǝpoW :ʎʇnᗡ ɟo ꞁꞁɐƆ,, uᴉ uǝǝs ʇsɹᴉɟ ʇǝᵷpɐᵷ ǝɥʇ ʎq pǝɹᴉdsuᴉ 'ɯǝʇsʎs ʎɥdoɹʇ ǝɥ⟘", "help.securitycraft.universal_block_modifier.info": "˙suoᴉʇɔunɟ ʞɔoꞁq ʇɐɥʇ ʍoɥ ǝzᴉɯoʇsnɔ oʇ ,,sǝꞁnpoɯ,, ʇɹǝsuᴉ uǝɥʇ uɐɔ no⅄ ˙I∩⅁ uoᴉʇɐzᴉɯoʇsnɔ ǝɥʇ uǝdo oʇ ʞɔoꞁq ɐ ʞɔᴉꞁɔʇɥᵷᴉᴚ ˙ʇɟɐɹƆʎʇᴉɹnɔǝS ʎq pǝppɐ sʞɔoꞁq snoᴉɹɐʌ ǝzᴉɯoʇsnɔ oʇ pǝsn sᴉ ɹǝᴉɟᴉpoɯ ʞɔoꞁq ꞁɐsɹǝʌᴉun ǝɥ⟘", - "help.securitycraft.universal_block_remover.info": "˙ʇᴉ ʎoɹʇsǝp uɐɔ uʍop ʞɔoꞁq ǝɥʇ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎꞁuO ˙ʇᴉ ᵷuᴉʞɔᴉꞁɔʇɥᵷᴉɹ ʎq sʞɔoꞁq ,,pǝɔɹoɟuᴉǝɹ,, ʎoɹʇsǝp oʇ pǝsn sᴉ ɹǝʌoɯǝɹ ʞɔoꞁq ꞁɐsɹǝʌᴉun ǝɥ⟘", + "help.securitycraft.universal_block_remover.info": "˙ʇᴉ ʎoɹʇsǝp uɐɔ uʍop ʞɔoꞁq ǝɥʇ pǝɔɐꞁd oɥʍ uosɹǝd ǝɥʇ ʎꞁuO ˙ʇᴉ ᵷuᴉʞɔᴉꞁɔʇɥᵷᴉɹ ʎq sʞɔoꞁq pǝɔɹoɟuᴉǝɹ ʎoɹʇsǝp oʇ pǝsn sᴉ ɹǝʌoɯǝɹ ʞɔoꞁq ꞁɐsɹǝʌᴉun ǝɥʇ 'pǝꞁqɐuǝ ɟI", "help.securitycraft.universal_key_changer.info": "˙ʇuɐʍ noʎ ǝpoɔssɐd ʍǝu ǝɥʇ uᴉ ǝdʎʇ uǝɥʇ 'I∩⅁ ɐ uǝdo oʇ ʞɔoꞁq pǝʇɔǝʇoɹd-ǝpoɔssɐd ɐ ʞɔᴉꞁɔʇɥᵷᴉᴚ ˙uʍo noʎ sʞɔoꞁq pǝʇɔǝʇoɹd-ǝpoɔssɐd ɟo ǝpoɔssɐd ǝɥʇ ǝᵷuɐɥɔ oʇ noʎ sʍoꞁꞁɐ ɹǝᵷuɐɥɔ ʎǝʞ ꞁɐsɹǝʌᴉun ǝɥ⟘", "help.securitycraft.universal_owner_changer.info": "˙ɹǝᵷuɐɥƆ pǝɯɐuun uɐ ɥʇᴉʍ ᵷuᴉʞɔᴉꞁɔʇɥᵷᴉɹ ʎq pǝɯᴉɐꞁɔ ǝq uɐɔ ɹǝuʍo uɐ ʇnoɥʇᴉʍ sʞɔoꞁq 'pǝꞁqɐuǝ ɟI ˙ǝᵷuɐɥɔ ꞁꞁᴉʍ ʇᴉ puɐ ɹǝuʍo uɐ ɥʇᴉʍ sʞɔoꞁq ɹnoʎ ɟo ǝuo ʞɔᴉꞁɔʇɥᵷᴉɹ ʇsnɾ uǝɥ⟘ ˙ʞɔoꞁq ǝɥʇ ɟo ɹǝuʍo ʍǝu ǝɥʇ ɟo ǝɯɐu ǝɥʇ oʇ ꞁᴉʌuɐ uɐ uᴉ ɯǝʇᴉ ǝɥʇ ǝɯɐuǝɹ 'sᴉɥʇ op o⟘ ˙ɹǝuʍo s,ʞɔoꞁq ɐ ǝᵷuɐɥɔ uɐɔ ɹǝᵷuɐɥƆ ɹǝuʍO ꞁɐsɹǝʌᴉu∩ ǝɥ⟘", "help.securitycraft.username_logger.info": "˙ǝuoʇspǝɹ ʎq pǝɹǝʍod sᴉ ʇᴉ uǝɥʍ sʞɔoꞁq Ɛ uᴉɥʇᴉʍ ǝɯɐu s,ɹǝʎɐꞁd ʎuɐ ᵷoꞁ ꞁꞁᴉʍ ɹǝᵷᵷoꞁ ǝɯɐuɹǝsn ǝɥ⟘", @@ -1410,14 +1410,16 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "˙uᴉɐᵷɐ pǝᵷᵷoꞁ ǝq uɐɔ ɹǝʎɐꞁd ǝɯɐs ǝɥʇ ꞁᴉʇun ssɐd oʇ ǝʌɐɥ spuoɔǝs ʎuɐɯ ʍoH", "option.securitycraft.username_logger.searchRadius": "%s :snᴉpɐɹ ɥɔɹɐǝS", "option.securitycraft.username_logger.searchRadius.description": "˙sɹǝʎɐꞁd ɹoɟ sǝɥɔɹɐǝs ɹǝᵷᵷoꞁ ǝɯɐuɹǝsn ǝɥʇ ɥɔᴉɥʍ uᴉ sʞɔoꞁq uᴉ ǝᵷuɐɹ ǝɥ⟘", - "securitycraft.configuration.ableToBreakMines": "sǝuᴉɯ ʞɐǝɹq oʇ ǝꞁqⱯ", - "securitycraft.configuration.ableToBreakMines.tooltip": "¿ᵷuᴉpoꞁdxǝ ʇᴉ ʇnoɥʇᴉʍ ǝuᴉɯ ɐ ʞɐǝɹq oʇ ǝꞁqɐ ǝq sɹǝʎɐꞁd pꞁnoɥS", "securitycraft.configuration.allowAdminTool": "ꞁoo⟘ uᴉɯpⱯ ʍoꞁꞁⱯ", "securitycraft.configuration.allowAdminTool.tooltip": "¿pǝsn ǝq ꞁooʇ uᴉɯpɐ ǝɥʇ uɐƆ", "securitycraft.configuration.allowBlockClaim": "ɯᴉɐꞁɔ ʞɔoꞁq ʍoꞁꞁⱯ", "securitycraft.configuration.allowBlockClaim.tooltip": "˙ɹǝᵷuɐɥƆ ɹǝuʍO ꞁɐsɹǝʌᴉu∩ ǝɥʇ ɥʇᴉʍ ɯǝɥʇ ᵷuᴉʞɔᴉꞁɔʇɥᵷᴉɹ ʎq ɹǝuʍo uɐ ǝʌɐɥ ʇou op ʇɐɥʇ sʞɔoꞁq ɯᴉɐꞁɔ oʇ sʍoꞁꞁⱯ", + "securitycraft.configuration.allow_breaking_non_owned_blocks": "sʞɔoꞁq pǝuʍo-uou ᵷuᴉʞɐǝɹq ʍoꞁꞁⱯ", + "securitycraft.configuration.allow_breaking_non_owned_blocks.tooltip": "˙oʇ ʇǝs sᴉ ,,ᵷuᴉʞɐǝɹq ʞɔoꞁq ꞁooʇ ɐꞁꞁᴉuɐɅ,, ʇɐɥʍ ɟo ssǝꞁpɹɐᵷǝɹ sǝᴉꞁddɐ sᴉɥ⟘\n˙ʇᴉ ʎoɹʇsǝp ꞁꞁᴉʇs uɐɔ ʞɔoꞁq ɐ ɟo ɹǝuʍo ǝɥʇ ʇou ǝɹɐ oɥʍ sɹǝʎɐꞁd ɹǝɥʇǝɥM", "securitycraft.configuration.allow_camera_night_vision": "uoᴉsᴉʌ ʇɥᵷᴉu ɐɹǝɯɐɔ ʍoꞁꞁⱯ", "securitycraft.configuration.allow_camera_night_vision.tooltip": "˙sɐɹǝɯɐɔ ɥᵷnoɹɥʇ ᵷuᴉʞooꞁ uǝɥʍ ʇɔǝɟɟǝ uoᴉʇod ǝɥʇ ᵷuᴉʌɐɥ ʇnoɥʇᴉʍ uoᴉsᴉʌ ʇɥᵷᴉu ǝʇɐʌᴉʇɔɐ oʇ sɹǝʎɐꞁd ʍoꞁꞁɐsᴉp oʇ ǝsꞁɐɟ oʇ sᴉɥʇ ʇǝS", + "securitycraft.configuration.always_drop": "sʞɔoꞁq doɹp sʎɐʍꞁⱯ", + "securitycraft.configuration.always_drop.tooltip": "˙pǝꞁqɐuǝ ǝɹɐ ,,ᵷuᴉʞɐǝɹq ʞɔoꞁq ꞁooʇ ɐꞁꞁᴉuɐɅ,, uǝɥʍ sǝᴉꞁddɐ ʎꞁuo sᴉɥ⟘\n˙(ʇɹᴉp pǝɔɹoɟuᴉǝɹ ɹoɟ ᵷuᴉɥʇʎuɐ ɹo 'ǝuoʇs pǝɔɹoɟuᴉǝɹ ɹoɟ ǝxɐʞɔᴉd ˙ᵷ˙ǝ) doɹp oʇ ʞɔoꞁq ǝɥʇ ɹoɟ pǝsn ǝq ʇsnɯ ꞁooʇ ʇɔǝɹɹoɔ ǝɥʇ 'pǝꞁqɐsᴉp sᴉ sᴉɥʇ ɟI ˙pǝsn sᴉ ꞁooʇ ɥɔᴉɥʍ ɹǝʇʇɐɯ ou sǝʌꞁǝsɯǝɥʇ doɹp sʎɐʍꞁɐ sʞɔoꞁq s,ʇɟɐɹƆʎʇᴉɹnɔǝS ɹǝɥʇǝɥM", "securitycraft.configuration.disable_thanks_message": "pꞁɹoʍ ǝɥʇ ᵷuᴉuᴉoɾ uǝɥʍ ǝᵷɐssǝɯ ǝꞁqɐsᴉᗡ", "securitycraft.configuration.disable_thanks_message.tooltip": "˙ɯǝɥʇ ǝǝs oʇ ʇuɐʍ ʇɐɥʇ ǝsoɥʇ uǝʌǝ 'ɹǝʎɐꞁd ʎɹǝʌǝ ɹoɟ ǝᵷɐssǝɯ ǝɥʇ ᵷuᴉʍoɥs sdoʇs sᴉɥʇ ʇɐɥʇ 'ǝʇoN\n˙suᴉoɾ ɹǝʎɐꞁd ɐ uǝɥʍ sʍoɥs ʇɟɐɹƆʎʇᴉɹnɔǝS ʇɐɥʇ ǝᵷɐssǝɯ ǝɥʇ ᵷuᴉpuǝs ǝꞁqɐsᴉp oʇ ǝnɹʇ oʇ sᴉɥʇ ʇǝS", "securitycraft.configuration.enable_team_ownership": "dᴉɥsɹǝuʍo ɯɐǝʇ ǝꞁqɐuƎ", @@ -1449,7 +1451,9 @@ "securitycraft.configuration.mineExplodesWhenInCreative": "ǝpoɯ ǝʌᴉʇɐǝɹɔ uᴉ uǝɥʍ ǝpoꞁdxǝ sǝuᴉW", "securitycraft.configuration.mineExplodesWhenInCreative.tooltip": "¿ǝpoɯ ǝʌᴉʇɐǝɹƆ uᴉ ǝꞁᴉɥʍ uǝʞoɹq ɟᴉ ǝpoꞁdxǝ sǝuᴉɯ pꞁnoɥS", "securitycraft.configuration.mineExplosionsBreakBlocks": "sʞɔoꞁq ʞɐǝɹq suoᴉsoꞁdxǝ ǝuᴉW", - "securitycraft.configuration.mineExplosionsBreakBlocks.tooltip": "pǝʇɔǝdsǝɹ ǝq ꞁꞁᴉʍ ǝꞁnɹǝɯɐᵷ ,,ʎɐɔǝᗡdoɹᗡuoᴉsoꞁdxƎʞɔoꞁq,, ǝɥʇ 'ǝnɹʇ oʇ ʇǝs sᴉ sᴉɥʇ ɟI ˙ǝpoꞁdxǝ ʎǝɥʇ uǝɥʍ sʞɔoꞁq ʞɐǝɹq ʇou oʇ sǝuᴉɯ ʇuɐʍ noʎ ɟᴉ ǝsꞁɐɟ oʇ sᴉɥʇ ʇǝS", + "securitycraft.configuration.mineExplosionsBreakBlocks.tooltip": "pǝʇɔǝdsǝɹ ǝq ꞁꞁᴉʍ ǝꞁnɹǝɯɐᵷ ,,ʎɐɔǝᗡdoɹᗡuoᴉsoꞁdxƎʞɔoꞁq,, ǝɥʇ 'pǝꞁqɐuǝ sᴉ sᴉɥʇ ɟI ˙ǝpoꞁdxǝ ʎǝɥʇ uǝɥʍ sʞɔoꞁq ʞɐǝɹq ʇou oʇ sǝuᴉɯ ʇuɐʍ noʎ ɟᴉ ǝsꞁɐɟ oʇ sᴉɥʇ ʇǝS", + "securitycraft.configuration.non_owned_breaking_slowdown": "uʍopʍoꞁs ᵷuᴉʞɐǝɹq ʞɔoꞁq pǝuʍo-uoN", + "securitycraft.configuration.non_owned_breaking_slowdown.tooltip": "˙pǝꞁqɐuǝ ǝɹɐ ,,ᵷuᴉʞɐǝɹq ʞɔoꞁq ꞁooʇ ɐꞁꞁᴉuɐɅ,, puɐ ,,sʞɔoꞁq pǝuʍo-uou ᵷuᴉʞɐǝɹq ʍoꞁꞁⱯ,, uǝɥʍ sǝᴉꞁddɐ ʎꞁuo sᴉɥ⟘\n˙ʞɔoꞁq ǝɥʇ ʞɐǝɹq oʇ ᵷuoꞁ sɐ ǝɔᴉʍʇ sǝʞɐʇ ʇᴉ suɐǝɯ 0˙ᘔ ɟo ǝnꞁɐʌ Ɐ :ǝꞁdɯɐxƎ ˙uʍopʍoꞁs ᵷuᴉʞɐǝɹq ʞɔoꞁq pǝuʍo-uou ǝɥʇ ʎq pǝpᴉʌᴉp pǝǝds ᵷuᴉʞɐǝɹq ʞɔoꞁq ꞁɐɯɹou ǝɥʇ sɐ pǝʇɐꞁnɔꞁɐɔ sᴉ ǝnꞁɐʌ ǝɥ⟘\n˙ʇᴉ ᵷuᴉʞɐǝɹq ɹǝʎɐꞁd ǝɥʇ ʎq pǝuʍo ʇou sᴉ ʇɐɥʇ ʞɔoꞁq ɐ ʞɐǝɹq oʇ ǝq pꞁnoɥs ʇᴉ ɹǝʍoꞁs ɥɔnɯ ʍoH", "securitycraft.configuration.passcode_check_cooldown": "uʍopꞁooɔ ʞɔǝɥɔ ǝpoɔssɐԀ", "securitycraft.configuration.passcode_check_cooldown.tooltip": "˙ǝpoɔssɐd ɐ ɹǝʇuǝ oʇ ɹǝʎɐꞁd ɐ ɯoɹɟ sʇdɯǝʇʇɐ ǝʇɐɹɐdǝs oʍʇ uǝǝʍʇǝq ssɐd oʇ spǝǝu ʇɐɥʇ spuoɔǝsᴉꞁꞁᴉɯ uᴉ ǝɯᴉʇ ɟo ʇunoɯɐ ǝɥʇ sǝuᴉɟǝᗡ", "securitycraft.configuration.passcode_spam_log_warning": "ᵷuᴉuɹɐʍ ᵷoꞁ ɯɐds ǝpoɔssɐԀ", @@ -1461,7 +1465,7 @@ "securitycraft.configuration.prevent_reinforced_floor_glitching": "ᵷuᴉɥɔʇᴉꞁᵷ ɹooꞁɟ pǝɔɹoɟuᴉǝɹ ʇuǝʌǝɹԀ", "securitycraft.configuration.prevent_reinforced_floor_glitching.tooltip": "˙sʞɔoꞁq pǝɔɹoɟuᴉǝɹ ǝpᴉsuᴉ ɯǝɥʇ ǝɔɐꞁd pꞁnoʍ ʇɐɥʇ ʎɐʍ ɐ uᴉ ʇɐoq ɐ ʇᴉxǝ sɹǝʎɐꞁd ᵷuᴉʇʇǝꞁ ʇou ʎq pǝʌǝᴉɥɔɐ sᴉ sᴉɥ⟘ ˙ʇɐoq ɐ ᵷuᴉsn sʞɔoꞁq pǝɔɹoɟuᴉǝɹ ɟo ǝpɐɯ ɹooꞁɟ ɐ ɥᵷnoɹɥʇ ᵷuᴉɥɔʇᴉꞁᵷ ɯoɹɟ sɹǝʎɐꞁd ʇuǝʌǝɹd oʇ ǝnɹʇ oʇ sᴉɥʇ ʇǝS", "securitycraft.configuration.reinforced_block_tint": "ʇuᴉʇ ʞɔoꞁq pǝɔɹoɟuᴉǝɹ ǝꞁqɐuƎ", - "securitycraft.configuration.reinforced_block_tint.tooltip": "˙ǝnɹʇ oʇ ʇǝs sᴉ ,,ʇuᴉʇ‾ʞɔoꞁq‾pǝɔɹoɟuᴉǝɹ‾ǝɔɹoɟ,, ᵷuᴉʇʇǝs ᵷᴉɟuoɔ ɹǝʌɹǝs ǝɥʇ ɟᴉ sʇuǝᴉꞁɔ uo ᵷuᴉʇʇǝs sᴉɥʇ ǝɔɹoɟ uɐɔ sɹǝʌɹǝS ¿sʇɹɐdɹǝʇunoɔ ɐꞁꞁᴉuɐʌ ɹᴉǝɥʇ uɐɥʇ ɹǝʞɹɐp ʎꞁʇɥᵷᴉꞁs ǝq sǝɹnʇxǝʇ ,sʞɔoꞁq pǝɔɹoɟuᴉǝɹ pꞁnoɥS", + "securitycraft.configuration.reinforced_block_tint.tooltip": "˙pǝꞁqɐuǝ sᴉ ,,ʇuᴉʇ‾ʞɔoꞁq‾pǝɔɹoɟuᴉǝɹ‾ǝɔɹoɟ,, ᵷuᴉʇʇǝs ᵷᴉɟuoɔ ɹǝʌɹǝs ǝɥʇ ɟᴉ sʇuǝᴉꞁɔ uo ᵷuᴉʇʇǝs sᴉɥʇ ǝɔɹoɟ uɐɔ sɹǝʌɹǝS ¿sʇɹɐdɹǝʇunoɔ ɐꞁꞁᴉuɐʌ ɹᴉǝɥʇ uɐɥʇ ɹǝʞɹɐp ʎꞁʇɥᵷᴉꞁs ǝq sǝɹnʇxǝʇ ,sʞɔoꞁq pǝɔɹoɟuᴉǝɹ pꞁnoɥS", "securitycraft.configuration.reinforced_block_tint_color": "ɹoꞁoɔ ʇuᴉʇ ʞɔoꞁq pǝɔɹoɟuᴉǝᴚ", "securitycraft.configuration.reinforced_block_tint_color.tooltip": "˙ʇsǝq ʞooꞁ sǝnꞁɐʌ ǝꞁɐɔsʎɐɹ⅁ ˙sʞɔoꞁq ꞁꞁɐ oʇ ǝɯɐs ǝɥʇ pǝᴉꞁddɐ ǝq ꞁꞁᴉʍ puɐ 'sɹǝʌɹǝs ʎq uǝppᴉɹɹǝʌo ǝq ʇouuɐɔ sᴉɥ⟘ ˙pǝꞁqɐuǝ sᴉ ʇuᴉʇ‾ʞɔoꞁq‾pǝɔɹoɟuᴉǝɹ uǝɥʍ ǝʌɐɥ sǝɹnʇxǝʇ ,sʞɔoꞁq pǝɔɹoɟuᴉǝɹ ʇɐɥʇ ɹoꞁoɔ ǝɥʇ ʇǝS", "securitycraft.configuration.reinforced_suffocation_damage": "ǝᵷɐɯɐp uoᴉʇɐɔoɟɟns pǝɔɹoɟuᴉǝᴚ", @@ -1487,10 +1491,12 @@ "securitycraft.configuration.taser_damage": "ǝᵷɐɯɐp ɹǝsɐ⟘", "securitycraft.configuration.taser_damage.tooltip": "˙ʇɹɐǝɥ ɐ ɟꞁɐɥ sᴉ ʇꞁnɐɟǝᗡ ˙sʇᴉɥ ʇᴉ sqoɯ ǝɥʇ oʇuo sʇɔᴉꞁɟuᴉ ɹǝsɐʇ ǝɥʇ ǝᵷɐɯɐp ɟo ʇunoɯɐ ǝɥʇ ʇǝS", "securitycraft.configuration.team_ownership_precedence": "ǝɔuǝpǝɔǝɹd dᴉɥsɹǝuʍo ɯɐǝ⟘", - "securitycraft.configuration.team_ownership_precedence.tooltip": "˙,,ⱯꞀꞀINⱯɅ,, puɐ ,,SWⱯƎ⟘‾ᗺ⟘Ⅎ,, ǝɹɐ sǝnꞁɐʌ pᴉꞁɐɅ ˙ɯɐǝʇ ɟo puᴉʞ ʇɐɥʇ ǝɹouᵷᴉ poɯ ǝɥʇ sǝʞɐɯ ʎɹʇuǝ uɐ ᵷuᴉʌoɯǝᴚ\n˙ɯɐǝʇ ɐꞁꞁᴉuɐʌ ǝɯɐs ǝɥʇ uo ǝɹɐ sɹǝʎɐꞁd ǝɯɐs ǝɥʇ ɟᴉ sʞɔǝɥɔ poɯ ǝɥʇ 'ɯɐǝʇ ᗺ⟘Ⅎ uɐ ǝɹɐɥs ʇou op sɹǝʎɐꞁd ǝɥʇ ʇnq pǝꞁꞁɐʇsuᴉ sᴉ sɯɐǝ⟘ ᗺ⟘Ⅎ ɟᴉ 'ᵷᴉɟuoɔ ʇꞁnɐɟǝp ǝɥʇ uǝʌᴉ⅁ ˙ᵷ˙Ǝ ˙ɹǝʌo sᴉ ʇsᴉꞁ ǝɥʇ ɹo 'ɯɐǝʇ ǝɯɐs ǝɥʇ uo ǝɹɐ sɹǝʎɐꞁd ǝɥʇ ǝɹǝɥʍ ǝsɐɔ ɐ spuᴉɟ ʇᴉ ꞁᴉʇun ʇsᴉꞁ ǝɥʇ uʍop sɯɐǝʇ ɹoɟ ᵷuᴉʞɔǝɥɔ ǝnuᴉʇuoɔ ꞁꞁᴉʍ ʇɟɐɹƆʎʇᴉɹnɔǝS\n˙ʇsɹᴉɟ pǝʞɔǝɥɔ s,ʇᴉ suɐǝɯ ʇsᴉꞁ ǝɥʇ uᴉ ʇsɹᴉℲ ˙ǝnɹʇ oʇ ʇǝs sᴉ ,,dᴉɥsɹǝuʍo‾ɯɐǝʇ‾ǝꞁqɐuǝ,, ɟᴉ 'ɯɐǝʇ ǝɯɐs ǝɥʇ uo ǝɹ,ʎǝɥʇ ɟᴉ ǝuᴉɯɹǝʇǝp oʇ sɹǝʎɐꞁd ɟo sɯɐǝʇ sʞɔǝɥɔ ʇɟɐɹƆʎʇᴉɹnɔǝS ɹǝpɹo ɥɔᴉɥʍ uᴉ sǝuᴉɟǝp ʇsᴉꞁ sᴉɥ⟘", + "securitycraft.configuration.team_ownership_precedence.tooltip": "˙,,ⱯꞀꞀINⱯɅ,, puɐ ,,SWⱯƎ⟘‾ᗺ⟘Ⅎ,, ǝɹɐ sǝnꞁɐʌ pᴉꞁɐɅ ˙ɯɐǝʇ ɟo puᴉʞ ʇɐɥʇ ǝɹouᵷᴉ poɯ ǝɥʇ sǝʞɐɯ ʎɹʇuǝ uɐ ᵷuᴉʌoɯǝᴚ\n˙ɯɐǝʇ ɐꞁꞁᴉuɐʌ ǝɯɐs ǝɥʇ uo ǝɹɐ sɹǝʎɐꞁd ǝɯɐs ǝɥʇ ɟᴉ sʞɔǝɥɔ poɯ ǝɥʇ 'ɯɐǝʇ ᗺ⟘Ⅎ uɐ ǝɹɐɥs ʇou op sɹǝʎɐꞁd ǝɥʇ ʇnq pǝꞁꞁɐʇsuᴉ sᴉ sɯɐǝ⟘ ᗺ⟘Ⅎ ɟᴉ 'ᵷᴉɟuoɔ ʇꞁnɐɟǝp ǝɥʇ uǝʌᴉ⅁ ˙ᵷ˙Ǝ ˙ɹǝʌo sᴉ ʇsᴉꞁ ǝɥʇ ɹo 'ɯɐǝʇ ǝɯɐs ǝɥʇ uo ǝɹɐ sɹǝʎɐꞁd ǝɥʇ ǝɹǝɥʍ ǝsɐɔ ɐ spuᴉɟ ʇᴉ ꞁᴉʇun ʇsᴉꞁ ǝɥʇ uʍop sɯɐǝʇ ɹoɟ ᵷuᴉʞɔǝɥɔ ǝnuᴉʇuoɔ ꞁꞁᴉʍ ʇɟɐɹƆʎʇᴉɹnɔǝS\n˙ʇsɹᴉɟ pǝʞɔǝɥɔ s,ʇᴉ suɐǝɯ ʇsᴉꞁ ǝɥʇ uᴉ ʇsɹᴉℲ ˙pǝꞁqɐuǝ sᴉ ,,dᴉɥsɹǝuʍo‾ɯɐǝʇ‾ǝꞁqɐuǝ,, ɟᴉ 'ɯɐǝʇ ǝɯɐs ǝɥʇ uo ǝɹ,ʎǝɥʇ ɟᴉ ǝuᴉɯɹǝʇǝp oʇ sɹǝʎɐꞁd ɟo sɯɐǝʇ sʞɔǝɥɔ ʇɟɐɹƆʎʇᴉɹnɔǝS ɹǝpɹo ɥɔᴉɥʍ uᴉ sǝuᴉɟǝp ʇsᴉꞁ sᴉɥ⟘", "securitycraft.configuration.title": "uoᴉʇɐɹnᵷᴉɟuoƆ ʇɟɐɹƆʎʇᴉɹnɔǝS", "securitycraft.configuration.trick_scanners_with_player_heads": "spɐǝɥ ɹǝʎɐꞁd ɥʇᴉʍ sɹǝuuɐɔs ʞɔᴉɹ⟘", "securitycraft.configuration.trick_scanners_with_player_heads.tooltip": "˙ᵷuᴉʇɐʌᴉʇɔɐ oʇuᴉ sɹoop ɹǝuuɐɔs puɐ sɹǝuuɐɔs ꞁɐuᴉʇǝɹ ɹᴉǝɥʇ ʞɔᴉɹʇ oʇ ǝꞁqɐ ǝq oʇ ꞁꞁnʞs s,ɹǝʎɐꞁd ʇuǝɹǝɟɟᴉp ɐ ᵷuᴉɹɐǝʍ sɹǝʎɐꞁd ʇuɐʍ noʎ ɟᴉ ǝnɹʇ oʇ sᴉɥʇ ʇǝS", + "securitycraft.configuration.vanilla_tool_block_breaking": "ᵷuᴉʞɐǝɹq ʞɔoꞁq ꞁooʇ ɐꞁꞁᴉuɐɅ", + "securitycraft.configuration.vanilla_tool_block_breaking.tooltip": "˙ɹǝʌoɯǝᴚ ʞɔoꞁᗺ ꞁɐsɹǝʌᴉu∩ ǝɥʇ ǝꞁqɐsᴉp ꞁꞁᴉʍ sᴉɥʇ 'pǝꞁqɐuǝ ɟI ˙ɹǝʌoɯǝᴚ ʞɔoꞁᗺ ꞁɐsɹǝʌᴉu∩ ǝɥʇ ɟo pɐǝʇsuᴉ '(˙˙˙ 'ǝoɥ 'ꞁǝʌoɥs 'ǝxɐ) sꞁooʇ ɐꞁꞁᴉuɐʌ ᵷuᴉsn uǝʞoɹq ǝq pꞁnoɥs sʞɔoꞁq s,ʇɟɐɹƆʎʇᴉɹnɔǝS ɹǝɥʇǝɥM", "securitycraft.option.default": "(%s ɟo ʇꞁnɐɟǝᗡ)", "securitycraft.option.default_with_range": "(%s oʇ %s ɯoɹɟ ǝᵷuɐɹ ɐ ɥʇᴉʍ '%s ɟo ʇꞁnɐɟǝᗡ)", "securitycraft.subtitle.alarm": "ᵷuᴉpunos ɯɹɐꞁⱯ", @@ -1526,6 +1532,7 @@ "tooltip.securitycraft:projector": "˙pꞁɹoʍ ǝɥʇ oʇuᴉ sʞɔoꞁq ǝʞɐɟ sʇɔǝɾoɹԀ", "tooltip.securitycraft:sentry": "%s ʎɹʇuǝS", "tooltip.securitycraft:sonicSecuritySystem.linkedTo": "˙(s)ʞɔoꞁq %s oʇ pǝʞuᴉꞀ", + "tooltip.securitycraft:universal_block_remover.disabled": "˙sʞɔoꞁq pǝɔɹoɟuᴉǝɹ ʞɐǝɹq oʇ sꞁooʇ ɐꞁꞁᴉuɐʌ ǝs∩ ˙pǝꞁqɐsᴉᗡ", "waila.securitycraft:customName": "%s :ǝɯɐu ɯoʇsnƆ", "waila.securitycraft:equipped": ":ɥʇᴉʍ pǝddᴉnbƎ", "waila.securitycraft:owner": "%s :ɹǝuʍO" diff --git a/src/main/resources/assets/securitycraft/lang/en_us.json b/src/main/resources/assets/securitycraft/lang/en_us.json index 8118bbcbcc..ffc8832c03 100644 --- a/src/main/resources/assets/securitycraft/lang/en_us.json +++ b/src/main/resources/assets/securitycraft/lang/en_us.json @@ -826,7 +826,7 @@ "gui.securitycraft:scManual.modules": "Available modules:", "gui.securitycraft:scManual.option_text": "- %s %s", "gui.securitycraft:scManual.options": "Available options:", - "gui.securitycraft:scManual.ownableBlock": "Ownable: This is resistant to explosions, and can only be broken by the player who placed it down using the Universal Block Remover.", + "gui.securitycraft:scManual.ownableBlock": "Ownable: This is resistant to explosions, and can only be broken by the player who placed it down.", "gui.securitycraft:scManual.passcodeProtectedBlock": "Passcode protected: This can only be used if a passcode set by the owner is correctly entered.", "gui.securitycraft:scManual.patreon.error": "Error fetching Patrons!", "gui.securitycraft:scManual.patreon.loading": "Loading...", @@ -927,7 +927,7 @@ "help.securitycraft.crystal_quartz_item.info": "Crystal Quartz is used to craft Crystal Quartz blocks.", "help.securitycraft.disguise_module.info": "The disguise module disguises certain blocks when added to them.", "help.securitycraft.display_cases.info": "The Display Case can display one item, similar to a vanilla item frame, although the item cannot be rotated. Opening the case requires inserting a passcode, just like the Keypad and other similar blocks do. Once open, an item can be inserted by rightclicking the case with the item. To retrieve the item, sneak-rightclick the case. To close the case, rightclick it with an empty hand. While the case is open, anyone can interact with it. The glow variant glows in the dark, akin to vanilla's glow item frames.", - "help.securitycraft.door_indestructible_iron_item.info": "The reinforced iron door is the same as the vanilla iron door, except it is unbreakable. It can only be opened by Keypads, Inventory Scanners, etc. The owner of the door can use the universal block remover to break it down.", + "help.securitycraft.door_indestructible_iron_item.info": "The reinforced iron door is the same as the vanilla iron door, except it is unbreakable. It can only be opened by Keypads, Inventory Scanners, etc.", "help.securitycraft.electrified_iron_fence.info": "The electrified iron fence acts the same as a vanilla fence, except it is unbreakable, and will hurt anyone but the owner when they get in contact with it.", "help.securitycraft.floor_trap.info": "The floor trap is a block that will disappear for a short amount of time when a player or mob steps on it. Many settings like the time it takes for it to disappear, or who can trigger the trap, are configurable with the universal block modifier.", "help.securitycraft.furnace_mines.info": "Furnace mines function just like the standard mines, except they only explode when rightclicked or broken by someone other than the owner.", @@ -959,15 +959,15 @@ "help.securitycraft.projector.info": "The Projector projects holographic versions of a block of your choice into the world, which can be used to hide buildings and other areas of interest from other players. The range and width of the projection can be changed within the Projector's GUI.", "help.securitycraft.protecto.info": "The protecto, inspired by the enemy from the game \"Megaman: Battle Network 2\" made by Capcom, will attack any mob in a 10-block radius with lightning bolts every 10 seconds while it's raining or snowing with a clear view of the sky.", "help.securitycraft.redstone_module.info": "The redstone module adds power properties to a block.", - "help.securitycraft.reinforced.info": "Reinforced blocks are unbreakable building blocks with vanilla equivalents. Only the person who placed them down can destroy them using the universal block remover.", + "help.securitycraft.reinforced.info": "Reinforced blocks are unbreakable building blocks with vanilla equivalents. Only the person who placed them down can destroy them.", "help.securitycraft.reinforced_buttons.info": "The reinforced buttons can only be activated by their owner or players on the allowlist.", "help.securitycraft.reinforced_chiseled_bookshelf.info": "The Reinforced Chiseled Bookshelf has the same features as its vanilla counterpart, though only the owner and players on the allowlist can add and remove books.", "help.securitycraft.reinforced_crystal_quartz.info": "Reinforced Crystal Quartz Blocks are used to build the Block Pocket. More info on the Block Pocket Manager's page.", "help.securitycraft.reinforced_fence_gate.info": "The electrified iron fence gate acts the same as a vanilla fence gate, except it is unbreakable, and can only be opened by Keypads, Inventory Scanners, etc.. It will also hurt anyone but the owner when they get in contact with it.", "help.securitycraft.reinforced_fence_gates.info": "The reinforced fence gates can only be opened by their owner or players on the allowlist.", - "help.securitycraft.reinforced_glass_pane.info": "The reinforced glass pane is the same as a vanilla glass, except only the person who placed it down can destroy it using the universal block remover.", + "help.securitycraft.reinforced_glass_pane.info": "The reinforced glass pane is the same as a vanilla glass, except only the person who placed it down can destroy it.", "help.securitycraft.reinforced_hopper.info": "The Reinforced Hopper is the only block that can be used to extract items out of a passcode protected chest or barrel if both are owned by the same player. It will otherwise act like a vanilla hopper.", - "help.securitycraft.reinforced_iron_bars.info": "The reinforced iron bars are the same as a vanilla iron bars, except only the person who placed them down can destroy them using the universal block remover.", + "help.securitycraft.reinforced_iron_bars.info": "The reinforced iron bars are the same as a vanilla iron bars, except only the person who placed them down can destroy them.", "help.securitycraft.reinforced_iron_trapdoor.info": "The reinforced iron trapdoor is the same as a vanilla trapdoor, except it can only be opened by Keypads, Inventory Scanners, etc., and only be broken by the person who placed it down.", "help.securitycraft.reinforced_lever.info": "The Reinforced Lever can only be activated by its owner or players on the allowlist.", "help.securitycraft.reinforced_pressure_plates.info": "The reinforced pressure plates can only be activated by their owner or players on the allowlist.", @@ -991,7 +991,7 @@ "help.securitycraft.track_mine.info": "The track mine explodes when a minecart passes on top of it.", "help.securitycraft.trophy_system.info": "The trophy system, inspired by the gadget first seen in \"Call of Duty: Modern Warfare 3\" published by Activision, targets enemy arrows and fireballs and will destroy them from range after a half-second charge time.", "help.securitycraft.universal_block_modifier.info": "The universal block modifier is used to customize various blocks added by SecurityCraft. Rightclick a block to open the customization GUI. You can then insert \"modules\" to customize how that block functions.", - "help.securitycraft.universal_block_remover.info": "The universal block remover is used to destroy \"reinforced\" blocks by rightclicking it. Only the person who placed the block down can destroy it.", + "help.securitycraft.universal_block_remover.info": "If enabled, the universal block remover is used to destroy reinforced blocks by rightclicking it. Only the person who placed the block down can destroy it.", "help.securitycraft.universal_key_changer.info": "The universal key changer allows you to change the passcode of passcode-protected blocks you own. Rightclick a passcode-protected block to open a GUI, then type in the new passcode you want.", "help.securitycraft.universal_owner_changer.info": "The Universal Owner Changer can change a block's owner. To do this, rename the item in an anvil to the name of the new owner of the block. Then just rightclick one of your blocks with an owner and it will change. If enabled, blocks without an owner can be claimed by rightclicking with an unnamed Changer.", "help.securitycraft.username_logger.info": "The username logger will log any player's name within 3 blocks when it is powered by redstone.", @@ -1410,14 +1410,16 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "How many seconds have to pass until the same player can be logged again.", "option.securitycraft.username_logger.searchRadius": "Search radius: %s", "option.securitycraft.username_logger.searchRadius.description": "The range in blocks in which the username logger searches for players.", - "securitycraft.configuration.ableToBreakMines": "Able to break mines", - "securitycraft.configuration.ableToBreakMines.tooltip": "Should players be able to break a mine without it exploding?", "securitycraft.configuration.allowAdminTool": "Allow Admin Tool", "securitycraft.configuration.allowAdminTool.tooltip": "Can the admin tool be used?", "securitycraft.configuration.allowBlockClaim": "Allow block claim", "securitycraft.configuration.allowBlockClaim.tooltip": "Allows to claim blocks that do not have an owner by rightclicking them with the Universal Owner Changer.", + "securitycraft.configuration.allow_breaking_non_owned_blocks": "Allow breaking non-owned blocks", + "securitycraft.configuration.allow_breaking_non_owned_blocks.tooltip": "Whether players who are not the owner of a block can still destroy it.\nThis applies regardless of what \"Vanilla tool block breaking\" is set to.", "securitycraft.configuration.allow_camera_night_vision": "Allow camera night vision", "securitycraft.configuration.allow_camera_night_vision.tooltip": "Set this to false to disallow players to activate night vision without having the potion effect when looking through cameras.", + "securitycraft.configuration.always_drop": "Always drop blocks", + "securitycraft.configuration.always_drop.tooltip": "Whether SecurityCraft's blocks always drop themselves no matter which tool is used. If this is disabled, the correct tool must be used for the block to drop (e.g. pickaxe for reinforced stone, or anything for reinforced dirt).\nThis only applies when \"Vanilla tool block breaking\" are enabled.", "securitycraft.configuration.disable_thanks_message": "Disable message when joining the world", "securitycraft.configuration.disable_thanks_message.tooltip": "Set this to true to disable sending the message that SecurityCraft shows when a player joins.\nNote, that this stops showing the message for every player, even those that want to see them.", "securitycraft.configuration.enable_team_ownership": "Enable team ownership", @@ -1449,7 +1451,9 @@ "securitycraft.configuration.mineExplodesWhenInCreative": "Mines explode when in creative mode", "securitycraft.configuration.mineExplodesWhenInCreative.tooltip": "Should mines explode if broken while in Creative mode?", "securitycraft.configuration.mineExplosionsBreakBlocks": "Mine explosions break blocks", - "securitycraft.configuration.mineExplosionsBreakBlocks.tooltip": "Set this to false if you want mines to not break blocks when they explode. If this is set to true, the \"blockExplosionDropDecay\" gamerule will be respected", + "securitycraft.configuration.mineExplosionsBreakBlocks.tooltip": "Set this to false if you want mines to not break blocks when they explode. If this is enabled, the \"blockExplosionDropDecay\" gamerule will be respected", + "securitycraft.configuration.non_owned_breaking_slowdown": "Non-owned block breaking slowdown", + "securitycraft.configuration.non_owned_breaking_slowdown.tooltip": "How much slower it should be to break a block that is not owned by the player breaking it.\nThe value is calculated as the normal block breaking speed divided by the non-owned block breaking slowdown. Example: A value of 2.0 means it takes twice as long to break the block.\nThis only applies when \"Allow breaking non-owned blocks\" and \"Vanilla tool block breaking\" are enabled.", "securitycraft.configuration.passcode_check_cooldown": "Passcode check cooldown", "securitycraft.configuration.passcode_check_cooldown.tooltip": "Defines the amount of time in milliseconds that needs to pass between two separate attempts from a player to enter a passcode.", "securitycraft.configuration.passcode_spam_log_warning": "Passcode spam log warning", @@ -1461,7 +1465,7 @@ "securitycraft.configuration.prevent_reinforced_floor_glitching": "Prevent reinforced floor glitching", "securitycraft.configuration.prevent_reinforced_floor_glitching.tooltip": "Set this to true to prevent players from glitching through a floor made of reinforced blocks using a boat. This is achieved by not letting players exit a boat in a way that would place them inside reinforced blocks.", "securitycraft.configuration.reinforced_block_tint": "Enable reinforced block tint", - "securitycraft.configuration.reinforced_block_tint.tooltip": "Should reinforced blocks' textures be slightly darker than their vanilla counterparts? Servers can force this setting on clients if the server config setting \"force_reinforced_block_tint\" is set to true.", + "securitycraft.configuration.reinforced_block_tint.tooltip": "Should reinforced blocks' textures be slightly darker than their vanilla counterparts? Servers can force this setting on clients if the server config setting \"force_reinforced_block_tint\" is enabled.", "securitycraft.configuration.reinforced_block_tint_color": "Reinforced block tint color", "securitycraft.configuration.reinforced_block_tint_color.tooltip": "Set the color that reinforced blocks' textures have when reinforced_block_tint is enabled. This cannot be overridden by servers, and will be applied the same to all blocks. Grayscale values look best.", "securitycraft.configuration.reinforced_suffocation_damage": "Reinforced suffocation damage", @@ -1487,10 +1491,12 @@ "securitycraft.configuration.taser_damage": "Taser damage", "securitycraft.configuration.taser_damage.tooltip": "Set the amount of damage the taser inflicts onto the mobs it hits. Default is half a heart.", "securitycraft.configuration.team_ownership_precedence": "Team ownership precedence", - "securitycraft.configuration.team_ownership_precedence.tooltip": "This list defines in which order SecurityCraft checks teams of players to determine if they're on the same team, if \"enable_team_ownership\" is set to true. First in the list means it's checked first.\nSecurityCraft will continue checking for teams down the list until it finds a case where the players are on the same team, or the list is over. E.g. Given the default config, if FTB Teams is installed but the players do not share an FTB team, the mod checks if the same players are on the same vanilla team.\nRemoving an entry makes the mod ignore that kind of team. Valid values are \"FTB_TEAMS\" and \"VANILLA\".", + "securitycraft.configuration.team_ownership_precedence.tooltip": "This list defines in which order SecurityCraft checks teams of players to determine if they're on the same team, if \"enable_team_ownership\" is enabled. First in the list means it's checked first.\nSecurityCraft will continue checking for teams down the list until it finds a case where the players are on the same team, or the list is over. E.g. Given the default config, if FTB Teams is installed but the players do not share an FTB team, the mod checks if the same players are on the same vanilla team.\nRemoving an entry makes the mod ignore that kind of team. Valid values are \"FTB_TEAMS\" and \"VANILLA\".", "securitycraft.configuration.title": "SecurityCraft Configuration", "securitycraft.configuration.trick_scanners_with_player_heads": "Trick scanners with player heads", "securitycraft.configuration.trick_scanners_with_player_heads.tooltip": "Set this to true if you want players wearing a different player's skull to be able to trick their retinal scanners and scanner doors into activating.", + "securitycraft.configuration.vanilla_tool_block_breaking": "Vanilla tool block breaking", + "securitycraft.configuration.vanilla_tool_block_breaking.tooltip": "Whether SecurityCraft's blocks should be broken using vanilla tools (axe, shovel, hoe, ...), instead of the Universal Block Remover. If enabled, this will disable the Universal Block Remover.", "securitycraft.option.default": "(Default of %s)", "securitycraft.option.default_with_range": "(Default of %s, with a range from %s to %s)", "securitycraft.subtitle.alarm": "Alarm sounding", @@ -1526,6 +1532,7 @@ "tooltip.securitycraft:projector": "Projects fake blocks into the world.", "tooltip.securitycraft:sentry": "Sentry %s", "tooltip.securitycraft:sonicSecuritySystem.linkedTo": "Linked to %s block(s).", + "tooltip.securitycraft:universal_block_remover.disabled": "Disabled. Use vanilla tools to break reinforced blocks.", "waila.securitycraft:customName": "Custom name: %s", "waila.securitycraft:equipped": "Equipped with:", "waila.securitycraft:owner": "Owner: %s" diff --git a/src/main/resources/assets/securitycraft/lang/es_ar.json b/src/main/resources/assets/securitycraft/lang/es_ar.json index 54d6dd2b4d..cac29c4337 100644 --- a/src/main/resources/assets/securitycraft/lang/es_ar.json +++ b/src/main/resources/assets/securitycraft/lang/es_ar.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Cuántos segundos tienen que pasar hasta que se vuelva a registrar al mismo usuario.", "option.securitycraft.username_logger.searchRadius": "Radio de búsqueda: %s", "option.securitycraft.username_logger.searchRadius.description": "El rango en bloques en el que el registrador de nombre de usuario busca jugadores.", - "securitycraft.configuration.ableToBreakMines": "Se pueden romper las minas", - "securitycraft.configuration.ableToBreakMines.tooltip": "¿Pueden los jugadores romper una mina sin explotarla?", "securitycraft.configuration.allowAdminTool": "Permitir herramienta de administrador", "securitycraft.configuration.allowAdminTool.tooltip": "¿Se puede usar la herramienta de administrador?", "securitycraft.configuration.allowBlockClaim": "Permitir que se reclamen bloques ", diff --git a/src/main/resources/assets/securitycraft/lang/es_cl.json b/src/main/resources/assets/securitycraft/lang/es_cl.json index 54d6dd2b4d..cac29c4337 100644 --- a/src/main/resources/assets/securitycraft/lang/es_cl.json +++ b/src/main/resources/assets/securitycraft/lang/es_cl.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Cuántos segundos tienen que pasar hasta que se vuelva a registrar al mismo usuario.", "option.securitycraft.username_logger.searchRadius": "Radio de búsqueda: %s", "option.securitycraft.username_logger.searchRadius.description": "El rango en bloques en el que el registrador de nombre de usuario busca jugadores.", - "securitycraft.configuration.ableToBreakMines": "Se pueden romper las minas", - "securitycraft.configuration.ableToBreakMines.tooltip": "¿Pueden los jugadores romper una mina sin explotarla?", "securitycraft.configuration.allowAdminTool": "Permitir herramienta de administrador", "securitycraft.configuration.allowAdminTool.tooltip": "¿Se puede usar la herramienta de administrador?", "securitycraft.configuration.allowBlockClaim": "Permitir que se reclamen bloques ", diff --git a/src/main/resources/assets/securitycraft/lang/es_ec.json b/src/main/resources/assets/securitycraft/lang/es_ec.json index 54d6dd2b4d..cac29c4337 100644 --- a/src/main/resources/assets/securitycraft/lang/es_ec.json +++ b/src/main/resources/assets/securitycraft/lang/es_ec.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Cuántos segundos tienen que pasar hasta que se vuelva a registrar al mismo usuario.", "option.securitycraft.username_logger.searchRadius": "Radio de búsqueda: %s", "option.securitycraft.username_logger.searchRadius.description": "El rango en bloques en el que el registrador de nombre de usuario busca jugadores.", - "securitycraft.configuration.ableToBreakMines": "Se pueden romper las minas", - "securitycraft.configuration.ableToBreakMines.tooltip": "¿Pueden los jugadores romper una mina sin explotarla?", "securitycraft.configuration.allowAdminTool": "Permitir herramienta de administrador", "securitycraft.configuration.allowAdminTool.tooltip": "¿Se puede usar la herramienta de administrador?", "securitycraft.configuration.allowBlockClaim": "Permitir que se reclamen bloques ", diff --git a/src/main/resources/assets/securitycraft/lang/es_es.json b/src/main/resources/assets/securitycraft/lang/es_es.json index 7fde7aaf75..3a9398bef1 100644 --- a/src/main/resources/assets/securitycraft/lang/es_es.json +++ b/src/main/resources/assets/securitycraft/lang/es_es.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Cuántos segundos tienen que pasar hasta que se vuelva a registrar al mismo usuario.", "option.securitycraft.username_logger.searchRadius": "Radio de búsqueda: %s", "option.securitycraft.username_logger.searchRadius.description": "El rango en bloques en el que el registrador de nombre de usuario busca jugadores.", - "securitycraft.configuration.ableToBreakMines": "Se pueden romper las minas", - "securitycraft.configuration.ableToBreakMines.tooltip": "¿Pueden los jugadores romper una mina sin explotarla?", "securitycraft.configuration.allowAdminTool": "Permitir herramienta de administrador", "securitycraft.configuration.allowAdminTool.tooltip": "¿Se puede usar la herramienta de administrador?", "securitycraft.configuration.allowBlockClaim": "Permitir que se reclamen bloques ", diff --git a/src/main/resources/assets/securitycraft/lang/es_mx.json b/src/main/resources/assets/securitycraft/lang/es_mx.json index 54d6dd2b4d..cac29c4337 100644 --- a/src/main/resources/assets/securitycraft/lang/es_mx.json +++ b/src/main/resources/assets/securitycraft/lang/es_mx.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Cuántos segundos tienen que pasar hasta que se vuelva a registrar al mismo usuario.", "option.securitycraft.username_logger.searchRadius": "Radio de búsqueda: %s", "option.securitycraft.username_logger.searchRadius.description": "El rango en bloques en el que el registrador de nombre de usuario busca jugadores.", - "securitycraft.configuration.ableToBreakMines": "Se pueden romper las minas", - "securitycraft.configuration.ableToBreakMines.tooltip": "¿Pueden los jugadores romper una mina sin explotarla?", "securitycraft.configuration.allowAdminTool": "Permitir herramienta de administrador", "securitycraft.configuration.allowAdminTool.tooltip": "¿Se puede usar la herramienta de administrador?", "securitycraft.configuration.allowBlockClaim": "Permitir que se reclamen bloques ", diff --git a/src/main/resources/assets/securitycraft/lang/es_uy.json b/src/main/resources/assets/securitycraft/lang/es_uy.json index 54d6dd2b4d..cac29c4337 100644 --- a/src/main/resources/assets/securitycraft/lang/es_uy.json +++ b/src/main/resources/assets/securitycraft/lang/es_uy.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Cuántos segundos tienen que pasar hasta que se vuelva a registrar al mismo usuario.", "option.securitycraft.username_logger.searchRadius": "Radio de búsqueda: %s", "option.securitycraft.username_logger.searchRadius.description": "El rango en bloques en el que el registrador de nombre de usuario busca jugadores.", - "securitycraft.configuration.ableToBreakMines": "Se pueden romper las minas", - "securitycraft.configuration.ableToBreakMines.tooltip": "¿Pueden los jugadores romper una mina sin explotarla?", "securitycraft.configuration.allowAdminTool": "Permitir herramienta de administrador", "securitycraft.configuration.allowAdminTool.tooltip": "¿Se puede usar la herramienta de administrador?", "securitycraft.configuration.allowBlockClaim": "Permitir que se reclamen bloques ", diff --git a/src/main/resources/assets/securitycraft/lang/es_ve.json b/src/main/resources/assets/securitycraft/lang/es_ve.json index 54d6dd2b4d..cac29c4337 100644 --- a/src/main/resources/assets/securitycraft/lang/es_ve.json +++ b/src/main/resources/assets/securitycraft/lang/es_ve.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Cuántos segundos tienen que pasar hasta que se vuelva a registrar al mismo usuario.", "option.securitycraft.username_logger.searchRadius": "Radio de búsqueda: %s", "option.securitycraft.username_logger.searchRadius.description": "El rango en bloques en el que el registrador de nombre de usuario busca jugadores.", - "securitycraft.configuration.ableToBreakMines": "Se pueden romper las minas", - "securitycraft.configuration.ableToBreakMines.tooltip": "¿Pueden los jugadores romper una mina sin explotarla?", "securitycraft.configuration.allowAdminTool": "Permitir herramienta de administrador", "securitycraft.configuration.allowAdminTool.tooltip": "¿Se puede usar la herramienta de administrador?", "securitycraft.configuration.allowBlockClaim": "Permitir que se reclamen bloques ", diff --git a/src/main/resources/assets/securitycraft/lang/fr_ca.json b/src/main/resources/assets/securitycraft/lang/fr_ca.json index d99f1523c4..da1b5e65d5 100644 --- a/src/main/resources/assets/securitycraft/lang/fr_ca.json +++ b/src/main/resources/assets/securitycraft/lang/fr_ca.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Combien de secondes avant que le même joueur ne soit à nouveau enregistré.", "option.securitycraft.username_logger.searchRadius": "Rayon de recherche : %s", "option.securitycraft.username_logger.searchRadius.description": "La portée en blocs dans laquelle l'enregistreur de nom d'utilisateur recherche des joueurs.", - "securitycraft.configuration.ableToBreakMines": "Capacité de détruire les mines", - "securitycraft.configuration.ableToBreakMines.tooltip": "Les joueurs devraient-ils être capables de détruire les mines sans qu'elles explosent ?", "securitycraft.configuration.allowAdminTool": "Autoriser l'Outil Administrateur", "securitycraft.configuration.allowAdminTool.tooltip": "L'Outil Administrateur peut-il être utilisé ?", "securitycraft.configuration.allowBlockClaim": "Autoriser l'appropriation des blocs", diff --git a/src/main/resources/assets/securitycraft/lang/fr_fr.json b/src/main/resources/assets/securitycraft/lang/fr_fr.json index f7d586dc6f..15f8eee96e 100644 --- a/src/main/resources/assets/securitycraft/lang/fr_fr.json +++ b/src/main/resources/assets/securitycraft/lang/fr_fr.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Combien de secondes avant que le même joueur ne soit à nouveau enregistré.", "option.securitycraft.username_logger.searchRadius": "Rayon de recherche : %s", "option.securitycraft.username_logger.searchRadius.description": "La portée en blocs dans laquelle l'enregistreur de nom d'utilisateur recherche des joueurs.", - "securitycraft.configuration.ableToBreakMines": "Capacité de détruire les mines", - "securitycraft.configuration.ableToBreakMines.tooltip": "Les joueurs devraient-ils être capables de détruire les mines sans qu'elles explosent ?", "securitycraft.configuration.allowAdminTool": "Autoriser l'Outil Administrateur", "securitycraft.configuration.allowAdminTool.tooltip": "L'Outil Administrateur peut-il être utilisé ?", "securitycraft.configuration.allowBlockClaim": "Autoriser l'appropriation des blocs", diff --git a/src/main/resources/assets/securitycraft/lang/it_it.json b/src/main/resources/assets/securitycraft/lang/it_it.json index 4d8a5b22e2..0fe680c9a4 100644 --- a/src/main/resources/assets/securitycraft/lang/it_it.json +++ b/src/main/resources/assets/securitycraft/lang/it_it.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Quanti secondi devono passare prima che lo stesso giocatore possa accedere nuovamente.", "option.securitycraft.username_logger.searchRadius": "Raggio di ricerca: %s", "option.securitycraft.username_logger.searchRadius.description": "Il raggio in blocchi nel quale l'Autenticatore per nome utente cerca i giocatori.", - "securitycraft.configuration.ableToBreakMines": "In grado di rompere le Mine", - "securitycraft.configuration.ableToBreakMines.tooltip": "I giocatori devono essere in grado di rompere una Mina senza che esploda?", "securitycraft.configuration.allowAdminTool": "Consenti Dispositivo dell'amministratore", "securitycraft.configuration.allowAdminTool.tooltip": "Il Dispositivo dell'amministratore può essere utilizzato?", "securitycraft.configuration.allowBlockClaim": "Consenti richiesta del blocco", diff --git a/src/main/resources/assets/securitycraft/lang/ja_jp.json b/src/main/resources/assets/securitycraft/lang/ja_jp.json index c235dd300d..d0fb861fdc 100644 --- a/src/main/resources/assets/securitycraft/lang/ja_jp.json +++ b/src/main/resources/assets/securitycraft/lang/ja_jp.json @@ -1381,8 +1381,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "同じプレイヤーを記録できるようになるまで何秒経過する必要があるか。", "option.securitycraft.username_logger.searchRadius": "検索範囲: %s", "option.securitycraft.username_logger.searchRadius.description": "ユーザー名記録装置がプレイヤーを検索するブロックの範囲です。", - "securitycraft.configuration.ableToBreakMines": "地雷の破壊許可", - "securitycraft.configuration.ableToBreakMines.tooltip": "プレイヤーは地雷を爆発させずに破壊できる必要があるか?", "securitycraft.configuration.allowAdminTool": "管理ツールの許可", "securitycraft.configuration.allowAdminTool.tooltip": "管理ツールを使用できるようにするか?", "securitycraft.configuration.allowBlockClaim": "ブロック要求の許可", diff --git a/src/main/resources/assets/securitycraft/lang/ru_ru.json b/src/main/resources/assets/securitycraft/lang/ru_ru.json index e9d887c74c..e5d0eeb775 100644 --- a/src/main/resources/assets/securitycraft/lang/ru_ru.json +++ b/src/main/resources/assets/securitycraft/lang/ru_ru.json @@ -1393,8 +1393,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "Сколько секунд должно пройти, прежде чем тот же игрок может быть снова записан.", "option.securitycraft.username_logger.searchRadius": "Радиус поиска: %s", "option.securitycraft.username_logger.searchRadius.description": "Диапазон в блоках, в котором регистратор имён пользователей ищет игроков.", - "securitycraft.configuration.ableToBreakMines": "Можно разрушать мины", - "securitycraft.configuration.ableToBreakMines.tooltip": "Должны ли игроки иметь возможность разрушать мины без их взрыва?", "securitycraft.configuration.allowAdminTool": "Разрешить административный инструмент", "securitycraft.configuration.allowAdminTool.tooltip": "Можно ли использовать административный инструмент?", "securitycraft.configuration.allowBlockClaim": "Разрешить присвоение блоков", diff --git a/src/main/resources/assets/securitycraft/lang/zh_cn.json b/src/main/resources/assets/securitycraft/lang/zh_cn.json index 9ea4c93e2d..1798cab32b 100644 --- a/src/main/resources/assets/securitycraft/lang/zh_cn.json +++ b/src/main/resources/assets/securitycraft/lang/zh_cn.json @@ -1382,8 +1382,6 @@ "option.securitycraft.username_logger.repeatedLogInterval.description": "同一名玩家被再次记录的间隔是多少秒。", "option.securitycraft.username_logger.searchRadius": "搜索范围:%s", "option.securitycraft.username_logger.searchRadius.description": "用户名记录器搜索玩家的范围。", - "securitycraft.configuration.ableToBreakMines": "允许破坏地雷", - "securitycraft.configuration.ableToBreakMines.tooltip": "玩家是否能在不引爆地雷的情况下破坏它?", "securitycraft.configuration.allowAdminTool": "允许管理员工具", "securitycraft.configuration.allowAdminTool.tooltip": "是否能使用管理员工具?", "securitycraft.configuration.allowBlockClaim": "允许方块认领", diff --git a/src/main/resources/securitycraft.mixins.json b/src/main/resources/securitycraft.mixins.json index 00fc2c4052..8a5ecaaa9e 100644 --- a/src/main/resources/securitycraft.mixins.json +++ b/src/main/resources/securitycraft.mixins.json @@ -10,6 +10,8 @@ "camera.MinecraftMixin", "camera.RenderTargetMixin", "camera.ViewAreaMixin", + "cobweb.ShearsItemMixin", + "cobweb.ToolMaterialMixin", "f3.BetterF3TargetModuleMixin", "f3.DebugScreenOverlayMixin", "taser.ItemInHandRendererMixin"