From 5a30c3bcdb5b20f35c6505f4e06adc8e5e5b9dbb Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 26 Jun 2021 01:17:35 +0200 Subject: [PATCH] Vegetable accelerator - Added the Potato Cannon - Extendogrips now have durability, which is not consumed while wearing a copper backtank (same applies for potato cannon) - Added a few projectile types for testing --- src/generated/resources/.cache/cache | 37 +-- .../resources/assets/create/lang/en_ud.json | 3 +- .../resources/assets/create/lang/en_us.json | 17 +- .../assets/create/lang/unfinished/de_de.json | 19 +- .../assets/create/lang/unfinished/es_es.json | 17 +- .../assets/create/lang/unfinished/es_mx.json | 17 +- .../assets/create/lang/unfinished/fr_fr.json | 19 +- .../assets/create/lang/unfinished/it_it.json | 17 +- .../assets/create/lang/unfinished/ja_jp.json | 17 +- .../assets/create/lang/unfinished/ko_kr.json | 17 +- .../assets/create/lang/unfinished/nl_nl.json | 19 +- .../assets/create/lang/unfinished/pl_pl.json | 17 +- .../assets/create/lang/unfinished/pt_br.json | 19 +- .../assets/create/lang/unfinished/ru_ru.json | 17 +- .../assets/create/lang/unfinished/zh_cn.json | 17 +- .../assets/create/lang/unfinished/zh_tw.json | 17 +- .../create/models/item/potato_cannon.json | 3 + .../resources/assets/create/sounds.json | 23 ++ .../advancements/dual_extendo_grip.json | 3 +- .../create/advancements/extendo_grip.json | 3 +- .../com/simibubi/create/AllEntityTypes.java | 73 +++--- .../java/com/simibubi/create/AllItems.java | 46 ++-- .../com/simibubi/create/AllSoundEvents.java | 12 +- src/main/java/com/simibubi/create/Create.java | 2 + .../contraptions/particle/AirParticle.java | 8 +- .../curiosities/armor/BackTankUtil.java | 103 ++++++++ .../curiosities/armor/CopperBacktankItem.java | 3 +- .../curiosities/armor/DivingHelmetItem.java | 22 +- .../curiosities/tools/ExtendoGripItem.java | 123 +++++++-- .../curiosities/weapons/PotatoCannonItem.java | 206 +++++++++++++++ .../weapons/PotatoCannonItemRenderer.java | 60 +++++ .../weapons/PotatoCannonModel.java | 20 ++ .../weapons/PotatoCannonPacket.java | 27 ++ .../weapons/PotatoCannonProjectileTypes.java | 221 ++++++++++++++++ .../weapons/PotatoProjectileEntity.java | 235 ++++++++++++++++++ .../weapons/PotatoProjectileRenderMode.java | 74 ++++++ .../weapons/PotatoProjectileRenderer.java | 44 ++++ .../weapons/ProperProjectileEntity.java | 40 +++ .../simibubi/create/events/ClientEvents.java | 2 + .../foundation/advancement/AllTriggers.java | 2 +- .../foundation/config/CCuriosities.java | 8 + .../foundation/networking/AllPackets.java | 2 + .../assets/create/lang/default/messages.json | 2 + .../assets/create/lang/default/tooltips.json | 11 +- .../models/item/potato_cannon/base.bbmodel | 1 + .../create/models/item/potato_cannon/cog.json | 104 ++++++++ .../models/item/potato_cannon/item.json | 126 ++++++++++ .../resources/assets/create/sounds/fwoomp.ogg | Bin 0 -> 15422 bytes 48 files changed, 1757 insertions(+), 138 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/potato_cannon.json create mode 100644 src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItem.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItemRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonModel.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonPacket.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonProjectileTypes.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileEntity.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderMode.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/weapons/ProperProjectileEntity.java create mode 100644 src/main/resources/assets/create/models/item/potato_cannon/base.bbmodel create mode 100644 src/main/resources/assets/create/models/item/potato_cannon/cog.json create mode 100644 src/main/resources/assets/create/models/item/potato_cannon/item.json create mode 100644 src/main/resources/assets/create/sounds/fwoomp.ogg diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 00cdfc444..f6b5ab5c0 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -407,21 +407,21 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -c71f5246d2cb8e9913d1552d23fcc82c43cde7a0 assets/create/lang/en_ud.json -1e395855b99f48b50dc6eed77ba715237867bebf assets/create/lang/en_us.json -ca34a1523c0b9787666923c189167cf239e85f1c assets/create/lang/unfinished/de_de.json -3ba4235fbc33ee28e7a6ef779d391a00858f0f52 assets/create/lang/unfinished/es_es.json -049ca87082069d80b22dd204296a14f67c01931a assets/create/lang/unfinished/es_mx.json -df29299d27809d115f352ae82935d6b406d08754 assets/create/lang/unfinished/fr_fr.json -0bb18404e068bbfc0332474fc78f5ce0440ee295 assets/create/lang/unfinished/it_it.json -0250be349a9364792717bb8d9bc680c6faa6291f assets/create/lang/unfinished/ja_jp.json -a70d2a2a75879a8ea0dea59964c2b20ae67033fd assets/create/lang/unfinished/ko_kr.json -1294137911d5b8e9aba264f1a1ce80644250354a assets/create/lang/unfinished/nl_nl.json -66f09bc9549c733d4bc3d8d31005f119efd952eb assets/create/lang/unfinished/pl_pl.json -4474c63c836597d1751bf86ee0166a3ca5e01db6 assets/create/lang/unfinished/pt_br.json -a95d5f9b37ec32a7c477c21f21d035471ea6ad24 assets/create/lang/unfinished/ru_ru.json -11c5105e97c88463511b200afebbcbdc58f1d116 assets/create/lang/unfinished/zh_cn.json -044db0d49cdcde32ba69bf34fa4117b8c9b5d40c assets/create/lang/unfinished/zh_tw.json +a653b0f1c3025a3cd6500a94f8bd33476bd7a307 assets/create/lang/en_ud.json +a439c55743394b9a8d64c8e83f15a7ff4d7916d5 assets/create/lang/en_us.json +a71e12072b830c74e35ad0bc6f57222b89210194 assets/create/lang/unfinished/de_de.json +b18e9d79be48ced653d6b74c933f90de9b3f33df assets/create/lang/unfinished/es_es.json +6b52b20eab6aeb55b47343ca9ca14fd411608444 assets/create/lang/unfinished/es_mx.json +6a7abf7fa4d567de46c200f6de1336e6b1a4d3b1 assets/create/lang/unfinished/fr_fr.json +bf287988337c6da1a4972328eee17a941f934ecf assets/create/lang/unfinished/it_it.json +51c0fe08a014501775f6c04c31232a704265ddbb assets/create/lang/unfinished/ja_jp.json +21bd6861640a1e0d10c0d9c6fb694e6290c41d3f assets/create/lang/unfinished/ko_kr.json +a6ac4ed14e89192928bbaee12d4d87eff62c7044 assets/create/lang/unfinished/nl_nl.json +e4a1c5579c6a9341aa64e5c6375778f5af71a483 assets/create/lang/unfinished/pl_pl.json +abd17be74ff3142252645365f8526d1a799d8c2f assets/create/lang/unfinished/pt_br.json +ca4a80fc40e2c86fd6c2f5514d81803c6908fcb6 assets/create/lang/unfinished/ru_ru.json +428e0831c3dfc80b888d675a4159af54105efc56 assets/create/lang/unfinished/zh_cn.json +e49b570ee482802accb0b76638de5b7f7f417deb assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1565,6 +1565,7 @@ e95125318055b8557afd7d108488cf0bdd81fe49 assets/create/models/item/polished_scor d98a1d479dff88d7a6f084f2c9de8fbbf80961ef assets/create/models/item/polished_weathered_limestone_wall.json 0e5638cdbf04d7af2222ec15fbe1d960385ea237 assets/create/models/item/portable_fluid_interface.json 3bc60b0d9884c2ee0f1dd530e90fceb699eea737 assets/create/models/item/portable_storage_interface.json +b97c891ebe74e7850ef1f982e4cc043338baa30f assets/create/models/item/potato_cannon.json 417c301eb7e54f14c564975570f59d048cc88987 assets/create/models/item/powdered_obsidian.json 1e501c1f2e9250aaaadcf17db62646d08177d4e1 assets/create/models/item/powered_latch.json 3a6dfc7f36e31ebfcd650c3144a7f2210e8a4f9f assets/create/models/item/powered_toggle_latch.json @@ -1653,7 +1654,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -6490fa0587db770cf7c794b47f3bcd2b691f4226 assets/create/sounds.json +f4c38d16e998aa2dbad4a827035fd5754c060104 assets/create/sounds.json 0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json @@ -1680,9 +1681,9 @@ d1015e059a2f2008a364b6d045a011a6d671f20d data/create/advancements/copper_casing. d1fbc14303c7327e9fc02e505e7e434591b7f785 data/create/advancements/crushing_wheel.json e9e1789de5cd5577a801a09d489a13f2c98779dc data/create/advancements/cuckoo.json 2a96fad5b44b62f233c9af5b4a637faf32ce24af data/create/advancements/deployer.json -eb8e7c13163923d2f88c999c6eb5afa4b7d2426e data/create/advancements/dual_extendo_grip.json +20e04d0ac916996efedc35ab80e2b4ac4001582c data/create/advancements/dual_extendo_grip.json 04eaf829696d735244c0e4798dd3bdeb26e13a32 data/create/advancements/electron_tube.json -36622ff02345cdc2404230c48de9ed42b1b9bd1d data/create/advancements/extendo_grip.json +6cf58b2b705b3db2fe8c2f38d86d82a214eead95 data/create/advancements/extendo_grip.json b1699baaadaac7ebce642c09428519d156e21594 data/create/advancements/fan.json 5aa76cba3b40a1c234ffa84a89ecca630990fc0f data/create/advancements/fan_lava.json 716a9816558300a3652ed8d8d568517017813f5c data/create/advancements/fan_smoke.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 2428052fc..1aca64703 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -48,7 +48,6 @@ "block.create.chiseled_scoria": "\u0250\u0131\u0279o\u0254S p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", "block.create.chiseled_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u05DF\u01DDs\u0131\u0265\u0186", "block.create.chocolate": "\u01DD\u0287\u0250\u05DFo\u0254o\u0265\u0186", - "block.create.chromatic_projector": "\u0279o\u0287\u0254\u01DD\u0638o\u0279\u0500 \u0254\u0131\u0287\u0250\u026Fo\u0279\u0265\u0186", "block.create.chute": "\u01DD\u0287n\u0265\u0186", "block.create.clockwork_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u029E\u0279o\u028D\u029E\u0254o\u05DF\u0186", "block.create.clutch": "\u0265\u0254\u0287n\u05DF\u0186", @@ -412,6 +411,7 @@ "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", "entity.create.crafting_blueprint": "\u0287u\u0131\u0279d\u01DDn\u05DF\u15FA bu\u0131\u0287\u025F\u0250\u0279\u0186", "entity.create.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141", + "entity.create.potato_projectile": "\u01DD\u05DF\u0131\u0287\u0254\u01DD\u0638o\u0279\u0500 o\u0287\u0250\u0287o\u0500", "entity.create.seat": "\u0287\u0250\u01DDS", "entity.create.stationary_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0250uo\u0131\u0287\u0250\u0287S", "entity.create.super_glue": "\u01DDn\u05DF\u2141 \u0279\u01DDdnS", @@ -475,6 +475,7 @@ "item.create.minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W", "item.create.minecart_coupling": "bu\u0131\u05DFdno\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W", "item.create.polished_rose_quartz": "z\u0287\u0279\u0250n\u1F49 \u01DDso\u1D1A p\u01DD\u0265s\u0131\u05DFo\u0500", + "item.create.potato_cannon": "uouu\u0250\u0186 o\u0287\u0250\u0287o\u0500", "item.create.powdered_obsidian": "u\u0250\u0131p\u0131sqO p\u01DD\u0279\u01DDp\u028Do\u0500", "item.create.propeller": "\u0279\u01DD\u05DF\u05DF\u01DDdo\u0279\u0500", "item.create.red_sand_paper": "\u0279\u01DDd\u0250\u0500 pu\u0250S p\u01DD\u1D1A", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 35c57fd5f..f7ccfc29a 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -415,6 +415,7 @@ "entity.create.contraption": "Contraption", "entity.create.crafting_blueprint": "Crafting Blueprint", "entity.create.gantry_contraption": "Gantry Contraption", + "entity.create.potato_projectile": "Potato Projectile", "entity.create.seat": "Seat", "entity.create.stationary_contraption": "Stationary Contraption", "entity.create.super_glue": "Super Glue", @@ -480,6 +481,7 @@ "item.create.minecart_contraption": "Minecart Contraption", "item.create.minecart_coupling": "Minecart Coupling", "item.create.polished_rose_quartz": "Polished Rose Quartz", + "item.create.potato_cannon": "Potato Cannon", "item.create.powdered_obsidian": "Powdered Obsidian", "item.create.propeller": "Propeller", "item.create.red_sand_paper": "Red Sand Paper", @@ -669,6 +671,8 @@ "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", + "death.attack.create.potato_cannon": "%1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "%1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "a rogue Deployer", @@ -1165,6 +1169,7 @@ "create.subtitle.contraption_disassemble": "Contraption stops", "create.subtitle.mixing": "Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", + "create.subtitle.fwoomp": "Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "Worldshaper zaps", "create.subtitle.depot_slide": "Item slides", "create.subtitle.saw_activate_stone": "Mechanical Saw activates", @@ -1179,6 +1184,7 @@ "create.subtitle.cogs": "Cogwheels rumble", "create.subtitle.slime_added": "Slime squishes", "create.subtitle.wrench_rotate": "Wrench used", + "create.subtitle.potato_hit": "Vegetable impacts", "create.subtitle.saw_activate_wood": "Mechanical Saw activates", "create.subtitle.deployer_polish": "Deployer applies polish", "create.subtitle.deny": "Declining boop", @@ -1243,9 +1249,18 @@ "item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees _regardless_ of their _spacing conditions_", "item.create.extendo_grip.tooltip": "EXTENDO GRIP", - "item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder.", + "item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder. Can be powered with Air Pressure from a _Copper_ _Backtank_", "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", "item.create.extendo_grip.tooltip.behaviour1": "Increases _reach distance_ of items used in the _Main-Hand_.", + "item.create.extendo_grip.tooltip.condition2": "While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTER", "item.create.filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 5a8b4c644..39f062089 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1047", + "_": "Missing Localizations: 1061", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "Vorrichtung", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "Portalkran Vorrichtung", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "Sitz", "entity.create.stationary_contraption": "Stationäre Vorrichtung", "entity.create.super_glue": "Superkleber", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "Loren Vorrichtung", "item.create.minecart_coupling": "Lorenkupplung", "item.create.polished_rose_quartz": "Polierter Rosenquarz", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Pulverisierter Obsidian", "item.create.propeller": "Propeller", "item.create.red_sand_paper": "Rotes Schmirgelpapier", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s wurde von Lava verweht", "death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert", "death.attack.create.mechanical_saw": "%1$s wurde zersägt", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt", "create.block.deployer.damage_source_name": "einem Finger", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Schleim matscht", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1244,9 +1250,18 @@ "item.create.tree_fertilizer.tooltip.behaviour1": "Lässt Bäume unabhängig vom Platz um sie herum wachsen", "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", - "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder. Can be powered with Air Pressure from a _Copper_ _Backtank_", "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach distance_ of items used in the _Main-Hand_.", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "UNLOCALIZED: FILTER", "item.create.filter.tooltip.summary": "UNLOCALIZED: _Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 70d619aa7..5b5bdfded 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 808", + "_": "Missing Localizations: 822", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "Artilugio", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "Artilugio de grúa", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "Asiento", "entity.create.stationary_contraption": "Artilugio estacionario", "entity.create.super_glue": "Super Pegamento", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "Artilugio de vagoneta", "item.create.minecart_coupling": "Acoplamiento de vagoneta", "item.create.polished_rose_quartz": "Cuarzo rosado pulido", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Obsidiana en polvo", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "Papel de lija rojo", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s murió quemado por un abanico de lava", "death.attack.create.mechanical_drill": "%1$s fue empalado por un taladro mecánico", "death.attack.create.mechanical_saw": "%1$s fue cortado por la mitad por una sierra mecánica", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s fue volado por los aires por un reloj cucú manipulado", "create.block.deployer.damage_source_name": "un Desplegador rebelde", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Slime aplastado", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "¡Boioioing! Aumenta enormemente la _distancia de alcance_ del portador", "item.create.extendo_grip.tooltip.condition1": "Cuando está fuera de la mano", "item.create.extendo_grip.tooltip.behaviour1": "Aumenta la _distancia de alcance_ de los objetos usados en la _mano principal_", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTRO", "item.create.filter.tooltip.summary": "Controla las salidas_ y _entradas_ de los dispositivos logísticos con más _precisión_, comparándolas con un _conjunto de elementos_ o varios _filtros anidados_", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 243fcaba9..0d4eb1e1b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1414", + "_": "Missing Localizations: 1428", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "Artefacto", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "Asiento", "entity.create.stationary_contraption": "Artefacto Estacionario", "entity.create.super_glue": "Super Pegamento", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "Artefacto de Vagón", "item.create.minecart_coupling": "Acoplamiento de Vagonetas", "item.create.polished_rose_quartz": "Cuarzo Rosa Pulido", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Polvo de Obsidiana", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "Papel de Arena Roja", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "UNLOCALIZED: %1$s was burned to death by lava fan", "death.attack.create.mechanical_drill": "UNLOCALIZED: %1$s was impaled by a Mechanical Drill", "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "Boioioing! En gran medida, _aumenta_ _la_ _distancia_ _de_ _alcance_ del portador.", "item.create.extendo_grip.tooltip.condition1": "Cuando está en la mano secundaria", "item.create.extendo_grip.tooltip.behaviour1": "Aumenta el rango de alcance de los objetos usados en la _mano_ _principal._", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTER", "item.create.filter.tooltip.summary": "_Controla_ las _salidas_ y _entradas_ de los dispositivos logísticos con más _precisión,_ comparándolas con un _conjunto_ _de_ _objetos_ o varios _filtros_ _anidados._", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 777e549f3..992b98075 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1299", + "_": "Missing Localizations: 1313", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "Engin", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "Siège", "entity.create.stationary_contraption": "Engin stationnaire", "entity.create.super_glue": "Colle extra-forte", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "Engin de wagonnet", "item.create.minecart_coupling": "Lien pour wagonnet", "item.create.polished_rose_quartz": "Quartz rose poli", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Obsidienne concassée", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "Papier de verre rouge", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s a été brûlé à mort par un ventilateur de lave", "death.attack.create.mechanical_drill": "%1$s a été empalé par une perceuse mécanique", "death.attack.create.mechanical_saw": "%1$s a été coupé en deux par une scie mécanique", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s a été explosé par un coucou trafiquée", "create.block.deployer.damage_source_name": "un déployeur voyou", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Bruit de slime", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1244,9 +1250,18 @@ "item.create.tree_fertilizer.tooltip.behaviour1": "Fait pousser des rotors _indépendamment_ de leurs _conditions_ _d'emplacement_", "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", - "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder. Can be powered with Air Pressure from a _Copper_ _Backtank_", "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach distance_ of items used in the _Main-Hand_.", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTRE", "item.create.filter.tooltip.summary": "_Contrôle_ les _sorties_ et _entrées_ de dispositifs logistiques avec plus de _précision_, en les comparant à un _ensemble_ _d'objets_ ou à plusieurs _filtres_ _imbriqués_.", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 964b6a4cf..d7e7e5838 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 825", + "_": "Missing Localizations: 839", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "Contrazione", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "Sedile", "entity.create.stationary_contraption": "Contrazione stazionaria", "entity.create.super_glue": "Super colla", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "Contrazione per carrello da miniera", "item.create.minecart_coupling": "Aggancio per carrelli da miniera", "item.create.polished_rose_quartz": "Quarzo rosa levigato", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Ossidiana in polvere", "item.create.propeller": "Elica", "item.create.red_sand_paper": "Carta vetrata rossa", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s è stato bruciato dal ventilatore di lava", "death.attack.create.mechanical_drill": "%1$s è stato trafitto dal trapano meccanico", "death.attack.create.mechanical_saw": "%1$s è stato tagliato a metà dalla sega meccanica", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s è saltato in aria da un orologio a cucù manomesso", "create.block.deployer.damage_source_name": "un disadattato", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Slime schiacciato", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "Boioioing! _Incrementa notevolmente la distanza per piazzare_ di chi lo brandisce.", "item.create.extendo_grip.tooltip.condition1": "Quando in mano secondaria", "item.create.extendo_grip.tooltip.behaviour1": "Incrementa la _distanza per piazzare_ degli oggetti usati nella _mano primaria_.", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTRO", "item.create.filter.tooltip.summary": "_Controlla_ _gli_ _output_ e gli _input_ dei dispositivi logistici con maggiore _precisione_, confrontandoli con una _serie_ _di_ _oggetti_ o diversi _filtri_ _nidificati_.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 68f830609..0ca87655a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 191", + "_": "Missing Localizations: 205", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "からくり", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "ガントリーからくり", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "シート", "entity.create.stationary_contraption": "付設からくり", "entity.create.super_glue": "超粘着剤", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "からくり付きトロッコ", "item.create.minecart_coupling": "トロッコ連結器", "item.create.polished_rose_quartz": "磨かれたローズクォーツ", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "黒曜石の粉", "item.create.propeller": "プロペラ", "item.create.red_sand_paper": "赤い紙やすり", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s は溶岩ファンによって焼死した", "death.attack.create.mechanical_drill": "%1$s はメカニカルドリルに突き刺さった", "death.attack.create.mechanical_saw": "%1$s はメカニカルソーで半分にカットされた", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s は改ざんされた鳩時計に爆破された", "create.block.deployer.damage_source_name": "悪いデプロイヤー", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "からくりが止まる", "create.subtitle.mixing": "混ぜる音", "create.subtitle.mechanical_press_activation_belt": "メカニカルプレスがボンと鳴る", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "アイテムが滑る", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "歯車がゴロゴロと鳴る", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", "create.subtitle.wrench_rotate": "レンチを使う", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "ビヨヨーン!着用者の_射程_を大幅に_伸ばし_ます。", "item.create.extendo_grip.tooltip.condition1": "オフハンドに装備したとき", "item.create.extendo_grip.tooltip.behaviour1": "_メインハンド_で使うアイテムの_射程_を_伸ばし_ます。", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "フィルター", "item.create.filter.tooltip.summary": "物流系の装置の_搬入_と_搬出_をより_正確_に_制御_し、_アイテムのセット_またはいくつかの_入れ子になったフィルター_と照合します。", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index c564341a9..ed80d285a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 878", + "_": "Missing Localizations: 892", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "장치", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "좌석", "entity.create.stationary_contraption": "고정된 장치", "entity.create.super_glue": "강력 접착제", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "광산 수레 장치", "item.create.minecart_coupling": "광산 수레 커플링", "item.create.polished_rose_quartz": "윤나는 장밋빛 석영", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "흑요석 가루", "item.create.propeller": "프로펠러", "item.create.red_sand_paper": "붉은 사포", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s이(가) 용암 바람으로 구워졌습니다", "death.attack.create.mechanical_drill": "%1$s이(가) 드릴에 관통당했습니다", "death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", "create.block.deployer.damage_source_name": "배포기", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "슬라임이 철퍽거림", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "띠요오옹! 사용자의 _사거리_를 늘려줍니다.", "item.create.extendo_grip.tooltip.condition1": "다른 손에 있을 때", "item.create.extendo_grip.tooltip.behaviour1": "_기존_ _손_에있는 아이템의 사거리를 늘립니다.", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTER", "item.create.filter.tooltip.summary": "장치의 _입력_과 _출력_을 필터 _아이템_ 목록에 따라 _조정_합니다.", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 77cd9bd86..0e8108f31 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1682", + "_": "Missing Localizations: 1696", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "UNLOCALIZED: Seat", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Propeller", "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s is verbrand door een lava ventilator", "death.attack.create.mechanical_drill": "%1$s is gespietst door een mechanische boor", "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1244,9 +1250,18 @@ "item.create.tree_fertilizer.tooltip.behaviour1": "Groeit bomen onafhankelijk van beschikbare ruimte", "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", - "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder. Can be powered with Air Pressure from a _Copper_ _Backtank_", "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach distance_ of items used in the _Main-Hand_.", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "UNLOCALIZED: FILTER", "item.create.filter.tooltip.summary": "UNLOCALIZED: _Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index b6c455931..d876f07e2 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 167", + "_": "Missing Localizations: 181", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "Maszyna", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "Maszyna suwnicowa", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "Siedzenie", "entity.create.stationary_contraption": "Maszyna stacjonarna", "entity.create.super_glue": "Super Glue", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "Maszyna w wagoniku", "item.create.minecart_coupling": "Łącznik wagoników", "item.create.polished_rose_quartz": "Wypolerowany kwarc różowy", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Sproszkowany obsydian", "item.create.propeller": "Śmigło", "item.create.red_sand_paper": "Czerwony papier ścierny", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "Gracz %1$s poparzył się kroplami lawy", "death.attack.create.mechanical_drill": "Gracz %1$s nabił się na mechaniczne wiertło", "death.attack.create.mechanical_saw": "Gracz %1$s został przecięty na pół przez mechaniczną piłę", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "Gracz %1$s został wysadzony w powietrze przez uszkodzony zegar z kukułką", "create.block.deployer.damage_source_name": "zbuntowany aplikator", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "Maszyna staje", "create.subtitle.mixing": "Dźwięki mieszania", "create.subtitle.mechanical_press_activation_belt": "Mechaniczna prasa stuka", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "Kształter strzela", "create.subtitle.depot_slide": "Przedmiot ślizga się", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "Koła zębate terkoczą", "create.subtitle.slime_added": "Szlam plaska", "create.subtitle.wrench_rotate": "Klucz skrzypi", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "Aplikator poleruje", "create.subtitle.deny": "Dźwięk odmowy", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "Mocno _wydłuża zasięg_ rąk posiadacza.", "item.create.extendo_grip.tooltip.condition1": "Kiedy w drugiej ręce", "item.create.extendo_grip.tooltip.behaviour1": "_Wydłuża zasięg_ głównej ręki.", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTR", "item.create.filter.tooltip.summary": "_Kontroluje_ wejścia i wyjścia urządzeń logistycznych z _większą precyzją_, przypasowując przedmioty do listy przedmiotów zawartej w filtrze lub wielu filtrach schowanych jeden w drugi.", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index b84a265e7..66b3cd4e1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1723", + "_": "Missing Localizations: 1737", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "UNLOCALIZED: Seat", "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", "item.create.propeller": "Hélice", "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s foi queimado pelo ventilador de lava", "death.attack.create.mechanical_drill": "%1$s foi empalado pela Furadeira Mecânica", "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1244,9 +1250,18 @@ "item.create.tree_fertilizer.tooltip.behaviour1": "Cresce Arvores independentemente das suas Regras de espaço", "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", - "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder.", + "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases reach distance_ of the wielder. Can be powered with Air Pressure from a _Copper_ _Backtank_", "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach distance_ of items used in the _Main-Hand_.", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "UNLOCALIZED: FILTER", "item.create.filter.tooltip.summary": "UNLOCALIZED: _Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 83fd713ac..9b95eaae5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 724", + "_": "Missing Localizations: 738", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "Штуковина", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "Сиденье", "entity.create.stationary_contraption": "Стационарная штуковина", "entity.create.super_glue": "Супер-клей", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "Вагонеточная штуковина", "item.create.minecart_coupling": "Связыватель вагонеток", "item.create.polished_rose_quartz": "Полированный розовый кварц", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "Порошкообразный обсидиан", "item.create.propeller": "Пропеллер", "item.create.red_sand_paper": "Красная наждачная бумага", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", "death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s взорвали подделанные часы с кукушкой", "create.block.deployer.damage_source_name": "автономным активатором", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Намазывание слизи", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "Бойоиоинг! Значительно _увеличивает_ _досягаемость_ владельца.", "item.create.extendo_grip.tooltip.condition1": "Находясь в другой руке", "item.create.extendo_grip.tooltip.behaviour1": "Увеличьте _расстояние_ _досягаемости_ предметов, используемых в _главной_ _руке_.", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTER", "item.create.filter.tooltip.summary": "Управляет_ _выходами_ и входами логистических устройств с _большей_ _точностью_, _сопоставляя_ их со _списком_ _предметов_ или несколькими _вложенными_ _фильтрами_.", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 1a15b4ab6..8694128fd 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 208", + "_": "Missing Localizations: 222", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "装置", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "起重机装置", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "坐垫", "entity.create.stationary_contraption": "固定装置", "entity.create.super_glue": "强力胶", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "装配过的矿车", "item.create.minecart_coupling": "矿车连轴器", "item.create.polished_rose_quartz": "磨制玫瑰石英", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "黑曜石粉末", "item.create.propeller": "扇叶", "item.create.red_sand_paper": "红沙砂纸", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s在接受热风的洗礼中浴火焚身", "death.attack.create.mechanical_drill": "%1$s被钻头钻的坏掉了", "death.attack.create.mechanical_saw": "%1$s被圆锯切成了两截", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s被布谷鸟钟炸得粉身碎骨", "create.block.deployer.damage_source_name": "二五仔机械手", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "粘液:挤碎声", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_触碰距离_。", "item.create.extendo_grip.tooltip.condition1": "放置于副手栏时", "item.create.extendo_grip.tooltip.behaviour1": "增加_主手_所使用物品的_接触距离_。", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "过滤器", "item.create.filter.tooltip.summary": "可用于_精确_控制物流设备的_输出_以及_输入_,使得通过的物品流与_一组_物品或者数个_相嵌套的过滤器_相匹配。", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 97bad0fc8..5e6f91ac1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 203", + "_": "Missing Localizations: 217", "_": "->------------------------] Game Elements [------------------------<-", @@ -416,6 +416,7 @@ "entity.create.contraption": "結構", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "門式結構", + "entity.create.potato_projectile": "UNLOCALIZED: Potato Projectile", "entity.create.seat": "坐墊", "entity.create.stationary_contraption": "固定結構", "entity.create.super_glue": "強力膠", @@ -481,6 +482,7 @@ "item.create.minecart_contraption": "裝修過的礦車", "item.create.minecart_coupling": "礦車連結器", "item.create.polished_rose_quartz": "磨製玫瑰石英", + "item.create.potato_cannon": "UNLOCALIZED: Potato Cannon", "item.create.powdered_obsidian": "黑曜石粉末", "item.create.propeller": "扇葉", "item.create.red_sand_paper": "紅砂紙", @@ -670,6 +672,8 @@ "death.attack.create.fan_lava": "%1$s想接受熱風的洗禮但走火入魔", "death.attack.create.mechanical_drill": "%1$s被鑽頭鑽爆腦袋", "death.attack.create.mechanical_saw": "%1$s被鋸切成了兩半", + "death.attack.create.potato_cannon": "UNLOCALIZED: %1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "UNLOCALIZED: %1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s 被布穀鳥鐘炸得粉身碎骨", "create.block.deployer.damage_source_name": "機械手", @@ -1166,6 +1170,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "液壓機工作", + "create.subtitle.fwoomp": "UNLOCALIZED: Potato Launcher fwoomps", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", @@ -1180,6 +1185,7 @@ "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "黏液擠壓", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.deny": "UNLOCALIZED: Declining boop", @@ -1247,6 +1253,15 @@ "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_觸碰距離_。", "item.create.extendo_grip.tooltip.condition1": "放置於副手欄時", "item.create.extendo_grip.tooltip.behaviour1": "大幅增加_主手_的觸碰距離,與_主手_的伸縮機械手攜同使用,可進一步增加_觸碰距離_。", + "item.create.extendo_grip.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "UNLOCALIZED: POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "UNLOCALIZED: Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "UNLOCALIZED: _Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "UNLOCALIZED: While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "UNLOCALIZED: _No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "過濾器", "item.create.filter.tooltip.summary": "將物品更精確地進行_篩選分類_,可以同時_篩選_多個物品或者將已標記的_過濾器_放在另一個_過濾器_里_嵌套_使用。", diff --git a/src/generated/resources/assets/create/models/item/potato_cannon.json b/src/generated/resources/assets/create/models/item/potato_cannon.json new file mode 100644 index 000000000..0767486a0 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/potato_cannon.json @@ -0,0 +1,3 @@ +{ + "parent": "create:item/potato_cannon/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 1052dd3a7..9734980b3 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -163,6 +163,12 @@ } ] }, + "fwoomp": { + "sounds": [ + "create:fwoomp" + ], + "subtitle": "create.subtitle.fwoomp" + }, "mechanical_press_activation": { "sounds": [ { @@ -214,6 +220,23 @@ } ] }, + "potato_hit": { + "sounds": [ + { + "name": "minecraft:entity.item_frame.break", + "type": "event" + } + ], + "subtitle": "create.subtitle.potato_hit" + }, + "potato_hit_compounded_1": { + "sounds": [ + { + "name": "minecraft:block.weeping_vines.break", + "type": "event" + } + ] + }, "saw_activate_stone": { "sounds": [ { diff --git a/src/generated/resources/data/create/advancements/dual_extendo_grip.json b/src/generated/resources/data/create/advancements/dual_extendo_grip.json index d8effe72f..63c805ca0 100644 --- a/src/generated/resources/data/create/advancements/dual_extendo_grip.json +++ b/src/generated/resources/data/create/advancements/dual_extendo_grip.json @@ -2,7 +2,8 @@ "parent": "create:extendo_grip", "display": { "icon": { - "item": "create:extendo_grip" + "item": "create:extendo_grip", + "nbt": "{Damage:0}" }, "title": { "translate": "advancement.create.dual_extendo_grip" diff --git a/src/generated/resources/data/create/advancements/extendo_grip.json b/src/generated/resources/data/create/advancements/extendo_grip.json index b4d7b88b1..c9176d09b 100644 --- a/src/generated/resources/data/create/advancements/extendo_grip.json +++ b/src/generated/resources/data/create/advancements/extendo_grip.json @@ -2,7 +2,8 @@ "parent": "create:crafter", "display": { "icon": { - "item": "create:extendo_grip" + "item": "create:extendo_grip", + "nbt": "{Damage:0}" }, "title": { "translate": "advancement.create.extendo_grip" diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 5873de910..bb6268498 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -1,6 +1,5 @@ package com.simibubi.create; -import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntityRenderer; @@ -13,9 +12,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.glu import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueRenderer; import com.simibubi.create.content.curiosities.tools.BlueprintEntity; import com.simibubi.create.content.curiosities.tools.BlueprintRenderer; +import com.simibubi.create.content.curiosities.weapons.PotatoProjectileEntity; +import com.simibubi.create.content.curiosities.weapons.PotatoProjectileRenderer; import com.simibubi.create.foundation.data.CreateEntityBuilder; import com.simibubi.create.foundation.utility.Lang; -import com.tterrag.registrate.builders.EntityBuilder; import com.tterrag.registrate.util.entry.EntityEntry; import com.tterrag.registrate.util.nullness.NonNullConsumer; import com.tterrag.registrate.util.nullness.NonNullSupplier; @@ -28,57 +28,54 @@ import net.minecraftforge.fml.client.registry.IRenderFactory; public class AllEntityTypes { - public static final EntityEntry ORIENTED_CONTRAPTION = - contraption("contraption", OrientedContraptionEntity::new, () -> OrientedContraptionEntityRenderer::new, - 5, 3, true); + public static final EntityEntry ORIENTED_CONTRAPTION = contraption("contraption", + OrientedContraptionEntity::new, () -> OrientedContraptionEntityRenderer::new, 5, 3, true); public static final EntityEntry CONTROLLED_CONTRAPTION = - contraption("stationary_contraption", ControlledContraptionEntity::new, () -> ContraptionEntityRenderer::new, - 20, 40, false); - public static final EntityEntry GANTRY_CONTRAPTION = - contraption("gantry_contraption", GantryContraptionEntity::new, () -> ContraptionEntityRenderer::new, - 10, 40, false); + contraption("stationary_contraption", ControlledContraptionEntity::new, () -> ContraptionEntityRenderer::new, + 20, 40, false); + public static final EntityEntry GANTRY_CONTRAPTION = contraption("gantry_contraption", + GantryContraptionEntity::new, () -> ContraptionEntityRenderer::new, 10, 40, false); public static final EntityEntry SUPER_GLUE = - register("super_glue", SuperGlueEntity::new, () -> SuperGlueRenderer::new, - EntityClassification.MISC, 10, Integer.MAX_VALUE, false, true, SuperGlueEntity::build) - .instance(() -> GlueInstance::new) - .register(); + register("super_glue", SuperGlueEntity::new, () -> SuperGlueRenderer::new, EntityClassification.MISC, 10, + Integer.MAX_VALUE, false, true, SuperGlueEntity::build).instance(() -> GlueInstance::new) + .register(); public static final EntityEntry CRAFTING_BLUEPRINT = - register("crafting_blueprint", BlueprintEntity::new, () -> BlueprintRenderer::new, - EntityClassification.MISC, 10, Integer.MAX_VALUE, false, true, BlueprintEntity::build).register(); + register("crafting_blueprint", BlueprintEntity::new, () -> BlueprintRenderer::new, EntityClassification.MISC, + 10, Integer.MAX_VALUE, false, true, BlueprintEntity::build).register(); - public static final EntityEntry SEAT = - register("seat", SeatEntity::new, () -> SeatEntity.Render::new, - EntityClassification.MISC, 0, Integer.MAX_VALUE, false, true, SeatEntity::build).register(); + public static final EntityEntry POTATO_PROJECTILE = + register("potato_projectile", PotatoProjectileEntity::new, () -> PotatoProjectileRenderer::new, + EntityClassification.MISC, 4, 20, true, true, PotatoProjectileEntity::build).register(); + + public static final EntityEntry SEAT = register("seat", SeatEntity::new, () -> SeatEntity.Render::new, + EntityClassification.MISC, 0, Integer.MAX_VALUE, false, true, SeatEntity::build).register(); // private static EntityEntry contraption(String name, IFactory factory, - NonNullSupplier> renderer, int range, int updateFrequency, - boolean sendVelocity) { - return register(name, factory, renderer, EntityClassification.MISC, range, updateFrequency, - sendVelocity, true, AbstractContraptionEntity::build).register(); + NonNullSupplier> renderer, int range, int updateFrequency, boolean sendVelocity) { + return register(name, factory, renderer, EntityClassification.MISC, range, updateFrequency, sendVelocity, true, + AbstractContraptionEntity::build).register(); } private static CreateEntityBuilder register(String name, IFactory factory, - NonNullSupplier> renderer, EntityClassification group, int range, - int updateFrequency, boolean sendVelocity, boolean immuneToFire, - NonNullConsumer> propertyBuilder) { + NonNullSupplier> renderer, EntityClassification group, int range, int updateFrequency, + boolean sendVelocity, boolean immuneToFire, NonNullConsumer> propertyBuilder) { String id = Lang.asId(name); return (CreateEntityBuilder) Create.registrate() - .entity(id, factory, group) - .properties(b -> b.setTrackingRange(range) - .setUpdateInterval(updateFrequency) - .setShouldReceiveVelocityUpdates(sendVelocity)) - .properties(propertyBuilder) - .properties(b -> { - if (immuneToFire) - b.immuneToFire(); - }) - .renderer(renderer); + .entity(id, factory, group) + .properties(b -> b.setTrackingRange(range) + .setUpdateInterval(updateFrequency) + .setShouldReceiveVelocityUpdates(sendVelocity)) + .properties(propertyBuilder) + .properties(b -> { + if (immuneToFire) + b.immuneToFire(); + }) + .renderer(renderer); } - public static void register() { - } + public static void register() {} } diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index e926eaa33..c7d7521d6 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -1,10 +1,10 @@ package com.simibubi.create; +import static com.simibubi.create.AllTags.forgeItemTag; import static com.simibubi.create.AllTags.AllItemTags.CREATE_INGOTS; import static com.simibubi.create.AllTags.AllItemTags.CRUSHED_ORES; import static com.simibubi.create.AllTags.AllItemTags.NUGGETS; import static com.simibubi.create.AllTags.AllItemTags.PLATES; -import static com.simibubi.create.AllTags.forgeItemTag; import static com.simibubi.create.content.AllSections.CURIOSITIES; import static com.simibubi.create.content.AllSections.KINETICS; import static com.simibubi.create.content.AllSections.LOGISTICS; @@ -40,6 +40,8 @@ import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; import com.simibubi.create.content.curiosities.tools.ExtendoGripModel; import com.simibubi.create.content.curiosities.tools.SandPaperItem; import com.simibubi.create.content.curiosities.tools.SandPaperItemRenderer.SandPaperModel; +import com.simibubi.create.content.curiosities.weapons.PotatoCannonItem; +import com.simibubi.create.content.curiosities.weapons.PotatoCannonModel; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperItem; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperModel; import com.simibubi.create.content.logistics.item.LinkedControllerItem; @@ -65,7 +67,7 @@ import net.minecraft.util.ResourceLocation; public class AllItems { private static final CreateRegistrate REGISTRATE = Create.registrate() - .itemGroup(() -> Create.BASE_CREATIVE_TAB); + .itemGroup(() -> Create.BASE_CREATIVE_TAB); // Schematics @@ -126,10 +128,10 @@ public class AllItems { BRASS_INGOT = taggedIngredient("brass_ingot", forgeItemTag("ingots/brass"), CREATE_INGOTS.tag); public static final ItemEntry CHROMATIC_COMPOUND = - REGISTRATE.item("chromatic_compound", ChromaticCompoundItem::new) - .properties(p -> p.rarity(Rarity.UNCOMMON)) - .model(AssetLookup.existingItemModel()) - .color(() -> ChromaticCompoundColor::new) + REGISTRATE.item("chromatic_compound", ChromaticCompoundItem::new) + .properties(p -> p.rarity(Rarity.UNCOMMON)) + .model(AssetLookup.existingItemModel()) + .color(() -> ChromaticCompoundColor::new) .register(); public static final ItemEntry SHADOW_STEEL = REGISTRATE.item("shadow_steel", ShadowSteelItem::new) @@ -187,29 +189,29 @@ public class AllItems { public static final ItemEntry GOGGLES = REGISTRATE.item("goggles", GogglesItem::new) .properties(p -> p.maxStackSize(1)) - .onRegister(CreateRegistrate.itemModel(() -> GogglesModel::new)) - .lang("Engineer's Goggles") - .register(); + .onRegister(CreateRegistrate.itemModel(() -> GogglesModel::new)) + .lang("Engineer's Goggles") + .register(); public static final ItemEntry SUPER_GLUE = REGISTRATE.item("super_glue", SuperGlueItem::new) - .register(); + .register(); public static final ItemEntry MINECART_COUPLING = - REGISTRATE.item("minecart_coupling", MinecartCouplingItem::new) - .register(); + REGISTRATE.item("minecart_coupling", MinecartCouplingItem::new) + .register(); public static final ItemEntry CRAFTING_BLUEPRINT = - REGISTRATE.item("crafting_blueprint", BlueprintItem::new) - .register(); + REGISTRATE.item("crafting_blueprint", BlueprintItem::new) + .register(); public static final ItemEntry SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) - .register(); + .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) + .register(); public static final ItemEntry RED_SAND_PAPER = REGISTRATE.item("red_sand_paper", SandPaperItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) - .onRegister(s -> TooltipHelper.referTo(s, SAND_PAPER)) - .register(); + .transform(CreateRegistrate.customRenderedItem(() -> SandPaperModel::new)) + .onRegister(s -> TooltipHelper.referTo(s, SAND_PAPER)) + .register(); public static final ItemEntry WRENCH = REGISTRATE.item("wrench", WrenchItem::new) .properties(p -> p.maxStackSize(1)) @@ -228,6 +230,12 @@ public class AllItems { .model(AssetLookup.itemModelWithPartials()) .register(); + public static final ItemEntry POTATO_CANNON = + REGISTRATE.item("potato_cannon", PotatoCannonItem::new) + .transform(CreateRegistrate.customRenderedItem(() -> PotatoCannonModel::new)) + .model(AssetLookup.itemModelWithPartials()) + .register(); + public static final ItemEntry WAND_OF_SYMMETRY = REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new) .transform(CreateRegistrate.customRenderedItem(() -> SymmetryWandModel::new)) diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index dc2b0f0c0..9056afc59 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -115,6 +115,16 @@ public class AllSoundEvents { .category(SoundCategory.BLOCKS) .build(), + FWOOMP = create("fwoomp").subtitle("Potato Launcher fwoomps") + .category(SoundCategory.PLAYERS) + .build(), + + POTATO_HIT = create("potato_hit").subtitle("Vegetable impacts") + .playExisting(SoundEvents.ENTITY_ITEM_FRAME_BREAK, .75f, .75f) + .playExisting(SoundEvents.BLOCK_WEEPING_VINES_BREAK, .75f, 1.25f) + .category(SoundCategory.PLAYERS) + .build(), + CONTRAPTION_ASSEMBLE = create("contraption_assemble").subtitle("Contraption moves") .playExisting(SoundEvents.BLOCK_WOODEN_TRAPDOOR_OPEN, .5f, .5f) .playExisting(SoundEvents.BLOCK_CHEST_OPEN, .045f, .74f) @@ -177,7 +187,7 @@ public class AllSoundEvents { .playExisting(SoundEvents.BLOCK_SAND_PLACE, .075f, .75f) .category(SoundCategory.BLOCKS) .build(), - + SAW_IDLE = create("saw_idle").subtitle("Mechanical Saw turns") .playExisting(SoundEvents.ENTITY_BOAT_PADDLE_LAND) .category(SoundCategory.BLOCKS) diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index d86dea882..9a54332c1 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -10,6 +10,7 @@ import com.google.gson.GsonBuilder; import com.simibubi.create.content.CreateItemGroup; import com.simibubi.create.content.contraptions.TorquePropagator; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; +import com.simibubi.create.content.curiosities.weapons.PotatoCannonProjectileTypes; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; import com.simibubi.create.content.palettes.AllPaletteBlocks; import com.simibubi.create.content.palettes.PalettesItemGroup; @@ -115,6 +116,7 @@ public class Create { AllPackets.registerPackets(); AllTriggers.register(); + PotatoCannonProjectileTypes.register(); event.enqueueWork(() -> { SchematicProcessor.register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java index 31d219f96..ff51b5719 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java @@ -44,9 +44,15 @@ public class AirParticle extends SimpleAnimatedParticle { twirlAxis = Create.RANDOM.nextBoolean() ? Axis.X : Axis.Z; // speed in m/ticks - maxAge = Math.min((int) (new Vector3d(dx, dy, dz).length() / data.speed), 60); + double length = new Vector3d(dx, dy, dz).length(); + maxAge = Math.min((int) (length / data.speed), 60); selectSprite(7); setAlphaF(.25f); + + if (length == 0) { + setExpired(); + setAlphaF(0); + } } public IParticleRenderType getRenderType() { diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java b/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java new file mode 100644 index 000000000..d38cb9ff2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java @@ -0,0 +1,103 @@ +package com.simibubi.create.content.curiosities.armor; + +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.config.AllConfigs; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class BackTankUtil { + + public static ItemStack get(LivingEntity entity) { + for (ItemStack itemStack : entity.getArmorInventoryList()) + if (AllItems.COPPER_BACKTANK.isIn(itemStack)) + return itemStack; + return ItemStack.EMPTY; + } + + public static boolean hasAirRemaining(ItemStack backtank) { + return getAir(backtank) > 0; + } + + public static float getAir(ItemStack backtank) { + CompoundNBT tag = backtank.getOrCreateTag(); + return tag.getFloat("Air"); + } + + public static void consumeAir(ItemStack backtank, float i) { + CompoundNBT tag = backtank.getOrCreateTag(); + tag.putFloat("Air", getAir(backtank) - i); + backtank.setTag(tag); + } + + private static float maxAir() { + return AllConfigs.SERVER.curiosities.maxAirInBacktank.get(); + } + + public static boolean canAbsorbDamage(LivingEntity entity, int usesPerTank) { + if (usesPerTank == 0) + return true; + if (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative()) + return true; + ItemStack backtank = get(entity); + if (backtank.isEmpty()) + return false; + if (!hasAirRemaining(backtank)) + return false; + float cost = maxAir() / usesPerTank; + consumeAir(backtank, cost); + return true; + } + + // For Air-using tools + + @OnlyIn(Dist.CLIENT) + public static int getRGBDurabilityForDisplay(ItemStack stack, int usesPerTank) { + if (usesPerTank == 0) + return 0; + ClientPlayerEntity player = Minecraft.getInstance().player; + if (player == null) + return 0; + ItemStack backtank = get(player); + if (backtank.isEmpty() || !hasAirRemaining(backtank)) + return MathHelper.hsvToRGB( + Math.max(0.0F, (float) (1.0F - getDurabilityForDisplay(stack, usesPerTank))) / 3.0F, 1.0F, 1.0F); + return backtank.getItem() + .getRGBDurabilityForDisplay(backtank); + } + + @OnlyIn(Dist.CLIENT) + public static double getDurabilityForDisplay(ItemStack stack, int usesPerTank) { + if (usesPerTank == 0) + return 0; + ClientPlayerEntity player = Minecraft.getInstance().player; + if (player == null) + return 0; + ItemStack backtank = get(player); + if (backtank.isEmpty() || !hasAirRemaining(backtank)) + return (double) stack.getDamage() / (double) stack.getMaxDamage(); + return backtank.getItem() + .getDurabilityForDisplay(backtank); + } + + @OnlyIn(Dist.CLIENT) + public static boolean showDurabilityBar(ItemStack stack, int usesPerTank) { + if (usesPerTank == 0) + return false; + ClientPlayerEntity player = Minecraft.getInstance().player; + if (player == null) + return false; + ItemStack backtank = get(player); + if (backtank.isEmpty() || !hasAirRemaining(backtank)) + return stack.isDamaged(); + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankItem.java index 571f8097d..7e537816d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankItem.java @@ -14,6 +14,7 @@ import net.minecraft.util.math.MathHelper; public class CopperBacktankItem extends CopperArmorItem { + public static final int DURABILITY_BAR = 0xefefef; private BlockItem blockItem; public CopperBacktankItem(Properties p_i48534_3_, BlockItem blockItem) { @@ -33,7 +34,7 @@ public class CopperBacktankItem extends CopperArmorItem { @Override public int getRGBDurabilityForDisplay(ItemStack stack) { - return 0xefefef; + return DURABILITY_BAR; } @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java index 6562b9416..dae5e477a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java @@ -6,7 +6,6 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Effects; import net.minecraft.tags.FluidTags; @@ -28,7 +27,7 @@ public class DivingHelmetItem extends CopperArmorItem { World world = entity.world; boolean second = world.getGameTime() % 20 == 0; boolean drowning = entity.getAir() == 0; - + if (world.isRemote) entity.getPersistentData() .remove("VisualBacktankAir"); @@ -41,20 +40,10 @@ public class DivingHelmetItem extends CopperArmorItem { if (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative()) return; - ItemStack backtank = ItemStack.EMPTY; - for (ItemStack itemStack : entity.getArmorInventoryList()) { - if (AllItems.COPPER_BACKTANK.isIn(itemStack)) { - backtank = itemStack; - break; - } - } - + ItemStack backtank = BackTankUtil.get(entity); if (backtank.isEmpty()) return; - - CompoundNBT tag = backtank.getOrCreateTag(); - int airRemaining = tag.getInt("Air"); - if (airRemaining == 0) + if (!BackTankUtil.hasAirRemaining(backtank)) return; if (drowning) @@ -62,15 +51,14 @@ public class DivingHelmetItem extends CopperArmorItem { if (world.isRemote) entity.getPersistentData() - .putInt("VisualBacktankAir", airRemaining); + .putInt("VisualBacktankAir", (int) BackTankUtil.getAir(backtank)); if (!second) return; entity.setAir(Math.min(entity.getMaxAir(), entity.getAir() + 10)); entity.addPotionEffect(new EffectInstance(Effects.WATER_BREATHING, 30, 0, true, false, true)); - tag.putInt("Air", airRemaining - 1); - backtank.setTag(tag); + BackTankUtil.consumeAir(backtank, 1); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java index 3b6a2acc6..1cf868e5a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java @@ -5,7 +5,9 @@ import java.util.UUID; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import com.simibubi.create.AllItems; +import com.simibubi.create.content.curiosities.armor.BackTankUtil; import com.simibubi.create.foundation.advancement.AllTriggers; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -20,9 +22,11 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.projectile.ProjectileHelper; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.item.Rarity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.DamageSource; +import net.minecraft.util.Hand; import net.minecraft.util.LazyValue; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockRayTraceResult; @@ -39,6 +43,9 @@ import net.minecraftforge.event.entity.living.LivingKnockBackEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.world.BlockEvent.BreakEvent; +import net.minecraftforge.event.world.BlockEvent.EntityPlaceEvent; +import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -46,24 +53,26 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber; public class ExtendoGripItem extends Item { private static DamageSource lastActiveDamageSource; - public static final AttributeModifier singleRangeAttributeModifier = new AttributeModifier(UUID.fromString("7f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 3, AttributeModifier.Operation.ADDITION); - public static final AttributeModifier doubleRangeAttributeModifier = new AttributeModifier(UUID.fromString("8f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 5, AttributeModifier.Operation.ADDITION); + public static final int MAX_DAMAGE = 200; - static LazyValue> rangeModifier = - new LazyValue<>(() -> - // Holding an ExtendoGrip - ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), singleRangeAttributeModifier) - ); + public static final AttributeModifier singleRangeAttributeModifier = + new AttributeModifier(UUID.fromString("7f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 3, + AttributeModifier.Operation.ADDITION); + public static final AttributeModifier doubleRangeAttributeModifier = + new AttributeModifier(UUID.fromString("8f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 5, + AttributeModifier.Operation.ADDITION); - static LazyValue> doubleRangeModifier = - new LazyValue<>(() -> - // Holding two ExtendoGrips o.O - ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), doubleRangeAttributeModifier) - ); + static LazyValue> rangeModifier = new LazyValue<>(() -> + // Holding an ExtendoGrip + ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), singleRangeAttributeModifier)); + + static LazyValue> doubleRangeModifier = new LazyValue<>(() -> + // Holding two ExtendoGrips o.O + ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), doubleRangeAttributeModifier)); public ExtendoGripItem(Properties properties) { super(properties.maxStackSize(1) - .rarity(Rarity.UNCOMMON)); + .rarity(Rarity.UNCOMMON)); } public static final String EXTENDO_MARKER = "createExtendo"; @@ -87,13 +96,14 @@ public class ExtendoGripItem extends Item { if (holdingExtendo != wasHoldingExtendo) { if (!holdingExtendo) { - player.getAttributes().removeModifiers(rangeModifier.getValue()); + player.getAttributes() + .removeModifiers(rangeModifier.getValue()); persistentData.remove(EXTENDO_MARKER); } else { if (player instanceof ServerPlayerEntity) AllTriggers.EXTENDO.trigger((ServerPlayerEntity) player); player.getAttributes() - .addTemporaryModifiers(rangeModifier.getValue()); + .addTemporaryModifiers(rangeModifier.getValue()); persistentData.putBoolean(EXTENDO_MARKER, true); } } @@ -101,13 +111,13 @@ public class ExtendoGripItem extends Item { if (holdingDualExtendo != wasHoldingDualExtendo) { if (!holdingDualExtendo) { player.getAttributes() - .removeModifiers(doubleRangeModifier.getValue()); + .removeModifiers(doubleRangeModifier.getValue()); persistentData.remove(DUAL_EXTENDO_MARKER); } else { if (player instanceof ServerPlayerEntity) AllTriggers.GIGA_EXTENDO.trigger((ServerPlayerEntity) player); player.getAttributes() - .addTemporaryModifiers(doubleRangeModifier.getValue()); + .addTemporaryModifiers(doubleRangeModifier.getValue()); persistentData.putBoolean(DUAL_EXTENDO_MARKER, true); } } @@ -120,9 +130,11 @@ public class ExtendoGripItem extends Item { CompoundNBT persistentData = player.getPersistentData(); if (persistentData.contains(DUAL_EXTENDO_MARKER)) - player.getAttributes().addTemporaryModifiers(doubleRangeModifier.getValue()); + player.getAttributes() + .addTemporaryModifiers(doubleRangeModifier.getValue()); else if (persistentData.contains(EXTENDO_MARKER)) - player.getAttributes().addTemporaryModifiers(rangeModifier.getValue()); + player.getAttributes() + .addTemporaryModifiers(rangeModifier.getValue()); } @SubscribeEvent @@ -164,10 +176,81 @@ public class ExtendoGripItem extends Item { } } + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void consumeDurabilityOnBlockBreak(BreakEvent event) { + findAndDamageExtendoGrip(event.getPlayer()); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void consumeDurabilityOnPlace(EntityPlaceEvent event) { + Entity entity = event.getEntity(); + if (entity instanceof PlayerEntity) + findAndDamageExtendoGrip((PlayerEntity) entity); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void consumeDurabilityOnPlace(PlayerInteractEvent event) { +// findAndDamageExtendoGrip(event.getPlayer()); + } + + private static void findAndDamageExtendoGrip(PlayerEntity player) { + if (player == null) + return; + if (player.world.isRemote) + return; + Hand hand = Hand.MAIN_HAND; + ItemStack extendo = player.getHeldItemMainhand(); + if (!AllItems.EXTENDO_GRIP.isIn(extendo)) { + extendo = player.getHeldItemOffhand(); + hand = Hand.OFF_HAND; + } + if (!AllItems.EXTENDO_GRIP.isIn(extendo)) + return; + final Hand h = hand; + if (!BackTankUtil.canAbsorbDamage(player, maxUses())) + extendo.damageItem(1, player, p -> p.sendBreakAnimation(h)); + } + + @Override + public int getRGBDurabilityForDisplay(ItemStack stack) { + return BackTankUtil.getRGBDurabilityForDisplay(stack, maxUses()); + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return BackTankUtil.getDurabilityForDisplay(stack, maxUses()); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return BackTankUtil.showDurabilityBar(stack, maxUses()); + } + + private static int maxUses() { + return AllConfigs.SERVER.curiosities.maxExtendoGripActions.get(); + } + + @Override + public boolean isDamageable() { + return true; + } + + @Override + public int getMaxDamage(ItemStack stack) { + return MAX_DAMAGE; + } + @SubscribeEvent public static void bufferLivingAttackEvent(LivingAttackEvent event) { - // Workaround for removed patch to get the attacking entity. Tbf this is a hack and a half, but it should work. + // Workaround for removed patch to get the attacking entity. lastActiveDamageSource = event.getSource(); + + DamageSource source = event.getSource(); + if (source == null) + return; + Entity trueSource = source.getTrueSource(); + if (trueSource instanceof PlayerEntity) + findAndDamageExtendoGrip((PlayerEntity) trueSource); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItem.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItem.java new file mode 100644 index 000000000..cd6fd4e0b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItem.java @@ -0,0 +1,206 @@ +package com.simibubi.create.content.curiosities.weapons; + +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; + +import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.content.curiosities.armor.BackTankUtil; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.ShootableItem; +import net.minecraft.util.ActionResult; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Hand; +import net.minecraft.util.HandSide; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3d; +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; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.network.PacketDistributor; + +public class PotatoCannonItem extends ShootableItem { + + public static ItemStack CLIENT_CURRENT_AMMO = ItemStack.EMPTY; + public static final int MAX_DAMAGE = 100; + + public static int PREV_SHOT = 0; + + public PotatoCannonItem(Properties p_i48487_1_) { + super(p_i48487_1_); + } + + @Override + public boolean canPlayerBreakBlockWhileHolding(BlockState p_195938_1_, World p_195938_2_, BlockPos p_195938_3_, + PlayerEntity p_195938_4_) { + return false; + } + + @Override + public ActionResultType onItemUse(ItemUseContext context) { + return onItemRightClick(context.getWorld(), context.getPlayer(), context.getHand()).getType(); + } + + @Override + public int getRGBDurabilityForDisplay(ItemStack stack) { + return BackTankUtil.getRGBDurabilityForDisplay(stack, maxUses()); + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return BackTankUtil.getDurabilityForDisplay(stack, maxUses()); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) { + return BackTankUtil.showDurabilityBar(stack, maxUses()); + } + + private int maxUses() { + return AllConfigs.SERVER.curiosities.maxPotatoCannonShots.get(); + } + + @Override + public boolean isDamageable() { + return true; + } + + @Override + public int getMaxDamage(ItemStack stack) { + return MAX_DAMAGE; + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { + ItemStack stack = player.getHeldItem(hand); + if (world.isRemote) + return ActionResult.pass(stack); + + findAmmoInInventory(world, player, stack).ifPresent(itemStack -> { + PotatoProjectileEntity projectile = AllEntityTypes.POTATO_PROJECTILE.create(world); + Vector3d offset = VecHelper.rotate(player.getLookVec() + .scale(1.25f), (hand == Hand.MAIN_HAND) == (player.getPrimaryHand() == HandSide.RIGHT) ? -25 : 25, + Axis.Y); + Vector3d vec = player.getBoundingBox() + .getCenter() + .add(0, player.getBoundingBox() + .getYSize() / 5f, 0) + .add(offset); + + projectile.setPosition(vec.x, vec.y, vec.z); + projectile.setMotion(player.getLookVec() + .scale(1.75f)); + projectile.setItem(itemStack); + projectile.setShooter(player); + world.addEntity(projectile); + PotatoProjectileEntity.playLaunchSound(world, player.getPositionVec(), projectile.getProjectileType() + .getSoundPitch()); + + if (player instanceof ServerPlayerEntity) + AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) player), + new PotatoCannonPacket()); + + if (!player.isCreative()) { + itemStack.shrink(1); + if (itemStack.isEmpty()) + player.inventory.deleteStack(itemStack); + } + + if (!BackTankUtil.canAbsorbDamage(player, maxUses())) + stack.damageItem(1, player, p -> p.sendBreakAnimation(hand)); + + Integer cooldown = + findAmmoInInventory(world, player, stack).flatMap(PotatoCannonProjectileTypes::getProjectileTypeOf) + .map(PotatoCannonProjectileTypes::getReloadTicks) + .orElse(10); + player.getCooldownTracker() + .setCooldown(this, cooldown); + }); + + return ActionResult.pass(stack); + } + + @Override + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { + return slotChanged || newStack.getItem() != oldStack.getItem(); + } + + private Optional findAmmoInInventory(World world, PlayerEntity player, ItemStack held) { + ItemStack findAmmo = player.findAmmo(held); + return PotatoCannonProjectileTypes.getProjectileTypeOf(findAmmo) + .map($ -> findAmmo); + } + + @OnlyIn(Dist.CLIENT) + public static Optional getAmmoforPreview(ItemStack cannon) { + if (AnimationTickHolder.getTicks() % 3 != 0) + return Optional.of(CLIENT_CURRENT_AMMO) + .filter(stack -> !stack.isEmpty()); + + ClientPlayerEntity player = Minecraft.getInstance().player; + CLIENT_CURRENT_AMMO = ItemStack.EMPTY; + if (player == null) + return Optional.empty(); + ItemStack findAmmo = player.findAmmo(cannon); + Optional found = PotatoCannonProjectileTypes.getProjectileTypeOf(findAmmo) + .map($ -> findAmmo); + found.ifPresent(stack -> CLIENT_CURRENT_AMMO = stack); + return found; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { + getAmmoforPreview(stack).ifPresent(ammo -> { + tooltip.add(new StringTextComponent("")); + tooltip.add(new TranslationTextComponent(ammo.getTranslationKey()).append(new StringTextComponent(":")) + .formatted(TextFormatting.GRAY)); + PotatoCannonProjectileTypes type = PotatoCannonProjectileTypes.getProjectileTypeOf(ammo) + .get(); + StringTextComponent spacing = new StringTextComponent(" "); + TextFormatting darkGreen = TextFormatting.DARK_GREEN; + tooltip.add(spacing.copy() + .append(new StringTextComponent(type.getDamage() + " Attack Damage").formatted(darkGreen))); + tooltip.add(spacing.copy() + .append(new StringTextComponent(type.getReloadTicks() + " Reload Ticks").formatted(darkGreen))); + tooltip.add(spacing.copy() + .append(new StringTextComponent(type.getKnockback() + " Knockback").formatted(darkGreen))); + }); + super.addInformation(stack, world, tooltip, flag); + } + + @Override + public Predicate getInventoryAmmoPredicate() { + return stack -> PotatoCannonProjectileTypes.getProjectileTypeOf(stack) + .isPresent(); + } + + @Override + public int getRange() { + return 15; + } + + // FIXME Temporary; use zappers way of animating + public static void clientTick() { + if (PREV_SHOT > 0) + PREV_SHOT--; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItemRenderer.java new file mode 100644 index 000000000..d7bc51e0c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonItemRenderer.java @@ -0,0 +1,60 @@ +package com.simibubi.create.content.curiosities.weapons; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; +import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.vector.Vector3f; + +public class PotatoCannonItemRenderer extends CustomRenderedItemModelRenderer { + + @Override + protected void render(ItemStack stack, PotatoCannonModel model, PartialItemModelRenderer renderer, + TransformType transformType, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + renderer.render(model.getOriginalModel(), light); + ClientPlayerEntity player = Minecraft.getInstance().player; + boolean mainHand = player.getHeldItemMainhand() == stack; + boolean offHand = player.getHeldItemOffhand() == stack; + + float speed = PotatoCannonItem.PREV_SHOT == 0 ? 0 + : (PotatoCannonItem.PREV_SHOT - AnimationTickHolder.getPartialTicks()) / 5f; + float worldTime = AnimationTickHolder.getRenderTime() / 10; + float angle = worldTime * -25; + if (mainHand || offHand) + angle += 30 * speed * speed; + + angle %= 360; + float offset = .5f / 16; + ms.push(); + ms.translate(0, offset, 0); + ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(angle)); + ms.translate(0, -offset, 0); + renderer.render(model.getPartial("cog"), light); + ms.pop(); + + if (transformType == TransformType.GUI) { + PotatoCannonItem.getAmmoforPreview(stack) + .ifPresent(ammo -> { + MatrixStack localMs = new MatrixStack(); + localMs.translate(-1 / 4f, -1 / 4f, 1); + localMs.scale(.5f, .5f, .5f); + MatrixStacker.of(localMs) + .rotateY(-34); + itemRenderer.renderItem(ammo, TransformType.GUI, light, OverlayTexture.DEFAULT_UV, localMs, buffer); + }); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonModel.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonModel.java new file mode 100644 index 000000000..5896c4d8e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonModel.java @@ -0,0 +1,20 @@ +package com.simibubi.create.content.curiosities.weapons; + +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; + +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; + +public class PotatoCannonModel extends CustomRenderedItemModel { + + public PotatoCannonModel(IBakedModel template) { + super(template, "potato_cannon"); + addPartials("cog"); + } + + @Override + public ItemStackTileEntityRenderer createRenderer() { + return new PotatoCannonItemRenderer(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonPacket.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonPacket.java new file mode 100644 index 000000000..26378508a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonPacket.java @@ -0,0 +1,27 @@ +package com.simibubi.create.content.curiosities.weapons; + +import java.util.function.Supplier; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class PotatoCannonPacket extends SimplePacketBase { + + public PotatoCannonPacket() {} + + public PotatoCannonPacket(PacketBuffer buffer) {} + + @Override + public void write(PacketBuffer buffer) {} + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> PotatoCannonItem.PREV_SHOT = 15); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonProjectileTypes.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonProjectileTypes.java new file mode 100644 index 000000000..2ab4dd6f7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoCannonProjectileTypes.java @@ -0,0 +1,221 @@ +package com.simibubi.create.content.curiosities.weapons; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.function.Consumer; + +import com.simibubi.create.Create; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effects; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.EntityRayTraceResult; +import net.minecraftforge.registries.IRegistryDelegate; + +public class PotatoCannonProjectileTypes { + + public static final Map ALL = new HashMap<>(); + public static final Map, PotatoCannonProjectileTypes> ITEM_MAP = new HashMap<>(); + public static final PotatoCannonProjectileTypes + + FALLBACK = create("fallback").damage(0) + .register(), + + POTATO = create("potato").damage(4) + .reloadTicks(15) + .knockback(1.5f) + .renderTumbling() + .registerAndAssign(Items.POTATO), + + BAKED_POTATO = create("baked_potato").damage(3) + .reloadTicks(15) + .knockback(1.5f) + .renderTumbling() + .onEntityHit(ray -> ray.getEntity() + .setFireTicks(10)) + .registerAndAssign(Items.BAKED_POTATO), + + CARROT = create("carrot").damage(3) + .renderTowardMotion(140, 1) + .velocity(1.25f) + .knockback(0.5f) + .soundPitch(1.25f) + .registerAndAssign(Items.CARROT), + + GOLDEN_CARROT = create("golden_carrot").damage(8) + .reloadTicks(20) + .knockback(0.5f) + .velocity(1.25f) + .renderTowardMotion(140, 2) + .soundPitch(1.25f) + .registerAndAssign(Items.GOLDEN_CARROT), + + POISON_POTATO = create("poison_potato").damage(5) + .reloadTicks(15) + .knockback(0.5f) + .renderTumbling() + .onEntityHit(ray -> { + Entity entity = ray.getEntity(); + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(Effects.POISON, 40)); + }) + .registerAndAssign(Items.POISONOUS_POTATO) + + ; + + public static void registerType(ResourceLocation resLoc, PotatoCannonProjectileTypes type) { + ALL.put(resLoc, type); + } + + public static void assignType(IRegistryDelegate item, PotatoCannonProjectileTypes type) { + ITEM_MAP.put(item, type); + } + + public static Optional getProjectileTypeOf(ItemStack item) { + if (item.isEmpty()) + return Optional.empty(); + return Optional.ofNullable(ITEM_MAP.get(item.getItem().delegate)); + } + + public static void register() {} + + private static PotatoCannonProjectileTypes.Builder create(String name) { + return new PotatoCannonProjectileTypes.Builder(Create.asResource(name)); + } + + private float gravityMultiplier = 1; + private float velocityMultiplier = 1; + private float knockback = 1; + private int reloadTicks = 10; + private int damage = 1; + private float fwoompPitch = 1; + private PotatoProjectileRenderMode renderMode = new PotatoProjectileRenderMode.Billboard(); + private Consumer onEntityHit = e -> { + }; + private Consumer onBlockHit = e -> { + }; + + public float getGravityMultiplier() { + return gravityMultiplier; + } + + public float getVelocityMultiplier() { + return velocityMultiplier; + } + + public float getKnockback() { + return knockback; + } + + public int getReloadTicks() { + return reloadTicks; + } + + public float getSoundPitch() { + return fwoompPitch; + } + + public PotatoProjectileRenderMode getRenderMode() { + return renderMode; + } + + public int getDamage() { + return damage; + } + + public void onEntityHit(EntityRayTraceResult ray) { + onEntityHit.accept(ray); + } + + public void onBlockHit(BlockRayTraceResult ray) { + onBlockHit.accept(ray); + } + + public static class Builder { + + ResourceLocation loc; + PotatoCannonProjectileTypes result; + + public Builder(ResourceLocation loc) { + this.result = new PotatoCannonProjectileTypes(); + this.loc = loc; + } + + public Builder damage(int damage) { + result.damage = damage; + return this; + } + + public Builder gravity(float modifier) { + result.gravityMultiplier = modifier; + return this; + } + + public Builder knockback(float knockback) { + result.knockback = knockback; + return this; + } + + public Builder reloadTicks(int reload) { + result.reloadTicks = reload; + return this; + } + + public Builder soundPitch(float pitch) { + result.fwoompPitch = pitch; + return this; + } + + public Builder velocity(float velocity) { + result.velocityMultiplier = velocity; + return this; + } + + public Builder renderTumbling() { + result.renderMode = new PotatoProjectileRenderMode.Tumble(); + return this; + } + + public Builder renderBillboard() { + result.renderMode = new PotatoProjectileRenderMode.Billboard(); + return this; + } + + public Builder renderTowardMotion(int spriteAngle, float spin) { + result.renderMode = new PotatoProjectileRenderMode.TowardMotion(spriteAngle, spin); + return this; + } + + public Builder onEntityHit(Consumer callback) { + result.onEntityHit = callback; + return this; + } + + public Builder onBlockHit(Consumer callback) { + result.onBlockHit = callback; + return this; + } + + public PotatoCannonProjectileTypes register() { + registerType(loc, result); + return result; + } + + public PotatoCannonProjectileTypes registerAndAssign(IItemProvider... items) { + registerType(loc, result); + for (IItemProvider provider : items) + assignType(provider.asItem().delegate, result); + return result; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileEntity.java new file mode 100644 index 000000000..2849bbd03 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileEntity.java @@ -0,0 +1,235 @@ +package com.simibubi.create.content.curiosities.weapons; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.contraptions.particle.AirParticleData; +import com.simibubi.create.foundation.advancement.AllTriggers; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.projectile.DamagingProjectileEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.IPacket; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.SChangeGameStatePacket; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ItemParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.DamageSource; +import net.minecraft.util.IndirectEntityDamageSource; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.EntityRayTraceResult; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; +import net.minecraftforge.fml.network.NetworkHooks; + +public class PotatoProjectileEntity extends DamagingProjectileEntity implements IEntityAdditionalSpawnData { + + ItemStack stack = ItemStack.EMPTY; + PotatoCannonProjectileTypes type; + + public PotatoProjectileEntity(EntityType type, World world) { + super(type, world); + } + + public ItemStack getItem() { + return stack; + } + + public void setItem(ItemStack stack) { + this.stack = stack; + } + + public PotatoCannonProjectileTypes getProjectileType() { + if (type == null) + type = PotatoCannonProjectileTypes.getProjectileTypeOf(stack) + .orElse(PotatoCannonProjectileTypes.FALLBACK); + return type; + } + + @Override + public void readAdditional(CompoundNBT nbt) { + stack = ItemStack.read(nbt.getCompound("Item")); + super.readAdditional(nbt); + } + + @Override + public void writeAdditional(CompoundNBT nbt) { + nbt.put("Item", stack.serializeNBT()); + super.writeAdditional(nbt); + } + + public void tick() { + setMotion(getMotion().add(0, -.05, 0) + .scale(.99f)); + super.tick(); + } + + @Override + protected float getMotionFactor() { + return 1; + } + + @Override + protected IParticleData getParticle() { + return new AirParticleData(1, 10); + } + + @Override + protected boolean isFireballFiery() { + return false; + } + + @Override + protected void onEntityHit(EntityRayTraceResult ray) { + super.onEntityHit(ray); + + Vector3d hit = ray.getHitVec(); + Entity target = ray.getEntity(); + PotatoCannonProjectileTypes projectileType = getProjectileType(); + int damage = projectileType.getDamage(); + float knockback = projectileType.getKnockback(); + Entity owner = this.getOwner(); + + if (!target.isAlive()) + return; + if (owner instanceof LivingEntity) + ((LivingEntity) owner).setLastAttackedEntity(target); + + pop(hit); + + boolean targetIsEnderman = target.getType() == EntityType.ENDERMAN; + int k = target.getFireTimer(); + if (this.isBurning() && !targetIsEnderman) + target.setFire(5); + + if (!target.attackEntityFrom(causePotatoDamage(), (float) damage)) { + target.setFireTicks(k); + remove(); + return; + } + + if (targetIsEnderman) + return; + + projectileType.onEntityHit(ray); + + if (!(target instanceof LivingEntity)) { + playHitSound(world, getPositionVec()); + remove(); + return; + } + + LivingEntity livingentity = (LivingEntity) target; + if (knockback > 0) { + Vector3d appliedMotion = this.getMotion() + .mul(1.0D, 0.0D, 1.0D) + .normalize() + .scale(knockback * 0.6); + if (appliedMotion.lengthSquared() > 0.0D) + livingentity.addVelocity(appliedMotion.x, 0.1D, appliedMotion.z); + } + + boolean onServer = !world.isRemote; + if (onServer && owner instanceof LivingEntity) { + EnchantmentHelper.applyThornEnchantments(livingentity, owner); + EnchantmentHelper.applyArthropodEnchantments((LivingEntity) owner, livingentity); + } + + if (owner != null && livingentity != owner && livingentity instanceof PlayerEntity + && owner instanceof ServerPlayerEntity && !this.isSilent()) { + ((ServerPlayerEntity) owner).connection + .sendPacket(new SChangeGameStatePacket(SChangeGameStatePacket.PROJECTILE_HIT_PLAYER, 0.0F)); + } + + if (onServer && owner instanceof ServerPlayerEntity) { + ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) owner; + if (!target.isAlive()) + AllTriggers.POTATO_KILL.trigger(serverplayerentity); + } + + remove(); + } + + public static void playHitSound(World world, Vector3d location) { + AllSoundEvents.POTATO_HIT.playOnServer(world, new BlockPos(location)); + } + + public static void playLaunchSound(World world, Vector3d location, float pitch) { + AllSoundEvents.FWOOMP.playOnServer(world, new BlockPos(location), 1, pitch); + } + + @Override + protected void onBlockHit(BlockRayTraceResult ray) { + Vector3d hit = ray.getHitVec(); + pop(hit); + getProjectileType().onBlockHit(ray); + super.onBlockHit(ray); + remove(); + } + + @Override + public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) { + if (this.isInvulnerableTo(p_70097_1_)) + return false; + pop(getPositionVec()); + remove(); + return true; + } + + private void pop(Vector3d hit) { + if (!stack.isEmpty()) { + for (int i = 0; i < 7; i++) { + Vector3d m = VecHelper.offsetRandomly(Vector3d.ZERO, this.rand, .25f); + world.addParticle(new ItemParticleData(ParticleTypes.ITEM, stack), hit.x, hit.y, hit.z, m.x, m.y, m.z); + } + } + if (!world.isRemote) + playHitSound(world, getPositionVec()); + } + + private DamageSource causePotatoDamage() { + return new PotatoDamageSource(this, getOwner()).setProjectile(); + } + + public static class PotatoDamageSource extends IndirectEntityDamageSource { + + public PotatoDamageSource(Entity source, @Nullable Entity trueSource) { + super("create.potato_cannon", source, trueSource); + } + + } + + @SuppressWarnings("unchecked") + public static EntityType.Builder build(EntityType.Builder builder) { + EntityType.Builder entityBuilder = (EntityType.Builder) builder; + return entityBuilder.size(.25f, .25f); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + public void writeSpawnData(PacketBuffer buffer) { + CompoundNBT compound = new CompoundNBT(); + writeAdditional(compound); + buffer.writeCompoundTag(compound); + } + + @Override + public void readSpawnData(PacketBuffer additionalData) { + readAdditional(additionalData.readCompoundTag()); + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderMode.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderMode.java new file mode 100644 index 000000000..46ab4fa99 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderMode.java @@ -0,0 +1,74 @@ +package com.simibubi.create.content.curiosities.weapons; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public abstract class PotatoProjectileRenderMode { + + @OnlyIn(Dist.CLIENT) + public abstract void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt); + + public static class Billboard extends PotatoProjectileRenderMode { + + @Override + @OnlyIn(Dist.CLIENT) + public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) { + Minecraft mc = Minecraft.getInstance(); + Vector3d p1 = mc.getRenderViewEntity() + .getEyePosition(pt); + Vector3d diff = entity.getBoundingBox() + .getCenter() + .subtract(p1); + + MatrixStacker.of(ms) + .rotateY(AngleHelper.deg(MathHelper.atan2(diff.x, diff.z))) + .rotateX(180 + + AngleHelper.deg(MathHelper.atan2(diff.y, -MathHelper.sqrt(diff.x * diff.x + diff.z * diff.z)))); + } + } + + public static class Tumble extends Billboard { + + @Override + @OnlyIn(Dist.CLIENT) + public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) { + super.transform(ms, entity, pt); + MatrixStacker.of(ms) + .rotateZ((entity.ticksExisted + pt) * 2 * (entity.getEntityId() % 16)) + .rotateX((entity.ticksExisted + pt) * (entity.getEntityId() % 32)); + } + } + + public static class TowardMotion extends PotatoProjectileRenderMode { + + private int spriteAngleOffset; + private float spin; + + public TowardMotion(int spriteAngleOffset, float spin) { + this.spriteAngleOffset = spriteAngleOffset; + this.spin = spin; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void transform(MatrixStack ms, PotatoProjectileEntity entity, float pt) { + Vector3d diff = entity.getMotion(); + MatrixStacker.of(ms) + .rotateY(AngleHelper.deg(MathHelper.atan2(diff.x, diff.z))) + .rotateX(270 + + AngleHelper.deg(MathHelper.atan2(diff.y, -MathHelper.sqrt(diff.x * diff.x + diff.z * diff.z)))); + MatrixStacker.of(ms) + .rotateY((entity.ticksExisted + pt) * 20 * spin) + .rotateZ(-spriteAngleOffset); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderer.java new file mode 100644 index 000000000..4a234782a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/PotatoProjectileRenderer.java @@ -0,0 +1,44 @@ +package com.simibubi.create.content.curiosities.weapons; + +import com.mojang.blaze3d.matrix.MatrixStack; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public class PotatoProjectileRenderer extends EntityRenderer { + + public PotatoProjectileRenderer(EntityRendererManager p_i46179_1_) { + super(p_i46179_1_); + } + + @Override + public void render(PotatoProjectileEntity entity, float yaw, float pt, MatrixStack ms, IRenderTypeBuffer buffer, + int light) { + ItemStack item = entity.getItem(); + if (item.isEmpty()) + return; + ms.push(); + ms.translate(0, entity.getBoundingBox() + .getYSize() / 2 - 1 / 8f, 0); + entity.getProjectileType() + .getRenderMode() + .transform(ms, entity, pt); + + Minecraft.getInstance() + .getItemRenderer() + .renderItem(item, TransformType.GROUND, light, OverlayTexture.DEFAULT_UV, ms, buffer); + ms.pop(); + } + + @Override + public ResourceLocation getEntityTexture(PotatoProjectileEntity p_110775_1_) { + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/weapons/ProperProjectileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/weapons/ProperProjectileEntity.java new file mode 100644 index 000000000..0c5020c30 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/weapons/ProperProjectileEntity.java @@ -0,0 +1,40 @@ +package com.simibubi.create.content.curiosities.weapons; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.IPacket; +import net.minecraft.world.World; + +public abstract class ProperProjectileEntity extends Entity { + + public ProperProjectileEntity(EntityType p_i48580_1_, World p_i48580_2_) { + super(p_i48580_1_, p_i48580_2_); + // TODO Auto-generated constructor stub + } + + @Override + protected void registerData() { + // TODO Auto-generated method stub + + } + + @Override + protected void readAdditional(CompoundNBT p_70037_1_) { + // TODO Auto-generated method stub + + } + + @Override + protected void writeAdditional(CompoundNBT p_213281_1_) { + // TODO Auto-generated method stub + + } + + @Override + public IPacket createSpawnPacket() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 925c761d8..03ec16835 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -28,6 +28,7 @@ import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHa import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer; import com.simibubi.create.content.curiosities.tools.BlueprintOverlayRenderer; import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler; +import com.simibubi.create.content.curiosities.weapons.PotatoCannonItem; import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler; @@ -111,6 +112,7 @@ public class ClientEvents { SoundScapes.tick(); AnimationTickHolder.tick(); ScrollValueHandler.tick(); + PotatoCannonItem.clientTick(); CreateClient.SCHEMATIC_SENDER.tick(); CreateClient.SCHEMATIC_AND_QUILL_HANDLER.tick(); diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 959043354..12ecd41c9 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -44,7 +44,7 @@ public class AllTriggers { CHAINED_ITEM_DRAIN = simple("chained_item_drain"), SPOUT = simple("spout"), SPOUT_POTION = simple("spout_potion"), GLASS_PIPE = simple("glass_pipe"), PIPE_COLLISION = simple("pipe_collision"), PIPE_SPILL = simple("pipe_spill"), - HOSE_PULLEY = simple("hose_pulley"), MIXER_MIX = simple("mixer"); + POTATO_KILL = simple("potato_kill"), HOSE_PULLEY = simple("hose_pulley"), MIXER_MIX = simple("mixer"); private static SimpleTrigger simple(String id) { return add(new SimpleTrigger(id)); diff --git a/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java b/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java index 2ca4dafa1..ffa5876b7 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java +++ b/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java @@ -5,6 +5,10 @@ public class CCuriosities extends ConfigBase { public ConfigInt maxSymmetryWandRange = i(50, 10, "maxSymmetryWandRange", Comments.symmetryRange); public ConfigInt placementAssistRange = i(12, 3, "placementAssistRange", Comments.placementRange); public ConfigInt maxAirInBacktank = i(900, 1, "maxAirInBacktank", Comments.maxAirInBacktank); + + public ConfigInt maxExtendoGripActions = i(1000, 0, "maxExtendoGripActions", Comments.maxExtendoGripActions); + public ConfigInt maxPotatoCannonShots = i(200, 0, "maxPotatoCannonShots", Comments.maxPotatoCannonShots); + // public ConfigInt zapperUndoLogLength = i(10, 0, "zapperUndoLogLength", Comments.zapperUndoLogLength); NYI @Override @@ -18,6 +22,10 @@ public class CCuriosities extends ConfigBase { "The Maximum volume of Air that can be stored in a backtank = Seconds of underwater breathing"; static String placementRange = "The Maximum Distance a Block placed by Create's placement assist will have to its interaction point."; + static String maxExtendoGripActions = + "Amount of free Extendo Grip actions provided by one filled Copper Backtank. Set to 0 makes Extendo Grips unbreakable"; + static String maxPotatoCannonShots = + "Amount of free Potato Cannon shots provided by one filled Copper Backtank. Set to 0 makes Potato Cannons unbreakable"; // static String zapperUndoLogLength = "The maximum amount of operations, a blockzapper can remember for undoing. (0 to disable undo)"; } diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 3bd14eedd..4391fbc83 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -25,6 +25,7 @@ import com.simibubi.create.content.curiosities.projector.ConfigureProjectorPacke import com.simibubi.create.content.curiosities.symmetry.SymmetryEffectPacket; import com.simibubi.create.content.curiosities.tools.BlueprintAssignCompleteRecipePacket; import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket; +import com.simibubi.create.content.curiosities.weapons.PotatoCannonPacket; import com.simibubi.create.content.curiosities.zapper.ZapperBeamPacket; import com.simibubi.create.content.logistics.block.depot.EjectorElytraPacket; import com.simibubi.create.content.logistics.block.depot.EjectorPlacementPacket; @@ -112,6 +113,7 @@ public enum AllPackets { BLOCK_HIGHLIGHT(HighlightPacket.class, HighlightPacket::new, PLAY_TO_CLIENT), TUNNEL_FLAP(TunnelFlapPacket.class, TunnelFlapPacket::new, PLAY_TO_CLIENT), FUNNEL_FLAP(FunnelFlapPacket.class, FunnelFlapPacket::new, PLAY_TO_CLIENT), + POTATO_CANNON(PotatoCannonPacket.class, PotatoCannonPacket::new, PLAY_TO_CLIENT), PERSISTENT_DATA(ISyncPersistentData.Packet.class, ISyncPersistentData.Packet::new, PLAY_TO_CLIENT), ; diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 985208e30..4de25257f 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -8,6 +8,8 @@ "death.attack.create.fan_lava": "%1$s was burned to death by lava fan", "death.attack.create.mechanical_drill": "%1$s was impaled by a Mechanical Drill", "death.attack.create.mechanical_saw": "%1$s got cut in half by a Mechanical Saw", + "death.attack.create.potato_cannon": "%1$s was shot by %2$s's Potato Cannon", + "death.attack.create.potato_cannon.item": "%1$s was shot by %2$s using %3$s", "death.attack.create.cuckoo_clock_explosion": "%1$s was blown up by tampered cuckoo clock", "create.block.deployer.damage_source_name": "a rogue Deployer", "create.block.cart_assembler.invalid": "Place your Cart Assembler on a rail block", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index dad4c4127..4ac29920b 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -49,9 +49,18 @@ "item.create.tree_fertilizer.tooltip.behaviour1": "Grows Trees _regardless_ of their _spacing conditions_", "item.create.extendo_grip.tooltip": "EXTENDO GRIP", - "item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder.", + "item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases reach distance_ of the wielder. Can be powered with Air Pressure from a _Copper_ _Backtank_", "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", "item.create.extendo_grip.tooltip.behaviour1": "Increases _reach distance_ of items used in the _Main-Hand_.", + "item.create.extendo_grip.tooltip.condition2": "While wearing Copper Backtank", + "item.create.extendo_grip.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", + + "item.create.potato_cannon.tooltip": "POTATO CANNON", + "item.create.potato_cannon.tooltip.summary": "Fwoomp! Launch your home-grown vegetables at your Enemies. Can be powered with Air Pressure from a _Copper_ _Backtank_", + "item.create.potato_cannon.tooltip.condition1": "When R-Clicked", + "item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", + "item.create.potato_cannon.tooltip.condition2": "While wearing Copper Backtank", + "item.create.potato_cannon.tooltip.behaviour2": "_No_ _Durability_ will be used. Instead, _Air_ _pressure_ is drained from the Tank", "item.create.filter.tooltip": "FILTER", "item.create.filter.tooltip.summary": "_Controls outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set of items_ or several _nested filters_.", diff --git a/src/main/resources/assets/create/models/item/potato_cannon/base.bbmodel b/src/main/resources/assets/create/models/item/potato_cannon/base.bbmodel new file mode 100644 index 000000000..ac8d214b3 --- /dev/null +++ b/src/main/resources/assets/create/models/item/potato_cannon/base.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"3.6","creation_time":1624660393,"model_format":"java_block","box_uv":false},"name":"item","parent":"create:item/potato_cannon/item","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"resolution":{"width":16,"height":16},"elements":[{"name":"cube","rescale":false,"from":[7,7,-2.5],"to":[9,10,6.5],"autouv":0,"color":0,"locked":false,"origin":[7,7.6,11],"faces":{"north":{"uv":[7.5,1,9.5,4],"texture":0},"east":{"uv":[0.5,6,3.5,15],"rotation":90,"texture":0},"south":{"uv":[7.5,1,9.5,4],"texture":0},"west":{"uv":[0.5,6,3.5,15],"rotation":270,"texture":0},"up":{"uv":[1,6,3,15],"texture":0},"down":{"uv":[1,6,3,15],"rotation":180,"texture":0}},"uuid":"5e678c6f-f4df-6c89-5094-cf6f159d76f1"},{"name":"cube","rescale":false,"from":[7,7,9.5],"to":[9,10,10.5],"autouv":0,"color":3,"locked":false,"origin":[8,7.6,11],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[0.5,6,3.5,7],"rotation":90,"texture":0},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[0.5,6,3.5,7],"rotation":270,"texture":0},"up":{"uv":[1,6,3,7],"texture":0},"down":{"uv":[1,6,3,7],"rotation":180,"texture":0}},"uuid":"26a67f2c-179c-2879-8433-8e3568b818d3"},{"name":"cube","rescale":false,"from":[6,7,10.5],"to":[10,11,16.5],"autouv":0,"color":5,"locked":false,"origin":[8,9.6,11],"faces":{"north":{"uv":[7,7,15,15],"rotation":270,"texture":1},"east":{"uv":[4,4,12,16],"rotation":270,"texture":2},"south":{"uv":[7,7,15,15],"rotation":270,"texture":1},"west":{"uv":[4,4,12,16],"rotation":90,"texture":2},"up":{"uv":[4,4,12,16],"rotation":180,"texture":2},"down":{"uv":[4,4,12,16],"texture":2}},"uuid":"4c11c0a3-218a-f5f1-5ef1-42e94ee9aacd"},{"name":"cube","rescale":false,"from":[7,4,11.5],"to":[9,6,15.5],"autouv":0,"color":7,"locked":false,"origin":[8,7.6,11],"faces":{"north":{"uv":[13,13,15,15],"texture":0},"east":{"uv":[1,6,3,10],"rotation":90,"texture":0},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[1,6,3,10],"rotation":270,"texture":0},"up":{"uv":[1,6,3,10],"texture":0},"down":{"uv":[1,6,3,10],"rotation":180,"texture":0}},"uuid":"ea1494fd-ebef-b708-b9a4-92593f90d620"},{"name":"cube","rescale":false,"from":[6.5,3.5,9.5],"to":[9.5,6.5,14.5],"autouv":0,"color":0,"locked":false,"rotation":[0,0,-45],"origin":[8,5,11.5],"faces":{"north":{"uv":[12.5,12.5,15.5,15.5],"texture":0},"east":{"uv":[0.5,6,3.5,11],"rotation":90,"texture":0},"south":{"uv":[12.5,12.5,15.5,15.5],"texture":0},"west":{"uv":[0.5,6,3.5,11],"rotation":270,"texture":0},"up":{"uv":[0.5,6,3.5,11],"texture":0},"down":{"uv":[0.5,6,3.5,11],"rotation":180,"texture":0}},"uuid":"c9ee0469-c584-6987-c27a-d6591c119e4a"},{"name":"cube","rescale":false,"from":[7,4,15.5],"to":[9,10,17.5],"autouv":0,"color":7,"locked":false,"origin":[8,7.6,11],"faces":{"north":{"uv":[3,7,1,13],"rotation":180,"texture":0},"east":{"uv":[1,9,3,15],"texture":0},"south":{"uv":[3,7,1,13],"rotation":180,"texture":0},"west":{"uv":[3,9,1,15],"texture":0},"up":{"uv":[1,7,3,9],"rotation":180,"texture":0},"down":{"uv":[1,7,3,9],"texture":0}},"uuid":"7116c2c4-a219-6979-364f-792a4eec68c2"},{"name":"Cog","rescale":false,"from":[5.5,8,6.5],"to":[10.5,9,9.5],"autouv":0,"color":4,"locked":false,"rotation":[0,0,45],"origin":[8,8.5,8.5],"faces":{"north":{"uv":[6,15,11,16],"texture":3},"east":{"uv":[7,13,8,16],"rotation":270,"texture":3},"south":{"uv":[6,14,11,15],"texture":3},"west":{"uv":[9,13,10,16],"rotation":90,"texture":3},"up":{"uv":[6,13,11,16],"rotation":180,"texture":3},"down":{"uv":[6,13,11,16],"texture":3}},"uuid":"9c6e556e-3af0-8367-5c8c-2eda35106e6a"},{"name":"Cog","rescale":false,"from":[5.5,8,6.5],"to":[10.5,9,9.5],"autouv":0,"color":7,"locked":false,"rotation":[0,0,-45],"origin":[8,8.5,8.5],"faces":{"north":{"uv":[6,15,11,16],"texture":3},"east":{"uv":[7,13,8,16],"rotation":270,"texture":3},"south":{"uv":[6,14,11,15],"texture":3},"west":{"uv":[9,13,10,16],"rotation":90,"texture":3},"up":{"uv":[6,13,11,16],"rotation":180,"texture":3},"down":{"uv":[6,13,11,16],"texture":3}},"uuid":"b79ea326-3102-0b62-7b79-2a938ad44e69"},{"name":"Cog","rescale":false,"from":[7.5,6,6.5],"to":[8.5,11,9.5],"autouv":0,"color":6,"locked":false,"origin":[8,8.5,8.5],"faces":{"north":{"uv":[6,15,11,16],"rotation":270,"texture":3},"east":{"uv":[6,13,11,16],"rotation":270,"texture":3},"south":{"uv":[6,14,11,15],"rotation":90,"texture":3},"west":{"uv":[6,13,11,16],"rotation":90,"texture":3},"up":{"uv":[8,13,9,16],"rotation":180,"texture":3},"down":{"uv":[6,13,7,16],"texture":3}},"uuid":"aec1402d-fc45-fc7e-0144-520a7ceddb0d"},{"name":"Cog","rescale":false,"from":[5.5,8,6.5],"to":[10.5,9,9.5],"autouv":0,"color":0,"locked":false,"origin":[8,11,3.5],"faces":{"north":{"uv":[6,15,11,16],"texture":3},"east":{"uv":[6,13,7,16],"rotation":270,"texture":3},"south":{"uv":[6,14,11,15],"texture":3},"west":{"uv":[8,13,9,16],"rotation":90,"texture":3},"up":{"uv":[6,13,11,16],"rotation":180,"texture":3},"down":{"uv":[6,13,11,16],"texture":3}},"uuid":"6cd0eeca-26e6-bf33-2ad3-5d0185d8f13e"}],"outliner":["5e678c6f-f4df-6c89-5094-cf6f159d76f1","26a67f2c-179c-2879-8433-8e3568b818d3","4c11c0a3-218a-f5f1-5ef1-42e94ee9aacd","ea1494fd-ebef-b708-b9a4-92593f90d620","c9ee0469-c584-6987-c27a-d6591c119e4a","7116c2c4-a219-6979-364f-792a4eec68c2",{"name":"cog","origin":[8,8,8],"uuid":"0fed5b4f-08c1-81df-64e3-c2a1410f906c","export":true,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":[{"name":"accelerator","origin":[8,8,8],"uuid":"f3e38ac1-88e9-9ad4-6331-f44b7424a494","export":true,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["9c6e556e-3af0-8367-5c8c-2eda35106e6a","b79ea326-3102-0b62-7b79-2a938ad44e69","aec1402d-fc45-fc7e-0144-520a7ceddb0d","6cd0eeca-26e6-bf33-2ad3-5d0185d8f13e"]}]}],"textures":[{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forgespace 1.16\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\fluid_pipe.png","name":"fluid_pipe.png","folder":"block","namespace":"create","id":"2","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"b1f94f74-864a-5d8e-db7c-abf1e7f25c9a","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFlklEQVRYR61XXWhcRRg9d5PNbna7d7ObbNI2SWMttgY1Koi0mrZiS8GgYAo+lKAPRUoF/0CkfSh5KH3wB4RS8akIKkGk9Qd/KgQVNX0o6kNJlfoX2jTbZJPsbppsNsnNJrly5va7mb3ZNElxXmbv3NmZM993zvnmGsf3PW7nFwywhX226qXJuDwvFAp4oGEdIvGAGoqGQ6ovq3aes9fGVJ/LWhifBqKVi2v1jc6gs/sHZyOtGQTQEA0gUGGgIuwsFAgAlgXM5i31zPHc2Awuj+Sxs6VabRyvT6h34zMT7nLRoIns9VGM56cUiJbtW9Uz537+Ve/yALYkgriSn8OFiSlnwwq/6mdnC6rfboawOVyOi8lJBWDz1ia14I/9yaLTPNbUgPanWnDl734FQBqjkV2Yw7Evuo1Lp161t+6ogZUfhrn7lKEiQAAfXssiHK5EwO+HGTExkXNOZhUKyOen8dymOHoGJnDgkSYV8s7T573RVM8nX2xTp2aT1PRfTKkDEsD5tw/azVsiGDTSuK+9axHAx0MTiIRDyN6YwIP3NmNsPIerA0nEq0zk8lNoqzLRm14bAAGhA/jpaIfdtDGApH8YrS98YxhH9u6xW+oC+DQzrU7f1FAPy5pFlRnBtGWhP3ldATiwwXQjwJy+8u65khE4/nwr5jOW4gEb+ZIcGHMj8OVL7XZdzI9c9Ab2vtZtGId3tdp77k7gg39HUROPIVARQCwaURGwZi1YluUCIAee3NGoSLUSgJGsA6A2XgzgzKF2uz4IpGoz2H/sZwfAw3URfJbJFaUgNZrG0PCom4JD9yTQ05tZNQkVf6ylALo62uy6SDmGakbw7IkLTgq2xSrwSWoMfn+5UgBTIQSkEgqFOZeEbfcnXBmKBCk/aSJDhr4UCd9/5gm7utKPofWDOPzWbw6Ah+408ddIHj0Zh/kEwsaN2R6tDIFKoQp2NprKiLgB86ybEY1Il58uw/SkY0Tv7W+zYz4bo/VpvHzy18UIlGSUNjhYmEcyO7UmAKWM6MTT++w6zCFTM4mjp39xOLDS5vr7hngIcZ8TIVqtNev8fWbeQLDMVj1Nh3NKWTF9JxT0YT6awpGPfjcMIuLkRI1jw2y0YN29dAAkkbcWuKG+KT2moaPr3BLf5zymPOKbx4KZQufZP50U8MVyhejN774vudBaoqbPfX33LtuED/lEBm+cvbQYAYZLTibVTPz7djcr9T+mPDpfhkIsjXe+/mPRilnxaBpsNBGmYbkS+n8CMqhLlmKePr4pptamlRIEpckCcqsNmUKmzxcqx8LUHFjapVE5bBv9ZUVjnMfG+4YLQCJAm2U5pYutFgCNTL9P6GQWlURiwSKSczw5bjkA+KZmfVCZCt1r6J+bN5uxGRw88+2KEWAx8ypDihHXlnX1IkWesUQrGW6rDatbkLgaw88bENtKALz/F/v1pk1uSxwnOImwAsDbTkNjTJ2eKNn6+rKrAsAIMrwksHdzqRGsGVxXf88o85BLAKyVhKUA6JvJgbg5AQkYibKbAp6ABOQEFpXVklBPgaiIh5A1+FvSKyBYMUVlioQMISfxsinl9HYBCNHkVk22e1NEcOnUDChTNwIb7oqpEBGAKIFmRKbqOvZqnPwRCesckhPKfK8XyHgRAMm/zlSC4AbsRdNezeshljXkHihGpP9H1nIjoKtAJ4oAEbT6JUS/dMp7YTnToAPg+volhvNdH2B9br4jWiQjXT5ePXNxIavOcGU4HpbTSdm8PlPkAzoJ9XucbCySks1kcx2YV++yweWr46o2CAnlCsfeJaF8GelWWuquJ5bKXrdrb/71D1QSmM2bAlGIsmL945SThXDyoSonlQ9V/eQisVJzpNiwSlIBpYqRIuGtyqm+mZRWr6w4zg3093q5jaxzSvFyMvwPaYjs9h/DqboAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forgespace 1.16\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\andesite_casing_very_short.png","name":"andesite_casing_very_short.png","folder":"block","namespace":"create","id":"4","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"85220030-0179-1a36-8ed9-8a2cd4d94045","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB0ElEQVQ4T91TPUscQRh+Zj9vct7tnglRiBauH4WXFHYWNvkBadIEDlIJQUipKP6QdLGzFqwEWxtJEERNQsAEBBsTLt6a253d2V1HZnTOVe8X+Dbzvs/MPLP7PO9LlldXhO/5yIsChTDAohCylpELAYsQ/O9ewHEoTNNQOOc5nlAXnbADMv9hXigUAGMMlFJd3lnlno7yGdJ63xJxxMCzDIblIksj2JYNIQTiNEW9WgVLYhiGjSzj6gHGUtCKg7pXA3kEv1AWsZ9698XTQutVuTAeTCBmKRzHUhxFcQnOGWoD9Z6VEpe20aoHk1zCMk0cfTsEWVxZFE8bz7C78UldrlYcRAnva2UZnGstYX/vy3Uf+A0ff75uYnTYx9/zLs7aXQQjg6g4FhKeI2JcYdPBc7TDWOWzbz/efgGt1HCys45Bz8W/MEXYTRQBdW2wNEO7EyusOT6E07NQ5T0CrcGP7bUHBEIUIMTsEYy98HoPTL5+h875TStLEe8TjA75sCyBPCe4iBL1aplAavDz+yFUKwfBFA62Pt8RzrVNpFmhMJnLkLXOZ94s4Nfv42uCl81XykYd9cbNNCa3AyT39Bk5iTKUjbqRdMOUJ63fBJYxSXIFRuc4bJLxudoAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forgespace 1.16\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\andesite_casing_short.png","name":"andesite_casing_short.png","folder":"block","namespace":"create","id":"5","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"5f28a2dc-5511-6bd0-cc23-537b005e1fff","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB7UlEQVQ4T61TvYvUUBD/veTtS97Fze6qHNeIuH7hx9oJdnaCjYLlgVis2Gh34OH/oZ121lcIItjaiCDIraco3oLYCCLmVpOXz30yL8maXfY6p5nMTOY3834zw+4/2NTdThd5UaDQFlS4B7JJcq3BGcPvPxMIIWHblvGnaY4V6SDYC8CGd4baeAEopSClrM05TbFamv+w9ZvrOgoV0iyDxR1kSYgWb0FrjShJ4HseVBzBslrIstQUUCqBdAX8Thvsvz5hWe+LrdfPrLXh4Hj/BCKVQAhuMIpiijRVaB/wZ0SSn0iTXgc2m4LbNt7vjEoSCeD11iOT7LnCTCTJiqVk1s4LV29jPP5cApw+O8Do2cNZgu+5SPMccZLPgbgOh+AckzDGmStD7I6/gG1sbuhDvcP4+PIJjqyV84/idC4xy6YG0JPC+H8GEQbX7uHd2zdlB91eF5Pt5yZIVanSYvUmIsWPXb5VckAdSLeNr6+e4uTRVQg+26t9OdjZ/WGeMEciPeFgx4FXbWJYbR7ZtFQkjDGjv30PsHrxOoJf1SrTFGoAM4kFkGYrFCMA4uDThxHMKvf7p7D94vG+LTst28RotPRN+tKNu+UUCOD8uYFZpFr8XnWN8b8DMtOp/qFLJJlxQEa9ss1LW3aBTR/l/QWX8QNstMA25AAAAABJRU5ErkJggg=="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forgespace 1.16\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\andesite_bricks.png","name":"andesite_bricks.png","folder":"block","namespace":"create","id":"particle","particle":true,"visible":true,"mode":"bitmap","saved":true,"uuid":"0a732870-6ee2-5b2b-13e2-0eadb56af61a","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACqElEQVQ4TzVTuUqzQRQ94xbjlsQkKCoqGg2E2AiBWEafwEKwsRA7KwvBwnewsRHEB5BUgiBYKYYohERcQIka4y7u+67zcw78Ax/zMXPvPeeee8Ykk0n79/eH5+dneDwebGxsoKGhAbe3t2hvb8fR0RG4Hh4eUFlZqd3n8+H9/R3MM/F43DLw4uIC1dXVeHp6QllZmZK4/v/z3Ov1Cuj+/h4vLy/Y29uDmZqasgwsKChQclFRkVBKSkp0ZozBz8+PEKuqqvD6+orCwkJ8fHzg8/MTpr+/39bX14tBaWmpaH19fen/+/tbyRUVFfj9/dXncDhUnCwYY6anp202m1XfbIGU6+rqRPH09FTB1CGXyyEWi+m+paUFmUxGAGZiYsLe3NyociQSEeXm5mbt19fXOD8/x8HBAfb399Hd3Q2Xy4W2tja1u76+DjM+Pm7Pzs7Q0dEh1ZlAVPZK+nd3dyp0cnKCsbEx5PN5gR0eHoql6evrs1SXwewxEAiALb29vcHtdksPakBGj4+Pos0C1KqpqQlmfn5eIq6srChhZ2dHegSDQfkilUphbW0Nvb29Up93iUQCTqdTOpjZ2Vnb2dkpmul0GsfHx4hGoxpnOBzWSCcnJ9HT0yMD1dbWCj2ZTEpYMzMzY0mJY6QwW1tbGB0d1SVRdnd3cXl5ieHhYSwvL4sldeIZPzM0NGRpCiJSOO6cL/Wg4ixCAAYXFxeDE2Nr1MxaCzM3NycGfr9f/XKtrq5KzMbGRnmCiSzOIoy9urrSm+FYzcLCgqVNW1tbVXFpaQmbm5vqv6amRv6nLxhD99EPZLG9vY2BgQGYxcVFS8cxmSgUk313dXUhFArJRGyFr5P3nD29wWIjIyMwg4ODlo+C4vCQo6LaFJRalJeXa2ci42g6sqM29MU/xiWmDH0vZeMAAAAASUVORK5CYII="}],"display":{"thirdperson_righthand":{"rotation":[0,90,0],"translation":[0,3.25,0]},"thirdperson_lefthand":{"translation":[0,3.75,0]},"firstperson_righthand":{"rotation":[-4.5,100.25,10],"translation":[1,4,1]},"firstperson_lefthand":{"rotation":[17.25,267,10],"translation":[1,4,1]},"ground":{"rotation":[-90,0,0],"translation":[0,-2.3,0],"scale":[0.76914,0.76914,0.76914]},"gui":{"rotation":[28,-163,43],"translation":[0.5,0,0],"scale":[1.09453,1.09453,1.09453]},"head":{"translation":[0,8,0],"scale":[1.4,1.4,1.4]},"fixed":{"rotation":[0,160.5,0],"translation":[0.5,0.5,0]}}} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/potato_cannon/cog.json b/src/main/resources/assets/create/models/item/potato_cannon/cog.json new file mode 100644 index 000000000..e0af26eb0 --- /dev/null +++ b/src/main/resources/assets/create/models/item/potato_cannon/cog.json @@ -0,0 +1,104 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/potato_cannon/item", + "textures": { + "1": "create:block/andesite_bricks", + "particle": "create:block/andesite_bricks" + }, + "elements": [ + { + "name": "Cog", + "from": [5.5, 8, 6.5], + "to": [10.5, 9, 9.5], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 8.5]}, + "faces": { + "north": {"uv": [6, 15, 11, 16], "texture": "#1"}, + "east": {"uv": [7, 13, 8, 16], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 14, 11, 15], "texture": "#1"}, + "west": {"uv": [9, 13, 10, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 13, 11, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 13, 11, 16], "texture": "#1"} + } + }, + { + "name": "Cog", + "from": [5.5, 8, 6.5], + "to": [10.5, 9, 9.5], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 8.5, 8.5]}, + "faces": { + "north": {"uv": [6, 15, 11, 16], "texture": "#1"}, + "east": {"uv": [7, 13, 8, 16], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 14, 11, 15], "texture": "#1"}, + "west": {"uv": [9, 13, 10, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 13, 11, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 13, 11, 16], "texture": "#1"} + } + }, + { + "name": "Cog", + "from": [7.5, 6, 6.5], + "to": [8.5, 11, 9.5], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 8.5]}, + "faces": { + "north": {"uv": [6, 15, 11, 16], "rotation": 270, "texture": "#1"}, + "east": {"uv": [6, 13, 11, 16], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 14, 11, 15], "rotation": 90, "texture": "#1"}, + "west": {"uv": [6, 13, 11, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [8, 13, 9, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 13, 7, 16], "texture": "#1"} + } + }, + { + "name": "Cog", + "from": [5.5, 8, 6.5], + "to": [10.5, 9, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 3.5]}, + "faces": { + "north": {"uv": [6, 15, 11, 16], "texture": "#1"}, + "east": {"uv": [6, 13, 7, 16], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 14, 11, 15], "texture": "#1"}, + "west": {"uv": [8, 13, 9, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 13, 11, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 13, 11, 16], "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [0, 90, 0], + "translation": [0, 3.25, 0] + }, + "thirdperson_lefthand": { + "translation": [0, 3.75, 0] + }, + "firstperson_righthand": { + "rotation": [-4.5, 100.25, 10], + "translation": [1, 4, 1] + }, + "firstperson_lefthand": { + "rotation": [17.25, 267, 10], + "translation": [1, 4, 1] + }, + "ground": { + "rotation": [-90, 0, 0], + "translation": [0, -2.3, 0], + "scale": [0.76914, 0.76914, 0.76914] + }, + "gui": { + "rotation": [28, -163, 43], + "translation": [0.5, 0, 0], + "scale": [1.09453, 1.09453, 1.09453] + }, + "fixed": { + "rotation": [0, 160.5, 0], + "translation": [0.5, 0.5, 0] + } + }, + "groups": [ + { + "name": "accelerator", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/potato_cannon/item.json b/src/main/resources/assets/create/models/item/potato_cannon/item.json new file mode 100644 index 000000000..1fc1396f1 --- /dev/null +++ b/src/main/resources/assets/create/models/item/potato_cannon/item.json @@ -0,0 +1,126 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/fluid_pipe", + "4": "create:block/andesite_casing_very_short", + "5": "create:block/andesite_casing_short", + "particle": "create:block/andesite_bricks" + }, + "elements": [ + { + "from": [7, 7, -2.5], + "to": [9, 10, 6.5], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 7.6, 11]}, + "faces": { + "north": {"uv": [7.5, 1, 9.5, 4], "texture": "#2"}, + "east": {"uv": [0.5, 6, 3.5, 15], "rotation": 90, "texture": "#2"}, + "south": {"uv": [7.5, 1, 9.5, 4], "texture": "#2"}, + "west": {"uv": [0.5, 6, 3.5, 15], "rotation": 270, "texture": "#2"}, + "up": {"uv": [1, 6, 3, 15], "texture": "#2"}, + "down": {"uv": [1, 6, 3, 15], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [7, 7, 9.5], + "to": [9, 10, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.6, 11]}, + "faces": { + "east": {"uv": [0.5, 6, 3.5, 7], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0.5, 6, 3.5, 7], "rotation": 270, "texture": "#2"}, + "up": {"uv": [1, 6, 3, 7], "texture": "#2"}, + "down": {"uv": [1, 6, 3, 7], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [6, 7, 10.5], + "to": [10, 11, 16.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9.6, 11]}, + "faces": { + "north": {"uv": [7, 7, 15, 15], "rotation": 270, "texture": "#4"}, + "east": {"uv": [4, 4, 12, 16], "rotation": 270, "texture": "#5"}, + "south": {"uv": [7, 7, 15, 15], "rotation": 270, "texture": "#4"}, + "west": {"uv": [4, 4, 12, 16], "rotation": 90, "texture": "#5"}, + "up": {"uv": [4, 4, 12, 16], "rotation": 180, "texture": "#5"}, + "down": {"uv": [4, 4, 12, 16], "texture": "#5"} + } + }, + { + "from": [7, 4, 11.5], + "to": [9, 6, 15.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.6, 11]}, + "faces": { + "north": {"uv": [13, 13, 15, 15], "texture": "#2"}, + "east": {"uv": [1, 6, 3, 10], "rotation": 90, "texture": "#2"}, + "west": {"uv": [1, 6, 3, 10], "rotation": 270, "texture": "#2"}, + "up": {"uv": [1, 6, 3, 10], "texture": "#2"}, + "down": {"uv": [1, 6, 3, 10], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [6.5, 3.5, 9.5], + "to": [9.5, 6.5, 14.5], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 5, 11.5]}, + "faces": { + "north": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#2"}, + "east": {"uv": [0.5, 6, 3.5, 11], "rotation": 90, "texture": "#2"}, + "south": {"uv": [12.5, 12.5, 15.5, 15.5], "texture": "#2"}, + "west": {"uv": [0.5, 6, 3.5, 11], "rotation": 270, "texture": "#2"}, + "up": {"uv": [0.5, 6, 3.5, 11], "texture": "#2"}, + "down": {"uv": [0.5, 6, 3.5, 11], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [7, 4, 15.5], + "to": [9, 10, 17.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.6, 11]}, + "faces": { + "north": {"uv": [3, 7, 1, 13], "rotation": 180, "texture": "#2"}, + "east": {"uv": [1, 9, 3, 15], "texture": "#2"}, + "south": {"uv": [3, 7, 1, 13], "rotation": 180, "texture": "#2"}, + "west": {"uv": [3, 9, 1, 15], "texture": "#2"}, + "up": {"uv": [1, 7, 3, 9], "rotation": 180, "texture": "#2"}, + "down": {"uv": [1, 7, 3, 9], "texture": "#2"} + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [0, 1.75, 0], + "scale": [0.89, 0.89, 0.89] + }, + "thirdperson_lefthand": { + "translation": [0, 1.75, 0], + "scale": [0.89, 0.89, 0.89] + }, + "firstperson_righthand": { + "rotation": [5, 4, 5], + "translation": [0.25, 4, 0.75], + "scale": [1, 1, 0.57] + }, + "firstperson_lefthand": { + "rotation": [5, 4, 5], + "translation": [0.25, 4, 0.75], + "scale": [1, 1, 0.57] + }, + "ground": { + "rotation": [0, 0, 90], + "translation": [0, -1.3, 0], + "scale": [0.76914, 0.76914, 0.76914] + }, + "gui": { + "rotation": [64, 47, -47], + "translation": [0, 0.5, 0], + "scale": [0.86, 0.86, 0.86] + }, + "head": { + "translation": [0, 8, 0], + "scale": [1.4, 1.4, 1.4] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0.5, 0.5, -1], + "scale": [0.72, 0.72, 0.72] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/sounds/fwoomp.ogg b/src/main/resources/assets/create/sounds/fwoomp.ogg new file mode 100644 index 0000000000000000000000000000000000000000..546953741cd1b5bcd3ab0f2614b3910956d6ef56 GIT binary patch literal 15422 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 literal 0 HcmV?d00001