From 1996ce7d9695b6ac23ba0c6d68ee07b2225b815c Mon Sep 17 00:00:00 2001 From: D4RKAR117 Date: Sun, 2 Jun 2024 00:53:27 -0500 Subject: [PATCH] feat(tools): added prospecting pick tool - Added geckolib as dependency - Added prospecting pick resources - Added Custom Class for prospecting pick --- build.gradle | 14 +- gradle.properties | 10 +- .../f9f5b962781cbf5adcc0a5f1bb62946a57aa0390 | 4 +- .../assets/cog_works/lang/en_us.json | 3 +- .../java/org/darkar/cog_works/Registry.java | 411 ++++-------------- .../generation/data/lang/EN_US_Generator.java | 2 + .../cog_works/item/ProspectingPickItem.java | 88 ++++ .../renderer/ProspectingPickItemRenderer.java | 16 + .../resources/META-INF/neoforge.mods.toml | 8 + .../item/prospecting_pick.animation.json | 81 ++++ .../geo/item/prospecting_pick.geo.json | 247 +++++++++++ .../models/item/prospecting_pick.json | 79 ++++ .../textures/item/prospecting_pick.png | Bin 0 -> 13331 bytes 13 files changed, 642 insertions(+), 321 deletions(-) create mode 100644 src/main/java/org/darkar/cog_works/item/ProspectingPickItem.java create mode 100644 src/main/java/org/darkar/cog_works/item/renderer/ProspectingPickItemRenderer.java create mode 100644 src/main/resources/assets/cog_works/animations/item/prospecting_pick.animation.json create mode 100644 src/main/resources/assets/cog_works/geo/item/prospecting_pick.geo.json create mode 100644 src/main/resources/assets/cog_works/models/item/prospecting_pick.json create mode 100644 src/main/resources/assets/cog_works/textures/item/prospecting_pick.png diff --git a/build.gradle b/build.gradle index 8ef7afd..2672ce8 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,13 @@ group = mod_group_id repositories { mavenLocal() + maven { + name = 'GeckoLib' + url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' + content { + includeGroup("software.bernie.geckolib") + } + } } base { @@ -101,6 +108,9 @@ dependencies { // The group id is ignored when searching -- in this case, it is "blank" // implementation "blank:coolmod-${mc_version}:${coolmod_version}" + //GeckoLib + implementation "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${gecko_lib_version}" + // Example mod dependency using a file as dependency // implementation files("libs/coolmod-${mc_version}-${coolmod_version}.jar") @@ -128,7 +138,9 @@ tasks.withType(ProcessResources).configureEach { mod_license : mod_license, mod_version : mod_version, mod_authors : mod_authors, - mod_description : mod_description + mod_description : mod_description, + gecko_lib_version : gecko_lib_version, + gecko_lib_version_range: gecko_lib_version_range ] inputs.properties replaceProperties diff --git a/gradle.properties b/gradle.properties index c41f5a0..9447e05 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ minecraft_version=1.20.6 # as they do not follow standard versioning conventions. minecraft_version_range=[1.20.6,1.21) # The Neo version must agree with the Minecraft version to get a valid artifact -neo_version=20.6.72-beta +neo_version=20.6.100-beta # The Neo version range can use any version of Neo as bounds neo_version_range=[20.6,) # The loader version range can only use the major version of FML as bounds @@ -32,7 +32,7 @@ mod_name=Cog Works Engineering # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=PolyFormPerimeter-1.0 # The mod version. See https://semver.org/ -mod_version=0.2.0 +mod_version=0.3.0 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html @@ -41,3 +41,9 @@ mod_group_id=org.darkar.cog_works mod_authors=D4RKAR117 # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. mod_description=Elevate your Minecraft experience with Cog Works Engineering, a mod that adds a variety of\n new machines and tools to the game. + +## Dependencies + +# Gecko Lib +gecko_lib_version=4.5.3 +gecko_lib_version_range=[4.5.3,) diff --git a/src/generated/resources/.cache/f9f5b962781cbf5adcc0a5f1bb62946a57aa0390 b/src/generated/resources/.cache/f9f5b962781cbf5adcc0a5f1bb62946a57aa0390 index ab42086..b26806a 100644 --- a/src/generated/resources/.cache/f9f5b962781cbf5adcc0a5f1bb62946a57aa0390 +++ b/src/generated/resources/.cache/f9f5b962781cbf5adcc0a5f1bb62946a57aa0390 @@ -1,2 +1,2 @@ -// 1.20.6 2024-05-21T19:36:40.8796163 Languages: en_us for mod: cog_works -ea8464eff1b916d7708dec4c78a9b5bccdd7fa6b assets/cog_works/lang/en_us.json +// 1.20.6 2024-06-01T23:30:49.1563185 Languages: en_us for mod: cog_works +f0204be40d756208deb6105e589e693518b05c9f assets/cog_works/lang/en_us.json diff --git a/src/generated/resources/assets/cog_works/lang/en_us.json b/src/generated/resources/assets/cog_works/lang/en_us.json index 17695c1..e89e1a3 100644 --- a/src/generated/resources/assets/cog_works/lang/en_us.json +++ b/src/generated/resources/assets/cog_works/lang/en_us.json @@ -38,5 +38,6 @@ "block.cog_works.tungsten_ore": "Tungsten Ore", "block.cog_works.uranium_ore": "Uranium Ore", "block.cog_works.vanadium_ore": "Vanadium Ore", - "block.cog_works.zinc_ore": "Zinc Ore" + "block.cog_works.zinc_ore": "Zinc Ore", + "item.cog_works.prospecting_pick": "Prospecting Pick" } \ No newline at end of file diff --git a/src/main/java/org/darkar/cog_works/Registry.java b/src/main/java/org/darkar/cog_works/Registry.java index b3676d1..2a1a743 100644 --- a/src/main/java/org/darkar/cog_works/Registry.java +++ b/src/main/java/org/darkar/cog_works/Registry.java @@ -12,6 +12,7 @@ import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; +import org.darkar.cog_works.item.ProspectingPickItem; import static org.darkar.cog_works.CogWorks.LOGGER; import static org.darkar.cog_works.CogWorks.MOD_ID; @@ -26,363 +27,141 @@ static void initialize(IEventBus bus) { public static class Blocks { private static final DeferredRegister.Blocks DEFERRED_REGISTRY = DeferredRegister.createBlocks(MOD_ID); - - public static class Tags { - - public static final TagKey BAUXITE_ORES = createConventional("ores/bauxite"); - public static final TagKey GRAPHITE_ORES = createConventional("ores/graphite"); - public static final TagKey LITHIUM_ORES = createConventional("ores/lithium"); - public static final TagKey MOLYBDENUM_ORES = createConventional("ores/molybdenum"); - public static final TagKey IRIDIUM_ORES = createConventional("ores/iridium"); - public static final TagKey TUNGSTEN_ORES = createConventional("ores/tungsten"); - public static final TagKey TITANIUM_ORES = createConventional("ores/titanium"); - public static final TagKey COBALT_ORES = createConventional("ores/cobalt"); - public static final TagKey NICKEL_ORES = createConventional("ores/nickel"); - public static final TagKey PLATINUM_ORES = createConventional("ores/platinum"); - public static final TagKey BERYLLIUM_ORES = createConventional("ores/beryllium"); - public static final TagKey CADMIUM_ORES = createConventional("ores/cadmium"); - public static final TagKey CHROMIUM_ORES = createConventional("ores/chromium"); - public static final TagKey MANGANESE_ORES = createConventional("ores/manganese"); - public static final TagKey OSMIUM_ORES = createConventional("ores/osmium"); - public static final TagKey PALLADIUM_ORES = createConventional("ores/palladium"); - public static final TagKey THORIUM_ORES = createConventional("ores/thorium"); - public static final TagKey URANIUM_ORES = createConventional("ores/uranium"); - public static final TagKey VANADIUM_ORES = createConventional("ores/vanadium"); - public static final TagKey ZINC_ORES = createConventional("ores/zinc"); - - private static TagKey createConventional(String name) { - return TagKey.create(Registries.BLOCK, new ResourceLocation("c" ,name)); - } - - private static TagKey createCustom(String name) { - return TagKey.create(Registries.BLOCK, new ResourceLocation(MOD_ID, name)); - } - } - // Tungsten Ore - public static final DeferredBlock TUNGSTEN_ORE = DEFERRED_REGISTRY.registerSimpleBlock("tungsten_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - - ); - - public static final DeferredBlock DEEPSLATE_TUNGSTEN_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_tungsten_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) + public static final DeferredBlock TUNGSTEN_ORE = DEFERRED_REGISTRY.registerSimpleBlock("tungsten_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - ); + ); + public static final DeferredBlock DEEPSLATE_TUNGSTEN_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_tungsten_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); // Titanium Ore - public static final DeferredBlock TITANIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("titanium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) + public static final DeferredBlock TITANIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("titanium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_TITANIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_titanium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - - ); + ); + public static final DeferredBlock DEEPSLATE_TITANIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_titanium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); // Cobalt Ore - public static final DeferredBlock COBALT_ORE = DEFERRED_REGISTRY.registerSimpleBlock("cobalt_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - - ); + public static final DeferredBlock COBALT_ORE = DEFERRED_REGISTRY.registerSimpleBlock("cobalt_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - public static final DeferredBlock DEEPSLATE_COBALT_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_cobalt_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - - ); + ); + public static final DeferredBlock DEEPSLATE_COBALT_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_cobalt_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); // Nickel Ore - public static final DeferredBlock NICKEL_ORE = DEFERRED_REGISTRY.registerSimpleBlock("nickel_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - - ); - - public static final DeferredBlock DEEPSLATE_NICKEL_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_nickel_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) + public static final DeferredBlock NICKEL_ORE = DEFERRED_REGISTRY.registerSimpleBlock("nickel_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - ); + ); + public static final DeferredBlock DEEPSLATE_NICKEL_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_nickel_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); // Bauxite Ore - public static final DeferredBlock BAUXITE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("bauxite_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) + public static final DeferredBlock BAUXITE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("bauxite_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_BAUXITE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_bauxite_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - - ); + ); + public static final DeferredBlock DEEPSLATE_BAUXITE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_bauxite_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); // Molybdenum Ore - public static final DeferredBlock MOLYBDENUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("molybdenum_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - - ); + public static final DeferredBlock MOLYBDENUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("molybdenum_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - public static final DeferredBlock DEEPSLATE_MOLYBDENUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_molybdenum_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - - ); + ); + public static final DeferredBlock DEEPSLATE_MOLYBDENUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_molybdenum_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); // Iridium Ore - public static final DeferredBlock IRIDIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("iridium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - - ); - - public static final DeferredBlock DEEPSLATE_IRIDIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_iridium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) + public static final DeferredBlock IRIDIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("iridium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - ); + ); + public static final DeferredBlock DEEPSLATE_IRIDIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_iridium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); // Lithium Ore - public static final DeferredBlock LITHIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("lithium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - - ); - - public static final DeferredBlock DEEPSLATE_LITHIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_lithium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) + public static final DeferredBlock LITHIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("lithium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - ); + ); + public static final DeferredBlock DEEPSLATE_LITHIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_lithium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); //Platinum Ore - public static final DeferredBlock PLATINUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("platinum_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) + public static final DeferredBlock PLATINUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("platinum_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_PLATINUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_platinum_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - - ); + ); + public static final DeferredBlock DEEPSLATE_PLATINUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_platinum_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE) + ); // Graphite Ore - public static final DeferredBlock GRAPHITE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("graphite_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - - ); - - public static final DeferredBlock DEEPSLATE_GRAPHITE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_graphite_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); + public static final DeferredBlock GRAPHITE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("graphite_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE) + ); + public static final DeferredBlock DEEPSLATE_GRAPHITE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_graphite_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); // Beryllium Ore - public static final DeferredBlock BERYLLIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("beryllium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_BERYLLIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_beryllium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock BERYLLIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("beryllium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_BERYLLIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_beryllium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); // Cadmium Ore - public static final DeferredBlock CADMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("cadmium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_CADMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_cadmium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock CADMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("cadmium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_CADMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_cadmium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); // Chromium Ore - public static final DeferredBlock CHROMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("chromium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_CHROMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_chromium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock CHROMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("chromium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_CHROMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_chromium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); //Manganese Ore - public static final DeferredBlock MANGANESE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("manganese_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_MANGANESE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_manganese_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock MANGANESE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("manganese_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_MANGANESE_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_manganese_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); // Osmium Ore - public static final DeferredBlock OSMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("osmium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_OSMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_osmium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock OSMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("osmium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_OSMIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_osmium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); // Palladium Ore - public static final DeferredBlock PALLADIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("palladium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_PALLADIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_palladium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock PALLADIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("palladium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_PALLADIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_palladium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); //Thorium Ore - public static final DeferredBlock THORIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("thorium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_THORIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_thorium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock THORIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("thorium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_THORIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_thorium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); //Uranium Ore - public static final DeferredBlock URANIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("uranium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_URANIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_uranium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock URANIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("uranium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_URANIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_uranium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); //Vanadium Ore - public static final DeferredBlock VANADIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("vanadium_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_VANADIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_vanadium_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock VANADIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("vanadium_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_VANADIUM_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_vanadium_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); //Zinc Ore - public static final DeferredBlock ZINC_ORE = DEFERRED_REGISTRY.registerSimpleBlock("zinc_ore", - BlockBehaviour.Properties.of(). - strength(3.0F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.STONE) - ); - - public static final DeferredBlock DEEPSLATE_ZINC_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_zinc_ore", - BlockBehaviour.Properties.of(). - strength(4.5F, 3.0F) - .lightLevel((state) -> 7) - .sound(SoundType.DEEPSLATE) - ); - + public static final DeferredBlock ZINC_ORE = DEFERRED_REGISTRY.registerSimpleBlock("zinc_ore", BlockBehaviour.Properties.of().strength(3.0F, 3.0F).lightLevel((state) -> 7).sound(SoundType.STONE)); + public static final DeferredBlock DEEPSLATE_ZINC_ORE = DEFERRED_REGISTRY.registerSimpleBlock("deepslate_zinc_ore", BlockBehaviour.Properties.of().strength(4.5F, 3.0F).lightLevel((state) -> 7).sound(SoundType.DEEPSLATE)); private static void init(IEventBus bus) { LOGGER.info("[Cog Works] Registering blocks ..."); DEFERRED_REGISTRY.register(bus); } + + public static class Tags { + + public static final TagKey BAUXITE_ORES = createConventional("ores/bauxite"); + public static final TagKey GRAPHITE_ORES = createConventional("ores/graphite"); + public static final TagKey LITHIUM_ORES = createConventional("ores/lithium"); + public static final TagKey MOLYBDENUM_ORES = createConventional("ores/molybdenum"); + public static final TagKey IRIDIUM_ORES = createConventional("ores/iridium"); + public static final TagKey TUNGSTEN_ORES = createConventional("ores/tungsten"); + public static final TagKey TITANIUM_ORES = createConventional("ores/titanium"); + public static final TagKey COBALT_ORES = createConventional("ores/cobalt"); + public static final TagKey NICKEL_ORES = createConventional("ores/nickel"); + public static final TagKey PLATINUM_ORES = createConventional("ores/platinum"); + public static final TagKey BERYLLIUM_ORES = createConventional("ores/beryllium"); + public static final TagKey CADMIUM_ORES = createConventional("ores/cadmium"); + public static final TagKey CHROMIUM_ORES = createConventional("ores/chromium"); + public static final TagKey MANGANESE_ORES = createConventional("ores/manganese"); + public static final TagKey OSMIUM_ORES = createConventional("ores/osmium"); + public static final TagKey PALLADIUM_ORES = createConventional("ores/palladium"); + public static final TagKey THORIUM_ORES = createConventional("ores/thorium"); + public static final TagKey URANIUM_ORES = createConventional("ores/uranium"); + public static final TagKey VANADIUM_ORES = createConventional("ores/vanadium"); + public static final TagKey ZINC_ORES = createConventional("ores/zinc"); + + private static TagKey createConventional(String name) { + return TagKey.create(Registries.BLOCK, new ResourceLocation("c", name)); + } + + private static TagKey createCustom(String name) { + return TagKey.create(Registries.BLOCK, new ResourceLocation(MOD_ID, name)); + } + } } public static class Items { @@ -429,8 +208,10 @@ public static class Items { public static final DeferredItem ZINC_ORE = registerBlockItem(Blocks.ZINC_ORE); public static final DeferredItem DEEPSLATE_ZINC_ORE = registerBlockItem(Blocks.DEEPSLATE_ZINC_ORE); - public static DeferredItem registerBlockItem(DeferredBlock block, Item.Properties properties) { - return DEFERRED_REGISTRY.registerSimpleBlockItem(block, properties); + public static final DeferredItem PROSPECTING_PICK = DEFERRED_REGISTRY.register("prospecting_pick", ProspectingPickItem::new); + + public static DeferredItem registerBlockItem(DeferredBlock block, Item.Properties properties) { + return DEFERRED_REGISTRY.registerSimpleBlockItem(block, properties); } public static DeferredItem registerBlockItem(DeferredBlock block) { diff --git a/src/main/java/org/darkar/cog_works/generation/data/lang/EN_US_Generator.java b/src/main/java/org/darkar/cog_works/generation/data/lang/EN_US_Generator.java index fa6a3f4..274f5ac 100644 --- a/src/main/java/org/darkar/cog_works/generation/data/lang/EN_US_Generator.java +++ b/src/main/java/org/darkar/cog_works/generation/data/lang/EN_US_Generator.java @@ -53,5 +53,7 @@ protected void addTranslations() { addBlock(Registry.Blocks.DEEPSLATE_VANADIUM_ORE, "Deepslate Vanadium Ore"); addBlock(Registry.Blocks.ZINC_ORE, "Zinc Ore"); addBlock(Registry.Blocks.DEEPSLATE_ZINC_ORE, "Deepslate Zinc Ore"); + + addItem(Registry.Items.PROSPECTING_PICK, "Prospecting Pick"); } } diff --git a/src/main/java/org/darkar/cog_works/item/ProspectingPickItem.java b/src/main/java/org/darkar/cog_works/item/ProspectingPickItem.java new file mode 100644 index 0000000..69b0a00 --- /dev/null +++ b/src/main/java/org/darkar/cog_works/item/ProspectingPickItem.java @@ -0,0 +1,88 @@ +package org.darkar.cog_works.item; + +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.common.extensions.IItemExtension; +import org.darkar.cog_works.item.renderer.ProspectingPickItemRenderer; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.SingletonGeoAnimatable; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.function.Consumer; + +public class ProspectingPickItem extends Item implements GeoItem, IItemExtension { + + private static final RawAnimation DIG_SAMPLE = RawAnimation.begin().thenPlay("animation.prospecting_pick.dig_sample"); + private static final RawAnimation COLLECT_SAMPLE = RawAnimation.begin().thenPlay("animation.prospecting_pick.collect_sample"); + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + private static final Properties itemProperties = new Properties().stacksTo(1) + .durability(128); + + public ProspectingPickItem() { + super(itemProperties); + SingletonGeoAnimatable.registerSyncedAnimatable(this); + } + + @Override + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { + private ProspectingPickItemRenderer renderer; + + @Override + public BlockEntityWithoutLevelRenderer getGeoItemRenderer() { + if (renderer == null) { + renderer = new ProspectingPickItemRenderer(); + } + + return this.renderer; + } + }); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + controllers.add(new AnimationController<>(this, "dig_sample_controller", 20, state -> PlayState.STOP).triggerableAnim("dig_sample", DIG_SAMPLE)); + + controllers.add(new AnimationController<>(this, "collect_sample_controller", 20, state -> PlayState.STOP).triggerableAnim("collect_sample", COLLECT_SAMPLE)); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + if (level instanceof ServerLevel serverLevel) + triggerAnim(player, GeoItem.getOrAssignId(player.getItemInHand(hand), serverLevel), + "collect_sample_controller", "collect_sample"); + return super.use(level, player, hand); + } + + @Override + public boolean canAttackBlock(BlockState blockState, Level level, BlockPos blockPos, Player player) { + var name = blockState.getBlock().getName().getString(); + if(level instanceof ServerLevel serverLevel) { + player.sendSystemMessage(Component.literal("Can attack block: " + name)); + triggerAnim(player, GeoItem.getOrAssignId(player.getItemInHand(InteractionHand.MAIN_HAND), serverLevel), + "dig_sample_controller", "dig_sample"); + } + + return false; + } +} diff --git a/src/main/java/org/darkar/cog_works/item/renderer/ProspectingPickItemRenderer.java b/src/main/java/org/darkar/cog_works/item/renderer/ProspectingPickItemRenderer.java new file mode 100644 index 0000000..f38648d --- /dev/null +++ b/src/main/java/org/darkar/cog_works/item/renderer/ProspectingPickItemRenderer.java @@ -0,0 +1,16 @@ +package org.darkar.cog_works.item.renderer; + +import net.minecraft.resources.ResourceLocation; +import org.darkar.cog_works.item.ProspectingPickItem; +import software.bernie.geckolib.model.DefaultedItemGeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +import static org.darkar.cog_works.CogWorks.MOD_ID; + +public class ProspectingPickItemRenderer extends GeoItemRenderer { + + + public ProspectingPickItemRenderer() { + super(new DefaultedItemGeoModel<>(new ResourceLocation(MOD_ID, "prospecting_pick"))); + } +} diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index 64aafe8..2cf4699 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -93,6 +93,14 @@ description='''${mod_description}''' ordering="NONE" side="BOTH" +# GeckoLib +[[dependencies.${mod_id}]] + modId="geckolib" + type="required" + versionRange="${gecko_lib_version_range}" + ordering="NONE" + side="BOTH" + # Features are specific properties of the game environment, that you may want to declare you require. This example declares # that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't # stop your mod loading on the server for example. diff --git a/src/main/resources/assets/cog_works/animations/item/prospecting_pick.animation.json b/src/main/resources/assets/cog_works/animations/item/prospecting_pick.animation.json new file mode 100644 index 0000000..35d39c8 --- /dev/null +++ b/src/main/resources/assets/cog_works/animations/item/prospecting_pick.animation.json @@ -0,0 +1,81 @@ +{ + "format_version": "1.8.0", + "animations": { + "animation.prospecting_pick.dig_sample": { + "animation_length": 1.75, + "bones": { + "handle": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [-65, 0, 0], + "easing": "easeInCubic" + }, + "0.75": { + "vector": [-35, 0, 0], + "easing": "easeInOutQuart" + }, + "1.0": { + "vector": [-65, 0, 0], + "easing": "easeInOutQuart" + }, + "1.25": { + "vector": [-35, 0, 0], + "easing": "easeOutQuart" + }, + "1.75": { + "vector": [0, 0, 0], + "easing": "easeOutCirc" + } + } + } + } + }, + "animation.prospecting_pick.collect_sample": { + "animation_length": 2.5, + "bones": { + "handle": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 180, 0], + "easing": "easeInCubic" + }, + "0.875": { + "vector": [65, 180, 0], + "easing": "easeInOutQuart" + }, + "1.125": { + "vector": [30, 180, 0], + "easing": "easeInOutQuart" + }, + "1.375": { + "vector": [65, 180, 0], + "easing": "easeInOutQuart" + }, + "1.625": { + "vector": [30, 180, 0], + "easing": "easeInOutQuart" + }, + "1.875": { + "vector": [30, 180, 0], + "easing": "easeInOutQuart" + }, + "2.2083": { + "vector": [0, 180, 0], + "easing": "easeOutCubic" + }, + "2.5": { + "vector": [0, 0, 0], + "easing": "easeOutQuad" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cog_works/geo/item/prospecting_pick.geo.json b/src/main/resources/assets/cog_works/geo/item/prospecting_pick.geo.json new file mode 100644 index 0000000..c6d0df7 --- /dev/null +++ b/src/main/resources/assets/cog_works/geo/item/prospecting_pick.geo.json @@ -0,0 +1,247 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.prospecting_pick", + "texture_width": 32, + "texture_height": 32, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "handle", + "pivot": [0, 7.625, -0.05], + "rotation": [0, 180, 0], + "cubes": [ + { + "origin": [-0.5, 0, -0.55], + "size": [1, 15.775, 1], + "uv": { + "north": {"uv": [0, 0], "uv_size": [1, 15.75]}, + "east": {"uv": [2, 0], "uv_size": [1, 15.75]}, + "south": {"uv": [4, 0], "uv_size": [1, 15.75]}, + "west": {"uv": [6, 0], "uv_size": [1, 15.75]}, + "up": {"uv": [14, 21], "uv_size": [1, 1]}, + "down": {"uv": [16, 22], "uv_size": [1, -1]} + } + }, + { + "origin": [-0.85, 14.975, -0.9], + "size": [1.7, 0.425, 1.7], + "uv": { + "north": {"uv": [3, 23], "uv_size": [1.75, 0.375]}, + "east": {"uv": [23, 4], "uv_size": [1.75, 0.375]}, + "south": {"uv": [6, 23], "uv_size": [1.75, 0.375]}, + "west": {"uv": [23, 8], "uv_size": [1.75, 0.375]}, + "up": {"uv": [17, 12], "uv_size": [1.75, 1.75]}, + "down": {"uv": [17, 16.75], "uv_size": [1.75, -1.75]} + } + }, + { + "origin": [-0.85, 14.4, -0.9], + "size": [1.7, 0.425, 1.7], + "uv": { + "north": {"uv": [9, 23], "uv_size": [1.75, 0.375]}, + "east": {"uv": [23, 10], "uv_size": [1.75, 0.375]}, + "south": {"uv": [12, 23], "uv_size": [1.75, 0.375]}, + "west": {"uv": [23, 12], "uv_size": [1.75, 0.375]}, + "up": {"uv": [18, 0], "uv_size": [1.75, 1.75]}, + "down": {"uv": [18, 4.75], "uv_size": [1.75, -1.75]} + } + }, + { + "origin": [-0.675, 3.775, -0.725], + "size": [1.35, 7.075, 1.35], + "uv": { + "north": {"uv": [11, 12], "uv_size": [1.375, 7.125]}, + "east": {"uv": [14, 12], "uv_size": [1.375, 7.125]}, + "south": {"uv": [15, 0], "uv_size": [1.375, 7.125]}, + "west": {"uv": [0, 17], "uv_size": [1.375, 7.125]}, + "up": {"uv": [20, 9], "uv_size": [1.375, 1.375]}, + "down": {"uv": [20, 13.375], "uv_size": [1.375, -1.375]} + } + }, + { + "origin": [-0.85, 10.85, -0.9], + "size": [1.7, 0.125, 1.7], + "uv": { + "north": {"uv": [21, 27], "uv_size": [1.75, 0.125]}, + "east": {"uv": [27, 21], "uv_size": [1.75, 0.125]}, + "south": {"uv": [27, 23], "uv_size": [1.75, 0.125]}, + "west": {"uv": [27, 25], "uv_size": [1.75, 0.125]}, + "up": {"uv": [18, 6], "uv_size": [1.75, 1.75]}, + "down": {"uv": [8, 19.75], "uv_size": [1.75, -1.75]} + } + }, + { + "origin": [-0.85, 3.65, -0.9], + "size": [1.7, 0.125, 1.7], + "uv": { + "north": {"uv": [27, 27], "uv_size": [1.75, 0.125]}, + "east": {"uv": [0, 28], "uv_size": [1.75, 0.125]}, + "south": {"uv": [28, 0], "uv_size": [1.75, 0.125]}, + "west": {"uv": [28, 2], "uv_size": [1.75, 0.125]}, + "up": {"uv": [17, 18], "uv_size": [1.75, 1.75]}, + "down": {"uv": [3, 21.75], "uv_size": [1.75, -1.75]} + } + } + ] + }, + { + "name": "head", + "parent": "handle", + "pivot": [0, 14.82561, -0.79121], + "cubes": [ + { + "origin": [-1, 14.775, -4.55], + "size": [2, 0.25, 7.5], + "uv": { + "north": {"uv": [24, 21], "uv_size": [2, 0.25]}, + "east": {"uv": [20, 15], "uv_size": [7.5, 0.25]}, + "south": {"uv": [24, 23], "uv_size": [2, 0.25]}, + "west": {"uv": [20, 17], "uv_size": [7.5, 0.25]}, + "up": {"uv": [8, 0], "uv_size": [2, 7.5]}, + "down": {"uv": [8, 16.5], "uv_size": [2, -7.5]} + } + }, + { + "origin": [-1.7, 14.475, -5.925], + "size": [3.4, 0.25, 1.5], + "pivot": [0, 14.6, -5.175], + "rotation": [25, 0, 0], + "uv": { + "north": {"uv": [23, 0], "uv_size": [3.375, 0.25]}, + "east": {"uv": [0, 26], "uv_size": [1.5, 0.25]}, + "south": {"uv": [23, 2], "uv_size": [3.375, 0.25]}, + "west": {"uv": [26, 4], "uv_size": [1.5, 0.25]}, + "up": {"uv": [15, 9], "uv_size": [3.375, 1.5]}, + "down": {"uv": [3, 18.5], "uv_size": [3.375, -1.5]} + } + }, + { + "origin": [1, 14.78025, -4.5481], + "size": [0.7, 0.25, 1.2], + "uv": { + "north": {"uv": [5, 29], "uv_size": [0.75, 0.25]}, + "east": {"uv": [3, 27], "uv_size": [1.25, 0.25]}, + "south": {"uv": [7, 29], "uv_size": [0.75, 0.25]}, + "west": {"uv": [6, 27], "uv_size": [1.25, 0.25]}, + "up": {"uv": [18, 21], "uv_size": [0.75, 1.25]}, + "down": {"uv": [22, 20.25], "uv_size": [0.75, -1.25]} + } + }, + { + "origin": [0.68439, 14.78025, -3.62023], + "size": [0.7, 0.25, 1.45], + "pivot": [1.03439, 14.90525, -2.89523], + "rotation": [0, -30, 0], + "uv": { + "north": {"uv": [29, 8], "uv_size": [0.75, 0.25]}, + "east": {"uv": [26, 8], "uv_size": [1.5, 0.25]}, + "south": {"uv": [29, 10], "uv_size": [0.75, 0.25]}, + "west": {"uv": [26, 10], "uv_size": [1.5, 0.25]}, + "up": {"uv": [6, 20], "uv_size": [0.75, 1.5]}, + "down": {"uv": [20, 20.5], "uv_size": [0.75, -1.5]} + } + }, + { + "origin": [-1.38439, 14.78025, -3.62023], + "size": [0.7, 0.25, 1.45], + "pivot": [-1.03439, 14.90525, -2.89523], + "rotation": [0, 30, 0], + "uv": { + "north": {"uv": [29, 12], "uv_size": [0.75, 0.25]}, + "east": {"uv": [26, 12], "uv_size": [1.5, 0.25]}, + "south": {"uv": [29, 14], "uv_size": [0.75, 0.25]}, + "west": {"uv": [15, 26], "uv_size": [1.5, 0.25]}, + "up": {"uv": [21, 0], "uv_size": [0.75, 1.5]}, + "down": {"uv": [21, 4.5], "uv_size": [0.75, -1.5]} + } + }, + { + "origin": [-1.7, 14.78025, -4.5481], + "size": [0.7, 0.25, 1.2], + "uv": { + "north": {"uv": [29, 16], "uv_size": [0.75, 0.25]}, + "east": {"uv": [27, 6], "uv_size": [1.25, 0.25]}, + "south": {"uv": [17, 29], "uv_size": [0.75, 0.25]}, + "west": {"uv": [18, 27], "uv_size": [1.25, 0.25]}, + "up": {"uv": [20, 22], "uv_size": [0.75, 1.25]}, + "down": {"uv": [22, 23.25], "uv_size": [0.75, -1.25]} + } + }, + { + "origin": [-1.225, 14.23574, 2.84609], + "size": [2.45, 0.25, 4.2], + "pivot": [0, 14.36074, 4.94609], + "rotation": [-15, 0, 0], + "uv": { + "north": {"uv": [15, 24], "uv_size": [2.5, 0.25]}, + "east": {"uv": [21, 6], "uv_size": [4.25, 0.25]}, + "south": {"uv": [24, 19], "uv_size": [2.5, 0.25]}, + "west": {"uv": [8, 21], "uv_size": [4.25, 0.25]}, + "up": {"uv": [11, 0], "uv_size": [2.5, 4.25]}, + "down": {"uv": [11, 10.25], "uv_size": [2.5, -4.25]} + } + }, + { + "origin": [-1.225, 14.775, 1.275], + "size": [0.225, 0.25, 1.675], + "uv": { + "north": {"uv": [19, 29], "uv_size": [0.25, 0.25]}, + "east": {"uv": [3, 25], "uv_size": [1.625, 0.25]}, + "south": {"uv": [21, 29], "uv_size": [0.25, 0.25]}, + "west": {"uv": [6, 25], "uv_size": [1.625, 0.25]}, + "up": {"uv": [9, 25], "uv_size": [0.25, 1.625]}, + "down": {"uv": [11, 26.625], "uv_size": [0.25, -1.625]} + } + }, + { + "origin": [1, 14.775, 1.275], + "size": [0.225, 0.25, 1.675], + "uv": { + "north": {"uv": [26, 29], "uv_size": [0.25, 0.25]}, + "east": {"uv": [19, 25], "uv_size": [1.625, 0.25]}, + "south": {"uv": [28, 29], "uv_size": [0.25, 0.25]}, + "west": {"uv": [22, 25], "uv_size": [1.625, 0.25]}, + "up": {"uv": [13, 25], "uv_size": [0.25, 1.625]}, + "down": {"uv": [25, 26.625], "uv_size": [0.25, -1.625]} + } + }, + { + "origin": [0.89384, 14.775, 0.4686], + "size": [0.225, 0.25, 0.85], + "pivot": [1.00634, 14.9, 0.8936], + "rotation": [0, 15, 0], + "uv": { + "north": {"uv": [0, 30], "uv_size": [0.25, 0.25]}, + "east": {"uv": [9, 28], "uv_size": [0.875, 0.25]}, + "south": {"uv": [30, 6], "uv_size": [0.25, 0.25]}, + "west": {"uv": [11, 28], "uv_size": [0.875, 0.25]}, + "up": {"uv": [13, 28], "uv_size": [0.25, 0.875]}, + "down": {"uv": [15, 28.875], "uv_size": [0.25, -0.875]} + } + }, + { + "origin": [-1.11884, 14.775, 0.4686], + "size": [0.225, 0.25, 0.85], + "pivot": [-1.00634, 14.9, 0.8936], + "rotation": [0, -15, 0], + "uv": { + "north": {"uv": [9, 30], "uv_size": [0.25, 0.25]}, + "east": {"uv": [28, 19], "uv_size": [0.875, 0.25]}, + "south": {"uv": [11, 30], "uv_size": [0.25, 0.25]}, + "west": {"uv": [24, 28], "uv_size": [0.875, 0.25]}, + "up": {"uv": [3, 29], "uv_size": [0.25, 0.875]}, + "down": {"uv": [29, 4.875], "uv_size": [0.25, -0.875]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cog_works/models/item/prospecting_pick.json b/src/main/resources/assets/cog_works/models/item/prospecting_pick.json new file mode 100644 index 0000000..c2532c1 --- /dev/null +++ b/src/main/resources/assets/cog_works/models/item/prospecting_pick.json @@ -0,0 +1,79 @@ +{ + "credit": "Made with Blockbench", + "parent": "builtin/entity", + "texture_size": [ + 32, + 32 + ], + "display": { + "thirdperson_righthand": { + "translation": [ + -0.75, + -9, + 0 + ] + }, + "thirdperson_lefthand": { + "translation": [ + -0.75, + -9, + 0 + ] + }, + "firstperson_righthand": { + "translation": [ + -2, + -6.5, + -1.25 + ] + }, + "firstperson_lefthand": { + "translation": [ + -2, + -6.5, + -1.25 + ] + }, + "gui": { + "rotation": [ + 90, + -62.5, + 90 + ], + "translation": [ + 4.5, + -7, + 0 + ], + "scale": [ + 0.9, + 0.9, + 0.9 + ] + }, + "head": { + "rotation": [ + -90, + 30, + -90 + ], + "translation": [ + -10, + 17, + 0 + ] + }, + "fixed": { + "rotation": [ + 0, + 90, + 0 + ], + "translation": [ + 0, + -8, + -0.5 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cog_works/textures/item/prospecting_pick.png b/src/main/resources/assets/cog_works/textures/item/prospecting_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..ff175a2d93a792a93c799390d4f9d7423b5729ee GIT binary patch literal 13331 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