diff --git a/build.gradle b/build.gradle index f0337cc3..c1b0ff7c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { repositories { - maven { url = 'https://files.minecraftforge.net/maven' } mavenCentral() + maven { url = 'https://files.minecraftforge.net/maven' } // using it after central because they messed up their repo } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true @@ -208,15 +208,17 @@ repositories { mavenCentral() } +def kotlinCompilerArgs = ["-Xopt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"] + compileKotlin { kotlinOptions { jvmTarget = "1.8" - freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" + freeCompilerArgs += kotlinCompilerArgs } } compileTestKotlin { kotlinOptions { jvmTarget = "1.8" - freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" + freeCompilerArgs += kotlinCompilerArgs } } diff --git a/gradle.properties b/gradle.properties index 783a8f69..0da78ac2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,6 +5,6 @@ org.gradle.daemon=false #versions mod_version=0.0.9.0 -kotlin_version=1.5.21 +kotlin_version=1.5.30 jei_version=7.7.0.106 mekanism_version=1.16.5-10.0.21.448 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c0..7454180f 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 69a97150..ffed3a25 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0c..744e882e 100644 --- a/gradlew +++ b/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 0c2dbb91..be566298 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -31,6 +31,7 @@ a08131d5adad743d41ea1cb1e1efe8f319bd7b78 assets/nucleartech/blockstates/electric f3ac61a3591b0e0dac668da571bfcda6565518d0 assets/nucleartech/blockstates/empty_oil_deposit.json bf4215f4f53ea4df0e094adf0ebdb331e194dc2d assets/nucleartech/blockstates/euphemium_block.json aa0e660642015dd5e5398a26a3ac86c5c7d34a92 assets/nucleartech/blockstates/euphemium_etched_schrabidium_cluster.json +76960664a00a0bc8d146387a6c8a74ff69f6f7ab assets/nucleartech/blockstates/fat_man.json c088298e8bf8dd4f627f3875a0643fba1828f8eb assets/nucleartech/blockstates/fiberglass_roll.json a1c973c0299e9afe68475fff8d1289101fbb3545 assets/nucleartech/blockstates/fluorite_block.json fd3a7411d06df26cf41ffbd2984c3505441b90a3 assets/nucleartech/blockstates/fluorite_ore.json @@ -129,8 +130,8 @@ cf823fc37b3f7fea4477f1010e89dc003f2b0764 assets/nucleartech/blockstates/verticiu 45737a9c5d55efa9b7834884a8b610d3c61ba78c assets/nucleartech/blockstates/weidite.json 45681ebcd66da9efdd451884813aef648d9998c1 assets/nucleartech/blockstates/white_phosphorus_block.json 41d908233d6a93047326258119c71d872d88c70d assets/nucleartech/blockstates/yellowcake_block.json -df1167d7973539a9764139980ffd09c6bf3e7d9d assets/nucleartech/lang/de_de.json -4cd0a0b2af2ec92363a0ae9aa0d82af85d70e7a5 assets/nucleartech/lang/en_us.json +96e5f798626e6f44fa2bf357c52e71c0d009abd5 assets/nucleartech/lang/de_de.json +bbc74acb0ca585d87194d7c42f49aae508f6e781 assets/nucleartech/lang/en_us.json b6330cd14c2cba9d5591c5db226d1aa48ee867b3 assets/nucleartech/models/block/advanced_alloy_block.json de0fad3f64c56a99681cc6675e6df379b086a40f assets/nucleartech/models/block/aluminium_block.json 6e8f32206076d9fc6718ca53ac1b48271e905c85 assets/nucleartech/models/block/aluminium_deco_block.json @@ -168,6 +169,7 @@ af008481461fbc408d3ebbf7a5ecf2708663d89b assets/nucleartech/models/block/electri 6eb17f1c0aaa7061b9ad1ed5465adbdf8aa858de assets/nucleartech/models/block/empty_oil_deposit.json 6937464a0b225447ddb0eb4ef2dfba08c38b56ab assets/nucleartech/models/block/euphemium_block.json 31703697395287eedb63e1bfb6a07d21a0b002de assets/nucleartech/models/block/euphemium_etched_schrabidium_cluster.json +ab9a12169edeae956ceb125e97c81041f930120a assets/nucleartech/models/block/fat_man.json 72e1a7df886dc06290061dee0f226fb88c72745b assets/nucleartech/models/block/fiberglass_roll.json ed2b9023f20b0e4ed2d982f150c5de9a035d04be assets/nucleartech/models/block/fiberglass_roll_horizontal.json e840ad00a8fa55ec4e841448bb94ebedea174030 assets/nucleartech/models/block/fluorite_block.json @@ -328,10 +330,12 @@ fe8f5e214dee285316ad1bb31da40d0c92ce0bd6 assets/nucleartech/models/item/blank_ru 06548d229b8f75b44a75c9edfeba35c55eacf72c assets/nucleartech/models/item/blast_furnace.json 778aee262230f2b62b505e3874a7925c146ccb2d assets/nucleartech/models/item/blazing_sellafite.json 039cf90a7a8078f0486777b7ffeba3b84fcfc267 assets/nucleartech/models/item/boiling_sellafite.json +5578b6b69ea580651630c4dfc58f55a5206a051a assets/nucleartech/models/item/bomb_igniter.json 4196bcd180617521ea3bdffb2feea9f2feaa73ac assets/nucleartech/models/item/breeding_reactor_core.json 94972a10975c0a743ebf684d83be1e8d7d74b381 assets/nucleartech/models/item/brightblende_ore.json f718e49e82555b08e2ffdeb00cea519816f3786f assets/nucleartech/models/item/buckshot_casing.json 2d8938f283e8e1f9254f3f712272b9702747c2ba assets/nucleartech/models/item/buckshot_primer.json +54201cfbdb7117f5a7a03a90d98e5a0823f4bba4 assets/nucleartech/models/item/bundle_of_implosion_propellant.json 89ec7c5fc8f8a9d877131d2d236b54ac18f57ad3 assets/nucleartech/models/item/burned_out_quad_schrabidium_rod.json 43728e5f068e901861e6217476c501757cac5179 assets/nucleartech/models/item/burnt_bark.json 1f0d3e53593deb0869531f2d63abdb56a5edabf6 assets/nucleartech/models/item/cable_drum.json @@ -400,6 +404,7 @@ df1510f87e1a9cc1ab38bda0dc33f8ae1f536ade assets/nucleartech/models/item/desh_mix a396ecb73fdc9fcce98f267b64d40e22d4b46c46 assets/nucleartech/models/item/desh_ready_mix.json 1a047b5afe1549a3a8d2e7203edf93f0848c0b53 assets/nucleartech/models/item/desh_reinforced_block.json 2e859670f3397a145d6858309a25dad84a887ca6 assets/nucleartech/models/item/desh_shredder_blade.json +204be351d352d360b671635e45a3d2b62190434f assets/nucleartech/models/item/detonator.json 9a21c4e4a2e8ae02234ae96fb19fadde01b26706 assets/nucleartech/models/item/diamond_crystals.json 63f4f782bfa463938f5c0a05ec69ccf4f5dc39f9 assets/nucleartech/models/item/diamond_powder.json 7b334bce2671b5599c6f72dfe3224c0399e3caa4 assets/nucleartech/models/item/dineutronium_compound_plate.json @@ -433,6 +438,8 @@ b46bde6065483d98fa7ddf2d390dd1036cce0034 assets/nucleartech/models/item/euphemiu 99f584410aa5b4e1a5c8ef360071cfe17f1a2ffb assets/nucleartech/models/item/exothermic_distribution_unit.json af6e83536cf00b30be67a904c99e70a8990f425f assets/nucleartech/models/item/exothermic_warhead.json 0b75b78502d950336911dadc598edda291055434 assets/nucleartech/models/item/explosive_pellets.json +54246777708cc35cc926b7ada3cf7c80453d4c63 assets/nucleartech/models/item/fat_man.json +e8a61d46ea9dba79c3a9adf444bbc26ecbf098e7 assets/nucleartech/models/item/fat_man_kit.json 69ba4e4d4c303afac5c04198c05ff6de671174f5 assets/nucleartech/models/item/fiberglass_roll.json 6fa78279b82534782377d931ca369006d87b08c3 assets/nucleartech/models/item/fiberglass_sheet.json 24c544998042136ac84888cf1bff0e5a24d27583 assets/nucleartech/models/item/fire_proximity_cloth.json @@ -619,6 +626,7 @@ b497578af2fbbd8f94dd227b05cb1a5d3efe2e56 assets/nucleartech/models/item/overcloc 373473d5ccf98c8f599bf8d29fb01134d57a97de assets/nucleartech/models/item/painting_of_a_cartoon_pony.json 6fd6f6661e2018dc75b147f102c80768cae6a6ab assets/nucleartech/models/item/photovoltaic_panel.json f3e548c3976ea0bfea7c10cc668318e6db57ce68 assets/nucleartech/models/item/plutonium_block.json +def065b1f915dd2ed73144d6d343bc57cdfccb1d assets/nucleartech/models/item/plutonium_core.json 1e54c8a2ae47c8f04d8c9ad37d1a0b13607a9fad assets/nucleartech/models/item/plutonium_crystals.json c9becdc5bc3b98f962fd6d766bb529bea54bcffd assets/nucleartech/models/item/plutonium_fuel_block.json 8cc45867fd6a4ae10fd857b7aa2739221e26c86a assets/nucleartech/models/item/plutonium_fuel_ingot.json @@ -806,6 +814,7 @@ b42f09fd2f2cc328345d00c2ffa6e987ba24e777 assets/nucleartech/models/item/super_co 933a39006be33a61f987d2d60d93aaeef3bb27b8 assets/nucleartech/models/item/super_conducting_ring_coil.json af2d4f5f10eb744072769eec8faa017ceda75f5e assets/nucleartech/models/item/super_conductor.json 41e168da8ea507da65cbe7456b02c8d0c9361cbd assets/nucleartech/models/item/telepad.json +610eea94ece3fc77a7eaab87e5a53717b8af27a7 assets/nucleartech/models/item/template_bomb_kit.json c8ea62022533bb15101abe8718d9336e21bd401d assets/nucleartech/models/item/th232_ingot.json ffbf27502b09c300802630b5e06c20a72f8e868f assets/nucleartech/models/item/th232_nugget.json 72ede9447a9f5691bfd0cb4c6b79b23ce6b8242f assets/nucleartech/models/item/thermal_distribution_unit.json @@ -898,7 +907,7 @@ a59deb2f75ece8ed3958dee1eb6484e9f01b7509 assets/nucleartech/models/item/white_ph 1aa1bec328c4d2d723b87f8edb9e65e2fd64459d assets/nucleartech/models/item/xenium_resonator.json 0f3a6ef6ec5a6bc6247d27c2b09d15ea2bc32370 assets/nucleartech/models/item/yellowcake.json bc083b15152cb3433715b8d1f69c7828ab877749 assets/nucleartech/models/item/yellowcake_block.json -1ec8b58c6666d6cba20fee258744260e19f5343d assets/nucleartech/sounds.json +46be99baf7f5e667fbde5067bad43817a83df3cc assets/nucleartech/sounds.json 5dc5ca1f2f1e5ebe9034ceeb686a220c541a4780 data/forge/tags/blocks/ores.json 524fddf0594328eb44daa9be7631d4e9e0ae542c data/forge/tags/blocks/ores/aluminium.json 22f9322b273933c23b23b09732b099925105b025 data/forge/tags/blocks/ores/asbestos.json @@ -1499,6 +1508,7 @@ bcbcc5ddee4f00b12d3ba9bded9e13665e1cff71 data/nucleartech/loot_tables/blocks/ele dde60520a7e0d62f590455585bf7e1326f63693f data/nucleartech/loot_tables/blocks/empty_oil_deposit.json fcce36beb537e70b597a35197ad122b619d3630f data/nucleartech/loot_tables/blocks/euphemium_block.json 688d94da37289dc5ebbee41d4b9314ee2a327a9b data/nucleartech/loot_tables/blocks/euphemium_etched_schrabidium_cluster.json +7730346d6b8f38c4f43dcf94930fbe694be44182 data/nucleartech/loot_tables/blocks/fat_man.json fbb3928b71ad4f970ffcf1b7644ce34dfcb3c23d data/nucleartech/loot_tables/blocks/fiberglass_roll.json ceefa3cae796288747af4dd45391386fa812d566 data/nucleartech/loot_tables/blocks/fluorite_block.json 7716116a54fe52e8ceac1de7147b771c9fa7822c data/nucleartech/loot_tables/blocks/fluorite_ore.json diff --git a/src/generated/resources/assets/nucleartech/blockstates/fat_man.json b/src/generated/resources/assets/nucleartech/blockstates/fat_man.json new file mode 100644 index 00000000..16bf20a2 --- /dev/null +++ b/src/generated/resources/assets/nucleartech/blockstates/fat_man.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "nucleartech:block/fat_man" + }, + "facing=south": { + "model": "nucleartech:block/fat_man", + "y": 180 + }, + "facing=west": { + "model": "nucleartech:block/fat_man", + "y": 270 + }, + "facing=east": { + "model": "nucleartech:block/fat_man", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/lang/de_de.json b/src/generated/resources/assets/nucleartech/lang/de_de.json index 5b297d95..403b6efc 100644 --- a/src/generated/resources/assets/nucleartech/lang/de_de.json +++ b/src/generated/resources/assets/nucleartech/lang/de_de.json @@ -36,6 +36,7 @@ "block.nucleartech.empty_oil_deposit": "Leeres \u00D6lvorkommen", "block.nucleartech.euphemium_block": "Euphemiumblock", "block.nucleartech.euphemium_etched_schrabidium_cluster": "Euphemiumge\u00E4tzter Schrabidium-Cluster", + "block.nucleartech.fat_man": "Fat Man", "block.nucleartech.fiberglass_roll": "Fiberglasrolle", "block.nucleartech.fluorite_block": "Fluoritblock", "block.nucleartech.fluorite_ore": "Fluoriterz", @@ -140,6 +141,7 @@ "container.nucleartech.blast_furnace": "Hochofen", "container.nucleartech.combustion_generator": "Verbrennungsgenerator", "container.nucleartech.electric_furnace": "Elektrischer Ofen", + "container.nucleartech.fat_man": "Fat Man", "container.nucleartech.safe": "Panzerschrank", "container.nucleartech.shredder": "Brecher", "container.nucleartech.siren": "Sirene", @@ -154,7 +156,7 @@ "creative_nuclear_explosion_spawner.nucleartech.position": "Position", "creative_nuclear_explosion_spawner.nucleartech.start": "Starten", "creative_nuclear_explosion_spawner.nucleartech.strength": "St\u00E4rke", - "death.attack.nucleartech.nuclear_blast": "%1$s wurde von einer Atomexplosion weggeblasen", + "death.attack.nucleartech.nuclearBlast": "%1$s wurde von einer Atomexplosion weggeblasen", "death.attack.nucleartech.radiation": "%1$s starb an Strahlenvergiftung", "energy.nucleartech": "Energie", "entity.nucleartech.fallout_rain_entity": "Fallout-Regen", @@ -215,9 +217,13 @@ "item.nucleartech.big_titanium_shell": "Gro\u00DFe Titanh\u00FClle", "item.nucleartech.biomass": "Biomasse", "item.nucleartech.blank_rune": "Blanke Katalysatormatrix", + "item.nucleartech.bomb_igniter": "Z\u00FCnder", + "item.nucleartech.bomb_igniter.desc": "Wird gebraucht f\u00FCr Fat Man", "item.nucleartech.breeding_reactor_core": "Brutreaktorkern", "item.nucleartech.buckshot_casing": "Schroth\u00FClse (x8)", "item.nucleartech.buckshot_primer": "Schrotz\u00FCndh\u00FCtchen (x8)", + "item.nucleartech.bundle_of_implosion_propellant": "Implosions-Treibladung", + "item.nucleartech.bundle_of_implosion_propellant.desc": "Wird gebraucht f\u00FCr:\nFat Man\nIvy Mike\nTsar Bombe", "item.nucleartech.burned_out_quad_schrabidium_rod": "Ausgebrannter Schrabidiumvierfachbrennstab", "item.nucleartech.burned_out_quad_schrabidium_rod.desc": "Ein Vierfachbrennstab der eine kleine Menge\neines seltsamen neuen Elements beinhaltet.", "item.nucleartech.burnt_bark": "Verbrannte Rinde", @@ -282,6 +288,18 @@ "item.nucleartech.desh_powder": "Deshpulver", "item.nucleartech.desh_ready_mix": "DeshReady\u2122-Mischung", "item.nucleartech.desh_shredder_blade": "Deshs\u00E4geblatt", + "item.nucleartech.detonator": "Fernz\u00FCnder", + "item.nucleartech.detonator.desc": "Shift-Rechtsklick auf einen Sprengstoff um die Position zu setzen,\nRechtsklick um zu sprengen!", + "item.nucleartech.detonator.detonation_successful": "Sprengung!", + "item.nucleartech.detonator.error_detonation_prohibited": "Die Sprengung wurde aufgehalten!", + "item.nucleartech.detonator.error_invalid_tile_entity": "Serverfehler: Die TileEntity des Ziels ist ung\u00FCltig!", + "item.nucleartech.detonator.error_missing_components": "Der Sprengstoff ist unvollst\u00E4ndig!", + "item.nucleartech.detonator.error_not_explosive": "Das Ziel ist kein g\u00FCltiger Sprengstoff!", + "item.nucleartech.detonator.error_position_not_loaded": "Das Ziel ist momentan nicht in der Welt geladen!", + "item.nucleartech.detonator.error_position_not_set": "Die Position wurde noch nicht gesetzt!", + "item.nucleartech.detonator.error_unknown": "Ein unbekannter Fehler ist w\u00E4hrend der Sprengung aufgetreten", + "item.nucleartech.detonator.position_set": "Position gesetzt!", + "item.nucleartech.detonator.tooltip_no_position_set": "Keine Position gesetzt!", "item.nucleartech.diamond_crystals": "Diamantkristalle", "item.nucleartech.diamond_powder": "Diamantpulver", "item.nucleartech.dineutronium_compound_plate": "Dineutroniumverbundplatte", @@ -315,6 +333,7 @@ "item.nucleartech.exothermic_warhead": "Exothermischer Sprengkopf", "item.nucleartech.explosive_pellets": "Explosive Pellets", "item.nucleartech.explosive_pellets.desc": "Wird in Mehrzweckbomben verwendet:\nF\u00FCr ein wenig extra Boom!", + "item.nucleartech.fat_man_kit": "Fat Man Kit", "item.nucleartech.fiberglass_sheet": "Fiberglasbogen", "item.nucleartech.fiberglass_sheet.desc": "Reich an \"Ballaststoffen\", reich an Glas. Alles was der K\u00F6rper braucht.", "item.nucleartech.fire_proximity_cloth": "Hitzeschutzanzugsstoff", @@ -470,6 +489,8 @@ "item.nucleartech.painting_of_a_cartoon_pony": "Bild eines Cartoon Ponys", "item.nucleartech.painting_of_a_cartoon_pony.desc": "Gelbes Pferd schl\u00E4gt blaues Pferd, das ist eine erwiesene Tatsache!", "item.nucleartech.photovoltaic_panel": "Photovoltaikpanele", + "item.nucleartech.plutonium_core": "Plutoniumkern", + "item.nucleartech.plutonium_core.desc": "Wird gebraucht f\u00FCr:\nFat Man\nIvy Mike\nTsar Bombe", "item.nucleartech.plutonium_crystals": "Plutoniumkristalle", "item.nucleartech.plutonium_fuel_ingot": "Plutoniumkernbrennstoffbarren", "item.nucleartech.plutonium_fuel_nugget": "Plutoniumkernbrennstoffklumpen", @@ -704,6 +725,7 @@ "item.nucleartech.xenium_resonator": "Xeniumresonator", "item.nucleartech.yellowcake": "Yellowcake", "itemGroup.nucleartech_blocks": "NTM Erze und Bl\u00F6cke", + "itemGroup.nucleartech_bombs": "NTM Bomben", "itemGroup.nucleartech_consumables": "NTM Verbrauchsg\u00FCter", "itemGroup.nucleartech_items": "NTM Maschinenitems", "itemGroup.nucleartech_machines": "NTM Maschinen", @@ -718,6 +740,8 @@ "jei.nucleartech.category.template_folder_results": "Vorlagen-Zeichenmappe", "subtitle.nucleartech.press.operate": "Presse stampft", "subtitle.nucleartech.random.bleep": "Ger\u00E4t piepst", + "subtitle.nucleartech.random.boop": "Ger\u00E4t boopt", + "subtitle.nucleartech.random.unpack": "Gegenstand ausgepackt", "subtitle.nucleartech.siren.air_raid": "Sirene l\u00E4uft: Air Raid Siren", "subtitle.nucleartech.siren.ams": "Sirene l\u00E4uft: AMS Siren", "subtitle.nucleartech.siren.apc": "Sirene l\u00E4uft: APC Siren", diff --git a/src/generated/resources/assets/nucleartech/lang/en_us.json b/src/generated/resources/assets/nucleartech/lang/en_us.json index cefe0cc5..15884c5f 100644 --- a/src/generated/resources/assets/nucleartech/lang/en_us.json +++ b/src/generated/resources/assets/nucleartech/lang/en_us.json @@ -36,6 +36,7 @@ "block.nucleartech.empty_oil_deposit": "Empty Oil Deposit", "block.nucleartech.euphemium_block": "Block of Euphemium", "block.nucleartech.euphemium_etched_schrabidium_cluster": "Euphemium Etched Schrabidium Cluster", + "block.nucleartech.fat_man": "Fat Man", "block.nucleartech.fiberglass_roll": "Fiberglass Roll", "block.nucleartech.fluorite_block": "Block of Fluorite", "block.nucleartech.fluorite_ore": "Fluorite Ore", @@ -140,6 +141,7 @@ "container.nucleartech.blast_furnace": "Blast Furnace", "container.nucleartech.combustion_generator": "Combustion Generator", "container.nucleartech.electric_furnace": "Electric Furnace", + "container.nucleartech.fat_man": "Fat Man", "container.nucleartech.safe": "Safe", "container.nucleartech.shredder": "Shredder", "container.nucleartech.siren": "Siren", @@ -154,7 +156,7 @@ "creative_nuclear_explosion_spawner.nucleartech.position": "Position", "creative_nuclear_explosion_spawner.nucleartech.start": "Start", "creative_nuclear_explosion_spawner.nucleartech.strength": "Strength", - "death.attack.nucleartech.nuclear_blast": "%1$s was blown away by a nuclear explosion", + "death.attack.nucleartech.nuclearBlast": "%1$s was blown away by a nuclear explosion", "death.attack.nucleartech.radiation": "%1$s died from radiation poisoning", "energy.nucleartech": "Energy", "entity.nucleartech.fallout_rain_entity": "Fallout Rain", @@ -215,9 +217,13 @@ "item.nucleartech.big_titanium_shell": "Big Titanium Shell", "item.nucleartech.biomass": "Biomass", "item.nucleartech.blank_rune": "Blank Catalyst Matrix", + "item.nucleartech.bomb_igniter": "Bomb Igniter", + "item.nucleartech.bomb_igniter.desc": "Used in Fat Man", "item.nucleartech.breeding_reactor_core": "Breeding Reactor Core", "item.nucleartech.buckshot_casing": "Buckshot Casing (x8)", "item.nucleartech.buckshot_primer": "Buckshot Primer (x8)", + "item.nucleartech.bundle_of_implosion_propellant": "Bundle of Implosion Propellant", + "item.nucleartech.bundle_of_implosion_propellant.desc": "Used in:\nFat Man\nIvy Mike\nTsar Bomba", "item.nucleartech.burned_out_quad_schrabidium_rod": "Burned Out Quad Schrabidium Rod", "item.nucleartech.burned_out_quad_schrabidium_rod.desc": "A quad fuel rod which contains a\nvery small amount of a strange new element.", "item.nucleartech.burnt_bark": "Burnt Bark", @@ -282,6 +288,18 @@ "item.nucleartech.desh_powder": "Desh Powder", "item.nucleartech.desh_ready_mix": "DeshReady\u2122 Mix", "item.nucleartech.desh_shredder_blade": "Desh Shredder Blade", + "item.nucleartech.detonator": "Detonator", + "item.nucleartech.detonator.desc": "Shift-right-click an explosive to set the position,\nright-click to detonate!", + "item.nucleartech.detonator.detonation_successful": "Detonated!", + "item.nucleartech.detonator.error_detonation_prohibited": "The detonation was prohibited!", + "item.nucleartech.detonator.error_invalid_tile_entity": "Server Error: The target's TileEntity is invalid!", + "item.nucleartech.detonator.error_missing_components": "The explosive is missing components!", + "item.nucleartech.detonator.error_not_explosive": "Target is not a valid explosive!", + "item.nucleartech.detonator.error_position_not_loaded": "Target is currently not loaded in the world!", + "item.nucleartech.detonator.error_position_not_set": "Position has not been set!", + "item.nucleartech.detonator.error_unknown": "An unknown error occurred during the detonation", + "item.nucleartech.detonator.position_set": "Position set!", + "item.nucleartech.detonator.tooltip_no_position_set": "No position set!", "item.nucleartech.diamond_crystals": "Diamond Crystals", "item.nucleartech.diamond_powder": "Diamond Powder", "item.nucleartech.dineutronium_compound_plate": "Dineutronium Compound Plate", @@ -315,6 +333,7 @@ "item.nucleartech.exothermic_warhead": "Exothermic Warhead", "item.nucleartech.explosive_pellets": "Explosive Pellets", "item.nucleartech.explosive_pellets.desc": "Used in multi purpose bombs:\nAdds some extra boom!", + "item.nucleartech.fat_man_kit": "Fat Man Kit", "item.nucleartech.fiberglass_sheet": "Fiberglass Sheet", "item.nucleartech.fiberglass_sheet.desc": "High in fiber, high in glass. Everything the body needs.", "item.nucleartech.fire_proximity_cloth": "Fire Proximity Cloth", @@ -470,6 +489,8 @@ "item.nucleartech.painting_of_a_cartoon_pony": "Painting of a Cartoon Pony", "item.nucleartech.painting_of_a_cartoon_pony.desc": "Yellow horse beats blue horse, that's a proven fact!", "item.nucleartech.photovoltaic_panel": "Photovoltaic Panel", + "item.nucleartech.plutonium_core": "Plutonium Core", + "item.nucleartech.plutonium_core.desc": "Used in:\nFat Man\nIvy Mike\nTsar Bomba", "item.nucleartech.plutonium_crystals": "Plutonium Crystals", "item.nucleartech.plutonium_fuel_ingot": "Plutonium Fuel Ingot", "item.nucleartech.plutonium_fuel_nugget": "Plutonium Fuel Nugget", @@ -704,6 +725,7 @@ "item.nucleartech.xenium_resonator": "Xenium Resonator", "item.nucleartech.yellowcake": "Yellowcake", "itemGroup.nucleartech_blocks": "NTM Ores and Blocks", + "itemGroup.nucleartech_bombs": "NTM Bombs", "itemGroup.nucleartech_consumables": "NTM Consumables and Gear", "itemGroup.nucleartech_items": "NTM Machine Items and Fuel", "itemGroup.nucleartech_machines": "NTM Machines", @@ -718,6 +740,8 @@ "jei.nucleartech.category.template_folder_results": "Template Folder", "subtitle.nucleartech.press.operate": "Press stamps", "subtitle.nucleartech.random.bleep": "Device bleeps", + "subtitle.nucleartech.random.boop": "Device boops", + "subtitle.nucleartech.random.unpack": "Item unpacked", "subtitle.nucleartech.siren.air_raid": "Siren running: Air Raid Siren", "subtitle.nucleartech.siren.ams": "Siren running: AMS Siren", "subtitle.nucleartech.siren.apc": "Siren running: APC Siren", diff --git a/src/generated/resources/assets/nucleartech/models/block/fat_man.json b/src/generated/resources/assets/nucleartech/models/block/fat_man.json new file mode 100644 index 00000000..14fa1d04 --- /dev/null +++ b/src/generated/resources/assets/nucleartech/models/block/fat_man.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "display": { + "gui": { + "rotation": [ + 30, + 225, + 0 + ], + "translation": [ + 2.5, + -3, + 0 + ], + "scale": [ + 0.34, + 0.34, + 0.34 + ] + }, + "fixed": { + "rotation": [ + 0, + 90, + 0 + ], + "translation": [ + 0, + -2, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + } + }, + "textures": { + "fat_man_texture": "nucleartech:block/fat_man", + "particle": "nucleartech:block/fat_man" + }, + "loader": "forge:obj", + "model": "nucleartech:models/block/fat_man/fat_man.obj", + "detectCullableFaces": false, + "flip-v": true +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/models/item/bomb_igniter.json b/src/generated/resources/assets/nucleartech/models/item/bomb_igniter.json new file mode 100644 index 00000000..26b08133 --- /dev/null +++ b/src/generated/resources/assets/nucleartech/models/item/bomb_igniter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "nucleartech:item/bomb_igniter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/models/item/bundle_of_implosion_propellant.json b/src/generated/resources/assets/nucleartech/models/item/bundle_of_implosion_propellant.json new file mode 100644 index 00000000..d456964d --- /dev/null +++ b/src/generated/resources/assets/nucleartech/models/item/bundle_of_implosion_propellant.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "nucleartech:item/bundle_of_implosion_propellant" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/models/item/detonator.json b/src/generated/resources/assets/nucleartech/models/item/detonator.json new file mode 100644 index 00000000..f16f7b96 --- /dev/null +++ b/src/generated/resources/assets/nucleartech/models/item/detonator.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "nucleartech:item/detonator" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/models/item/fat_man.json b/src/generated/resources/assets/nucleartech/models/item/fat_man.json new file mode 100644 index 00000000..20529824 --- /dev/null +++ b/src/generated/resources/assets/nucleartech/models/item/fat_man.json @@ -0,0 +1,3 @@ +{ + "parent": "nucleartech:block/fat_man" +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/models/item/fat_man_kit.json b/src/generated/resources/assets/nucleartech/models/item/fat_man_kit.json new file mode 100644 index 00000000..2ee83cbe --- /dev/null +++ b/src/generated/resources/assets/nucleartech/models/item/fat_man_kit.json @@ -0,0 +1,3 @@ +{ + "parent": "nucleartech:item/template_bomb_kit" +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/models/item/plutonium_core.json b/src/generated/resources/assets/nucleartech/models/item/plutonium_core.json new file mode 100644 index 00000000..d21d8730 --- /dev/null +++ b/src/generated/resources/assets/nucleartech/models/item/plutonium_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "nucleartech:item/plutonium_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/models/item/template_bomb_kit.json b/src/generated/resources/assets/nucleartech/models/item/template_bomb_kit.json new file mode 100644 index 00000000..bfbb6207 --- /dev/null +++ b/src/generated/resources/assets/nucleartech/models/item/template_bomb_kit.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "nucleartech:item/bomb_kit", + "layer1": "nucleartech:item/bomb_kit_overlay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/nucleartech/sounds.json b/src/generated/resources/assets/nucleartech/sounds.json index 080a085b..4eca672f 100644 --- a/src/generated/resources/assets/nucleartech/sounds.json +++ b/src/generated/resources/assets/nucleartech/sounds.json @@ -192,5 +192,18 @@ "sounds": [ "nucleartech:random/bleep" ] + }, + "random.boop": { + "subtitle": "subtitle.nucleartech.random.boop", + "sounds": [ + "nucleartech:random/boop" + ] + }, + "random.unpack": { + "subtitle": "subtitle.nucleartech.random.unpack", + "sounds": [ + "nucleartech:random/unpack1", + "nucleartech:random/unpack2" + ] } } \ No newline at end of file diff --git a/src/generated/resources/data/nucleartech/loot_tables/blocks/fat_man.json b/src/generated/resources/data/nucleartech/loot_tables/blocks/fat_man.json new file mode 100644 index 00000000..f97fa980 --- /dev/null +++ b/src/generated/resources/data/nucleartech/loot_tables/blocks/fat_man.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "nucleartech:fat_man" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/ClientRegistries.kt b/src/main/kotlin/at/martinthedragon/nucleartech/ClientRegistries.kt index fb0e882a..203bd3df 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/ClientRegistries.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/ClientRegistries.kt @@ -5,6 +5,7 @@ import at.martinthedragon.nucleartech.entities.EntityTypes import at.martinthedragon.nucleartech.entities.renderers.FalloutRainRenderer import at.martinthedragon.nucleartech.entities.renderers.NuclearCreeperRenderer import at.martinthedragon.nucleartech.entities.renderers.NukeExplosionRenderer +import at.martinthedragon.nucleartech.items.BombKitItem import at.martinthedragon.nucleartech.items.NuclearSpawnEggItem import at.martinthedragon.nucleartech.screens.* import at.martinthedragon.nucleartech.tileentities.TileEntityTypes @@ -47,6 +48,8 @@ object ClientRegistries { ScreenManager.register(ContainerTypes.combustionGeneratorContainer.get(), ::CombustionGeneratorScreen) ScreenManager.register(ContainerTypes.electricFurnaceContainer.get(), ::ElectricFurnaceScreen) ScreenManager.register(ContainerTypes.shredderContainer.get(), ::ShredderScreen) + + ScreenManager.register(ContainerTypes.fatManContainer.get(), ::FatManScreen) } @SubscribeEvent @JvmStatic @@ -83,8 +86,11 @@ object ClientRegistries { fun registerColors(event: ColorHandlerEvent) { if (event is ColorHandlerEvent.Item) { val itemColors = event.itemColors + for (bombKit in BombKitItem.allKits) { + itemColors.register({ _, layer -> if (layer == 0) -1 else bombKit.color }, bombKit) + } for (spawnEgg in NuclearSpawnEggItem.resolvedMap.values) { - itemColors.register({ _, color -> spawnEgg.getColor(color) }, spawnEgg) + itemColors.register({ _, layer -> spawnEgg.getColor(layer) }, spawnEgg) } } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/CreativeTabs.kt b/src/main/kotlin/at/martinthedragon/nucleartech/CreativeTabs.kt index 9e9fd54d..187c116e 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/CreativeTabs.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/CreativeTabs.kt @@ -3,6 +3,7 @@ package at.martinthedragon.nucleartech import net.minecraft.item.Item import net.minecraft.item.ItemGroup import net.minecraft.item.ItemStack +import net.minecraft.util.ResourceLocation import java.util.function.Supplier enum class CreativeTabs(val itemGroup: ItemGroup) { @@ -11,6 +12,7 @@ enum class CreativeTabs(val itemGroup: ItemGroup) { Templates(createItemGroup("templates", ModItems.machineTemplateFolder)), Blocks(createItemGroup("blocks", ModBlockItems.uraniumOre)), Machines(createItemGroup("machines", ModBlockItems.safe)), // TODO + Bombs(createItemGroup("bombs", ModBlockItems.fatMan).setBackgroundImage(ResourceLocation(NuclearTech.MODID, "textures/gui/creative_inventory/tab_nuke.png"))), Consumables(createItemGroup("consumables", ModItems.oilDetector)), Miscellaneous(createItemGroup("miscellaneous", ModItems.nuclearCreeperSpawnEgg)) } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/DamageSources.kt b/src/main/kotlin/at/martinthedragon/nucleartech/DamageSources.kt index 88bbccea..1d1e6e9a 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/DamageSources.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/DamageSources.kt @@ -4,5 +4,5 @@ import net.minecraft.util.DamageSource object DamageSources { val radiation: DamageSource = DamageSource("${NuclearTech.MODID}.radiation").bypassArmor() - val nuclearBlast: DamageSource = DamageSource("${NuclearTech.MODID}.nuclear_blast").setExplosion() + val nuclearBlast: DamageSource = DamageSource("${NuclearTech.MODID}.nuclearBlast").setExplosion() } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/ModBlockItems.kt b/src/main/kotlin/at/martinthedragon/nucleartech/ModBlockItems.kt index 836980f5..6418b4ff 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/ModBlockItems.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/ModBlockItems.kt @@ -11,143 +11,147 @@ import net.minecraftforge.fml.RegistryObject @Suppress("unused") object ModBlockItems { - val uraniumOre: RegistryObject = ITEMS.register("uranium_ore") { BlockItem(ModBlocks.uraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val scorchedUraniumOre: RegistryObject = ITEMS.register("scorched_uranium_ore") { BlockItem(ModBlocks.scorchedUraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val thoriumOre: RegistryObject = ITEMS.register("thorium_ore") { BlockItem(ModBlocks.thoriumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val titaniumOre: RegistryObject = ITEMS.register("titanium_ore") { BlockItem(ModBlocks.titaniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val sulfurOre: RegistryObject = ITEMS.register("sulfur_ore") { BlockItem(ModBlocks.sulfurOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val niterOre: RegistryObject = ITEMS.register("niter_ore") { BlockItem(ModBlocks.niterOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val copperOre: RegistryObject = ITEMS.register("copper_ore") { BlockItem(ModBlocks.copperOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val tungstenOre: RegistryObject = ITEMS.register("tungsten_ore") { BlockItem(ModBlocks.tungstenOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val aluminiumOre: RegistryObject = ITEMS.register("aluminium_ore") { BlockItem(ModBlocks.aluminiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val fluoriteOre: RegistryObject = ITEMS.register("fluorite_ore") { BlockItem(ModBlocks.fluoriteOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val berylliumOre: RegistryObject = ITEMS.register("beryllium_ore") { BlockItem(ModBlocks.berylliumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val leadOre: RegistryObject = ITEMS.register("lead_ore") { BlockItem(ModBlocks.leadOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val oilDeposit: RegistryObject = ITEMS.register("oil_deposit") { AutoTooltippedBlockItem(ModBlocks.oilDeposit.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val emptyOilDeposit: RegistryObject = ITEMS.register("empty_oil_deposit") { BlockItem(ModBlocks.emptyOilDeposit.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val oilSand: RegistryObject = ITEMS.register("oil_sand") { BlockItem(ModBlocks.oilSand.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val ligniteOre: RegistryObject = ITEMS.register("lignite_ore") { BlockItem(ModBlocks.ligniteOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val asbestosOre: RegistryObject = ITEMS.register("asbestos_ore") { BlockItem(ModBlocks.asbestosOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val schrabidiumOre: RegistryObject = ITEMS.register("schrabidium_ore") { BlockItem(ModBlocks.schrabidiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.RARE)) } - val australianOre: RegistryObject = ITEMS.register("australian_ore") { AutoTooltippedBlockItem(ModBlocks.australianOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.UNCOMMON)) } - val weidite: RegistryObject = ITEMS.register("weidite") { AutoTooltippedBlockItem(ModBlocks.weidite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.UNCOMMON)) } - val reiite: RegistryObject = ITEMS.register("reiite") { AutoTooltippedBlockItem(ModBlocks.reiite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.UNCOMMON)) } - val brightblendeOre: RegistryObject = ITEMS.register("brightblende_ore") { AutoTooltippedBlockItem(ModBlocks.brightblendeOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.UNCOMMON)) } - val dellite: RegistryObject = ITEMS.register("dellite") { AutoTooltippedBlockItem(ModBlocks.dellite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.UNCOMMON)) } - val dollarGreenMineral: RegistryObject = ITEMS.register("dollar_green_mineral") { AutoTooltippedBlockItem(ModBlocks.dollarGreenMineral.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.UNCOMMON)) } - val rareEarthOre: RegistryObject = ITEMS.register("rare_earth_ore") { BlockItem(ModBlocks.rareEarthOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.UNCOMMON)) } - val netherUraniumOre: RegistryObject = ITEMS.register("nether_uranium_ore") { BlockItem(ModBlocks.netherUraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val scorchedNetherUraniumOre: RegistryObject = ITEMS.register("scorched_nether_uranium_ore") { BlockItem(ModBlocks.scorchedNetherUraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val netherPlutoniumOre: RegistryObject = ITEMS.register("nether_plutonium_ore") { BlockItem(ModBlocks.netherPlutoniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val netherTungstenOre: RegistryObject = ITEMS.register("nether_tungsten_ore") { BlockItem(ModBlocks.netherTungstenOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val netherSulfurOre: RegistryObject = ITEMS.register("nether_sulfur_ore") { BlockItem(ModBlocks.netherSulfurOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val netherPhosphorusOre: RegistryObject = ITEMS.register("nether_phosphorus_ore") { BlockItem(ModBlocks.netherPhosphorusOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val netherSchrabidiumOre: RegistryObject = ITEMS.register("nether_schrabidium_ore") { BlockItem(ModBlocks.netherSchrabidiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup).rarity(Rarity.RARE)) } - val meteorUraniumOre: RegistryObject = ITEMS.register("meteor_uranium_ore") { BlockItem(ModBlocks.meteorUraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val meteorThoriumOre: RegistryObject = ITEMS.register("meteor_thorium_ore") { BlockItem(ModBlocks.meteorThoriumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val meteorTitaniumOre: RegistryObject = ITEMS.register("meteor_titanium_ore") { BlockItem(ModBlocks.meteorTitaniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val meteorSulfurOre: RegistryObject = ITEMS.register("meteor_sulfur_ore") { BlockItem(ModBlocks.meteorSulfurOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val meteorCopperOre: RegistryObject = ITEMS.register("meteor_copper_ore") { BlockItem(ModBlocks.meteorCopperOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val meteorTungstenOre: RegistryObject = ITEMS.register("meteor_tungsten_ore") { BlockItem(ModBlocks.meteorTungstenOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val meteorAluminiumOre: RegistryObject = ITEMS.register("meteor_aluminium_ore") { BlockItem(ModBlocks.meteorAluminiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val meteorLeadOre: RegistryObject = ITEMS.register("meteor_lead_ore") { BlockItem(ModBlocks.meteorLeadOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val meteorLithiumOre: RegistryObject = ITEMS.register("meteor_lithium_ore") { BlockItem(ModBlocks.meteorLithiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val starmetalOre: RegistryObject = ITEMS.register("starmetal_ore") { BlockItem(ModBlocks.starmetalOre.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val trixite: RegistryObject = ITEMS.register("trixite") { BlockItem(ModBlocks.trixite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } + val uraniumOre: RegistryObject = ITEMS.register("uranium_ore") { BlockItem(ModBlocks.uraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val scorchedUraniumOre: RegistryObject = ITEMS.register("scorched_uranium_ore") { BlockItem(ModBlocks.scorchedUraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val thoriumOre: RegistryObject = ITEMS.register("thorium_ore") { BlockItem(ModBlocks.thoriumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val titaniumOre: RegistryObject = ITEMS.register("titanium_ore") { BlockItem(ModBlocks.titaniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val sulfurOre: RegistryObject = ITEMS.register("sulfur_ore") { BlockItem(ModBlocks.sulfurOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val niterOre: RegistryObject = ITEMS.register("niter_ore") { BlockItem(ModBlocks.niterOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val copperOre: RegistryObject = ITEMS.register("copper_ore") { BlockItem(ModBlocks.copperOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val tungstenOre: RegistryObject = ITEMS.register("tungsten_ore") { BlockItem(ModBlocks.tungstenOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val aluminiumOre: RegistryObject = ITEMS.register("aluminium_ore") { BlockItem(ModBlocks.aluminiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val fluoriteOre: RegistryObject = ITEMS.register("fluorite_ore") { BlockItem(ModBlocks.fluoriteOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val berylliumOre: RegistryObject = ITEMS.register("beryllium_ore") { BlockItem(ModBlocks.berylliumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val leadOre: RegistryObject = ITEMS.register("lead_ore") { BlockItem(ModBlocks.leadOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val oilDeposit: RegistryObject = ITEMS.register("oil_deposit") { AutoTooltippedBlockItem(ModBlocks.oilDeposit.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val emptyOilDeposit: RegistryObject = ITEMS.register("empty_oil_deposit") { BlockItem(ModBlocks.emptyOilDeposit.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val oilSand: RegistryObject = ITEMS.register("oil_sand") { BlockItem(ModBlocks.oilSand.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val ligniteOre: RegistryObject = ITEMS.register("lignite_ore") { BlockItem(ModBlocks.ligniteOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val asbestosOre: RegistryObject = ITEMS.register("asbestos_ore") { BlockItem(ModBlocks.asbestosOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val schrabidiumOre: RegistryObject = ITEMS.register("schrabidium_ore") { BlockItem(ModBlocks.schrabidiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.RARE)) } + val australianOre: RegistryObject = ITEMS.register("australian_ore") { AutoTooltippedBlockItem(ModBlocks.australianOre.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.UNCOMMON)) } + val weidite: RegistryObject = ITEMS.register("weidite") { AutoTooltippedBlockItem(ModBlocks.weidite.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.UNCOMMON)) } + val reiite: RegistryObject = ITEMS.register("reiite") { AutoTooltippedBlockItem(ModBlocks.reiite.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.UNCOMMON)) } + val brightblendeOre: RegistryObject = ITEMS.register("brightblende_ore") { AutoTooltippedBlockItem(ModBlocks.brightblendeOre.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.UNCOMMON)) } + val dellite: RegistryObject = ITEMS.register("dellite") { AutoTooltippedBlockItem(ModBlocks.dellite.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.UNCOMMON)) } + val dollarGreenMineral: RegistryObject = ITEMS.register("dollar_green_mineral") { AutoTooltippedBlockItem(ModBlocks.dollarGreenMineral.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.UNCOMMON)) } + val rareEarthOre: RegistryObject = ITEMS.register("rare_earth_ore") { BlockItem(ModBlocks.rareEarthOre.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.UNCOMMON)) } + val netherUraniumOre: RegistryObject = ITEMS.register("nether_uranium_ore") { BlockItem(ModBlocks.netherUraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val scorchedNetherUraniumOre: RegistryObject = ITEMS.register("scorched_nether_uranium_ore") { BlockItem(ModBlocks.scorchedNetherUraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val netherPlutoniumOre: RegistryObject = ITEMS.register("nether_plutonium_ore") { BlockItem(ModBlocks.netherPlutoniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val netherTungstenOre: RegistryObject = ITEMS.register("nether_tungsten_ore") { BlockItem(ModBlocks.netherTungstenOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val netherSulfurOre: RegistryObject = ITEMS.register("nether_sulfur_ore") { BlockItem(ModBlocks.netherSulfurOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val netherPhosphorusOre: RegistryObject = ITEMS.register("nether_phosphorus_ore") { BlockItem(ModBlocks.netherPhosphorusOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val netherSchrabidiumOre: RegistryObject = ITEMS.register("nether_schrabidium_ore") { BlockItem(ModBlocks.netherSchrabidiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks).rarity(Rarity.RARE)) } + val meteorUraniumOre: RegistryObject = ITEMS.register("meteor_uranium_ore") { BlockItem(ModBlocks.meteorUraniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val meteorThoriumOre: RegistryObject = ITEMS.register("meteor_thorium_ore") { BlockItem(ModBlocks.meteorThoriumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val meteorTitaniumOre: RegistryObject = ITEMS.register("meteor_titanium_ore") { BlockItem(ModBlocks.meteorTitaniumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val meteorSulfurOre: RegistryObject = ITEMS.register("meteor_sulfur_ore") { BlockItem(ModBlocks.meteorSulfurOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val meteorCopperOre: RegistryObject = ITEMS.register("meteor_copper_ore") { BlockItem(ModBlocks.meteorCopperOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val meteorTungstenOre: RegistryObject = ITEMS.register("meteor_tungsten_ore") { BlockItem(ModBlocks.meteorTungstenOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val meteorAluminiumOre: RegistryObject = ITEMS.register("meteor_aluminium_ore") { BlockItem(ModBlocks.meteorAluminiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val meteorLeadOre: RegistryObject = ITEMS.register("meteor_lead_ore") { BlockItem(ModBlocks.meteorLeadOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val meteorLithiumOre: RegistryObject = ITEMS.register("meteor_lithium_ore") { BlockItem(ModBlocks.meteorLithiumOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val starmetalOre: RegistryObject = ITEMS.register("starmetal_ore") { BlockItem(ModBlocks.starmetalOre.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val trixite: RegistryObject = ITEMS.register("trixite") { BlockItem(ModBlocks.trixite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } - val uraniumBlock: RegistryObject = ITEMS.register("uranium_block") { BlockItem(ModBlocks.uraniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val u233Block: RegistryObject = ITEMS.register("u233_block") { BlockItem(ModBlocks.u233Block.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val u235Block: RegistryObject = ITEMS.register("u235_block") { BlockItem(ModBlocks.u235Block.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val u238Block: RegistryObject = ITEMS.register("u238_block") { BlockItem(ModBlocks.u238Block.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val uraniumFuelBlock: RegistryObject = ITEMS.register("uranium_fuel_block") { BlockItem(ModBlocks.uraniumFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val neptuniumBlock: RegistryObject = ITEMS.register("neptunium_block") { BlockItem(ModBlocks.neptuniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val moxFuelBlock: RegistryObject = ITEMS.register("mox_fuel_block") { BlockItem(ModBlocks.moxFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val plutoniumBlock: RegistryObject = ITEMS.register("plutonium_block") { BlockItem(ModBlocks.plutoniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val pu238Block: RegistryObject = ITEMS.register("pu238_block") { BlockItem(ModBlocks.pu238Block.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val pu239Block: RegistryObject = ITEMS.register("pu239_block") { BlockItem(ModBlocks.pu239Block.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val pu240Block: RegistryObject = ITEMS.register("pu240_block") { BlockItem(ModBlocks.pu240Block.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val plutoniumFuelBlock: RegistryObject = ITEMS.register("plutonium_fuel_block") { BlockItem(ModBlocks.plutoniumFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val thoriumBlock: RegistryObject = ITEMS.register("thorium_block") { BlockItem(ModBlocks.thoriumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val thoriumFuelBlock: RegistryObject = ITEMS.register("thorium_fuel_block") { BlockItem(ModBlocks.thoriumFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val titaniumBlock: RegistryObject = ITEMS.register("titanium_block") { BlockItem(ModBlocks.titaniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val sulfurBlock: RegistryObject = ITEMS.register("sulfur_block") { BlockItem(ModBlocks.sulfurBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val niterBlock: RegistryObject = ITEMS.register("niter_block") { BlockItem(ModBlocks.niterBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val copperBlock: RegistryObject = ITEMS.register("copper_block") { BlockItem(ModBlocks.copperBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val redCopperBlock: RegistryObject = ITEMS.register("red_copper_block") { BlockItem(ModBlocks.redCopperBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val advancedAlloyBlock: RegistryObject = ITEMS.register("advanced_alloy_block") { BlockItem(ModBlocks.advancedAlloyBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val tungstenBlock: RegistryObject = ITEMS.register("tungsten_block") { BlockItem(ModBlocks.tungstenBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val aluminiumBlock: RegistryObject = ITEMS.register("aluminium_block") { BlockItem(ModBlocks.aluminiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val fluoriteBlock: RegistryObject = ITEMS.register("fluorite_block") { BlockItem(ModBlocks.fluoriteBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val berylliumBlock: RegistryObject = ITEMS.register("beryllium_block") { BlockItem(ModBlocks.berylliumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val cobaltBlock: RegistryObject = ITEMS.register("cobalt_block") { BlockItem(ModBlocks.cobaltBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val steelBlock: RegistryObject = ITEMS.register("steel_block") { BlockItem(ModBlocks.steelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val leadBlock: RegistryObject = ITEMS.register("lead_block") { BlockItem(ModBlocks.leadBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val lithiumBlock: RegistryObject = ITEMS.register("lithium_block") { BlockItem(ModBlocks.lithiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val whitePhosphorusBlock: RegistryObject = ITEMS.register("white_phosphorus_block") { BlockItem(ModBlocks.whitePhosphorusBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val redPhosphorusBlock: RegistryObject = ITEMS.register("red_phosphorus_block") { BlockItem(ModBlocks.redPhosphorusBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val yellowcakeBlock: RegistryObject = ITEMS.register("yellowcake_block") { BlockItem(ModBlocks.yellowcakeBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val scrapBlock: RegistryObject = ITEMS.register("scrap_block") { object : BlockItem(ModBlocks.scrapBlock.get(), Properties().tab(CreativeTabs.Blocks.itemGroup)) { + val uraniumBlock: RegistryObject = ITEMS.register("uranium_block") { BlockItem(ModBlocks.uraniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val u233Block: RegistryObject = ITEMS.register("u233_block") { BlockItem(ModBlocks.u233Block.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val u235Block: RegistryObject = ITEMS.register("u235_block") { BlockItem(ModBlocks.u235Block.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val u238Block: RegistryObject = ITEMS.register("u238_block") { BlockItem(ModBlocks.u238Block.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val uraniumFuelBlock: RegistryObject = ITEMS.register("uranium_fuel_block") { BlockItem(ModBlocks.uraniumFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val neptuniumBlock: RegistryObject = ITEMS.register("neptunium_block") { BlockItem(ModBlocks.neptuniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val moxFuelBlock: RegistryObject = ITEMS.register("mox_fuel_block") { BlockItem(ModBlocks.moxFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val plutoniumBlock: RegistryObject = ITEMS.register("plutonium_block") { BlockItem(ModBlocks.plutoniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val pu238Block: RegistryObject = ITEMS.register("pu238_block") { BlockItem(ModBlocks.pu238Block.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val pu239Block: RegistryObject = ITEMS.register("pu239_block") { BlockItem(ModBlocks.pu239Block.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val pu240Block: RegistryObject = ITEMS.register("pu240_block") { BlockItem(ModBlocks.pu240Block.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val plutoniumFuelBlock: RegistryObject = ITEMS.register("plutonium_fuel_block") { BlockItem(ModBlocks.plutoniumFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val thoriumBlock: RegistryObject = ITEMS.register("thorium_block") { BlockItem(ModBlocks.thoriumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val thoriumFuelBlock: RegistryObject = ITEMS.register("thorium_fuel_block") { BlockItem(ModBlocks.thoriumFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val titaniumBlock: RegistryObject = ITEMS.register("titanium_block") { BlockItem(ModBlocks.titaniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val sulfurBlock: RegistryObject = ITEMS.register("sulfur_block") { BlockItem(ModBlocks.sulfurBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val niterBlock: RegistryObject = ITEMS.register("niter_block") { BlockItem(ModBlocks.niterBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val copperBlock: RegistryObject = ITEMS.register("copper_block") { BlockItem(ModBlocks.copperBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val redCopperBlock: RegistryObject = ITEMS.register("red_copper_block") { BlockItem(ModBlocks.redCopperBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val advancedAlloyBlock: RegistryObject = ITEMS.register("advanced_alloy_block") { BlockItem(ModBlocks.advancedAlloyBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val tungstenBlock: RegistryObject = ITEMS.register("tungsten_block") { BlockItem(ModBlocks.tungstenBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val aluminiumBlock: RegistryObject = ITEMS.register("aluminium_block") { BlockItem(ModBlocks.aluminiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val fluoriteBlock: RegistryObject = ITEMS.register("fluorite_block") { BlockItem(ModBlocks.fluoriteBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val berylliumBlock: RegistryObject = ITEMS.register("beryllium_block") { BlockItem(ModBlocks.berylliumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val cobaltBlock: RegistryObject = ITEMS.register("cobalt_block") { BlockItem(ModBlocks.cobaltBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val steelBlock: RegistryObject = ITEMS.register("steel_block") { BlockItem(ModBlocks.steelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val leadBlock: RegistryObject = ITEMS.register("lead_block") { BlockItem(ModBlocks.leadBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val lithiumBlock: RegistryObject = ITEMS.register("lithium_block") { BlockItem(ModBlocks.lithiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val whitePhosphorusBlock: RegistryObject = ITEMS.register("white_phosphorus_block") { BlockItem(ModBlocks.whitePhosphorusBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val redPhosphorusBlock: RegistryObject = ITEMS.register("red_phosphorus_block") { BlockItem(ModBlocks.redPhosphorusBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val yellowcakeBlock: RegistryObject = ITEMS.register("yellowcake_block") { BlockItem(ModBlocks.yellowcakeBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val scrapBlock: RegistryObject = ITEMS.register("scrap_block") { object : BlockItem(ModBlocks.scrapBlock.get(), Properties().tab(CreativeTabs.Blocks)) { override fun getBurnTime(itemStack: ItemStack?) = 4000 }} - val electricalScrapBlock: RegistryObject = ITEMS.register("electrical_scrap_block") { BlockItem(ModBlocks.electricalScrapBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val insulatorRoll: RegistryObject = ITEMS.register("insulator_roll") { BlockItem(ModBlocks.insulatorRoll.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val fiberglassRoll: RegistryObject = ITEMS.register("fiberglass_roll") { BlockItem(ModBlocks.fiberglassRoll.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val asbestosBlock: RegistryObject = ITEMS.register("asbestos_block") { BlockItem(ModBlocks.asbestosBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val trinititeBlock: RegistryObject = ITEMS.register("trinitite_block") { BlockItem(ModBlocks.trinititeBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val nuclearWasteBlock: RegistryObject = ITEMS.register("nuclear_waste_block") { BlockItem(ModBlocks.nuclearWasteBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val schrabidiumBlock: RegistryObject = ITEMS.register("schrabidium_block") { BlockItem(ModBlocks.schrabidiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val soliniumBlock: RegistryObject = ITEMS.register("solinium_block") { BlockItem(ModBlocks.soliniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val schrabidiumFuelBlock: RegistryObject = ITEMS.register("schrabidium_fuel_block") { BlockItem(ModBlocks.schrabidiumFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val euphemiumBlock: RegistryObject = ITEMS.register("euphemium_block") { BlockItem(ModBlocks.euphemiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val schrabidiumCluster: RegistryObject = ITEMS.register("schrabidium_cluster") { BlockItem(ModBlocks.schrabidiumCluster.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val euphemiumEtchedSchrabidiumCluster: RegistryObject = ITEMS.register("euphemium_etched_schrabidium_cluster") { BlockItem(ModBlocks.euphemiumEtchedSchrabidiumCluster.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val magnetizedTungstenBlock: RegistryObject = ITEMS.register("magnetized_tungsten_block") { BlockItem(ModBlocks.magnetizedTungstenBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val combineSteelBlock: RegistryObject = ITEMS.register("combine_steel_block") { BlockItem(ModBlocks.combineSteelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val deshReinforcedBlock: RegistryObject = ITEMS.register("desh_reinforced_block") { BlockItem(ModBlocks.deshReinforcedBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val starmetalBlock: RegistryObject = ITEMS.register("starmetal_block") { BlockItem(ModBlocks.starmetalBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val australiumBlock: RegistryObject = ITEMS.register("australium_block") { BlockItem(ModBlocks.australiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val weidaniumBlock: RegistryObject = ITEMS.register("weidanium_block") { BlockItem(ModBlocks.weidaniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val reiiumBlock: RegistryObject = ITEMS.register("reiium_block") { BlockItem(ModBlocks.reiiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val unobtainiumBlock: RegistryObject = ITEMS.register("unobtainium_block") { BlockItem(ModBlocks.unobtainiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val daffergonBlock: RegistryObject = ITEMS.register("daffergon_block") { BlockItem(ModBlocks.daffergonBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val verticiumBlock: RegistryObject = ITEMS.register("verticium_block") { BlockItem(ModBlocks.verticiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val titaniumDecoBlock: RegistryObject = ITEMS.register("titanium_deco_block") { BlockItem(ModBlocks.titaniumDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val redCopperDecoBlock: RegistryObject = ITEMS.register("red_copper_deco_block") { BlockItem(ModBlocks.redCopperDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val tungstenDecoBlock: RegistryObject = ITEMS.register("tungsten_deco_block") { BlockItem(ModBlocks.tungstenDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val aluminiumDecoBlock: RegistryObject = ITEMS.register("aluminium_deco_block") { BlockItem(ModBlocks.aluminiumDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val steelDecoBlock: RegistryObject = ITEMS.register("steel_deco_block") { BlockItem(ModBlocks.steelDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val leadDecoBlock: RegistryObject = ITEMS.register("lead_deco_block") { BlockItem(ModBlocks.leadDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val berylliumDecoBlock: RegistryObject = ITEMS.register("beryllium_deco_block") { BlockItem(ModBlocks.berylliumDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val asbestosRoof: RegistryObject = ITEMS.register("asbestos_roof") { BlockItem(ModBlocks.asbestosRoof.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val hazmatBlock: RegistryObject = ITEMS.register("hazmat_block") { BlockItem(ModBlocks.hazmatBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } + val electricalScrapBlock: RegistryObject = ITEMS.register("electrical_scrap_block") { BlockItem(ModBlocks.electricalScrapBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val insulatorRoll: RegistryObject = ITEMS.register("insulator_roll") { BlockItem(ModBlocks.insulatorRoll.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val fiberglassRoll: RegistryObject = ITEMS.register("fiberglass_roll") { BlockItem(ModBlocks.fiberglassRoll.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val asbestosBlock: RegistryObject = ITEMS.register("asbestos_block") { BlockItem(ModBlocks.asbestosBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val trinititeBlock: RegistryObject = ITEMS.register("trinitite_block") { BlockItem(ModBlocks.trinititeBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val nuclearWasteBlock: RegistryObject = ITEMS.register("nuclear_waste_block") { BlockItem(ModBlocks.nuclearWasteBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val schrabidiumBlock: RegistryObject = ITEMS.register("schrabidium_block") { BlockItem(ModBlocks.schrabidiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val soliniumBlock: RegistryObject = ITEMS.register("solinium_block") { BlockItem(ModBlocks.soliniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val schrabidiumFuelBlock: RegistryObject = ITEMS.register("schrabidium_fuel_block") { BlockItem(ModBlocks.schrabidiumFuelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val euphemiumBlock: RegistryObject = ITEMS.register("euphemium_block") { BlockItem(ModBlocks.euphemiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val schrabidiumCluster: RegistryObject = ITEMS.register("schrabidium_cluster") { BlockItem(ModBlocks.schrabidiumCluster.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val euphemiumEtchedSchrabidiumCluster: RegistryObject = ITEMS.register("euphemium_etched_schrabidium_cluster") { BlockItem(ModBlocks.euphemiumEtchedSchrabidiumCluster.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val magnetizedTungstenBlock: RegistryObject = ITEMS.register("magnetized_tungsten_block") { BlockItem(ModBlocks.magnetizedTungstenBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val combineSteelBlock: RegistryObject = ITEMS.register("combine_steel_block") { BlockItem(ModBlocks.combineSteelBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val deshReinforcedBlock: RegistryObject = ITEMS.register("desh_reinforced_block") { BlockItem(ModBlocks.deshReinforcedBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val starmetalBlock: RegistryObject = ITEMS.register("starmetal_block") { BlockItem(ModBlocks.starmetalBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val australiumBlock: RegistryObject = ITEMS.register("australium_block") { BlockItem(ModBlocks.australiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val weidaniumBlock: RegistryObject = ITEMS.register("weidanium_block") { BlockItem(ModBlocks.weidaniumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val reiiumBlock: RegistryObject = ITEMS.register("reiium_block") { BlockItem(ModBlocks.reiiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val unobtainiumBlock: RegistryObject = ITEMS.register("unobtainium_block") { BlockItem(ModBlocks.unobtainiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val daffergonBlock: RegistryObject = ITEMS.register("daffergon_block") { BlockItem(ModBlocks.daffergonBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val verticiumBlock: RegistryObject = ITEMS.register("verticium_block") { BlockItem(ModBlocks.verticiumBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val titaniumDecoBlock: RegistryObject = ITEMS.register("titanium_deco_block") { BlockItem(ModBlocks.titaniumDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val redCopperDecoBlock: RegistryObject = ITEMS.register("red_copper_deco_block") { BlockItem(ModBlocks.redCopperDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val tungstenDecoBlock: RegistryObject = ITEMS.register("tungsten_deco_block") { BlockItem(ModBlocks.tungstenDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val aluminiumDecoBlock: RegistryObject = ITEMS.register("aluminium_deco_block") { BlockItem(ModBlocks.aluminiumDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val steelDecoBlock: RegistryObject = ITEMS.register("steel_deco_block") { BlockItem(ModBlocks.steelDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val leadDecoBlock: RegistryObject = ITEMS.register("lead_deco_block") { BlockItem(ModBlocks.leadDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val berylliumDecoBlock: RegistryObject = ITEMS.register("beryllium_deco_block") { BlockItem(ModBlocks.berylliumDecoBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val asbestosRoof: RegistryObject = ITEMS.register("asbestos_roof") { BlockItem(ModBlocks.asbestosRoof.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val hazmatBlock: RegistryObject = ITEMS.register("hazmat_block") { BlockItem(ModBlocks.hazmatBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } - val glowingMushroom: RegistryObject = ITEMS.register("glowing_mushroom") { BlockItem(ModBlocks.glowingMushroom.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val glowingMushroomBlock: RegistryObject = ITEMS.register("glowing_mushroom_block") { BlockItem(ModBlocks.glowingMushroomBlock.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val glowingMushroomStem: RegistryObject = ITEMS.register("glowing_mushroom_stem") { BlockItem(ModBlocks.glowingMushroomStem.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val deadGrass: RegistryObject = ITEMS.register("dead_grass") { BlockItem(ModBlocks.deadGrass.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val glowingMycelium: RegistryObject = ITEMS.register("glowing_mycelium") { BlockItem(ModBlocks.glowingMycelium.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val trinititeOre: RegistryObject = ITEMS.register("trinitite_ore") { BlockItem(ModBlocks.trinitite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val redTrinititeOre: RegistryObject = ITEMS.register("red_trinitite_ore") { BlockItem(ModBlocks.redTrinitite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val charredLog: RegistryObject = ITEMS.register("charred_log") { object : BlockItem(ModBlocks.charredLog.get(), Properties().tab(CreativeTabs.Blocks.itemGroup)) { + val glowingMushroom: RegistryObject = ITEMS.register("glowing_mushroom") { BlockItem(ModBlocks.glowingMushroom.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val glowingMushroomBlock: RegistryObject = ITEMS.register("glowing_mushroom_block") { BlockItem(ModBlocks.glowingMushroomBlock.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val glowingMushroomStem: RegistryObject = ITEMS.register("glowing_mushroom_stem") { BlockItem(ModBlocks.glowingMushroomStem.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val deadGrass: RegistryObject = ITEMS.register("dead_grass") { BlockItem(ModBlocks.deadGrass.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val glowingMycelium: RegistryObject = ITEMS.register("glowing_mycelium") { BlockItem(ModBlocks.glowingMycelium.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val trinititeOre: RegistryObject = ITEMS.register("trinitite_ore") { BlockItem(ModBlocks.trinitite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val redTrinititeOre: RegistryObject = ITEMS.register("red_trinitite_ore") { BlockItem(ModBlocks.redTrinitite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val charredLog: RegistryObject = ITEMS.register("charred_log") { object : BlockItem(ModBlocks.charredLog.get(), Properties().tab(CreativeTabs.Blocks)) { override fun getBurnTime(itemStack: ItemStack?, recipeType: IRecipeType<*>?) = 300 }} - val charredPlanks: RegistryObject = ITEMS.register("charred_planks") { object : BlockItem(ModBlocks.charredPlanks.get(), Properties().tab(CreativeTabs.Blocks.itemGroup)) { + val charredPlanks: RegistryObject = ITEMS.register("charred_planks") { object : BlockItem(ModBlocks.charredPlanks.get(), Properties().tab(CreativeTabs.Blocks)) { override fun getBurnTime(itemStack: ItemStack?, recipeType: IRecipeType<*>?) = 300 }} - val slakedSellafite: RegistryObject = ITEMS.register("slaked_sellafite") { BlockItem(ModBlocks.slakedSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val sellafite: RegistryObject = ITEMS.register("sellafite") { BlockItem(ModBlocks.sellafite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val hotSellafite: RegistryObject = ITEMS.register("hot_sellafite") { BlockItem(ModBlocks.hotSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val boilingSellafite: RegistryObject = ITEMS.register("boiling_sellafite") { BlockItem(ModBlocks.boilingSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val blazingSellafite: RegistryObject = ITEMS.register("blazing_sellafite") { BlockItem(ModBlocks.blazingSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val infernalSellafite: RegistryObject = ITEMS.register("infernal_sellafite") { BlockItem(ModBlocks.infernalSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } - val sellafiteCorium: RegistryObject = ITEMS.register("sellafite_corium") { BlockItem(ModBlocks.sellafiteCorium.get(), Item.Properties().tab(CreativeTabs.Blocks.itemGroup)) } + val slakedSellafite: RegistryObject = ITEMS.register("slaked_sellafite") { BlockItem(ModBlocks.slakedSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val sellafite: RegistryObject = ITEMS.register("sellafite") { BlockItem(ModBlocks.sellafite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val hotSellafite: RegistryObject = ITEMS.register("hot_sellafite") { BlockItem(ModBlocks.hotSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val boilingSellafite: RegistryObject = ITEMS.register("boiling_sellafite") { BlockItem(ModBlocks.boilingSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val blazingSellafite: RegistryObject = ITEMS.register("blazing_sellafite") { BlockItem(ModBlocks.blazingSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val infernalSellafite: RegistryObject = ITEMS.register("infernal_sellafite") { BlockItem(ModBlocks.infernalSellafite.get(), Item.Properties().tab(CreativeTabs.Blocks)) } + val sellafiteCorium: RegistryObject = ITEMS.register("sellafite_corium") { BlockItem(ModBlocks.sellafiteCorium.get(), Item.Properties().tab(CreativeTabs.Blocks)) } - val siren: RegistryObject = ITEMS.register("siren") { BlockItem(ModBlocks.siren.get(), Item.Properties().tab(CreativeTabs.Machines.itemGroup)) } - val safe: RegistryObject = ITEMS.register("safe") { BlockItem(ModBlocks.safe.get(), Item.Properties().tab(CreativeTabs.Machines.itemGroup)) } - val steamPress: RegistryObject = ITEMS.register("steam_press") { BlockItem(ModBlocks.steamPressBase.get(), Item.Properties().tab(CreativeTabs.Machines.itemGroup)) } - val blastFurnace: RegistryObject = ITEMS.register("blast_furnace") { BlockItem(ModBlocks.blastFurnace.get(), Item.Properties().tab(CreativeTabs.Machines.itemGroup)) } - val combustionGenerator: RegistryObject = ITEMS.register("combustion_generator") { BlockItem(ModBlocks.combustionGenerator.get(), Item.Properties().tab(CreativeTabs.Machines.itemGroup)) } - val electricFurnace: RegistryObject = ITEMS.register("electric_furnace") { BlockItem(ModBlocks.electricFurnace.get(), Item.Properties().tab(CreativeTabs.Machines.itemGroup)) } - val shredder: RegistryObject = ITEMS.register("shredder") { BlockItem(ModBlocks.shredder.get(), Item.Properties().tab(CreativeTabs.Machines.itemGroup)) } + val siren: RegistryObject = ITEMS.register("siren") { BlockItem(ModBlocks.siren.get(), Item.Properties().tab(CreativeTabs.Machines)) } + val safe: RegistryObject = ITEMS.register("safe") { BlockItem(ModBlocks.safe.get(), Item.Properties().tab(CreativeTabs.Machines)) } + val steamPress: RegistryObject = ITEMS.register("steam_press") { BlockItem(ModBlocks.steamPressBase.get(), Item.Properties().tab(CreativeTabs.Machines)) } + val blastFurnace: RegistryObject = ITEMS.register("blast_furnace") { BlockItem(ModBlocks.blastFurnace.get(), Item.Properties().tab(CreativeTabs.Machines)) } + val combustionGenerator: RegistryObject = ITEMS.register("combustion_generator") { BlockItem(ModBlocks.combustionGenerator.get(), Item.Properties().tab(CreativeTabs.Machines)) } + val electricFurnace: RegistryObject = ITEMS.register("electric_furnace") { BlockItem(ModBlocks.electricFurnace.get(), Item.Properties().tab(CreativeTabs.Machines)) } + val shredder: RegistryObject = ITEMS.register("shredder") { BlockItem(ModBlocks.shredder.get(), Item.Properties().tab(CreativeTabs.Machines)) } + + val fatMan: RegistryObject = ITEMS.register("fat_man") { BlockItem(ModBlocks.fatMan.get(), Item.Properties().tab(CreativeTabs.Bombs)) } + + private fun Item.Properties.tab(tab: CreativeTabs): Item.Properties = tab(tab.itemGroup) } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/ModBlocks.kt b/src/main/kotlin/at/martinthedragon/nucleartech/ModBlocks.kt index c822e011..517ebd6c 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/ModBlocks.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/ModBlocks.kt @@ -161,17 +161,21 @@ object ModBlocks { val infernalSellafite: RegistryObject = BLOCKS.register("infernal_sellafite") { Block(Properties.of(STONE, MaterialColor.COLOR_LIGHT_GREEN).strength(5F).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.STONE)) } val sellafiteCorium: RegistryObject = BLOCKS.register("sellafite_corium") { Block(Properties.of(STONE, MaterialColor.COLOR_LIGHT_GREEN).strength(10F).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.STONE)) } + // Machines + val siren: RegistryObject = BLOCKS.register("siren") { Siren(Properties.of(METAL).strength(5f).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } val safe: RegistryObject = BLOCKS.register("safe") { Safe(Properties.of(METAL).strength(25f, 1200f).harvestLevel(2).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } - // region Steam Press val steamPressBase: RegistryObject = BLOCKS.register("steam_press_base") { SteamPressBase(Properties.of(METAL).strength(5f).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } val steamPressFrame: RegistryObject = BLOCKS.register("steam_press_frame") { SteamPressFrame(Properties.of(METAL).strength(5f).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } val steamPressTop: RegistryObject = BLOCKS.register("steam_press_top") { SteamPressTop(Properties.of(METAL).strength(5f).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } - // endregion val blastFurnace: RegistryObject = BLOCKS.register("blast_furnace") { BlastFurnace(Properties.of(METAL).strength(5F).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } val combustionGenerator: RegistryObject = BLOCKS.register("combustion_generator") { CombustionGenerator(Properties.of(METAL).strength(5F).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } val electricFurnace: RegistryObject = BLOCKS.register("electric_furnace") { ElectricFurnace(Properties.of(METAL).strength(5F).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } val shredder: RegistryObject = BLOCKS.register("shredder") { Shredder(Properties.of(METAL).strength(5F).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL)) } + + // Bombs + + val fatMan: RegistryObject = BLOCKS.register("fat_man") { FatMan(Properties.of(METAL).strength(5F, 6000F).harvestLevel(1).harvestTool(ToolType.PICKAXE).requiresCorrectToolForDrops().sound(SoundType.METAL).noOcclusion()) } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/ModItems.kt b/src/main/kotlin/at/martinthedragon/nucleartech/ModItems.kt index d6785db8..e5be41f5 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/ModItems.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/ModItems.kt @@ -1,6 +1,7 @@ package at.martinthedragon.nucleartech import at.martinthedragon.nucleartech.RegistriesAndLifecycle.ITEMS +import at.martinthedragon.nucleartech.blocks.FatMan import at.martinthedragon.nucleartech.entities.EntityTypes import at.martinthedragon.nucleartech.items.* import net.minecraft.client.util.ITooltipFlag @@ -543,6 +544,19 @@ object ModItems { val sirenTrackAPCPass: RegistryObject = ITEMS.register("siren_track_apc_pass") { SirenTrack(SoundEvents.sirenTrackAPCPass, 50, false, 0x3437D3) } val sirenTrackRazortrainHorn: RegistryObject = ITEMS.register("siren_track_razortrain_horn") { SirenTrack(SoundEvents.sirenTrackRazortrainHorn, 250, false, 0x7750ED) } + // Bomb Items + + val bundleOfImplosionPropellant: RegistryObject = ITEMS.register("bundle_of_implosion_propellant") { AutoTooltippedItem(Item.Properties().tab(CreativeTabs.Bombs).stacksTo(1)) } + val bombIgniter: RegistryObject = ITEMS.register("bomb_igniter") { AutoTooltippedItem(Item.Properties().tab(CreativeTabs.Bombs).stacksTo(1)) } + val plutoniumCore: RegistryObject = ITEMS.register("plutonium_core") { object : EffectItem(listOf(EffectTypes.Radioactive), Properties().tab(CreativeTabs.Bombs).stacksTo(1), 5F) { + override fun appendHoverText(stack: ItemStack, worldIn: World?, tooltip: MutableList, flagIn: ITooltipFlag) { + autoTooltip(stack, tooltip) + super.appendHoverText(stack, worldIn, tooltip, flagIn) + } + }} + val detonator: RegistryObject = ITEMS.register("detonator") { Detonator(Item.Properties().tab(CreativeTabs.Bombs).stacksTo(1)) } + val fatManKit: RegistryObject = ITEMS.register("fat_man_kit") { BombKitItem(mapOf(ModBlockItems.fatMan to 1) + FatMan.requiredComponents, 0xFFD800, Item.Properties().tab(CreativeTabs.Bombs)) } + // Consumables val oilDetector: RegistryObject = ITEMS.register("oil_detector") { OilDetector(Item.Properties().tab(CreativeTabs.Consumables).stacksTo(1)) } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/Radiation.kt b/src/main/kotlin/at/martinthedragon/nucleartech/Radiation.kt index 7c3744e2..2892660d 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/Radiation.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/Radiation.kt @@ -18,8 +18,9 @@ import net.minecraft.world.server.ChunkManager import net.minecraft.world.server.ServerWorld object Radiation { - var irradiatedEntityList = listOf() // TODO still a bit spaghetti, consider doing it differently + internal var irradiatedEntityList = listOf() // TODO still a bit spaghetti, consider doing it differently + @JvmStatic fun addEntityIrradiation(entity: LivingEntity, radiation: Float) { if (entity.isDeadOrDying) return val cap = entity.getCapability(CapabilityIrradiationHandler.irradiationHandlerCapability).orElseThrow(::RuntimeException) @@ -28,6 +29,7 @@ object Radiation { cap.setIrradiation(newIrradiation) } + @JvmStatic fun setEntityIrradiation(entity: LivingEntity, radiation: Float) { if (entity.isDeadOrDying) return val cap = entity.getCapability(CapabilityIrradiationHandler.irradiationHandlerCapability).orElseThrow(::RuntimeException) @@ -36,6 +38,7 @@ object Radiation { cap.setIrradiation(newIrradiation) } + @JvmStatic fun getEntityIrradiation(entity: LivingEntity): Float { if (entity.isDeadOrDying) return 0f if (!entity.getCapability(CapabilityIrradiationHandler.irradiationHandlerCapability).isPresent) return 0f @@ -44,7 +47,7 @@ object Radiation { return cap.getIrradiation() } - fun applyRadiationEffects(world: World) { + internal fun applyRadiationEffects(world: World) { if (!world.isClientSide) { // 3000 IQ strategy to get irradiated entities without causing ConcurrentModificationException follows (now with access transformation): if (world.gameTime % 20 == 0L) { // polling rate diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/SoundEvents.kt b/src/main/kotlin/at/martinthedragon/nucleartech/SoundEvents.kt index 310b6e30..bf123835 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/SoundEvents.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/SoundEvents.kt @@ -28,4 +28,6 @@ object SoundEvents { val sirenTrackRazortrainHorn: RegistryObject = SOUNDS.register("siren.razortrain_horn") { SoundEvent(ResourceLocation(NuclearTech.MODID, "siren.razortrain_horn")) } val pressOperate: RegistryObject = SOUNDS.register("press.operate") { SoundEvent(ResourceLocation(NuclearTech.MODID, "press.operate")) } val randomBleep: RegistryObject = SOUNDS.register("random.bleep") { SoundEvent(ResourceLocation(NuclearTech.MODID, "random.bleep")) } + val randomBoop: RegistryObject = SOUNDS.register("random.boop") { SoundEvent(ResourceLocation(NuclearTech.MODID, "random.boop")) } + val randomUnpack: RegistryObject = SOUNDS.register("random.unpack") { SoundEvent(ResourceLocation(NuclearTech.MODID, "random.unpack")) } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/BlastFurnace.kt b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/BlastFurnace.kt index 7e6a7d61..ee0d681a 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/BlastFurnace.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/BlastFurnace.kt @@ -119,7 +119,7 @@ class BlastFurnace(properties: Properties) : Block(properties) { override fun createTileEntity(state: BlockState?, world: IBlockReader?) = BlastFurnaceTileEntity() companion object { - val FACING: DirectionProperty = HorizontalBlock.FACING - val LIT: BooleanProperty = BlockStateProperties.LIT + @JvmField val FACING: DirectionProperty = HorizontalBlock.FACING + @JvmField val LIT: BooleanProperty = BlockStateProperties.LIT } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/CombustionGenerator.kt b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/CombustionGenerator.kt index 50f32757..30354b71 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/CombustionGenerator.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/CombustionGenerator.kt @@ -109,7 +109,7 @@ class CombustionGenerator(properties: Properties) : Block(properties) { override fun createTileEntity(state: BlockState?, world: IBlockReader?) = CombustionGeneratorTileEntity() companion object { - val FACING: DirectionProperty = HorizontalBlock.FACING - val LIT: BooleanProperty = BlockStateProperties.LIT + @JvmField val FACING: DirectionProperty = HorizontalBlock.FACING + @JvmField val LIT: BooleanProperty = BlockStateProperties.LIT } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/FatMan.kt b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/FatMan.kt new file mode 100644 index 00000000..5079512c --- /dev/null +++ b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/FatMan.kt @@ -0,0 +1,68 @@ +package at.martinthedragon.nucleartech.blocks + +import at.martinthedragon.nucleartech.ModItems +import at.martinthedragon.nucleartech.explosions.IgnitableExplosive +import at.martinthedragon.nucleartech.tileentities.FatManTileEntity +import net.minecraft.block.Block +import net.minecraft.block.BlockState +import net.minecraft.block.HorizontalBlock +import net.minecraft.block.material.PushReaction +import net.minecraft.entity.LivingEntity +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.entity.player.ServerPlayerEntity +import net.minecraft.item.BlockItemUseContext +import net.minecraft.item.ItemStack +import net.minecraft.state.StateContainer +import net.minecraft.util.ActionResultType +import net.minecraft.util.Hand +import net.minecraft.util.Mirror +import net.minecraft.util.Rotation +import net.minecraft.util.math.BlockPos +import net.minecraft.util.math.BlockRayTraceResult +import net.minecraft.world.IBlockReader +import net.minecraft.world.World +import net.minecraftforge.fml.network.NetworkHooks + +class FatMan(properties: Properties) : Block(properties), IgnitableExplosive { + override fun createBlockStateDefinition(builder: StateContainer.Builder) { + builder.add(HorizontalBlock.FACING) + } + + override fun getStateForPlacement(context: BlockItemUseContext): BlockState = + defaultBlockState().setValue(HorizontalBlock.FACING, context.horizontalDirection.counterClockWise) + + override fun getPistonPushReaction(state: BlockState) = PushReaction.BLOCK + override fun setPlacedBy(world: World, pos: BlockPos, state: BlockState, entity: LivingEntity?, stack: ItemStack) { + setTileEntityCustomName(world, pos, stack) + } + override fun onRemove(state: BlockState, world: World, pos: BlockPos, newState: BlockState, p_196243_5_: Boolean) { + dropTileEntityContents(state, world, pos, newState) + @Suppress("DEPRECATION") + super.onRemove(state, world, pos, newState, p_196243_5_) + } + override fun use(state: BlockState, world: World, pos: BlockPos, player: PlayerEntity, hand: Hand, hit: BlockRayTraceResult): ActionResultType { + if (!world.isClientSide) { + val tileEntity = world.getBlockEntity(pos) + if (tileEntity is FatManTileEntity) NetworkHooks.openGui(player as ServerPlayerEntity, tileEntity, pos) + } + return ActionResultType.sidedSuccess(world.isClientSide) + } + + override fun hasTileEntity(state: BlockState?) = true + override fun createTileEntity(state: BlockState?, world: IBlockReader?) = FatManTileEntity() + + override fun rotate(state: BlockState, rotation: Rotation): BlockState = + state.setValue(HorizontalBlock.FACING, rotation.rotate(state.getValue(HorizontalBlock.FACING))) + + @Suppress("DEPRECATION") + override fun mirror(state: BlockState, mirror: Mirror): BlockState = + state.rotate(mirror.getRotation(state.getValue(HorizontalBlock.FACING))) + + companion object { + val requiredComponents = mapOf( + ModItems.bundleOfImplosionPropellant to 4, + ModItems.bombIgniter to 1, + ModItems.plutoniumCore to 1 + ) + } +} diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/Safe.kt b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/Safe.kt index 0ca1fb9f..0a37d5a5 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/Safe.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/Safe.kt @@ -74,6 +74,6 @@ class Safe(properties: Properties) : Block(properties) { } companion object { - val FACING: DirectionProperty = HorizontalBlock.FACING + @JvmField val FACING: DirectionProperty = HorizontalBlock.FACING } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/Siren.kt b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/Siren.kt index d96c2f40..121ad8e4 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/blocks/Siren.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/blocks/Siren.kt @@ -70,6 +70,6 @@ class Siren(properties: Properties) : Block(properties) { override fun createTileEntity(state: BlockState?, world: IBlockReader?) = SirenTileEntity() companion object { - val POWERED: BooleanProperty = BlockStateProperties.POWERED + @JvmField val POWERED: BooleanProperty = BlockStateProperties.POWERED } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/capabilites/radiation/CapabilityIrradiationHandler.kt b/src/main/kotlin/at/martinthedragon/nucleartech/capabilites/radiation/CapabilityIrradiationHandler.kt index a2d93d60..522a13a1 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/capabilites/radiation/CapabilityIrradiationHandler.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/capabilites/radiation/CapabilityIrradiationHandler.kt @@ -11,7 +11,7 @@ object CapabilityIrradiationHandler { @CapabilityInject(IIrradiationHandler::class) lateinit var irradiationHandlerCapability: Capability - fun register() { + internal fun register() { CapabilityManager.INSTANCE.register(IIrradiationHandler::class.java, object : Capability.IStorage { override fun writeNBT( diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/containers/ContainerTypes.kt b/src/main/kotlin/at/martinthedragon/nucleartech/containers/ContainerTypes.kt index 4e66155e..49662fec 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/containers/ContainerTypes.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/containers/ContainerTypes.kt @@ -6,25 +6,12 @@ import net.minecraftforge.common.extensions.IForgeContainerType import net.minecraftforge.fml.RegistryObject object ContainerTypes { - val safeContainer: RegistryObject> = CONTAINERS.register("safe") { - IForgeContainerType.create(SafeContainer.Companion::fromNetwork) - } - val sirenContainer: RegistryObject> = CONTAINERS.register("siren") { - IForgeContainerType.create(SirenContainer.Companion::fromNetwork) - } - val steamPressContainer: RegistryObject> = CONTAINERS.register("steam_press") { - IForgeContainerType.create(PressContainer.Companion::fromNetwork) - } - val blastFurnaceContainer: RegistryObject> = CONTAINERS.register("blast_furnace") { - IForgeContainerType.create(BlastFurnaceContainer.Companion::fromNetwork) - } - val combustionGeneratorContainer: RegistryObject> = CONTAINERS.register("combustion_generator") { - IForgeContainerType.create(CombustionGeneratorContainer.Companion::fromNetwork) - } - val electricFurnaceContainer: RegistryObject> = CONTAINERS.register("electric_furnace") { - IForgeContainerType.create(ElectricFurnaceContainer.Companion::fromNetwork) - } - val shredderContainer: RegistryObject> = CONTAINERS.register("shredder") { - IForgeContainerType.create(ShredderContainer.Companion::fromNetwork) - } + val safeContainer: RegistryObject> = CONTAINERS.register("safe") { IForgeContainerType.create(SafeContainer::fromNetwork) } + val sirenContainer: RegistryObject> = CONTAINERS.register("siren") { IForgeContainerType.create(SirenContainer::fromNetwork) } + val steamPressContainer: RegistryObject> = CONTAINERS.register("steam_press") { IForgeContainerType.create(PressContainer::fromNetwork) } + val blastFurnaceContainer: RegistryObject> = CONTAINERS.register("blast_furnace") { IForgeContainerType.create(BlastFurnaceContainer::fromNetwork) } + val combustionGeneratorContainer: RegistryObject> = CONTAINERS.register("combustion_generator") { IForgeContainerType.create(CombustionGeneratorContainer::fromNetwork) } + val electricFurnaceContainer: RegistryObject> = CONTAINERS.register("electric_furnace") { IForgeContainerType.create(ElectricFurnaceContainer::fromNetwork) } + val shredderContainer: RegistryObject> = CONTAINERS.register("shredder") { IForgeContainerType.create(ShredderContainer::fromNetwork) } + val fatManContainer: RegistryObject> = CONTAINERS.register("fat_man") { IForgeContainerType.create(FatManContainer::fromNetwork) } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/containers/FatManContainer.kt b/src/main/kotlin/at/martinthedragon/nucleartech/containers/FatManContainer.kt new file mode 100644 index 00000000..7935a6b2 --- /dev/null +++ b/src/main/kotlin/at/martinthedragon/nucleartech/containers/FatManContainer.kt @@ -0,0 +1,61 @@ +package at.martinthedragon.nucleartech.containers + +import at.martinthedragon.nucleartech.tileentities.FatManTileEntity +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.entity.player.PlayerInventory +import net.minecraft.inventory.container.Container +import net.minecraft.item.ItemStack +import net.minecraft.network.PacketBuffer +import net.minecraft.util.IIntArray +import net.minecraftforge.items.CapabilityItemHandler +import net.minecraftforge.items.SlotItemHandler +import net.minecraft.util.IntArray as MinecraftIntArray + +class FatManContainer( + windowID: Int, + val playerInventory: PlayerInventory, + val tileEntity: FatManTileEntity, + val data: IIntArray = MinecraftIntArray(1) +) : Container(ContainerTypes.fatManContainer.get(), windowID) { + private val inv = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).orElseThrow(::Error) + + init { + addSlot(SlotItemHandler(inv, 0, 8, 17)) + addSlot(SlotItemHandler(inv, 1, 44, 17)) + addSlot(SlotItemHandler(inv, 2, 8, 53)) + addSlot(SlotItemHandler(inv, 3, 44, 53)) + addSlot(SlotItemHandler(inv, 4, 26, 35)) + addSlot(SlotItemHandler(inv, 5, 98, 35)) + addPlayerInventory(this::addSlot, playerInventory, 8, 84) + addDataSlots(data) + } + + override fun quickMoveStack(player: PlayerEntity, index: Int): ItemStack { + var returnStack = ItemStack.EMPTY + val slot = slots[index] + if (slot != null && slot.hasItem()) { + val itemStack = slot.item + returnStack = itemStack.copy() + if (index !in 0..5) { + if (!moveItemStackTo(itemStack, 0, 6, false) && !tryMoveInPlayerInventory(index, 6, itemStack)) return ItemStack.EMPTY + } else if (!moveItemStackTo(itemStack, 6, slots.size, false)) return ItemStack.EMPTY + + if (itemStack.isEmpty) slot.set(ItemStack.EMPTY) + else slot.setChanged() + + if (itemStack.count == returnStack.count) return ItemStack.EMPTY + + slot.onTake(player, itemStack) + } + return returnStack + } + + override fun stillValid(player: PlayerEntity) = playerInventory.stillValid(player) + + fun getBombCompletion() = data[0] + + companion object { + fun fromNetwork(windowID: Int, playerInventory: PlayerInventory, buffer: PacketBuffer) = + FatManContainer(windowID, playerInventory, getTileEntityForContainer(buffer)) + } +} diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearBlockStateProvider.kt b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearBlockStateProvider.kt index 48153b5a..975d6234 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearBlockStateProvider.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearBlockStateProvider.kt @@ -8,8 +8,11 @@ import net.minecraft.block.SixWayBlock import net.minecraft.data.DataGenerator import net.minecraft.state.properties.BlockStateProperties import net.minecraft.util.ResourceLocation +import net.minecraftforge.client.model.generators.BlockModelBuilder import net.minecraftforge.client.model.generators.BlockStateProvider import net.minecraftforge.client.model.generators.ConfiguredModel +import net.minecraftforge.client.model.generators.ModelBuilder +import net.minecraftforge.client.model.generators.loaders.OBJLoaderBuilder import net.minecraftforge.common.data.ExistingFileHelper class NuclearBlockStateProvider( @@ -178,6 +181,18 @@ class NuclearBlockStateProvider( litHorizontalBlock(ModBlocks.combustionGenerator.get()) litHorizontalBlock(ModBlocks.electricFurnace.get()) cubeAllSides(ModBlocks.shredder.get(), north = extend(blockTexture(ModBlocks.shredder.get()), "_front"), south = extend(blockTexture(ModBlocks.shredder.get()), "_front"), east = extend(blockTexture(ModBlocks.shredder.get()), "_side"), west = extend(blockTexture(ModBlocks.shredder.get()), "_side")) + horizontalBlock(ModBlocks.fatMan.get(), models().getBuilder("fat_man") + .customLoader { modelLoader: BlockModelBuilder, existingFileHelper -> OBJLoaderBuilder.begin(modelLoader, existingFileHelper) } + .modelLocation(modLoc("models/block/fat_man/fat_man.obj")) + .flipV(true).detectCullableFaces(false).end() + .texture("fat_man_texture", modLoc("block/fat_man")) + .texture("particle", modLoc("block/fat_man")) + .parent(blockTransformsModel) + .transforms() + .transform(ModelBuilder.Perspective.GUI).rotation(30F, 225F, 0F).translation(2.5F, -3F, 0F).scale(.34F).end() + .transform(ModelBuilder.Perspective.FIXED).rotation(0F, 90F, 0F).translation(0F, -2F, 0F).scale(.5F).end() + .end() + ) copiedBlockItem(ModBlocks.uraniumOre.get()) copiedBlockItem(ModBlocks.scorchedUraniumOre.get()) @@ -305,8 +320,10 @@ class NuclearBlockStateProvider( copiedBlockItem(ModBlocks.combustionGenerator.get()) copiedBlockItem(ModBlocks.electricFurnace.get()) copiedBlockItem(ModBlocks.shredder.get()) + copiedBlockItem(ModBlocks.fatMan.get()) } + private val blockTransformsModel = models().getExistingFile(mcLoc("block/block")) private val generatedItem = models().getExistingFile(mcLoc("item/generated")) private fun simpleItem(block: Block) { diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearItemModelProvider.kt b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearItemModelProvider.kt index 347250b0..b9e2a2ff 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearItemModelProvider.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearItemModelProvider.kt @@ -4,12 +4,14 @@ import at.martinthedragon.nucleartech.ModBlockItems import at.martinthedragon.nucleartech.ModBlocks import at.martinthedragon.nucleartech.ModItems import at.martinthedragon.nucleartech.NuclearTech +import at.martinthedragon.nucleartech.items.BombKitItem import at.martinthedragon.nucleartech.items.NuclearSpawnEggItem import net.minecraft.block.Block import net.minecraft.data.DataGenerator import net.minecraft.item.Item import net.minecraft.util.ResourceLocation import net.minecraftforge.client.model.generators.ItemModelProvider +import net.minecraftforge.client.model.generators.ModelFile import net.minecraftforge.common.data.ExistingFileHelper class NuclearItemModelProvider( @@ -519,12 +521,20 @@ class NuclearItemModelProvider( simpleItem(ModItems.sirenTrackEASAlarmScreech.get()) simpleItem(ModItems.sirenTrackAPCPass.get()) simpleItem(ModItems.sirenTrackRazortrainHorn.get()) + simpleItem(ModItems.bundleOfImplosionPropellant.get()) + simpleItem(ModItems.bombIgniter.get()) + simpleItem(ModItems.plutoniumCore.get()) + simpleItem(ModItems.detonator.get()) simpleItem(ModItems.oilDetector.get()) simpleItem(ModItems.creativeNuclearExplosionSpawner.get()) - for (spawnEgg in NuclearSpawnEggItem.resolvedMap.values) { - spawnEgg(spawnEgg) - } + bombKitItem = getBuilder("template_bomb_kit").parent(generatedItem) + .texture("layer0", modLoc("$ITEM_FOLDER/bomb_kit")) + .texture("layer1", modLoc("$ITEM_FOLDER/bomb_kit_overlay")) + + for (bombKit in BombKitItem.allKits) bombKit(bombKit) + + for (spawnEgg in NuclearSpawnEggItem.resolvedMap.values) spawnEgg(spawnEgg) // BlockItems @@ -536,6 +546,7 @@ class NuclearItemModelProvider( private val cubeAll = getExistingFile(mcLoc("block/cube_all")) private val generatedItem = getExistingFile(mcLoc("item/generated")) private val spawnEggItem = getExistingFile(mcLoc("item/template_spawn_egg")) + private lateinit var bombKitItem: ModelFile private fun simpleItem(item: Item) { getBuilder(item.registryName!!.path) @@ -543,6 +554,10 @@ class NuclearItemModelProvider( .texture("layer0", itemTexture(item)) } + private fun bombKit(item: Item) { + getBuilder(item.registryName!!.path).parent(bombKitItem) + } + private fun spawnEgg(item: Item) { getBuilder(item.registryName!!.path).parent(spawnEggItem) } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearSoundsProvider.kt b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearSoundsProvider.kt index 677ce7c2..a9762fc0 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearSoundsProvider.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/NuclearSoundsProvider.kt @@ -6,7 +6,6 @@ import at.martinthedragon.nucleartech.SoundEvents import net.minecraft.data.DataGenerator import net.minecraft.util.ResourceLocation import net.minecraftforge.common.data.ExistingFileHelper -import net.minecraftforge.common.data.SoundDefinition.SoundType.SOUND import net.minecraftforge.common.data.SoundDefinitionsProvider class NuclearSoundsProvider( @@ -16,28 +15,30 @@ class NuclearSoundsProvider( override fun getName(): String = "Nuclear Tech Mod Sounds" override fun registerSounds() { - add(SoundEvents.sirenTrackHatchSiren, definition().with(sound(ntm("blocks/siren/hatch"), SOUND).attenuationDistance(ModItems.sirenTrackHatchSiren.get().range)).subtitle(ntmSubtitle("siren.hatch"))) - add(SoundEvents.sirenTrackAutopilotDisconnected, definition().with(sound(ntm("blocks/siren/autopilot_disconnected"), SOUND).attenuationDistance(ModItems.sirenTrackAutopilotDisconnected.get().range)).subtitle(ntmSubtitle("siren.autopilot_disconnected"))) - add(SoundEvents.sirenTrackAMSSiren, definition().with(sound(ntm("blocks/siren/ams"), SOUND).attenuationDistance(ModItems.sirenTrackAMSSiren.get().range)).subtitle(ntmSubtitle("siren.ams"))) - add(SoundEvents.sirenTrackBlastDoorAlarm, definition().with(sound(ntm("blocks/siren/blast_door"), SOUND).attenuationDistance(ModItems.sirenTrackBlastDoorAlarm.get().range)).subtitle(ntmSubtitle("siren.blast_door"))) - add(SoundEvents.sirenTrackAPCSiren, definition().with(sound(ntm("blocks/siren/apc"), SOUND).attenuationDistance(ModItems.sirenTrackAPCSiren.get().range)).subtitle(ntmSubtitle("siren.apc"))) - add(SoundEvents.sirenTrackKlaxon, definition().with(sound(ntm("blocks/siren/klaxon"), SOUND).attenuationDistance(ModItems.sirenTrackKlaxon.get().range)).subtitle(ntmSubtitle("siren.klaxon"))) - add(SoundEvents.sirenTrackVaultDoorAlarm, definition().with(sound(ntm("blocks/siren/vault_door"), SOUND).attenuationDistance(ModItems.sirenTrackVaultDoorAlarm.get().range)).subtitle(ntmSubtitle("siren.vault_door"))) - add(SoundEvents.sirenTrackSecurityAlert, definition().with(sound(ntm("blocks/siren/security"), SOUND).attenuationDistance(ModItems.sirenTrackSecurityAlert.get().range)).subtitle(ntmSubtitle("siren.security"))) - add(SoundEvents.sirenTrackStandardSiren, definition().with(sound(ntm("blocks/siren/standard"), SOUND).attenuationDistance(ModItems.sirenTrackStandardSiren.get().range)).subtitle(ntmSubtitle("siren.standard"))) - add(SoundEvents.sirenTrackClassicSiren, definition().with(sound(ntm("blocks/siren/classic"), SOUND).attenuationDistance(ModItems.sirenTrackClassicSiren.get().range).stream()).subtitle(ntmSubtitle("siren.classic"))) - add(SoundEvents.sirenTrackBankAlarm, definition().with(sound(ntm("blocks/siren/bank"), SOUND).attenuationDistance(ModItems.sirenTrackBankAlarm.get().range)).subtitle(ntmSubtitle("siren.bank"))) - add(SoundEvents.sirenTrackBeepSiren, definition().with(sound(ntm("blocks/siren/beep"), SOUND).attenuationDistance(ModItems.sirenTrackBeepSiren.get().range)).subtitle(ntmSubtitle("siren.beep"))) - add(SoundEvents.sirenTrackContainerAlarm, definition().with(sound(ntm("blocks/siren/container"), SOUND).attenuationDistance(ModItems.sirenTrackContainerAlarm.get().range)).subtitle(ntmSubtitle("siren.container"))) - add(SoundEvents.sirenTrackSweepSiren, definition().with(sound(ntm("blocks/siren/sweep"), SOUND).attenuationDistance(ModItems.sirenTrackSweepSiren.get().range)).subtitle(ntmSubtitle("siren.sweep"))) - add(SoundEvents.sirenTrackMissileSiloSiren, definition().with(sound(ntm("blocks/siren/missile_silo"), SOUND).attenuationDistance(ModItems.sirenTrackMissileSiloSiren.get().range)).subtitle(ntmSubtitle("siren.missile_silo"))) - add(SoundEvents.sirenTrackAirRaidSiren, definition().with(sound(ntm("blocks/siren/air_raid"), SOUND).attenuationDistance(ModItems.sirenTrackAirRaidSiren.get().range).stream()).subtitle(ntmSubtitle("siren.air_raid"))) - add(SoundEvents.sirenTrackNostromoSelfDestruct, definition().with(sound(ntm("blocks/siren/nostromo_self_destruct"), SOUND).attenuationDistance(ModItems.sirenTrackNostromoSelfDestruct.get().range)).subtitle(ntmSubtitle("siren.nostromo_self_destruct"))) - add(SoundEvents.sirenTrackEASAlarmScreech, definition().with(sound(ntm("blocks/siren/eas"), SOUND).attenuationDistance(ModItems.sirenTrackEASAlarmScreech.get().range)).subtitle(ntmSubtitle("siren.eas"))) - add(SoundEvents.sirenTrackAPCPass, definition().with(sound(ntm("blocks/siren/apc_pass"), SOUND).attenuationDistance(ModItems.sirenTrackAPCPass.get().range)).subtitle(ntmSubtitle("siren.apc_pass"))) - add(SoundEvents.sirenTrackRazortrainHorn, definition().with(sound(ntm("blocks/siren/razortrain_horn"), SOUND).attenuationDistance(ModItems.sirenTrackRazortrainHorn.get().range)).subtitle(ntmSubtitle("siren.razortrain_horn"))) - add(SoundEvents.pressOperate, definition().with(sound(ntm("blocks/press/press_operate"), SOUND)).subtitle(ntmSubtitle("press.operate"))) - add(SoundEvents.randomBleep, definition().with(sound(ntm("random/bleep"), SOUND)).subtitle(ntmSubtitle("random.bleep"))) + add(SoundEvents.sirenTrackHatchSiren, definition().with(sound(ntm("blocks/siren/hatch")).attenuationDistance(ModItems.sirenTrackHatchSiren.get().range)).subtitle(ntmSubtitle("siren.hatch"))) + add(SoundEvents.sirenTrackAutopilotDisconnected, definition().with(sound(ntm("blocks/siren/autopilot_disconnected")).attenuationDistance(ModItems.sirenTrackAutopilotDisconnected.get().range)).subtitle(ntmSubtitle("siren.autopilot_disconnected"))) + add(SoundEvents.sirenTrackAMSSiren, definition().with(sound(ntm("blocks/siren/ams")).attenuationDistance(ModItems.sirenTrackAMSSiren.get().range)).subtitle(ntmSubtitle("siren.ams"))) + add(SoundEvents.sirenTrackBlastDoorAlarm, definition().with(sound(ntm("blocks/siren/blast_door")).attenuationDistance(ModItems.sirenTrackBlastDoorAlarm.get().range)).subtitle(ntmSubtitle("siren.blast_door"))) + add(SoundEvents.sirenTrackAPCSiren, definition().with(sound(ntm("blocks/siren/apc")).attenuationDistance(ModItems.sirenTrackAPCSiren.get().range)).subtitle(ntmSubtitle("siren.apc"))) + add(SoundEvents.sirenTrackKlaxon, definition().with(sound(ntm("blocks/siren/klaxon")).attenuationDistance(ModItems.sirenTrackKlaxon.get().range)).subtitle(ntmSubtitle("siren.klaxon"))) + add(SoundEvents.sirenTrackVaultDoorAlarm, definition().with(sound(ntm("blocks/siren/vault_door")).attenuationDistance(ModItems.sirenTrackVaultDoorAlarm.get().range)).subtitle(ntmSubtitle("siren.vault_door"))) + add(SoundEvents.sirenTrackSecurityAlert, definition().with(sound(ntm("blocks/siren/security")).attenuationDistance(ModItems.sirenTrackSecurityAlert.get().range)).subtitle(ntmSubtitle("siren.security"))) + add(SoundEvents.sirenTrackStandardSiren, definition().with(sound(ntm("blocks/siren/standard")).attenuationDistance(ModItems.sirenTrackStandardSiren.get().range)).subtitle(ntmSubtitle("siren.standard"))) + add(SoundEvents.sirenTrackClassicSiren, definition().with(sound(ntm("blocks/siren/classic")).attenuationDistance(ModItems.sirenTrackClassicSiren.get().range).stream()).subtitle(ntmSubtitle("siren.classic"))) + add(SoundEvents.sirenTrackBankAlarm, definition().with(sound(ntm("blocks/siren/bank")).attenuationDistance(ModItems.sirenTrackBankAlarm.get().range)).subtitle(ntmSubtitle("siren.bank"))) + add(SoundEvents.sirenTrackBeepSiren, definition().with(sound(ntm("blocks/siren/beep")).attenuationDistance(ModItems.sirenTrackBeepSiren.get().range)).subtitle(ntmSubtitle("siren.beep"))) + add(SoundEvents.sirenTrackContainerAlarm, definition().with(sound(ntm("blocks/siren/container")).attenuationDistance(ModItems.sirenTrackContainerAlarm.get().range)).subtitle(ntmSubtitle("siren.container"))) + add(SoundEvents.sirenTrackSweepSiren, definition().with(sound(ntm("blocks/siren/sweep")).attenuationDistance(ModItems.sirenTrackSweepSiren.get().range)).subtitle(ntmSubtitle("siren.sweep"))) + add(SoundEvents.sirenTrackMissileSiloSiren, definition().with(sound(ntm("blocks/siren/missile_silo")).attenuationDistance(ModItems.sirenTrackMissileSiloSiren.get().range)).subtitle(ntmSubtitle("siren.missile_silo"))) + add(SoundEvents.sirenTrackAirRaidSiren, definition().with(sound(ntm("blocks/siren/air_raid")).attenuationDistance(ModItems.sirenTrackAirRaidSiren.get().range).stream()).subtitle(ntmSubtitle("siren.air_raid"))) + add(SoundEvents.sirenTrackNostromoSelfDestruct, definition().with(sound(ntm("blocks/siren/nostromo_self_destruct")).attenuationDistance(ModItems.sirenTrackNostromoSelfDestruct.get().range)).subtitle(ntmSubtitle("siren.nostromo_self_destruct"))) + add(SoundEvents.sirenTrackEASAlarmScreech, definition().with(sound(ntm("blocks/siren/eas")).attenuationDistance(ModItems.sirenTrackEASAlarmScreech.get().range)).subtitle(ntmSubtitle("siren.eas"))) + add(SoundEvents.sirenTrackAPCPass, definition().with(sound(ntm("blocks/siren/apc_pass")).attenuationDistance(ModItems.sirenTrackAPCPass.get().range)).subtitle(ntmSubtitle("siren.apc_pass"))) + add(SoundEvents.sirenTrackRazortrainHorn, definition().with(sound(ntm("blocks/siren/razortrain_horn")).attenuationDistance(ModItems.sirenTrackRazortrainHorn.get().range)).subtitle(ntmSubtitle("siren.razortrain_horn"))) + add(SoundEvents.pressOperate, definition().with(sound(ntm("blocks/press/press_operate"))).subtitle(ntmSubtitle("press.operate"))) + add(SoundEvents.randomBleep, definition().with(sound(ntm("random/bleep"))).subtitle(ntmSubtitle("random.bleep"))) + add(SoundEvents.randomBoop, definition().with(sound(ntm("random/boop"))).subtitle(ntmSubtitle("random.boop"))) + add(SoundEvents.randomUnpack, definition().with(sound(ntm("random/unpack1")), sound(ntm("random/unpack2"))).subtitle(ntmSubtitle("random.unpack"))) } private fun ntm(location: String) = ResourceLocation(NuclearTech.MODID, location) diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/localisation/DeDeLanguageProvider.kt b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/localisation/DeDeLanguageProvider.kt index 7f432036..ae341ea5 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/localisation/DeDeLanguageProvider.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/localisation/DeDeLanguageProvider.kt @@ -17,6 +17,7 @@ class DeDeLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid add("itemGroup.${MODID}_templates", "NTM Fertigungsvorlagen") add("itemGroup.${MODID}_blocks", "NTM Erze und Blöcke") add("itemGroup.${MODID}_machines", "NTM Maschinen") + add("itemGroup.${MODID}_bombs", "NTM Bomben") add("itemGroup.${MODID}_consumables", "NTM Verbrauchsgüter") add("itemGroup.${MODID}_miscellaneous", "NTM Verschiedenes") @@ -168,6 +169,8 @@ class DeDeLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid addBlock(ModBlocks.electricFurnace, "Elektrischer Ofen") addBlock(ModBlocks.shredder, "Brecher") + addBlock(ModBlocks.fatMan, "Fat Man") + addItem(ModItems.uraniumIngot, "Uranbarren") addItem(ModItems.u233Ingot, "U233-Barren") addItem(ModItems.u235Ingot, "U235-Barren") @@ -760,6 +763,27 @@ class DeDeLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid addItem(ModItems.sirenTrackAPCPass, "APC Pass") addItem(ModItems.sirenTrackRazortrainHorn, "Razortrain Horn") + addItem(ModItems.bundleOfImplosionPropellant, "Implosions-Treibladung") + addItemDesc(ModItems.bundleOfImplosionPropellant, "Wird gebraucht für:\nFat Man\nIvy Mike\nTsar Bombe") + addItem(ModItems.bombIgniter, "Zünder") + addItemDesc(ModItems.bombIgniter, "Wird gebraucht für Fat Man") + addItem(ModItems.plutoniumCore, "Plutoniumkern") + addItemDesc(ModItems.plutoniumCore, "Wird gebraucht für:\nFat Man\nIvy Mike\nTsar Bombe") + addItem(ModItems.detonator, "Fernzünder") + addItemDesc(ModItems.detonator, "Shift-Rechtsklick auf einen Sprengstoff um die Position zu setzen,\nRechtsklick um zu sprengen!") + val detonatorDescriptionId = ModItems.detonator.get().descriptionId + add("$detonatorDescriptionId.tooltip_no_position_set", "Keine Position gesetzt!") + add("$detonatorDescriptionId.position_set", "Position gesetzt!") + add("$detonatorDescriptionId.error_position_not_set", "Die Position wurde noch nicht gesetzt!") + add("$detonatorDescriptionId.error_position_not_loaded", "Das Ziel ist momentan nicht in der Welt geladen!") + add("$detonatorDescriptionId.error_not_explosive", "Das Ziel ist kein gültiger Sprengstoff!") + add("$detonatorDescriptionId.error_invalid_tile_entity", "Serverfehler: Die TileEntity des Ziels ist ungültig!") + add("$detonatorDescriptionId.error_missing_components", "Der Sprengstoff ist unvollständig!") + add("$detonatorDescriptionId.error_detonation_prohibited", "Die Sprengung wurde aufgehalten!") + add("$detonatorDescriptionId.error_unknown", "Ein unbekannter Fehler ist während der Sprengung aufgetreten") + add("$detonatorDescriptionId.detonation_successful", "Sprengung!") + addItem(ModItems.fatManKit, "Fat Man Kit") + addItem(ModItems.oilDetector, "Ölvorkommen-Detektor") addItemDesc(ModItems.oilDetector, "Rechtsklick um nach Öl zu suchen.\nDetektor findet nur größere Vorkommen.") add(ModItems.oilDetector.get().descriptionId + ".below", "Ölvorkommen direkt untertage!") @@ -792,6 +816,8 @@ class DeDeLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid addContainerType(ContainerTypes.electricFurnaceContainer, "Elektrischer Ofen") addContainerType(ContainerTypes.shredderContainer, "Brecher") + addContainerType(ContainerTypes.fatManContainer, "Fat Man") + addSound(SoundEvents.sirenTrackHatchSiren, "Sirene läuft: Hatch Siren") addSound(SoundEvents.sirenTrackAutopilotDisconnected, "Sirene läuft: Autopilot Disconnected") addSound(SoundEvents.sirenTrackAMSSiren, "Sirene läuft: AMS Siren") @@ -814,6 +840,8 @@ class DeDeLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid addSound(SoundEvents.sirenTrackRazortrainHorn, "Sirene läuft: Razortrain Horn") addSound(SoundEvents.pressOperate, "Presse stampft") addSound(SoundEvents.randomBleep, "Gerät piepst") + addSound(SoundEvents.randomBoop, "Gerät boopt") + addSound(SoundEvents.randomUnpack, "Gegenstand ausgepackt") addDamageSource(DamageSources.radiation, "%1\$s starb an Strahlenvergiftung") addDamageSource(DamageSources.nuclearBlast, "%1\$s wurde von einer Atomexplosion weggeblasen") diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/localisation/EnUsLanguageProvider.kt b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/localisation/EnUsLanguageProvider.kt index 88e9ab23..2be1bcc9 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/localisation/EnUsLanguageProvider.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/localisation/EnUsLanguageProvider.kt @@ -21,6 +21,7 @@ class EnUsLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid add("itemGroup.${MODID}_templates", "NTM Templates") add("itemGroup.${MODID}_blocks", "NTM Ores and Blocks") add("itemGroup.${MODID}_machines", "NTM Machines") + add("itemGroup.${MODID}_bombs", "NTM Bombs") add("itemGroup.${MODID}_consumables", "NTM Consumables and Gear") add("itemGroup.${MODID}_miscellaneous", "NTM Miscellaneous Items") @@ -172,6 +173,8 @@ class EnUsLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid addBlock(ModBlocks.electricFurnace, "Electric Furnace") addBlock(ModBlocks.shredder, "Shredder") + addBlock(ModBlocks.fatMan, "Fat Man") + addItem(ModItems.uraniumIngot, "Uranium Ingot") addItem(ModItems.u233Ingot, "U233 Ingot") addItem(ModItems.u235Ingot, "U235 Ingot") @@ -764,6 +767,27 @@ class EnUsLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid addItem(ModItems.sirenTrackAPCPass, "APC Pass") addItem(ModItems.sirenTrackRazortrainHorn, "Razortrain Horn") + addItem(ModItems.bundleOfImplosionPropellant, "Bundle of Implosion Propellant") + addItemDesc(ModItems.bundleOfImplosionPropellant, "Used in:\nFat Man\nIvy Mike\nTsar Bomba") + addItem(ModItems.bombIgniter, "Bomb Igniter") + addItemDesc(ModItems.bombIgniter, "Used in Fat Man") + addItem(ModItems.plutoniumCore, "Plutonium Core") + addItemDesc(ModItems.plutoniumCore, "Used in:\nFat Man\nIvy Mike\nTsar Bomba") + addItem(ModItems.detonator, "Detonator") + addItemDesc(ModItems.detonator, "Shift-right-click an explosive to set the position,\nright-click to detonate!") + val detonatorDescriptionId = ModItems.detonator.get().descriptionId + add("$detonatorDescriptionId.tooltip_no_position_set", "No position set!") + add("$detonatorDescriptionId.position_set", "Position set!") + add("$detonatorDescriptionId.error_position_not_set", "Position has not been set!") + add("$detonatorDescriptionId.error_position_not_loaded", "Target is currently not loaded in the world!") + add("$detonatorDescriptionId.error_not_explosive", "Target is not a valid explosive!") + add("$detonatorDescriptionId.error_invalid_tile_entity", "Server Error: The target's TileEntity is invalid!") + add("$detonatorDescriptionId.error_missing_components", "The explosive is missing components!") + add("$detonatorDescriptionId.error_detonation_prohibited", "The detonation was prohibited!") + add("$detonatorDescriptionId.error_unknown", "An unknown error occurred during the detonation") + add("$detonatorDescriptionId.detonation_successful", "Detonated!") + addItem(ModItems.fatManKit, "Fat Man Kit") + addItem(ModItems.oilDetector, "Oil Reservoir Detector") addItemDesc(ModItems.oilDetector, "Right-click to scan for oil.\nDetector will only find large deposits.") add(ModItems.oilDetector.get().descriptionId + ".below", "Oil deposit directly below!") @@ -796,6 +820,8 @@ class EnUsLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid addContainerType(ContainerTypes.electricFurnaceContainer, "Electric Furnace") addContainerType(ContainerTypes.shredderContainer, "Shredder") + addContainerType(ContainerTypes.fatManContainer, "Fat Man") + addSound(SoundEvents.sirenTrackHatchSiren, "Siren running: Hatch Siren") addSound(SoundEvents.sirenTrackAutopilotDisconnected, "Siren running: Autopilot Disconnected") addSound(SoundEvents.sirenTrackAMSSiren, "Siren running: AMS Siren") @@ -818,6 +844,8 @@ class EnUsLanguageProvider(dataGenerator: DataGenerator) : NuclearLanguageProvid addSound(SoundEvents.sirenTrackRazortrainHorn, "Siren running: Razortrain Horn") addSound(SoundEvents.pressOperate, "Press stamps") addSound(SoundEvents.randomBleep, "Device bleeps") + addSound(SoundEvents.randomBoop, "Device boops") + addSound(SoundEvents.randomUnpack, "Item unpacked") addDamageSource(DamageSources.radiation, "%1\$s died from radiation poisoning") addDamageSource(DamageSources.nuclearBlast, "%1\$s was blown away by a nuclear explosion") diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/loot/BlockLoots.kt b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/loot/BlockLoots.kt index f9fef469..5ea3eef0 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/datagen/loot/BlockLoots.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/datagen/loot/BlockLoots.kt @@ -197,6 +197,8 @@ class BlockLoots : BlockLootTables() { dropSelf(ModBlocks.combustionGenerator.get()) dropSelf(ModBlocks.electricFurnace.get()) dropSelf(ModBlocks.shredder.get()) + + dropSelf(ModBlocks.fatMan.get()) } // automatically await a loot table for all blocks registered by this mod diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/energy/EnergyFormatter.kt b/src/main/kotlin/at/martinthedragon/nucleartech/energy/EnergyFormatter.kt index 542f28a4..92d18cce 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/energy/EnergyFormatter.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/energy/EnergyFormatter.kt @@ -8,10 +8,12 @@ object EnergyFormatter { FE(1.0, 0) } + @JvmOverloads @JvmStatic fun formatEnergy(amount: Int, unit: EnergyUnit = EnergyUnit.HE, withUnit: Boolean = false): String = formatEnergy(amount.toLong(), unit, withUnit) // dirty but performant implementation + @JvmOverloads @JvmStatic fun formatEnergy(amount: Long, unit: EnergyUnit = EnergyUnit.HE, withUnit: Boolean = false): String { val amountInUnit = amount * unit.ratio val valueForSuffix: Double diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/energy/EnergyFunctions.kt b/src/main/kotlin/at/martinthedragon/nucleartech/energy/EnergyFunctions.kt index b603eb41..d4e63dc2 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/energy/EnergyFunctions.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/energy/EnergyFunctions.kt @@ -11,6 +11,7 @@ import kotlin.math.min * * Negative values for [amount] are allowed, but may not always work and are unrecommended. */ +@JvmOverloads fun transferEnergy(from: IEnergyStorage, to: IEnergyStorage, amount: Int = Int.MAX_VALUE): Int = if (to.energyStored < to.maxEnergyStored) to.receiveEnergy(from.energyStored, true).let { maxPossible -> @@ -26,6 +27,7 @@ fun transferEnergy(from: IEnergyStorage, to: IEnergyStorage, amount: Int = Int.M * * Negative values for [amount] are allowed, but may not always work and are unrecommended. */ +@JvmOverloads fun transferEnergy(from: ItemStack, to: ItemStack, amount: Int = Int.MAX_VALUE): Int = from.getCapability(CapabilityEnergy.ENERGY).map { fromStorage -> to.getCapability(CapabilityEnergy.ENERGY).map { toStorage -> @@ -39,6 +41,7 @@ fun transferEnergy(from: ItemStack, to: ItemStack, amount: Int = Int.MAX_VALUE): * * Negative values for [amount] are allowed, but may not always work and are unrecommended. */ +@JvmOverloads fun transferEnergy(from: ItemStack, to: IEnergyStorage, amount: Int = Int.MAX_VALUE): Int = from.getCapability(CapabilityEnergy.ENERGY).map { itemStackEnergy -> transferEnergy(itemStackEnergy, to, amount) @@ -50,6 +53,7 @@ fun transferEnergy(from: ItemStack, to: IEnergyStorage, amount: Int = Int.MAX_VA * * Negative values for [amount] are allowed, but may not always work and are unrecommended. */ +@JvmOverloads fun transferEnergy(from: IEnergyStorage, to: ItemStack, amount: Int = Int.MAX_VALUE): Int = to.getCapability(CapabilityEnergy.ENERGY).map { itemStackEnergy -> transferEnergy(from, itemStackEnergy, amount) diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/entities/EntityTypes.kt b/src/main/kotlin/at/martinthedragon/nucleartech/entities/EntityTypes.kt index 9239e831..5c8e1587 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/entities/EntityTypes.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/entities/EntityTypes.kt @@ -1,8 +1,6 @@ package at.martinthedragon.nucleartech.entities import at.martinthedragon.nucleartech.RegistriesAndLifecycle.ENTITIES -import at.martinthedragon.nucleartech.explosions.FalloutRainEntity -import at.martinthedragon.nucleartech.explosions.NukeExplosionEntity import net.minecraft.entity.EntityClassification import net.minecraft.entity.EntityType import net.minecraftforge.fml.RegistryObject diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/entities/FalloutRainEntity.kt b/src/main/kotlin/at/martinthedragon/nucleartech/entities/FalloutRainEntity.kt index 140fbfd5..74b6e177 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/entities/FalloutRainEntity.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/entities/FalloutRainEntity.kt @@ -84,6 +84,7 @@ class FalloutRainEntity(entityType: EntityType, world: World) } block.`is`(Blocks.GRASS_BLOCK) || block.`is`(Blocks.PODZOL) -> level.setBlockAndUpdate(pos, ModBlocks.deadGrass.get().defaultBlockState()).also { return } block.`is`(Blocks.MYCELIUM) -> level.setBlockAndUpdate(pos, ModBlocks.glowingMycelium.get().defaultBlockState()).also { return } + // FIXME drops tall flowers, e.g. peonies block.block is IPlantable || block.block is IGrowable -> level.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()) block.`is`(Tags.Blocks.SAND) -> { if (random.nextInt(60) == 0) diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/explosions/NukeExplosionEntity.kt b/src/main/kotlin/at/martinthedragon/nucleartech/entities/NukeExplosionEntity.kt similarity index 91% rename from src/main/kotlin/at/martinthedragon/nucleartech/explosions/NukeExplosionEntity.kt rename to src/main/kotlin/at/martinthedragon/nucleartech/entities/NukeExplosionEntity.kt index 13e166b2..b74c3723 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/explosions/NukeExplosionEntity.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/entities/NukeExplosionEntity.kt @@ -1,9 +1,6 @@ -package at.martinthedragon.nucleartech.explosions +package at.martinthedragon.nucleartech.entities import at.martinthedragon.nucleartech.DamageSources -import at.martinthedragon.nucleartech.entities.EntityTypes -import at.martinthedragon.nucleartech.entities.FalloutRainEntity -import at.martinthedragon.nucleartech.entities.NukeExplosionRay import net.minecraft.entity.Entity import net.minecraft.entity.EntityType import net.minecraft.entity.passive.CatEntity @@ -17,6 +14,7 @@ import net.minecraft.util.math.RayTraceContext import net.minecraft.util.math.vector.Vector3d import net.minecraft.world.World import net.minecraftforge.fml.network.NetworkHooks +import kotlin.math.ceil class NukeExplosionEntity(entityType: EntityType, world: World) : Entity(entityType, world) { var strength = 0 @@ -122,5 +120,13 @@ class NukeExplosionEntity(entityType: EntityType, world: Wo entity is CatEntity -> false else -> true } + + fun create(world: World, pos: Vector3d, strength: Int): Boolean = if (world.isClientSide) false + else world.addFreshEntity(NukeExplosionEntity(EntityTypes.nukeExplosionEntity.get(), world).apply { + this@apply.strength = strength + speed = ceil(100000F / strength).toInt() + length = strength / 2 + moveTo(pos) + }) } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/entities/renderers/FalloutRainRenderer.kt b/src/main/kotlin/at/martinthedragon/nucleartech/entities/renderers/FalloutRainRenderer.kt index 7ed0c715..cbd6489d 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/entities/renderers/FalloutRainRenderer.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/entities/renderers/FalloutRainRenderer.kt @@ -1,6 +1,6 @@ package at.martinthedragon.nucleartech.entities.renderers -import at.martinthedragon.nucleartech.explosions.FalloutRainEntity +import at.martinthedragon.nucleartech.entities.FalloutRainEntity import net.minecraft.client.renderer.culling.ClippingHelper import net.minecraft.client.renderer.entity.EntityRenderer import net.minecraft.client.renderer.entity.EntityRendererManager diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/entities/renderers/NukeExplosionRenderer.kt b/src/main/kotlin/at/martinthedragon/nucleartech/entities/renderers/NukeExplosionRenderer.kt index 633403a0..32cac9fe 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/entities/renderers/NukeExplosionRenderer.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/entities/renderers/NukeExplosionRenderer.kt @@ -1,6 +1,6 @@ package at.martinthedragon.nucleartech.entities.renderers -import at.martinthedragon.nucleartech.explosions.NukeExplosionEntity +import at.martinthedragon.nucleartech.entities.NukeExplosionEntity import net.minecraft.client.renderer.culling.ClippingHelper import net.minecraft.client.renderer.entity.EntityRenderer import net.minecraft.client.renderer.entity.EntityRendererManager diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/explosions/IgnitableExplosive.kt b/src/main/kotlin/at/martinthedragon/nucleartech/explosions/IgnitableExplosive.kt index 23d1f8eb..7501fefb 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/explosions/IgnitableExplosive.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/explosions/IgnitableExplosive.kt @@ -1,5 +1,6 @@ package at.martinthedragon.nucleartech.explosions +import at.martinthedragon.nucleartech.tileentities.BombTileEntity import net.minecraft.util.math.BlockPos import net.minecraft.world.World @@ -12,6 +13,8 @@ interface IgnitableExplosive { Success, /** An explosive at the specified position cannot be found */ InvalidPosition, + /** An unexpected different [net.minecraft.tileentity.TileEntity] is at the position, or there isn't one present */ + InvalidTileEntity, /** The explosive is missing components required for detonation */ Incomplete, /** The explosive did not detonate because of some internal logic */ @@ -22,6 +25,26 @@ interface IgnitableExplosive { /** * Detonates the explosive at the given [pos] in a [world] and returns a [DetonationResult]. + * + * Defaults to accessing a [net.minecraft.tileentity.TileEntity] at [pos] and checking if it implements + * [at.martinthedragon.nucleartech.tileentities.BombTileEntity], and if so, tries to detonate it. */ - fun detonate(world: World, pos: BlockPos): DetonationResult + fun detonate(world: World, pos: BlockPos): DetonationResult { + if (world.isClientSide) return DetonationResult.Unknown + val blockState = world.getBlockState(pos) + return when { + blockState.block !is IgnitableExplosive -> DetonationResult.InvalidPosition + !blockState.hasTileEntity() -> DetonationResult.InvalidTileEntity + else -> { + val tileEntity = world.getBlockEntity(pos) ?: return DetonationResult.InvalidTileEntity + when { + tileEntity !is BombTileEntity<*> -> DetonationResult.InvalidTileEntity + !tileEntity.isComplete() -> DetonationResult.Incomplete + !tileEntity.canDetonate() -> DetonationResult.Prohibited + tileEntity.detonate() -> DetonationResult.Success + else -> DetonationResult.Unknown + } + } + } + } } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/items/BombKitItem.kt b/src/main/kotlin/at/martinthedragon/nucleartech/items/BombKitItem.kt new file mode 100644 index 00000000..89e5a55b --- /dev/null +++ b/src/main/kotlin/at/martinthedragon/nucleartech/items/BombKitItem.kt @@ -0,0 +1,69 @@ +package at.martinthedragon.nucleartech.items + +import at.martinthedragon.nucleartech.SoundEvents +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.item.Item +import net.minecraft.item.ItemStack +import net.minecraft.util.ActionResult +import net.minecraft.util.Hand +import net.minecraft.util.IItemProvider +import net.minecraft.util.SoundCategory +import net.minecraft.world.World +import java.util.function.Supplier +import kotlin.math.min +import net.minecraft.util.SoundEvents as MinecraftSounds + +class BombKitItem( + val items: Map, Int>, + val color: Int, + properties: Properties +) : Item(properties) { + init { + allKits += this + } + + override fun use(world: World, player: PlayerEntity, hand: Hand): ActionResult { + val stack = player.getItemInHand(hand).copy() + stack.shrink(1) + if (world.isClientSide) { + player.playSound(SoundEvents.randomUnpack.get(), 1F, 1F) + return ActionResult.success(stack) + } + + for ((itemSupplier, amount) in items) { + val item = itemSupplier.get() + var amountLeft = amount + while (true) { + if (amountLeft <= 0) break + + @Suppress("DEPRECATION") + val possibleAmount = min(item.asItem().maxStackSize, amountLeft) + val newStack = ItemStack(item, possibleAmount) + val successful = player.inventory.add(newStack) + if (successful && newStack.isEmpty) { + newStack.count = 1 + player.drop(newStack, false)?.makeFakeItem() + // cannot use player.playSound here because we already checked for server + player.level.playSound(null, player.x, player.y, player.z, + MinecraftSounds.ITEM_PICKUP, SoundCategory.PLAYERS, + .2F, ((player.random.nextFloat() - player.random.nextFloat()) * .7F + 1F) * 2F + ) + player.inventoryMenu.broadcastChanges() + } else { + val droppedStack = player.drop(newStack, false) + if (droppedStack != null) { + droppedStack.setNoPickUpDelay() + droppedStack.owner = player.uuid + } + } + + amountLeft -= possibleAmount + } + } + return ActionResult.consume(stack) + } + + companion object { + val allKits = mutableListOf() + } +} diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/items/CreativeNuclearExplosionSpawner.kt b/src/main/kotlin/at/martinthedragon/nucleartech/items/CreativeNuclearExplosionSpawner.kt index ff1ca3d9..cb5939b4 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/items/CreativeNuclearExplosionSpawner.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/items/CreativeNuclearExplosionSpawner.kt @@ -1,7 +1,6 @@ package at.martinthedragon.nucleartech.items -import at.martinthedragon.nucleartech.entities.EntityTypes -import at.martinthedragon.nucleartech.explosions.NukeExplosionEntity +import at.martinthedragon.nucleartech.entities.NukeExplosionEntity import at.martinthedragon.nucleartech.screens.UseCreativeNuclearExplosionSpawnerScreen import net.minecraft.client.Minecraft import net.minecraft.entity.player.PlayerEntity @@ -12,7 +11,6 @@ import net.minecraft.util.ActionResultType import net.minecraft.util.Hand import net.minecraft.util.Util import net.minecraft.world.World -import kotlin.math.ceil // more like destructive class CreativeNuclearExplosionSpawner(properties: Properties) : Item(properties) { @@ -22,12 +20,7 @@ class CreativeNuclearExplosionSpawner(properties: Properties) : Item(properties) if (player.isShiftKeyDown) { // quick detonation if (!world.isClientSide) { if (player.canUseGameMasterBlocks()) { - world.addFreshEntity(NukeExplosionEntity(EntityTypes.nukeExplosionEntity.get(), world).apply { - strength = 200 - speed = ceil(100000F / strength).toInt() - length = strength / 2 - moveTo(player.position()) - }) + NukeExplosionEntity.create(world, player.position(), 200) } else { player.sendMessage(UseCreativeNuclearExplosionSpawnerScreen.ERR_INSUFFICIENT_PERMISSION, Util.NIL_UUID) return ActionResult(ActionResultType.PASS, item) diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/items/Detonator.kt b/src/main/kotlin/at/martinthedragon/nucleartech/items/Detonator.kt new file mode 100644 index 00000000..d922c60d --- /dev/null +++ b/src/main/kotlin/at/martinthedragon/nucleartech/items/Detonator.kt @@ -0,0 +1,92 @@ +package at.martinthedragon.nucleartech.items + +import at.martinthedragon.nucleartech.SoundEvents +import at.martinthedragon.nucleartech.explosions.IgnitableExplosive +import net.minecraft.client.util.ITooltipFlag +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.item.Item +import net.minecraft.item.ItemStack +import net.minecraft.item.ItemUseContext +import net.minecraft.util.ActionResult +import net.minecraft.util.ActionResultType +import net.minecraft.util.Hand +import net.minecraft.util.math.BlockPos +import net.minecraft.util.text.ITextComponent +import net.minecraft.util.text.StringTextComponent +import net.minecraft.util.text.TextFormatting +import net.minecraft.util.text.TranslationTextComponent +import net.minecraft.world.World + +class Detonator(properties: Properties) : Item(properties) { + override fun useOn(context: ItemUseContext): ActionResultType { + val player = context.player + val world = context.level + + if (player != null && player.isSecondaryUseActive) { + val pos = context.clickedPos + val block = world.getBlockState(pos) + if (block.block !is IgnitableExplosive) return ActionResultType.FAIL + if (!world.isClientSide) { + val detonatorTag = context.itemInHand.orCreateTag + detonatorTag.putInt("ExplosivePosX", pos.x) + detonatorTag.putInt("ExplosivePosY", pos.y) + detonatorTag.putInt("ExplosivePosZ", pos.z) + } + player.playSound(SoundEvents.randomBoop.get(), 2F, 1F) + if (world.isClientSide) player.displayClientMessage(TranslationTextComponent("$descriptionId.position_set").withStyle(TextFormatting.GREEN), true) + return ActionResultType.sidedSuccess(world.isClientSide) + } + + return ActionResultType.PASS + } + + override fun use(world: World, player: PlayerEntity, hand: Hand): ActionResult { + player.playSound(SoundEvents.randomBleep.get(), 1F, 1F) + val itemStack = player.getItemInHand(hand) + if (!world.isClientSide) processUse(itemStack, world, player) + return ActionResult.sidedSuccess(itemStack, world.isClientSide) + } + + private fun processUse(stack: ItemStack, world: World, player: PlayerEntity) { + if (!isPositionSet(stack)) { + player.displayClientMessage(TranslationTextComponent("$descriptionId.error_position_not_set").withStyle(TextFormatting.RED), true) + return + } + val detonatorTag = stack.orCreateTag + val posX = detonatorTag.getInt("ExplosivePosX") + val posY = detonatorTag.getInt("ExplosivePosY") + val posZ = detonatorTag.getInt("ExplosivePosZ") + val pos = BlockPos(posX, posY, posZ) + if (!world.isLoaded(pos)) { // TODO make configurable + player.displayClientMessage(TranslationTextComponent("$descriptionId.error_position_not_loaded").withStyle(TextFormatting.RED), true) + return + } + val block = world.getBlockState(pos).block + if (block !is IgnitableExplosive) { + player.displayClientMessage(TranslationTextComponent("$descriptionId.error_not_explosive").withStyle(TextFormatting.RED), true) + return + } + val messageToSend = when (block.detonate(world, pos)) { + IgnitableExplosive.DetonationResult.Success -> TranslationTextComponent("$descriptionId.detonation_successful").withStyle(TextFormatting.GREEN) + IgnitableExplosive.DetonationResult.InvalidPosition -> TranslationTextComponent("$descriptionId.error_not_explosive").withStyle(TextFormatting.RED) + IgnitableExplosive.DetonationResult.InvalidTileEntity -> TranslationTextComponent("$descriptionId.error_invalid_tile_entity").withStyle(TextFormatting.RED) + IgnitableExplosive.DetonationResult.Incomplete -> TranslationTextComponent("$descriptionId.error_missing_components").withStyle(TextFormatting.RED) + IgnitableExplosive.DetonationResult.Prohibited -> TranslationTextComponent("$descriptionId.error_detonation_prohibited").withStyle(TextFormatting.RED) + IgnitableExplosive.DetonationResult.Unknown -> TranslationTextComponent("$descriptionId.error_unknown").withStyle(TextFormatting.RED) + } + player.displayClientMessage(messageToSend, true) + } + + private fun isPositionSet(stack: ItemStack): Boolean = stack.hasTag() && stack.orCreateTag.contains("ExplosivePosX") + + override fun appendHoverText(stack: ItemStack, worldIn: World?, tooltip: MutableList, flagIn: ITooltipFlag) { + autoTooltip(stack, tooltip) + tooltip += if (isPositionSet(stack)) { + val tag = stack.orCreateTag + val x = tag.getInt("ExplosivePosX") + val y = tag.getInt("ExplosivePosY") + val z = tag.getInt("ExplosivePosZ") + StringTextComponent("$x, $y, $z").withStyle(TextFormatting.GRAY) + } else TranslationTextComponent("$descriptionId.tooltip_no_position_set").withStyle(TextFormatting.DARK_RED) + } +} diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/items/EffectItem.kt b/src/main/kotlin/at/martinthedragon/nucleartech/items/EffectItem.kt index 3a64cadb..a1f41afb 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/items/EffectItem.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/items/EffectItem.kt @@ -23,9 +23,10 @@ open class EffectItem(val effectTypes: List, properties: Properties } override fun appendHoverText(stack: ItemStack, worldIn: World?, tooltip: MutableList, flagIn: ITooltipFlag) { - for (effectType in effectTypes) { - tooltip.add(effectType.effectInfo) - } + // separate from other tooltip + if (tooltip.size > 1) tooltip.add(StringTextComponent.EMPTY) + + for (effectType in effectTypes) tooltip.add(effectType.effectInfo) if (radPerSecond > 0f) tooltip.add(StringTextComponent("${radPerSecond * stack.count} RAD/s").withStyle(TextFormatting.YELLOW)) } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/networking/CraftMachineTemplateMessage.kt b/src/main/kotlin/at/martinthedragon/nucleartech/networking/CraftMachineTemplateMessage.kt index e4cc860e..4b7681aa 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/networking/CraftMachineTemplateMessage.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/networking/CraftMachineTemplateMessage.kt @@ -83,6 +83,7 @@ class CraftMachineTemplateMessage(val result: ItemStack) : NetworkMessage> registerMessage(message: KClass, decoder: (PacketBuffer) -> T, networkDirection: NetworkDirection? = null): NuclearPacketHandler { + private fun > registerMessage(message: KClass, decoder: (PacketBuffer) -> T, networkDirection: NetworkDirection? = null): NuclearPacketHandler { @Suppress("INACCESSIBLE_TYPE") INSTANCE.registerMessage( currentPacketID++, @@ -38,7 +40,7 @@ object NuclearPacketHandler { return this } - inline fun > registerMessage(noinline decoder: (PacketBuffer) -> T, networkDirection: NetworkDirection? = null) = + private inline fun > registerMessage(noinline decoder: (PacketBuffer) -> T, networkDirection: NetworkDirection? = null) = registerMessage(T::class, decoder, networkDirection) } diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/networking/SpawnNuclearExplosionMessage.kt b/src/main/kotlin/at/martinthedragon/nucleartech/networking/SpawnNuclearExplosionMessage.kt index fb26744d..efa2151f 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/networking/SpawnNuclearExplosionMessage.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/networking/SpawnNuclearExplosionMessage.kt @@ -1,7 +1,7 @@ package at.martinthedragon.nucleartech.networking import at.martinthedragon.nucleartech.entities.EntityTypes -import at.martinthedragon.nucleartech.explosions.NukeExplosionEntity +import at.martinthedragon.nucleartech.entities.NukeExplosionEntity import at.martinthedragon.nucleartech.screens.UseCreativeNuclearExplosionSpawnerScreen import net.minecraft.network.PacketBuffer import net.minecraft.util.Util @@ -50,6 +50,7 @@ class SpawnNuclearExplosionMessage( } companion object { + @JvmStatic fun decode(packetBuffer: PacketBuffer) = SpawnNuclearExplosionMessage( packetBuffer.readInt(), packetBuffer.readBoolean(), diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/screens/FatManScreen.kt b/src/main/kotlin/at/martinthedragon/nucleartech/screens/FatManScreen.kt new file mode 100644 index 00000000..3da30996 --- /dev/null +++ b/src/main/kotlin/at/martinthedragon/nucleartech/screens/FatManScreen.kt @@ -0,0 +1,35 @@ +package at.martinthedragon.nucleartech.screens + +import at.martinthedragon.nucleartech.NuclearTech +import at.martinthedragon.nucleartech.containers.FatManContainer +import com.mojang.blaze3d.matrix.MatrixStack +import net.minecraft.client.gui.screen.inventory.ContainerScreen +import net.minecraft.entity.player.PlayerInventory +import net.minecraft.util.ResourceLocation +import net.minecraft.util.text.ITextComponent + +class FatManScreen( + container: FatManContainer, + playerInventory: PlayerInventory, + title: ITextComponent +) : ContainerScreen(container, playerInventory, title) { + private val texture = ResourceLocation(NuclearTech.MODID, "textures/gui/fat_man.png") + + override fun render(matrix: MatrixStack, mouseX: Int, mouseY: Int, partialTicks: Float) { + renderBackground(matrix) + super.render(matrix, mouseX, mouseY, partialTicks) + renderTooltip(matrix, mouseX, mouseY) + } + + override fun renderBg(matrix: MatrixStack, partialTicks: Float, mouseX: Int, mouseY: Int) { + minecraft!!.textureManager.bind(texture) + blit(matrix, leftPos, topPos, 0, 0, xSize, ySize) + + val bombCompletion = menu.getBombCompletion() + if (bombCompletion shr 5 and 1 == 1) blit(matrix, leftPos + 82, topPos + 19, 176, 0, 24, 24) + if (bombCompletion shr 4 and 1 == 1) blit(matrix, leftPos + 106, topPos + 19, 200, 0, 24, 24) + if (bombCompletion shr 3 and 1 == 1) blit(matrix, leftPos + 82, topPos + 43, 176, 24, 24, 24) + if (bombCompletion shr 2 and 1 == 1) blit(matrix, leftPos + 106, topPos + 43, 200, 24, 24, 24) + if (bombCompletion shr 6 and 1 == 1) blit(matrix, leftPos + 134, topPos + 35, 176, 48, 16, 16) + } +} diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/BombTileEntity.kt b/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/BombTileEntity.kt new file mode 100644 index 00000000..dc9f1fce --- /dev/null +++ b/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/BombTileEntity.kt @@ -0,0 +1,50 @@ +package at.martinthedragon.nucleartech.tileentities + +import net.minecraft.inventory.IInventory +import net.minecraft.item.Item +import net.minecraft.tileentity.TileEntity +import java.util.function.Supplier + +// Type-argument T is just used here to make sure the interface gets implemented by an actual TileEntity +interface BombTileEntity : IInventory + where T : TileEntity, + T : IInventory, + T : BombTileEntity +{ + val requiresComponentsToDetonate: Boolean get() = getRequiredDetonationComponents().isNotEmpty() + + /** Returns a Map of all required components */ + fun getRequiredDetonationComponents(): Map, Int> + + /** + * Returns `true` when all items are contained in the inventory. + * + * @exception[NullPointerException] When called before items are registered. + */ + fun isComplete(): Boolean { + return when { + !requiresComponentsToDetonate -> true + isEmpty -> false + else -> { + val componentMap = getRequiredDetonationComponents().mapKeys { (supplier, _) -> supplier.get() }.toMutableMap() + // for each matching component, subtract the amount contained from the map + for (i in 0 until containerSize) getItem(i).let { itemStack -> + if (!itemStack.isEmpty && componentMap[itemStack.item] != null) + componentMap[itemStack.item] = componentMap.getValue(itemStack.item) - itemStack.count + } + // if all map values are equal or below 0, then all components are present + return componentMap.values.all { it <= 0 } + } + } + } + + /** + * Checks whether the explosive can be detonated + * + * Can be used to implement extra checks + */ + fun canDetonate() = isComplete() + + /** Detonates the explosive and returns whether it was successful */ + fun detonate(): Boolean +} diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/FatManTileEntity.kt b/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/FatManTileEntity.kt new file mode 100644 index 00000000..3910533f --- /dev/null +++ b/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/FatManTileEntity.kt @@ -0,0 +1,131 @@ +package at.martinthedragon.nucleartech.tileentities + +import at.martinthedragon.nucleartech.ModItems +import at.martinthedragon.nucleartech.NuclearTech +import at.martinthedragon.nucleartech.blocks.FatMan +import at.martinthedragon.nucleartech.containers.FatManContainer +import at.martinthedragon.nucleartech.entities.NukeExplosionEntity +import net.minecraft.block.BlockState +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.entity.player.PlayerInventory +import net.minecraft.inventory.ItemStackHelper +import net.minecraft.item.ItemStack +import net.minecraft.nbt.CompoundNBT +import net.minecraft.tileentity.LockableTileEntity +import net.minecraft.util.* +import net.minecraft.util.math.vector.Vector3d +import net.minecraft.util.text.TranslationTextComponent +import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.util.LazyOptional +import net.minecraftforge.items.CapabilityItemHandler +import net.minecraftforge.items.ItemStackHandler + +class FatManTileEntity : LockableTileEntity(TileEntityTypes.fatManTileEntityType.get()), BombTileEntity { + // Bits in following order: Is Ready?, Propellant 1, Propellant 2, Propellant 3, Propellant 4, Bomb Igniter, Plutonium Core + private var bombCompletion = 0b0 + + private val dataAccess = object : IIntArray { + override fun get(index: Int): Int = when (index) { + 0 -> bombCompletion + else -> 0 + } + + override fun set(index: Int, value: Int) { + when (index) { + 0 -> bombCompletion = value + } + } + + override fun getCount() = 1 + } + + private val items = NonNullList.withSize(6, ItemStack.EMPTY) + private val inventory = object : ItemStackHandler(items) { + override fun onContentsChanged(slot: Int) { + setChanged() + } + + override fun isItemValid(slot: Int, stack: ItemStack): Boolean = when (slot) { + in 0..3 -> stack.item == ModItems.bundleOfImplosionPropellant.get() + 4 -> stack.item == ModItems.bombIgniter.get() + 5 -> stack.item == ModItems.plutoniumCore.get() + else -> false + } + } + + override fun load(blockState: BlockState, nbt: CompoundNBT) { + super.load(blockState, nbt) + items.clear() + ItemStackHelper.loadAllItems(nbt, items) + updateBombCompletion() + } + + override fun save(nbt: CompoundNBT): CompoundNBT { + super.save(nbt) + ItemStackHelper.saveAllItems(nbt, items) + return nbt + } + + override fun getRequiredDetonationComponents() = FatMan.requiredComponents + + // TODO gr4ph1x + override fun detonate(): Boolean = if (level != null && !level!!.isClientSide) { + setRemoved() + level!!.removeBlock(worldPosition, false) + level!!.playSound(null, worldPosition, SoundEvents.GENERIC_EXPLODE, SoundCategory.BLOCKS, 1F, level!!.random.nextFloat() * .1F + .9F) + NukeExplosionEntity.create( + level!!, + Vector3d(blockPos.x + .5, blockPos.y + .5, blockPos.z + .5), + 350 // TODO config + ) + } else false + + override fun setChanged() { + updateBombCompletion() + super.setChanged() + } + + private fun updateBombCompletion() { + var result = 0 + if (getItem(0).let { it.item == ModItems.bundleOfImplosionPropellant.get() && !it.isEmpty }) result = result or 0b100000 + if (getItem(1).let { it.item == ModItems.bundleOfImplosionPropellant.get() && !it.isEmpty }) result = result or 0b10000 + if (getItem(2).let { it.item == ModItems.bundleOfImplosionPropellant.get() && !it.isEmpty }) result = result or 0b1000 + if (getItem(3).let { it.item == ModItems.bundleOfImplosionPropellant.get() && !it.isEmpty }) result = result or 0b100 + if (getItem(4).let { it.item == ModItems.bombIgniter.get() && !it.isEmpty }) result = result or 0b10 + if (getItem(5).let { it.item == ModItems.plutoniumCore.get() && !it.isEmpty }) result = result or 0b1 + if (result == 0b111111) result = 0b1111111 + bombCompletion = result + } + + override fun clearContent() { items.clear() } + override fun getContainerSize() = items.size + override fun isEmpty() = items.all { it.isEmpty } + override fun getItem(slot: Int) = items[slot] + override fun removeItem(slot: Int, amount: Int): ItemStack = ItemStackHelper.removeItem(items, slot, amount) + override fun removeItemNoUpdate(slot: Int): ItemStack = ItemStackHelper.takeItem(items, slot) + override fun setItem(slot: Int, itemStack: ItemStack) { + items[slot] = itemStack + if (itemStack.count > maxStackSize) + itemStack.count = maxStackSize + } + override fun stillValid(player: PlayerEntity) = if (level!!.getBlockEntity(worldPosition) != this) false + else player.distanceToSqr(worldPosition.x + .5, worldPosition.y + .5, worldPosition.z + .5) <= 64 + + override fun createMenu(windowID: Int, playerInventory: PlayerInventory) = FatManContainer(windowID, playerInventory, this, dataAccess) + + override fun getDefaultName() = TranslationTextComponent("container.${NuclearTech.MODID}.fat_man") + + private var inventoryCapability = LazyOptional.of(this::inventory) + + override fun getCapability(cap: Capability, direction: Direction?): LazyOptional { + if (!remove && cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + return inventoryCapability.cast() + } + return super.getCapability(cap, direction) + } + + override fun invalidateCaps() { + super.invalidateCaps() + inventoryCapability.invalidate() + } +} diff --git a/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/TileEntityTypes.kt b/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/TileEntityTypes.kt index a13f30d7..89a1daf3 100644 --- a/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/TileEntityTypes.kt +++ b/src/main/kotlin/at/martinthedragon/nucleartech/tileentities/TileEntityTypes.kt @@ -2,30 +2,20 @@ package at.martinthedragon.nucleartech.tileentities import at.martinthedragon.nucleartech.ModBlocks import at.martinthedragon.nucleartech.RegistriesAndLifecycle.TILE_ENTITIES +import net.minecraft.tileentity.TileEntity import net.minecraft.tileentity.TileEntityType import net.minecraftforge.fml.RegistryObject @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") object TileEntityTypes { - val safeTileEntityType: RegistryObject> = TILE_ENTITIES.register("safe") { - TileEntityType.Builder.of(::SafeTileEntity, ModBlocks.safe.get()).build(null) - } - val sirenTileEntityType: RegistryObject> = TILE_ENTITIES.register("siren") { - TileEntityType.Builder.of(::SirenTileEntity, ModBlocks.siren.get()).build(null) - } - val steamPressHeadTileEntityType: RegistryObject> = TILE_ENTITIES.register("steam_press_top") { - TileEntityType.Builder.of(::SteamPressTopTileEntity, ModBlocks.steamPressTop.get()).build(null) - } - val blastFurnaceTileEntityType: RegistryObject> = TILE_ENTITIES.register("blast_furnace") { - TileEntityType.Builder.of(::BlastFurnaceTileEntity, ModBlocks.blastFurnace.get()).build(null) - } - val combustionGeneratorTileEntityType: RegistryObject> = TILE_ENTITIES.register("combustion_generator") { - TileEntityType.Builder.of(::CombustionGeneratorTileEntity, ModBlocks.combustionGenerator.get()).build(null) - } - val electricFurnaceTileEntityType: RegistryObject> = TILE_ENTITIES.register("electric_furnace") { - TileEntityType.Builder.of(::ElectricFurnaceTileEntity, ModBlocks.electricFurnace.get()).build(null) - } - val shredderTileEntityType: RegistryObject> = TILE_ENTITIES.register("shredder") { - TileEntityType.Builder.of(::ShredderTileEntity, ModBlocks.shredder.get()).build(null) - } + val safeTileEntityType: RegistryObject> = TILE_ENTITIES.register("safe") { TileEntityType.Builder.of(::SafeTileEntity, ModBlocks.safe.get()).build() } + val sirenTileEntityType: RegistryObject> = TILE_ENTITIES.register("siren") { TileEntityType.Builder.of(::SirenTileEntity, ModBlocks.siren.get()).build() } + val steamPressHeadTileEntityType: RegistryObject> = TILE_ENTITIES.register("steam_press_top") { TileEntityType.Builder.of(::SteamPressTopTileEntity, ModBlocks.steamPressTop.get()).build() } + val blastFurnaceTileEntityType: RegistryObject> = TILE_ENTITIES.register("blast_furnace") { TileEntityType.Builder.of(::BlastFurnaceTileEntity, ModBlocks.blastFurnace.get()).build() } + val combustionGeneratorTileEntityType: RegistryObject> = TILE_ENTITIES.register("combustion_generator") { TileEntityType.Builder.of(::CombustionGeneratorTileEntity, ModBlocks.combustionGenerator.get()).build() } + val electricFurnaceTileEntityType: RegistryObject> = TILE_ENTITIES.register("electric_furnace") { TileEntityType.Builder.of(::ElectricFurnaceTileEntity, ModBlocks.electricFurnace.get()).build() } + val shredderTileEntityType: RegistryObject> = TILE_ENTITIES.register("shredder") { TileEntityType.Builder.of(::ShredderTileEntity, ModBlocks.shredder.get()).build() } + val fatManTileEntityType: RegistryObject> = TILE_ENTITIES.register("fat_man") { TileEntityType.Builder.of(::FatManTileEntity, ModBlocks.fatMan.get()).build() } + + private fun TileEntityType.Builder.build() = build(null) } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 33714098..c3a8e2e5 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -9,7 +9,7 @@ public net.minecraft.world.server.ChunkManager$EntityTracker field_219403_c # en public net.minecraft.inventory.container.Container func_75135_a(Lnet/minecraft/item/ItemStack;IIZ)Z # moveItemStackTo # For translation key validation -public net.minecraftforge.common.data.LanguageProvider data +protected net.minecraftforge.common.data.LanguageProvider data # For Nuclear Creeper protected net.minecraft.entity.monster.CreeperEntity field_82225_f # maxSwell diff --git a/src/main/resources/assets/nucleartech/models/block/fat_man/fat_man.mtl b/src/main/resources/assets/nucleartech/models/block/fat_man/fat_man.mtl new file mode 100644 index 00000000..800b2e1b --- /dev/null +++ b/src/main/resources/assets/nucleartech/models/block/fat_man/fat_man.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'Fat Man.blend' +# Material Count: 1 + +newmtl Fat_Man +# Ns 0.000000 +# Ka 1.000000 1.000000 1.000000 +# Kd 0.800000 0.800000 0.800000 +# Ks 0.500000 0.500000 0.500000 +# Ke 0.000000 0.000000 0.000000 +# Ni 1.450000 +# d 1.000000 +# illum 2 +map_Kd #fat_man_texture diff --git a/src/main/resources/assets/nucleartech/models/block/fat_man/fat_man.obj b/src/main/resources/assets/nucleartech/models/block/fat_man/fat_man.obj new file mode 100644 index 00000000..c1e360f1 --- /dev/null +++ b/src/main/resources/assets/nucleartech/models/block/fat_man/fat_man.obj @@ -0,0 +1,811 @@ +# Blender v2.93.1 OBJ File: 'Fat Man.blend' +# www.blender.org +mtllib fat_man.mtl +o Fat_Man +v 0.499999 0.750000 -0.499999 +v 0.227034 0.838692 -0.423879 +v 0.227034 0.661309 -0.423879 +v 0.331297 0.982198 -0.423879 +v 0.331297 0.517802 -0.423879 +v 0.499999 1.037013 -0.423879 +v 0.499999 0.462988 -0.423879 +v 0.668701 0.982198 -0.423879 +v 0.668701 0.517802 -0.423879 +v 0.772964 0.838692 -0.423879 +v 0.772964 0.661309 -0.423879 +v 0.149999 1.100000 -0.350000 +v 0.149999 1.000000 -0.350000 +v 0.149999 0.500000 -0.350000 +v 0.150000 0.400000 -0.350000 +v 0.249999 1.100000 -0.350000 +v 0.249999 1.000000 -0.350000 +v 0.249999 0.500000 -0.350000 +v 0.250000 0.400000 -0.350000 +v 0.749999 1.100000 -0.350000 +v 0.749999 1.000000 -0.350000 +v 0.750000 0.500000 -0.350000 +v 0.750000 0.400000 -0.350000 +v 0.849999 1.100000 -0.350000 +v 0.849999 1.000000 -0.350000 +v 0.849999 0.500000 -0.350000 +v 0.850000 0.400000 -0.350000 +v -0.004375 0.913881 -0.207106 +v -0.004374 0.586119 -0.207106 +v 0.188279 1.179046 -0.207106 +v 0.188280 0.320954 -0.207106 +v 0.499999 1.280330 -0.207106 +v 0.500000 0.219670 -0.207106 +v 0.811719 1.179046 -0.207106 +v 0.811720 0.320954 -0.207106 +v 1.004374 0.913881 -0.207106 +v 1.004374 0.586119 -0.207106 +v 0.150000 1.100000 -0.050000 +v 0.150000 1.000000 -0.050000 +v 0.150000 0.500000 -0.050000 +v 0.150000 0.400000 -0.050000 +v 0.250000 1.100000 -0.050000 +v 0.250000 1.000000 -0.050000 +v 0.250000 0.500000 -0.050000 +v 0.250000 0.400000 -0.050000 +v 0.750000 1.100000 -0.050000 +v 0.750000 1.000000 -0.050000 +v 0.750000 0.500000 -0.050000 +v 0.750000 0.400000 -0.050000 +v 0.850000 1.100000 -0.050000 +v 0.850000 1.000000 -0.050000 +v 0.850000 0.500000 -0.050000 +v 0.850000 0.400000 -0.050000 +v -0.158996 0.964121 0.117317 +v -0.158996 0.535880 0.117317 +v 0.092718 1.310576 0.117317 +v 0.092718 0.189425 0.117317 +v 0.500000 1.442910 0.117317 +v 0.500000 0.057091 0.117317 +v 0.907282 1.310576 0.117317 +v 0.907282 0.189425 0.117317 +v 1.158996 0.964121 0.117317 +v 1.158996 0.535880 0.117317 +v -0.213292 0.981763 0.500001 +v -0.213292 0.518238 0.500001 +v 0.059161 1.356763 0.500001 +v 0.059161 0.143238 0.500001 +v 0.500000 1.500000 0.500001 +v 0.500000 0.000000 0.500001 +v 0.940839 1.356763 0.500001 +v 0.940839 0.143238 0.500001 +v 1.213292 0.981763 0.500001 +v 1.213292 0.518238 0.500001 +v -0.158996 0.964121 0.882684 +v -0.158996 0.535880 0.882684 +v 0.092718 1.310576 0.882684 +v 0.092718 0.189425 0.882684 +v 0.500000 1.442910 0.882684 +v 0.500000 0.057091 0.882684 +v 0.907282 1.310576 0.882684 +v 0.907282 0.189425 0.882684 +v 1.158996 0.964121 0.882684 +v 1.158996 0.535880 0.882684 +v 0.350000 0.750000 1.400000 +v 0.393934 0.856066 1.400000 +v 0.393934 0.643934 1.399999 +v 0.500000 0.900000 1.400000 +v 0.500000 0.600000 1.399999 +v 0.606066 0.856066 1.400000 +v 0.606066 0.643934 1.399999 +v 0.650000 0.750000 1.400000 +v -0.250000 1.500000 1.800000 +v -0.150000 1.400000 1.800000 +v -0.249999 -0.000000 1.800000 +v -0.149999 0.750000 1.800000 +v -0.149999 0.100000 1.800000 +v 0.214684 0.842705 1.800000 +v 0.214684 0.657295 1.800000 +v 0.323664 0.992705 1.800000 +v 0.323666 0.507295 1.800000 +v 0.500000 1.400000 1.800000 +v 0.500000 1.050000 1.800000 +v 0.500001 0.450000 1.800000 +v 0.500001 0.100000 1.800000 +v 0.676335 0.992705 1.800000 +v 0.676337 0.507295 1.800000 +v 0.785318 0.842705 1.800000 +v 0.785318 0.657295 1.800000 +v 1.150000 1.400000 1.800000 +v 1.150001 0.750000 1.800000 +v 1.250000 1.500000 1.800000 +v 1.150001 0.100000 1.800000 +v 1.250001 0.000000 1.800000 +v 0.150001 1.100000 2.200000 +v 0.150001 0.400000 2.200000 +v 0.214684 0.842705 2.200000 +v 0.214684 0.657295 2.200000 +v 0.323665 0.992705 2.200000 +v 0.350001 0.750000 2.200000 +v 0.323665 0.507295 2.200000 +v 0.393935 0.856066 2.200000 +v 0.393935 0.643934 2.200000 +v 0.500000 1.050000 2.200000 +v 0.500001 0.900000 2.200000 +v 0.500001 0.600000 2.200000 +v 0.500001 0.450000 2.200000 +v 0.606067 0.856066 2.200000 +v 0.606067 0.643934 2.200000 +v 0.676336 0.992705 2.200000 +v 0.650001 0.750000 2.200000 +v 0.676337 0.507295 2.200000 +v 0.785318 0.842705 2.200000 +v 0.785318 0.657295 2.200000 +v 0.850001 1.100000 2.200000 +v 0.850001 0.400000 2.200000 +v -0.249999 1.500000 2.400000 +v -0.149999 1.400000 2.400000 +v -0.249999 -0.000000 2.400000 +v -0.149999 0.750000 2.400000 +v -0.149999 0.100000 2.400000 +v 0.500001 1.400000 2.400000 +v 0.500001 0.100000 2.400000 +v 1.150001 1.400000 2.400000 +v 1.150001 0.750000 2.400000 +v 1.250001 1.500000 2.400000 +v 1.150001 0.100000 2.400000 +v 1.250001 0.000000 2.400000 +v 0.500000 0.900000 1.400000 +v 0.393934 0.643934 1.399999 +v 0.393934 0.856066 1.400000 +v 0.350000 0.750000 1.400000 +v 0.500000 0.600000 1.399999 +v 0.606066 0.856066 1.400000 +v 0.606066 0.643934 1.399999 +v 0.650000 0.750000 1.400000 +v -0.150000 1.400000 1.800000 +v -0.149999 0.750000 1.800000 +v -0.149999 0.100000 1.800000 +v 0.500000 1.400000 1.800000 +v 0.500001 0.100000 1.800000 +v 1.150000 1.400000 1.800000 +v 1.150001 0.750000 1.800000 +v 1.150001 0.100000 1.800000 +v 0.150001 1.100000 2.200000 +v 0.150001 0.400000 2.200000 +v 0.350001 0.750000 2.200000 +v 0.393935 0.856066 2.200000 +v 0.393935 0.643934 2.200000 +v 0.500001 0.900000 2.200000 +v 0.500001 0.600000 2.200000 +v 0.606067 0.856066 2.200000 +v 0.606067 0.643934 2.200000 +v 0.650001 0.750000 2.200000 +v 0.850001 1.100000 2.200000 +v 0.850001 0.400000 2.200000 +v -0.149999 1.400000 2.400000 +v -0.149999 0.750000 2.400000 +v -0.149999 0.100000 2.400000 +v 0.500001 1.400000 2.400000 +v 0.500001 0.100000 2.400000 +v 1.150001 1.400000 2.400000 +v 1.150001 0.750000 2.400000 +v 1.150001 0.100000 2.400000 +vt 0.009166 0.876834 +vt 0.098018 0.849020 +vt 0.098001 0.904650 +vt 0.098018 0.849020 +vt 0.098001 0.904650 +vt 0.009129 0.876836 +vt 0.098018 0.849020 +vt 0.098001 0.904650 +vt 0.098018 0.849020 +vt 0.098037 0.904649 +vt 0.098018 0.849020 +vt 0.098037 0.904649 +vt 0.098018 0.849020 +vt 0.098037 0.904649 +vt 0.098018 0.849020 +vt 0.098001 0.904650 +vt 0.098018 0.849020 +vt 0.098037 0.904649 +vt 0.098018 0.849020 +vt 0.098001 0.904650 +vt 0.098018 0.849020 +vt 0.098037 0.904649 +vt 0.916517 0.655663 +vt 0.906630 0.665550 +vt 0.896743 0.655663 +vt 0.906630 0.645776 +vt 0.899806 0.349949 +vt 0.913788 0.349949 +vt 0.913788 0.363931 +vt 0.899806 0.363931 +vt 0.916517 0.561715 +vt 0.906630 0.571602 +vt 0.896743 0.561715 +vt 0.906630 0.551828 +vt 0.906806 0.474525 +vt 0.896919 0.464638 +vt 0.906806 0.454751 +vt 0.916693 0.464638 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.197442 0.825440 +vt 0.197442 0.928230 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.197478 0.825439 +vt 0.197478 0.928229 +vt 0.946178 0.626002 +vt 0.936291 0.616115 +vt 0.946178 0.685324 +vt 0.936291 0.695211 +vt 0.867082 0.626002 +vt 0.876969 0.616115 +vt 0.876969 0.695211 +vt 0.867082 0.685324 +vt 0.857859 0.349949 +vt 0.857859 0.363931 +vt 0.899806 0.308001 +vt 0.913788 0.308001 +vt 0.913788 0.405878 +vt 0.899806 0.405878 +vt 0.955735 0.349949 +vt 0.955735 0.363931 +vt 0.946178 0.532054 +vt 0.936291 0.522167 +vt 0.946178 0.591377 +vt 0.936291 0.601264 +vt 0.867082 0.532054 +vt 0.876969 0.522167 +vt 0.876969 0.601264 +vt 0.867082 0.591377 +vt 0.936467 0.504186 +vt 0.946354 0.494299 +vt 0.877145 0.504186 +vt 0.867258 0.494299 +vt 0.936467 0.425090 +vt 0.946354 0.434977 +vt 0.867258 0.434977 +vt 0.877145 0.425090 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.310150 0.809683 +vt 0.310187 0.943985 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.310187 0.809683 +vt 0.310187 0.943985 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.431386 0.804150 +vt 0.431403 0.949518 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.431403 0.804150 +vt 0.431403 0.949518 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.552620 0.809683 +vt 0.552620 0.943985 +vt 0.863256 0.847760 +vt 0.863256 0.905908 +vt 0.863220 0.847759 +vt 0.863239 0.905906 +vt 0.863239 0.905906 +vt 0.863220 0.847759 +vt 0.863220 0.847759 +vt 0.863239 0.905906 +vt 0.863256 0.847760 +vt 0.863256 0.905908 +vt 0.863220 0.847759 +vt 0.863239 0.905906 +vt 0.863220 0.847759 +vt 0.863239 0.905906 +vt 0.863220 0.847759 +vt 0.863239 0.905906 +vt 0.863256 0.905908 +vt 0.863256 0.847760 +vt 0.863256 0.847760 +vt 0.863256 0.905908 +vt 0.261168 0.301042 +vt 0.352053 0.301042 +vt 0.247185 0.315025 +vt 0.261168 0.210157 +vt 0.456922 0.315025 +vt 0.442939 0.301042 +vt 0.247185 0.105289 +vt 0.442939 0.210157 +vt 0.261168 0.119271 +vt 0.456921 0.105289 +vt 0.352054 0.119271 +vt 0.442939 0.119271 +vt 0.541685 0.196174 +vt 0.541685 0.287060 +vt 0.471773 0.245113 +vt 0.563320 0.329876 +vt 0.535355 0.437434 +vt 0.423496 0.437434 +vt 0.479425 0.329876 +vt 0.113483 0.484009 +vt 0.204369 0.484009 +vt 0.162422 0.553921 +vt 0.334331 0.537049 +vt 0.356168 0.609111 +vt 0.268820 0.678989 +vt 0.268820 0.589458 +vt 0.253969 0.329876 +vt 0.253969 0.441010 +vt 0.145709 0.469158 +vt 0.172774 0.350987 +vt 0.626448 0.245113 +vt 0.556536 0.287060 +vt 0.556536 0.196174 +vt 0.465443 0.554485 +vt 0.577302 0.554484 +vt 0.605267 0.624397 +vt 0.521372 0.624397 +vt 0.408644 0.452286 +vt 0.450592 0.522198 +vt 0.359706 0.522198 +vt 0.687744 0.452286 +vt 0.709581 0.524347 +vt 0.622234 0.594225 +vt 0.622234 0.504694 +vt 0.268820 0.329876 +vt 0.380680 0.329876 +vt 0.408644 0.437434 +vt 0.324750 0.437434 +vt 0.607382 0.517796 +vt 0.535321 0.539633 +vt 0.465443 0.452286 +vt 0.554974 0.452286 +vt 0.130858 0.329876 +vt 0.130858 0.441010 +vt 0.022598 0.469158 +vt 0.049663 0.350987 +vt 0.471773 0.147236 +vt 0.541685 0.105289 +vt 0.064545 0.553921 +vt 0.022598 0.484009 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.310768 0.452286 +vt 0.268820 0.522198 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.988701 0.847760 +vt 0.988701 0.905908 +vt 0.626448 0.147236 +vt 0.556536 0.105289 +vt 0.641300 0.211026 +vt 0.725194 0.211026 +vt 0.725194 0.301911 +vt 0.641300 0.301911 +vt 0.651806 0.090437 +vt 0.651806 0.006543 +vt 0.861541 0.006543 +vt 0.861541 0.090437 +vt 0.121344 0.667518 +vt 0.212229 0.667518 +vt 0.212229 0.751413 +vt 0.121344 0.751413 +vt 0.690899 0.329876 +vt 0.774794 0.329876 +vt 0.774794 0.420762 +vt 0.690899 0.420762 +vt 0.442070 0.090437 +vt 0.442070 0.006543 +vt 0.465443 0.639248 +vt 0.556328 0.639248 +vt 0.556328 0.723142 +vt 0.465443 0.723142 +vt 0.121344 0.568772 +vt 0.212229 0.568772 +vt 0.212229 0.652667 +vt 0.121344 0.652667 +vt 0.022598 0.006543 +vt 0.232334 0.006543 +vt 0.232334 0.090437 +vt 0.022598 0.090437 +vt 0.622234 0.609077 +vt 0.706128 0.609077 +vt 0.706128 0.699962 +vt 0.622234 0.699962 +vt 0.022598 0.659658 +vt 0.022598 0.568772 +vt 0.106492 0.568772 +vt 0.106492 0.659658 +vt 0.641300 0.105289 +vt 0.725194 0.105289 +vt 0.725194 0.196174 +vt 0.641300 0.196174 +vt 0.030609 0.739059 +vt 0.022598 0.714404 +vt 0.030609 0.689748 +vt 0.077507 0.754298 +vt 0.051583 0.754298 +vt 0.051583 0.674509 +vt 0.077507 0.674509 +vt 0.106492 0.714404 +vt 0.098481 0.739059 +vt 0.098481 0.689748 +vt 0.036581 0.301043 +vt 0.022598 0.315025 +vt 0.036580 0.210157 +vt 0.127466 0.301043 +vt 0.022598 0.105289 +vt 0.036580 0.119272 +vt 0.232334 0.315025 +vt 0.127466 0.119271 +vt 0.218352 0.301043 +vt 0.232334 0.105289 +vt 0.218352 0.210157 +vt 0.218352 0.119271 +vt 0.541685 0.196174 +vt 0.471773 0.245113 +vt 0.541685 0.287060 +vt 0.563320 0.329876 +vt 0.479425 0.329876 +vt 0.423496 0.437434 +vt 0.535355 0.437434 +vt 0.113483 0.484009 +vt 0.162422 0.553921 +vt 0.204369 0.484009 +vt 0.334331 0.537049 +vt 0.268820 0.589458 +vt 0.268820 0.678989 +vt 0.356168 0.609111 +vt 0.253969 0.329876 +vt 0.172774 0.350987 +vt 0.145709 0.469158 +vt 0.253969 0.441010 +vt 0.626448 0.245113 +vt 0.556536 0.196174 +vt 0.556536 0.287060 +vt 0.465443 0.554485 +vt 0.521372 0.624397 +vt 0.605267 0.624397 +vt 0.577302 0.554484 +vt 0.408644 0.452286 +vt 0.359706 0.522198 +vt 0.450592 0.522198 +vt 0.687744 0.452286 +vt 0.622234 0.504694 +vt 0.622234 0.594225 +vt 0.709581 0.524347 +vt 0.268820 0.329876 +vt 0.324750 0.437434 +vt 0.408644 0.437434 +vt 0.380680 0.329876 +vt 0.607382 0.517796 +vt 0.554974 0.452286 +vt 0.465443 0.452286 +vt 0.535321 0.539633 +vt 0.130858 0.329876 +vt 0.049663 0.350987 +vt 0.022598 0.469158 +vt 0.130858 0.441010 +vt 0.541685 0.105289 +vt 0.471773 0.147236 +vt 0.022598 0.484009 +vt 0.064545 0.553921 +vt 0.310768 0.452286 +vt 0.268820 0.522198 +vt 0.626448 0.147236 +vt 0.556536 0.105289 +vn -0.2173 0.1579 -0.9632 +vn -0.2686 -0.0000 -0.9632 +vn -0.0830 0.2555 -0.9632 +vn -0.2173 -0.1579 -0.9632 +vn 0.0830 0.2555 -0.9632 +vn -0.0830 -0.2555 -0.9632 +vn 0.2173 0.1579 -0.9632 +vn 0.0830 -0.2555 -0.9632 +vn 0.2686 0.0000 -0.9632 +vn 0.2173 -0.1579 -0.9632 +vn -0.0000 -0.0000 -1.0000 +vn -0.5531 0.4018 -0.7298 +vn -0.6837 -0.0000 -0.7298 +vn -0.2113 0.6502 -0.7298 +vn -0.5531 -0.4018 -0.7298 +vn 0.2113 0.6502 -0.7298 +vn -0.2113 -0.6502 -0.7298 +vn 0.5531 0.4018 -0.7298 +vn 0.2113 -0.6502 -0.7298 +vn 0.6837 0.0000 -0.7298 +vn 0.5531 -0.4018 -0.7298 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn -0.7303 0.5306 -0.4302 +vn -0.9027 -0.0000 -0.4302 +vn -0.2790 0.8585 -0.4302 +vn -0.7303 -0.5306 -0.4302 +vn 0.2790 0.8585 -0.4302 +vn -0.2790 -0.8585 -0.4302 +vn 0.7303 0.5306 -0.4302 +vn 0.2790 -0.8585 -0.4302 +vn 0.9027 0.0000 -0.4302 +vn 0.7303 -0.5306 -0.4302 +vn -0.8010 0.5820 -0.1405 +vn -0.9901 -0.0000 -0.1405 +vn -0.3060 0.9416 -0.1405 +vn -0.8010 -0.5820 -0.1405 +vn 0.3060 0.9416 -0.1405 +vn -0.3060 -0.9416 -0.1405 +vn 0.8010 0.5820 -0.1405 +vn 0.3060 -0.9416 -0.1405 +vn 0.9901 0.0000 -0.1405 +vn 0.8010 -0.5820 -0.1405 +vn -0.8010 0.5820 0.1405 +vn -0.9901 -0.0000 0.1405 +vn -0.3060 0.9416 0.1405 +vn -0.8010 -0.5820 0.1405 +vn 0.3060 0.9416 0.1405 +vn -0.3060 -0.9416 0.1405 +vn 0.8010 0.5820 0.1405 +vn 0.3060 -0.9416 0.1405 +vn 0.9901 0.0000 0.1405 +vn 0.8010 -0.5820 0.1405 +vn -0.7492 0.5444 0.3773 +vn -0.9261 -0.0000 0.3773 +vn -0.2862 0.8808 0.3773 +vn -0.7492 -0.5444 0.3773 +vn 0.2862 0.8808 0.3773 +vn -0.2862 -0.8808 0.3773 +vn 0.7492 0.5444 0.3773 +vn 0.2862 -0.8808 0.3773 +vn 0.9261 0.0000 0.3773 +vn 0.7492 -0.5444 0.3773 +vn 0.8000 0.0000 -0.6000 +vn 0.7071 0.7071 -0.0000 +vn -0.0000 -0.8000 -0.6000 +vn -0.7071 0.7071 0.0000 +vn -0.8000 -0.0000 -0.6000 +vn -0.0000 0.8000 -0.6000 +vn -0.7071 -0.7071 0.0000 +vn -0.8090 0.5878 0.0000 +vn -0.3090 0.9511 -0.0000 +vn -0.8090 -0.5878 -0.0000 +vn 0.3090 0.9511 0.0000 +vn -0.3090 -0.9511 -0.0000 +vn 0.8090 0.5878 -0.0000 +vn 0.3090 -0.9511 -0.0000 +vn 0.8090 -0.5878 -0.0000 +vn 0.0000 -0.0000 1.0000 +vn -0.8000 -0.0000 0.6000 +vn 0.0000 0.8000 0.6000 +vn 0.7071 -0.7071 -0.0000 +vn 0.8000 0.0000 0.6000 +vn 0.0000 -0.8000 0.6000 +usemtl Fat_Man +s 1 +f 1/1/1 2/2/1 4/3/1 +f 1/1/2 3/4/2 2/5/2 +f 1/6/3 4/7/3 6/8/3 +f 1/1/4 5/9/4 3/10/4 +f 1/1/5 6/11/5 8/12/5 +f 1/6/6 7/13/6 5/14/6 +f 1/6/7 8/15/7 10/16/7 +f 1/6/8 9/17/8 7/18/8 +f 1/1/9 10/19/9 11/20/9 +f 1/1/10 11/21/10 9/22/10 +f 12/23/11 16/24/11 17/25/11 13/26/11 +f 14/27/11 18/28/11 19/29/11 15/30/11 +f 20/31/11 24/32/11 25/33/11 21/34/11 +f 22/35/11 26/36/11 27/37/11 23/38/11 +f 4/3/12 2/2/12 28/39/12 30/40/12 +f 3/4/13 29/41/13 28/42/13 2/5/13 +f 4/7/14 30/43/14 32/44/14 6/8/14 +f 5/9/15 31/45/15 29/46/15 3/10/15 +f 6/11/16 32/47/16 34/48/16 8/12/16 +f 7/13/17 33/49/17 31/50/17 5/14/17 +f 8/15/18 34/51/18 36/52/18 10/16/18 +f 7/18/19 9/17/19 35/53/19 33/54/19 +f 10/19/20 36/55/20 37/56/20 11/20/20 +f 11/21/21 37/57/21 35/58/21 9/22/21 +f 38/59/22 12/23/22 13/26/22 39/60/22 +f 38/61/23 42/62/23 16/24/23 12/23/23 +f 13/26/24 17/25/24 43/63/24 39/64/24 +f 16/24/25 42/65/25 43/66/25 17/25/25 +f 40/67/22 14/27/22 15/30/22 41/68/22 +f 40/69/23 44/70/23 18/28/23 14/27/23 +f 15/30/24 19/29/24 45/71/24 41/72/24 +f 18/28/25 44/73/25 45/74/25 19/29/25 +f 46/75/22 20/31/22 21/34/22 47/76/22 +f 46/77/23 50/78/23 24/32/23 20/31/23 +f 21/34/24 25/33/24 51/79/24 47/80/24 +f 24/32/25 50/81/25 51/82/25 25/33/25 +f 48/83/22 22/35/22 23/38/22 49/84/22 +f 48/85/23 52/86/23 26/36/23 22/35/23 +f 23/38/24 27/37/24 53/87/24 49/88/24 +f 26/36/25 52/89/25 53/90/25 27/37/25 +f 28/39/26 54/91/26 56/92/26 30/40/26 +f 28/42/27 29/41/27 55/93/27 54/94/27 +f 30/43/28 56/95/28 58/96/28 32/44/28 +f 29/46/29 31/45/29 57/97/29 55/98/29 +f 34/48/30 32/47/30 58/99/30 60/100/30 +f 33/49/31 59/101/31 57/102/31 31/50/31 +f 34/51/32 60/103/32 62/104/32 36/52/32 +f 35/53/33 61/105/33 59/106/33 33/54/33 +f 36/55/34 62/107/34 63/108/34 37/56/34 +f 37/57/35 63/109/35 61/110/35 35/58/35 +f 56/92/36 54/91/36 64/111/36 66/112/36 +f 54/94/37 55/93/37 65/113/37 64/114/37 +f 56/95/38 66/115/38 68/116/38 58/96/38 +f 57/97/39 67/117/39 65/118/39 55/98/39 +f 58/99/40 68/119/40 70/120/40 60/100/40 +f 57/102/41 59/101/41 69/121/41 67/122/41 +f 60/103/42 70/123/42 72/124/42 62/104/42 +f 61/105/43 71/125/43 69/126/43 59/106/43 +f 63/108/44 62/107/44 72/127/44 73/128/44 +f 63/109/45 73/129/45 71/130/45 61/110/45 +f 64/111/46 74/131/46 76/132/46 66/112/46 +f 65/113/47 75/133/47 74/134/47 64/114/47 +f 66/115/48 76/135/48 78/136/48 68/116/48 +f 67/117/49 77/137/49 75/138/49 65/118/49 +f 68/119/50 78/139/50 80/140/50 70/120/50 +f 69/121/51 79/141/51 77/142/51 67/122/51 +f 70/123/52 80/143/52 82/144/52 72/124/52 +f 71/125/53 81/145/53 79/146/53 69/126/53 +f 72/127/54 82/147/54 83/148/54 73/128/54 +f 71/130/55 73/129/55 83/149/55 81/150/55 +f 97/151/56 99/152/56 76/132/56 74/131/56 +f 98/153/57 97/154/57 74/134/57 75/133/57 +f 102/155/58 78/136/58 76/135/58 99/156/58 +f 100/157/59 98/158/59 75/138/59 77/137/59 +f 78/139/60 102/159/60 105/160/60 80/140/60 +f 103/161/61 100/162/61 77/142/61 79/141/61 +f 105/163/62 107/164/62 82/144/62 80/143/62 +f 106/165/63 103/166/63 79/146/63 81/145/63 +f 108/167/64 83/148/64 82/147/64 107/168/64 +f 108/169/65 106/170/65 81/150/65 83/149/65 +f 93/171/11 95/172/11 92/173/11 +f 93/171/11 92/173/11 101/174/11 +f 94/175/11 92/173/11 95/172/11 +f 95/172/11 96/176/11 94/175/11 +f 111/177/11 101/174/11 92/173/11 +f 94/175/11 96/176/11 104/178/11 +f 111/177/11 109/179/11 101/174/11 +f 113/180/11 94/175/11 104/178/11 +f 109/179/11 111/177/11 110/181/11 +f 113/180/11 110/181/11 111/177/11 +f 104/178/11 112/182/11 113/180/11 +f 113/180/11 112/182/11 110/181/11 +f 95/183/66 93/184/66 114/185/66 +f 137/186/67 121/187/67 85/188/67 93/189/67 +f 101/190/68 109/191/68 134/192/68 +f 139/193/23 119/194/23 84/195/23 95/196/23 +f 140/197/69 122/198/69 86/199/69 96/200/69 +f 134/201/70 109/202/70 110/203/70 +f 87/204/22 124/205/22 141/206/22 101/207/22 +f 135/208/71 112/209/71 104/210/71 +f 142/211/22 125/212/22 88/213/22 104/214/22 +f 89/215/69 127/216/69 143/217/69 109/218/69 +f 144/219/24 130/220/24 91/221/24 110/222/24 +f 146/223/72 128/224/72 90/225/72 112/226/72 +f 114/185/66 115/227/66 96/228/66 95/183/66 +f 134/192/68 114/229/68 93/230/68 101/190/68 +f 97/151/73 116/231/73 118/232/73 99/152/73 +f 98/153/22 117/233/22 116/234/22 97/154/22 +f 102/155/74 99/156/74 118/235/74 123/236/74 +f 98/158/75 100/157/75 120/237/75 117/238/75 +f 102/159/76 123/239/76 129/240/76 105/160/76 +f 103/161/77 126/241/77 120/242/77 100/162/77 +f 115/243/71 135/208/71 104/210/71 96/244/71 +f 107/164/78 105/163/78 129/245/78 132/246/78 +f 103/166/79 106/165/79 131/247/79 126/248/79 +f 107/168/25 132/249/25 133/250/25 108/167/25 +f 108/169/80 133/251/80 131/252/80 106/170/80 +f 135/253/70 134/201/70 110/203/70 112/254/70 +f 139/255/25 95/256/25 93/257/25 137/258/25 +f 136/259/22 92/260/22 94/261/22 138/262/22 +f 93/263/24 101/264/24 141/265/24 137/266/24 +f 140/267/25 96/268/25 95/269/25 139/270/25 +f 145/271/23 111/272/23 92/260/23 136/259/23 +f 140/273/23 142/274/23 104/275/23 96/276/23 +f 101/277/24 109/278/24 143/279/24 141/280/24 +f 94/281/24 113/282/24 147/283/24 138/284/24 +f 110/285/22 144/286/22 143/287/22 109/288/22 +f 142/289/23 146/290/23 112/291/23 104/292/23 +f 111/272/25 145/271/25 147/283/25 113/282/25 +f 112/293/22 146/294/22 144/295/22 110/296/22 +f 118/297/81 116/298/81 117/299/81 +f 118/297/81 117/299/81 129/300/81 +f 129/300/81 123/301/81 118/297/81 +f 117/299/81 120/302/81 126/303/81 +f 117/299/81 126/303/81 129/300/81 +f 126/303/81 133/304/81 129/300/81 +f 133/304/81 132/305/81 129/300/81 +f 126/303/81 131/306/81 133/304/81 +f 137/307/81 136/308/81 139/309/81 +f 136/308/81 137/307/81 141/310/81 +f 136/308/81 138/311/81 139/309/81 +f 140/312/81 139/309/81 138/311/81 +f 136/308/81 141/310/81 145/313/81 +f 142/314/81 140/312/81 138/311/81 +f 143/315/81 145/313/81 141/310/81 +f 142/314/81 138/311/81 147/316/81 +f 143/315/81 144/317/81 145/313/81 +f 147/316/81 145/313/81 144/317/81 +f 147/316/81 146/318/81 142/314/81 +f 144/317/81 146/318/81 147/316/81 +f 157/319/82 164/320/82 156/321/82 +f 176/322/72 156/323/72 150/324/72 167/325/72 +f 159/326/83 174/327/83 161/328/83 +f 177/329/24 157/330/24 151/331/24 166/332/24 +f 178/333/84 158/334/84 149/335/84 168/336/84 +f 174/337/85 162/338/85 161/339/85 +f 148/340/25 159/341/25 179/342/25 169/343/25 +f 175/344/86 160/345/86 163/346/86 +f 180/347/25 160/348/25 152/349/25 170/350/25 +f 153/351/84 161/352/84 181/353/84 171/354/84 +f 182/355/23 162/356/23 155/357/23 173/358/23 +f 183/359/67 163/360/67 154/361/67 172/362/67 +f 164/320/82 157/319/82 158/363/82 165/364/82 +f 174/327/83 159/326/83 156/365/83 164/366/83 +f 165/367/86 158/368/86 160/345/86 175/344/86 +f 175/369/85 163/370/85 162/338/85 174/337/85 diff --git a/src/main/resources/assets/nucleartech/sounds/random/boop.ogg b/src/main/resources/assets/nucleartech/sounds/random/boop.ogg new file mode 100644 index 00000000..da266b2f Binary files /dev/null and b/src/main/resources/assets/nucleartech/sounds/random/boop.ogg differ diff --git a/src/main/resources/assets/nucleartech/sounds/random/unpack1.ogg b/src/main/resources/assets/nucleartech/sounds/random/unpack1.ogg new file mode 100644 index 00000000..b91acf1b Binary files /dev/null and b/src/main/resources/assets/nucleartech/sounds/random/unpack1.ogg differ diff --git a/src/main/resources/assets/nucleartech/sounds/random/unpack2.ogg b/src/main/resources/assets/nucleartech/sounds/random/unpack2.ogg new file mode 100644 index 00000000..efcd35c3 Binary files /dev/null and b/src/main/resources/assets/nucleartech/sounds/random/unpack2.ogg differ diff --git a/src/main/resources/assets/nucleartech/textures/block/fat_man.png b/src/main/resources/assets/nucleartech/textures/block/fat_man.png new file mode 100644 index 00000000..86a3ccf5 Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/block/fat_man.png differ diff --git a/src/main/resources/assets/nucleartech/textures/gui/creative_inventory/tab_nuke.png b/src/main/resources/assets/nucleartech/textures/gui/creative_inventory/tab_nuke.png new file mode 100644 index 00000000..b8f11fa5 Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/gui/creative_inventory/tab_nuke.png differ diff --git a/src/main/resources/assets/nucleartech/textures/gui/fat_man.png b/src/main/resources/assets/nucleartech/textures/gui/fat_man.png new file mode 100644 index 00000000..8eb62ae2 Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/gui/fat_man.png differ diff --git a/src/main/resources/assets/nucleartech/textures/item/bomb_igniter.png b/src/main/resources/assets/nucleartech/textures/item/bomb_igniter.png new file mode 100644 index 00000000..05802eb1 Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/item/bomb_igniter.png differ diff --git a/src/main/resources/assets/nucleartech/textures/item/bomb_kit.png b/src/main/resources/assets/nucleartech/textures/item/bomb_kit.png new file mode 100644 index 00000000..794e719a Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/item/bomb_kit.png differ diff --git a/src/main/resources/assets/nucleartech/textures/item/bomb_kit_overlay.png b/src/main/resources/assets/nucleartech/textures/item/bomb_kit_overlay.png new file mode 100644 index 00000000..5cff9486 Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/item/bomb_kit_overlay.png differ diff --git a/src/main/resources/assets/nucleartech/textures/item/bundle_of_implosion_propellant.png b/src/main/resources/assets/nucleartech/textures/item/bundle_of_implosion_propellant.png new file mode 100644 index 00000000..4626fc28 Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/item/bundle_of_implosion_propellant.png differ diff --git a/src/main/resources/assets/nucleartech/textures/item/detonator.png b/src/main/resources/assets/nucleartech/textures/item/detonator.png new file mode 100644 index 00000000..d83e1640 Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/item/detonator.png differ diff --git a/src/main/resources/assets/nucleartech/textures/item/plutonium_core.png b/src/main/resources/assets/nucleartech/textures/item/plutonium_core.png new file mode 100644 index 00000000..9bdcea68 Binary files /dev/null and b/src/main/resources/assets/nucleartech/textures/item/plutonium_core.png differ