From e65dc91f0cb9a07f4b1149d9bbe81c37fbe3353a Mon Sep 17 00:00:00 2001 From: Big Duckie Date: Fri, 29 Nov 2024 11:54:13 -0700 Subject: [PATCH] Commit of all project code. --- .gitattributes | 9 + .github/workflows/build.yml | 37 +++ .gitignore | 40 +++ LICENSE | 21 ++ README.md | 11 + build.gradle | 116 ++++++++ gradle.properties | 22 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 252 ++++++++++++++++++ gradlew.bat | 94 +++++++ settings.gradle | 10 + .../simpleexcavators/SimpleExcavators.java | 53 ++++ .../config/SimpleExcavatorsConfig.java | 15 ++ .../simpleexcavators/data/ExcavatorData.java | 144 ++++++++++ .../item/ExtendedExcavatorItem.java | 50 ++++ .../material/CustomToolMaterial.java | 67 +++++ .../mixin/ExcavatorKnockbackMixin.java | 28 ++ .../mixin/SilkTouchEnchantmentMixin.java | 26 ++ .../assets/simple-excavators/icon.png | Bin 0 -> 35816 bytes .../assets/simple-excavators/lang/en_us.json | 30 +++ .../assets/simple-excavators/lang/ru_ru.json | 30 +++ .../assets/simple-excavators/lang/zh_cn.json | 30 +++ .../models/item/diamond_excavator.json | 6 + .../models/item/emerald_excavator.json | 6 + .../models/item/ender_excavator.json | 6 + .../models/item/fiery_excavator.json | 6 + .../models/item/glowstone_excavator.json | 6 + .../models/item/golden_excavator.json | 6 + .../models/item/iron_excavator.json | 6 + .../models/item/lapis_excavator.json | 6 + .../models/item/nether_excavator.json | 6 + .../models/item/netherite_excavator.json | 6 + .../models/item/obsidian_excavator.json | 6 + .../models/item/prismarine_excavator.json | 6 + .../models/item/quartz_excavator.json | 6 + .../models/item/slime_excavator.json | 6 + .../models/item/stone_excavator.json | 6 + .../models/item/tater_excavator.json | 6 + .../models/item/vibranium_excavator.json | 6 + .../models/item/wooden_excavator.json | 6 + .../textures/item/diamond_excavator.png | Bin 0 -> 367 bytes .../textures/item/emerald_excavator.png | Bin 0 -> 362 bytes .../textures/item/ender_excavator.png | Bin 0 -> 373 bytes .../textures/item/fiery_excavator.png | Bin 0 -> 366 bytes .../textures/item/golden_excavator.png | Bin 0 -> 368 bytes .../textures/item/iron_excavator.png | Bin 0 -> 348 bytes .../textures/item/lapis_excavator.png | Bin 0 -> 367 bytes .../textures/item/netherite_excavator.png | Bin 0 -> 474 bytes .../textures/item/obsidian_excavator.png | Bin 0 -> 370 bytes .../textures/item/prismarine_excavator.png | Bin 0 -> 370 bytes .../textures/item/quartz_excavator.png | Bin 0 -> 369 bytes .../textures/item/slime_excavator.png | Bin 0 -> 369 bytes .../textures/item/stone_excavator.png | Bin 0 -> 359 bytes .../textures/item/wooden_excavator.png | Bin 0 -> 370 bytes .../data/fabric/tags/items/shovels.json | 61 +++++ .../minecraft/tags/items/piglin_loved.json | 6 + .../recipes/diamond_excavator.json | 22 ++ .../recipes/emerald_excavator.json | 22 ++ .../recipes/ender_excavator.json | 22 ++ .../recipes/fiery_excavator.json | 22 ++ .../recipes/golden_excavator.json | 22 ++ .../recipes/iron_excavator.json | 22 ++ .../recipes/lapis_excavator.json | 22 ++ .../recipes/netherite_excavator.json | 12 + .../recipes/obsidian_excavator.json | 19 ++ .../recipes/prismarine_excavator.json | 22 ++ .../recipes/quartz_excavator.json | 22 ++ .../recipes/slime_excavator.json | 22 ++ .../recipes/stone_excavator.json | 22 ++ .../recipes/wooden_excavator.json | 22 ++ src/main/resources/fabric.mod.json | 32 +++ .../resources/simple-excavators.mixins.json | 12 + .../excavators/diamond_excavator.json | 10 + .../excavators/emerald_excavator.json | 11 + .../excavators/ender_excavator.json | 11 + .../excavators/fiery_excavator.json | 13 + .../excavators/golden_excavator.json | 10 + .../excavators/iron_excavator.json | 10 + .../excavators/lapis_excavator.json | 11 + .../excavators/netherite_excavator.json | 11 + .../excavators/obsidian_excavator.json | 11 + .../excavators/prismarine_excavator.json | 11 + .../excavators/quartz_excavator.json | 11 + .../excavators/slime_excavator.json | 12 + .../excavators/stone_excavator.json | 10 + .../excavators/wooden_excavator.json | 11 + 87 files changed, 1759 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/dev/bigduckie/simpleexcavators/SimpleExcavators.java create mode 100644 src/main/java/dev/bigduckie/simpleexcavators/config/SimpleExcavatorsConfig.java create mode 100644 src/main/java/dev/bigduckie/simpleexcavators/data/ExcavatorData.java create mode 100644 src/main/java/dev/bigduckie/simpleexcavators/item/ExtendedExcavatorItem.java create mode 100644 src/main/java/dev/bigduckie/simpleexcavators/material/CustomToolMaterial.java create mode 100644 src/main/java/dev/bigduckie/simpleexcavators/mixin/ExcavatorKnockbackMixin.java create mode 100644 src/main/java/dev/bigduckie/simpleexcavators/mixin/SilkTouchEnchantmentMixin.java create mode 100644 src/main/resources/assets/simple-excavators/icon.png create mode 100644 src/main/resources/assets/simple-excavators/lang/en_us.json create mode 100644 src/main/resources/assets/simple-excavators/lang/ru_ru.json create mode 100644 src/main/resources/assets/simple-excavators/lang/zh_cn.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/diamond_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/emerald_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/ender_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/fiery_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/glowstone_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/golden_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/iron_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/lapis_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/nether_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/netherite_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/obsidian_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/prismarine_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/quartz_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/slime_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/stone_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/tater_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/vibranium_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/models/item/wooden_excavator.json create mode 100644 src/main/resources/assets/simple-excavators/textures/item/diamond_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/emerald_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/ender_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/fiery_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/golden_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/iron_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/lapis_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/netherite_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/obsidian_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/prismarine_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/quartz_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/slime_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/stone_excavator.png create mode 100644 src/main/resources/assets/simple-excavators/textures/item/wooden_excavator.png create mode 100644 src/main/resources/data/fabric/tags/items/shovels.json create mode 100644 src/main/resources/data/minecraft/tags/items/piglin_loved.json create mode 100644 src/main/resources/data/simple-excavators/recipes/diamond_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/emerald_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/ender_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/fiery_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/golden_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/iron_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/lapis_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/netherite_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/obsidian_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/prismarine_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/quartz_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/slime_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/stone_excavator.json create mode 100644 src/main/resources/data/simple-excavators/recipes/wooden_excavator.json create mode 100644 src/main/resources/fabric.mod.json create mode 100644 src/main/resources/simple-excavators.mixins.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/diamond_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/emerald_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/ender_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/fiery_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/golden_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/iron_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/lapis_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/netherite_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/obsidian_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/prismarine_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/quartz_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/slime_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/stone_excavator.json create mode 100644 src/main/resources/static_data/simple-excavators/excavators/wooden_excavator.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..097f9f9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..b01da52 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,37 @@ +# Automatically build the project and run any configured tests for every push +# and submitted pull request. This can help catch issues that only occur on +# certain platforms or Java versions, and provides a first line of defence +# against bad commits. + +name: build +on: [pull_request, push] + +jobs: + build: + strategy: + matrix: + # Use these Java versions + java: [ + 21, # Current Java LTS + ] + runs-on: ubuntu-22.04 + steps: + - name: checkout repository + uses: actions/checkout@v4 + - name: validate gradle wrapper + uses: gradle/wrapper-validation-action@v2 + - name: setup jdk ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.java }} + distribution: 'microsoft' + - name: make gradle wrapper executable + run: chmod +x ./gradlew + - name: build + run: ./gradlew build + - name: capture build artifacts + if: ${{ matrix.java == '21' }} # Only upload artifacts built from latest java + uses: actions/upload-artifact@v4 + with: + name: Artifacts + path: build/libs/ \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c476faf --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# gradle + +.gradle/ +build/ +out/ +classes/ + +# eclipse + +*.launch + +# idea + +.idea/ +*.iml +*.ipr +*.iws + +# vscode + +.settings/ +.vscode/ +bin/ +.classpath +.project + +# macos + +*.DS_Store + +# fabric + +run/ + +# java + +hs_err_*.log +replay_*.log +*.hprof +*.jfr diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..44eb41f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Big Duckie + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..06f215f --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Simple Excavators + +Simple Excavators is a mod that adds new digging tools via Fabric. + +This mod is an updated fork of Draylar's Vanilla Excavators. + +## Installation + +1. Install the Fabric Launcher from [Fabric MC](https://fabricmc.net/use/installer/) +2. Install the Fabric API jar as a mod from [Modrinth](https://modrinth.com/mod/fabric-api) +3. Install the latest version of Simple Excavators from [Modrinth](https://modrinth.com/simple-excavators) \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..4f5e3b5 --- /dev/null +++ b/build.gradle @@ -0,0 +1,116 @@ +plugins { + id 'fabric-loom' version '1.8-SNAPSHOT' + id 'maven-publish' +} + +version = "${project.mod_version}-${project.minecraft_version}" +group = project.maven_group + +base { + archivesName = project.archives_base_name +} + +repositories { + maven { url "https://maven.shedaniel.me/" } + maven { url "https://maven.bigduckie.dev/releases" } +} + +loom { + splitEnvironmentSourceSets() + + mods { + "simple-excavators" { + sourceSet sourceSets.main + sourceSet sourceSets.client + } + } + +} + +fabricApi { + configureDataGeneration() +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + + // Magna (https://github.com/Draylar/magna) for hammers + include "dev.draylar:magna:${project.magna_version}" + modImplementation("dev.draylar:magna:${project.magna_version}") { + exclude group: "net.fabricmc" + exclude group: "com.jamieswhiteshirt" + exclude group: "me.shedaniel.cloth" + exclude module: "omega-config-base" + } + + // Static Content (https://github.com/Draylar/static-content) for hammer loading and compat + include "dev.bigduckie:static-content:${project.static_content_version}" + modImplementation("dev.bigduckie:static-content:${project.static_content_version}") { + exclude group: "net.fabricmc" + exclude module: "omega-config-base" + } + + // Config solutions + Cloth Config for Magna + modImplementation "dev.draylar.omega-config:omega-config-base:${project.omega_config_version}" + include "dev.draylar.omega-config:omega-config-base:${project.omega_config_version}" + modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config_version}") { + exclude(group: "net.fabricmc.fabric-api") + } +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() + + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +jar { + from("LICENSE") { + rename { "${it}_${project.base.archivesName.get()}" } + } +} + +// configure the maven publication +publishing { + publications { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name + version = "${project.mod_version}+${project.minecraft_version}" + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + maven { + name = "personal" + url = "https://maven.bigduckie.dev/releases" + credentials { + username = System.getenv("MAVEN_USERNAME") + password = System.getenv("MAVEN_PASSWORD") + } + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..8d90d59 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,22 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.20.1 +yarn_mappings=1.20.1+build.10 +loader_version=0.16.7 + +# Mod Properties +mod_version=1.0.0 +maven_group=dev.bigduckie +archives_base_name=simple-excavators + +# Dependencies +fabric_version=0.92.2+1.20.1 + +magna_version=1.10.1+1.20.1 +static_content_version=1.0.7+1.20.1 +omega_config_version=1.4.1+1.20.1 +cloth_config_version=11.1.106 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..df97d72 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..f5feea6 --- /dev/null +++ b/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..9d21a21 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..75c4d72 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + mavenCentral() + gradlePluginPortal() + } +} \ No newline at end of file diff --git a/src/main/java/dev/bigduckie/simpleexcavators/SimpleExcavators.java b/src/main/java/dev/bigduckie/simpleexcavators/SimpleExcavators.java new file mode 100644 index 0000000..b9ad9b1 --- /dev/null +++ b/src/main/java/dev/bigduckie/simpleexcavators/SimpleExcavators.java @@ -0,0 +1,53 @@ +package dev.bigduckie.simpleexcavators; + +import dev.bigduckie.simpleexcavators.config.SimpleExcavatorsConfig; +import dev.bigduckie.simpleexcavators.data.ExcavatorData; +import dev.bigduckie.simpleexcavators.item.ExtendedExcavatorItem; +import dev.bigduckie.staticcontent.StaticContent; +import dev.draylar.magna.api.optional.MagnaOptionals; +import draylar.omegaconfig.OmegaConfig; +import net.fabricmc.api.ModInitializer; + +import net.fabricmc.fabric.api.event.player.AttackEntityCallback; +import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Identifier; + +public class SimpleExcavators implements ModInitializer { + public static final String MOD_ID = "simple-excavators"; + public static SimpleExcavatorsConfig CONFIG = OmegaConfig.register(SimpleExcavatorsConfig.class); + private static final RegistryKey ITEM_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, id("group")); + + @Override + public void onInitialize() { + MagnaOptionals.optInForCurse(); + StaticContent.load(id("excavators"), ExcavatorData.class); + Registry.register(Registries.ITEM_GROUP, ITEM_GROUP, FabricItemGroup.builder().displayName(Text.translatable("itemGroup.simple-excavators.group")).icon(() -> new ItemStack(Registries.ITEM.get(id("diamond_excavator")))).entries((context, entries) -> entries.addAll(ExcavatorData.ENTRY_SET)).build()); + registerCallbackHandlers(); + } + + private void registerCallbackHandlers() { + AttackEntityCallback.EVENT.register((playerEntity, world, hand, entity, entityHitResult) -> { + ItemStack handStack = playerEntity.getMainHandStack(); + if (handStack.getItem() instanceof ExtendedExcavatorItem extendedExcavatorItem) { + // set entity on fire if this excavator smelts blocks + if (extendedExcavatorItem.getData().canSmelt()) { + entity.setOnFireFor(4); + } + } + + return ActionResult.PASS; + }); + } + + public static Identifier id(String name) { + return new Identifier(MOD_ID, name); + } +} \ No newline at end of file diff --git a/src/main/java/dev/bigduckie/simpleexcavators/config/SimpleExcavatorsConfig.java b/src/main/java/dev/bigduckie/simpleexcavators/config/SimpleExcavatorsConfig.java new file mode 100644 index 0000000..0a7ab0d --- /dev/null +++ b/src/main/java/dev/bigduckie/simpleexcavators/config/SimpleExcavatorsConfig.java @@ -0,0 +1,15 @@ +package dev.bigduckie.simpleexcavators.config; + +import draylar.omegaconfig.api.Config; + +public class SimpleExcavatorsConfig implements Config { + + public boolean enableExtraMaterials = true; + public int durabilityModifier = 5; + public double breakSpeedMultiplier = 1.0; + + @Override + public String getName() { + return "simple-excavators"; + } +} \ No newline at end of file diff --git a/src/main/java/dev/bigduckie/simpleexcavators/data/ExcavatorData.java b/src/main/java/dev/bigduckie/simpleexcavators/data/ExcavatorData.java new file mode 100644 index 0000000..6340d2b --- /dev/null +++ b/src/main/java/dev/bigduckie/simpleexcavators/data/ExcavatorData.java @@ -0,0 +1,144 @@ +package dev.bigduckie.simpleexcavators.data; + +import dev.bigduckie.simpleexcavators.item.ExtendedExcavatorItem; +import dev.bigduckie.simpleexcavators.material.CustomToolMaterial; +import dev.bigduckie.staticcontent.api.ContentData; +import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemStackSet; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +import java.util.Set; + +public class ExcavatorData implements ContentData { + + private final String id; + private final int miningLevel; + private final int durability; + private final float blockBreakSpeed; + private final float attackDamage; + private final float attackSpeed; + private final int enchantability; + private final Identifier repairIngredient; + private final boolean isFireImmune; + private final boolean smelts; + private final int breakRadius; + private final boolean isExtra; + private final int burnTime; + private final boolean hasExtraKnockback; + + public static final Set ENTRY_SET = ItemStackSet.create(); + + public ExcavatorData(String id, int miningLevel, int durability, float blockBreakSpeed, float attackDamage, float attackSpeed, int enchantability, Identifier repairIngredient, boolean isFireImmune, boolean smelts, int breakRadius, boolean isExtra, int burnTime, boolean hasExtraKnockback, String group) { + this.id = id; + this.miningLevel = miningLevel; + this.durability = durability; + this.blockBreakSpeed = blockBreakSpeed; + this.attackDamage = attackDamage; + this.attackSpeed = attackSpeed; + this.enchantability = enchantability; + this.repairIngredient = repairIngredient; + this.isFireImmune = isFireImmune; + this.smelts = smelts; + this.breakRadius = breakRadius; + this.isExtra = isExtra; + this.burnTime = burnTime; + this.hasExtraKnockback = hasExtraKnockback; + } + + @Override + public void register(Identifier identifier) { + // only register if the excavator is not extra (wood -> diamond), or if it is extra (lapis, emerald, ...) and the option is enabled + if (!isExtra() || isExtra() && dev.bigduckie.simpleexcavators.SimpleExcavators.CONFIG.enableExtraMaterials) { + + // setup settings + Item.Settings settings = new Item.Settings(); + if (isFireImmune()) { + settings.fireproof(); + } + + // check for excavator autosmelt + // create excavator with settings + ExtendedExcavatorItem excavatorItem = new ExtendedExcavatorItem( + CustomToolMaterial.from(this), + 0, + getAttackSpeed() == 0 ? -2.4f : getAttackSpeed(), + settings, + getBreakRadius() == 0 ? 1 : getBreakRadius(), + this + ); + + // burn time for furnace fuel + if (getBurnTime() > 0) { + FuelRegistry.INSTANCE.add(excavatorItem, getBurnTime()); + } + + // add excavator to tag + String path = getId() + "_excavator"; + Identifier registryID = path.contains(":") ? new Identifier(path) : dev.bigduckie.simpleexcavators.SimpleExcavators.id(path); + Registry.register(Registries.ITEM, registryID, excavatorItem); + + // add excavator to item group + ENTRY_SET.add(excavatorItem.getDefaultStack()); + } + } + + public boolean hasExtraKnockback() { + return hasExtraKnockback; + } + + public boolean canSmelt() { + return smelts; + } + + public int getBurnTime() { + return burnTime; + } + + public boolean isExtra() { + return isExtra; + } + + public String getId() { + return id; + } + + public int getBreakRadius() { + return breakRadius; + } + + public float getAttackSpeed() { + return attackSpeed; + } + + public int getMiningLevel() { + return miningLevel; + } + + public int getDurability() { + return durability; + } + + public float getBlockBreakSpeed() { + return blockBreakSpeed * (float) dev.bigduckie.simpleexcavators.SimpleExcavators.CONFIG.breakSpeedMultiplier; + } + + public float getAttackDamage() { + return attackDamage; + } + + public int getEnchantability() { + return enchantability; + } + + public Identifier getRepairIngredient() { + return repairIngredient; + } + + public boolean isFireImmune() { + return isFireImmune; + } +} diff --git a/src/main/java/dev/bigduckie/simpleexcavators/item/ExtendedExcavatorItem.java b/src/main/java/dev/bigduckie/simpleexcavators/item/ExtendedExcavatorItem.java new file mode 100644 index 0000000..50ed55d --- /dev/null +++ b/src/main/java/dev/bigduckie/simpleexcavators/item/ExtendedExcavatorItem.java @@ -0,0 +1,50 @@ +package dev.bigduckie.simpleexcavators.item; + +import dev.bigduckie.simpleexcavators.data.ExcavatorData; +import dev.draylar.magna.api.BlockProcessor; +import dev.draylar.magna.item.ExcavatorItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ToolMaterial; +import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.SmeltingRecipe; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.Optional; + +public class ExtendedExcavatorItem extends ExcavatorItem { + + private final ExcavatorData data; + + public ExtendedExcavatorItem(ToolMaterial toolMaterial, int attackDamage, float attackSpeed, Settings settings, int breakRadius, ExcavatorData data) { + super(toolMaterial, attackDamage, attackSpeed, settings, breakRadius); + this.data = data; + } + + public ExcavatorData getData() { + return data; + } + + @Override + public BlockProcessor getProcessor(World world, PlayerEntity player, BlockPos pos, ItemStack heldStack) { + if (data.canSmelt()) { + return (tool, input) -> { + Optional cooked = world.getRecipeManager().getFirstMatch( + RecipeType.SMELTING, + new SimpleInventory(input), + world + ); + + if (cooked.isPresent()) { + return cooked.get().getOutput(world.getRegistryManager()).copy(); + } + + return input; + }; + } else { + return super.getProcessor(world, player, pos, heldStack); + } + } +} diff --git a/src/main/java/dev/bigduckie/simpleexcavators/material/CustomToolMaterial.java b/src/main/java/dev/bigduckie/simpleexcavators/material/CustomToolMaterial.java new file mode 100644 index 0000000..6dcd58a --- /dev/null +++ b/src/main/java/dev/bigduckie/simpleexcavators/material/CustomToolMaterial.java @@ -0,0 +1,67 @@ +package dev.bigduckie.simpleexcavators.material; + +import dev.bigduckie.simpleexcavators.data.ExcavatorData; +import net.minecraft.item.ToolMaterial; +import net.minecraft.recipe.Ingredient; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; + +public class CustomToolMaterial implements ToolMaterial { + + private final int enchantability; + private final float miningSpeedMultiplier; + private final int durability; + private final float attackDamage; + private final int miningLevel; + private final Ingredient ingredient; + + public CustomToolMaterial(int enchantability, float miningSpeedMultiplier, int durability, float attackDamage, int miningLevel, Ingredient ingredient) { + this.enchantability = enchantability; + this.miningSpeedMultiplier = miningSpeedMultiplier; + this.durability = durability; + this.attackDamage = attackDamage; + this.miningLevel = miningLevel; + this.ingredient = ingredient; + } + + public static CustomToolMaterial from(ExcavatorData data) { + return new CustomToolMaterial( + data.getEnchantability() == 0 ? 15 : data.getEnchantability(), + data.getBlockBreakSpeed() == 0 ? 1 : data.getBlockBreakSpeed(), + (data.getDurability() == 0 ? 500 : data.getDurability()) * dev.bigduckie.simpleexcavators.SimpleExcavators.CONFIG.durabilityModifier, + data.getAttackDamage() == 0 ? 4 : data.getAttackDamage(), + data.getMiningLevel(), + Ingredient.ofItems(Registries.ITEM.get(data.getRepairIngredient() == null ? new Identifier("iron_ingot") : data.getRepairIngredient())) + ); + } + + @Override + public int getDurability() { + return durability; + } + + @Override + public float getMiningSpeedMultiplier() { + return miningSpeedMultiplier; + } + + @Override + public float getAttackDamage() { + return attackDamage; + } + + @Override + public int getMiningLevel() { + return miningLevel; + } + + @Override + public int getEnchantability() { + return enchantability; + } + + @Override + public Ingredient getRepairIngredient() { + return ingredient; + } +} diff --git a/src/main/java/dev/bigduckie/simpleexcavators/mixin/ExcavatorKnockbackMixin.java b/src/main/java/dev/bigduckie/simpleexcavators/mixin/ExcavatorKnockbackMixin.java new file mode 100644 index 0000000..5617704 --- /dev/null +++ b/src/main/java/dev/bigduckie/simpleexcavators/mixin/ExcavatorKnockbackMixin.java @@ -0,0 +1,28 @@ +package dev.bigduckie.simpleexcavators.mixin; + +import dev.bigduckie.simpleexcavators.item.ExtendedExcavatorItem; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(EnchantmentHelper.class) +public class ExcavatorKnockbackMixin { + + private static final int SLIME_KNOCKBACK_MODIFIER = 3; + + @Inject(at = @At("HEAD"), method = "getKnockback", cancellable = true) + private static void getKnockback(LivingEntity livingEntity, CallbackInfoReturnable info) { + ItemStack heldStack = livingEntity.getMainHandStack(); + if(heldStack.getItem() instanceof ExtendedExcavatorItem excavatorItem) { + // check data associated with excavator item for extra kb + if(excavatorItem.getData().hasExtraKnockback()) { + info.setReturnValue(SLIME_KNOCKBACK_MODIFIER); + info.cancel(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/dev/bigduckie/simpleexcavators/mixin/SilkTouchEnchantmentMixin.java b/src/main/java/dev/bigduckie/simpleexcavators/mixin/SilkTouchEnchantmentMixin.java new file mode 100644 index 0000000..9497f22 --- /dev/null +++ b/src/main/java/dev/bigduckie/simpleexcavators/mixin/SilkTouchEnchantmentMixin.java @@ -0,0 +1,26 @@ +package dev.bigduckie.simpleexcavators.mixin; + +import dev.bigduckie.simpleexcavators.item.ExtendedExcavatorItem; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentTarget; +import net.minecraft.enchantment.SilkTouchEnchantment; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(SilkTouchEnchantment.class) +public class SilkTouchEnchantmentMixin extends Enchantment { + + public SilkTouchEnchantmentMixin(Rarity weight, EnchantmentTarget type, EquipmentSlot[] slotTypes) { + super(weight, type, slotTypes); + } + + @Override + public boolean isAcceptableItem(ItemStack stack) { + if (stack.getItem() instanceof ExtendedExcavatorItem item) { + return !item.getData().canSmelt(); + } + + return super.isAcceptableItem(stack); + } +} diff --git a/src/main/resources/assets/simple-excavators/icon.png b/src/main/resources/assets/simple-excavators/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bdae06b1fdf144b318071ab94134684dac66ae96 GIT binary patch literal 35816 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 JS?83{1OVtEik|=g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/emerald_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/emerald_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa919cf16a6c251f3d50926a9fc3ce79fb90135 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbmnFu>%90961LU#sm-+E zmX708$r}fScbqoMQTSB)b57FCguW;9=AQU}(#~Azllajjzv^t(7J)mnw4XRU3C`NW z@jRgJjK2KsBc3b^Uw;WYR{sCZ@};NPI21TKjii(2`ES3caBN3LlKo8!yw@$=l)7Yvf-e^&F9G-MPkH0?TCwWN}99^)d$?|PiAKz}iKy85}Sb4q9e E0EmH&6951J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/ender_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/ender_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..fca5579b4af05e1dadbae7f2bc8fdd19cdcb1215 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbmnFu>%9097i?&;zfV&T7Zf+F7`2LadD7jHyyusa;!G>B>b zCFSSPly!(PfP*if(c$V>4vBR}XQhqKmZdie9l4#m{QuuvGvSH*J@}HtUbi|#PJ1_7 z`iO$vymZx26OQ9EYIe&{*>J*ZPKv;;nD2Yf6qjlp6BkhENZBO1>2q&P5F6L4U2;=e z>OXH~@Y!ZNMN|E;O7iA8rwYxhPljH-&slwY+pqE`b2v^MHJe^(7kJYlZV zl|TDkaNtQT*fdw>9IrN4`Ywf|>iw?bDS1D_B}*K63KsgSv_GD>hI!40dAFI%LZ$+} O$l&Sf=d#Wzp$P!ZB#CPP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/fiery_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/fiery_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..5acba116fb05c74d25ebe45df386bc59f2d36a36 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbmnFu>%9097i;OXKRV&T7Zf+1g%gMjNx-xq6qG%^eps(fS$ z6AP+h+4@{0ET&EPLg6aY{4*00(?ffX-fn%ke}BqmfkW{s?S{K;_%D>s{r!y1u;cnN z!64V}f}T^;cZuapoMz#vSh8+a&^WdU52Tp z+l`*4%vmyr@Aiisdk@v#KVN>x&Uf-3Sxa@MPkVI_?Yq&jMxp<)#;4ofS0+!aR9~SG zB{^q}`t6;IT+7tBgK9oSr8quotDov9=F-evt7IADe_|d_TcMZLrou{~-xxey{an^L HB{Ts5hk1xX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/golden_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/golden_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..d57b8404e8b09bec82229f97bd2fe7071105882d GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbmnFu>%9097izvHt^u6rz$sc*^PhY=wgpEUiqti$_srG)}9><=I*N@zLmd)%i zbM@4VGLq^O|CT9E&szF$*Sg*22WJIcx~=%!h2dw7PHODAP_+rOmj(WOto$kE#1Hog z4qJ>0jQqEi9&+2ZOnAwkCo5mDNb3Jt%~R5pQLxaEt^4xCN1SiwE^RWaty&569fPN< KpUXO@geCyO#g2af literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/iron_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/iron_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..3993dcd41539f2cdc7d5e91c8aeb03c39cc812d7 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbmnFu>%9097?=jq}YV&T7Z!a>0%0|D2a)!$BqYHw(Y*>j_9 zTax+~NAZ%)&))u+t2#SSVrC_y+5f)=JZay=?x^mh!&;y$Aq(SWfg=9?SGce=yA>V)Rf7dlXk@QecLl% zrF!O*s3-C6dYuh_cJ!9X@#}SKTu(n=mg?vBZ0-Vw9wU`V_2WAO0_Xf}x-xH%X#9kq ohpSURuo_Nqy8nW2d-7rKm3nJ;Nyha}2Kt1-)78&qol`;+0P-w^2LJ#7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/lapis_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/lapis_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..c80d458c643c66161e31f3f3a535e88abea64872 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbmnFu>%9097i=;`7ZV&T7Zf+1g%gMjNx-A>)LVI?;%OukXU z`}Vs?*pc80MlElvcMoEZ?eT2m*}XbR=bj$V|G%oy9Vg;b+6_~0aVw(<2m zuXP!MeTF-8<-7DZO>!~fFg;s4t#aM#+rOBYSSI>xb1K_6@$@N&g9bd^LjTR9O;i&q0SMij*AK{WEjwLD!{ZrasPkhAsM!7j-YNUiI&~pr)u6{1- HoD!M<9JPo{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/netherite_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/netherite_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc2c7b0d814c92b38fb504406354dbf8562f905 GIT binary patch literal 474 zcmV<00VV#4P)Px$lu1NER5*>Ll21!wQ5eR5XFP@H&g|VZD|J=$5dv`&!=(tb#lXdHaaZOzqI7fm z5blFkBK=wT6(k0f=-MS134$ESt2e05EaD19=|m5l&CC1z&hx&!@IeWHYPCAG>BsiA zR!Xt7yev%9oYZaGM$Y=d*>QAcBMU&|u&#ffo<0Lj1?>IW(_5Qc^m;u2zO6o)8b=Ks zrvLPodDq$1$#`;N9tUH*OOJRmj$s&+zBd7jON*j&*5QwLf$_y48jZ5>b%AEHi7_W> zwOV@S2y5$W;^g>5KeRhM1|#kt9s!8X&(BU^nkEPP`+5#IKR@Hv9{~_i3h(NQOeQmZ z2gO1`Mbjv?}A(|C#EJS6^mL*$?eD|l}-zQl~hW!J8iyOmKY9) zxUTy;p!Bn(KP$!f?v6^OA_jv2;j=7D1VMo7y1aS^#X><#DY@?VaU4g4y9iaU*LhhJ z0Et9G`@T;s7NgtklF#P_{~_D9pGNR~pKLb!E_0{}pjN8^P%f9>%9097i;_2cTV&T7Zf+5!-2Lad1-KkoN35%07Gt!mK znmT&T1-6{mTvIf2jzX;8)`z@4Gv2I`+E}ss7ap z^|N%FZI+(3s1|ppFULSsK$hb)~mnCy?yHb#9}1{dwtgkQQ?WAPnKo6)Kzy@85zB2 z5p~gSp8Pe%I(*BCb19Bp{&L+qC+>V$Z*-z5qhO)GO8aBZNcPvUCGKG%9097i;_2cTV&T7Zf+F7`2LadD7jLL(1aPpFA5gGh z5WAr5m?W@->AYY-=!sqPvQExUnf3A@cGz(9~Eqmu#&wPH?kVjv^LBKOrH|4qX&NVzDS4!_{Z>;~k zl_BKX-BVL07f#v~)%Q5nd}={x=-s&+w&!ZsyPxZ9*b_g!Fs#odY{Kkifo$sHuf&OFg MboFyt=akR{0E3l^xBvhE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/quartz_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/quartz_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..d18a2c5caa65bddaec3f5d0c545ad2fc7b8fe6b3 GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbmnFu>%9097i?CIhdV&T7Z!bZU+2LacUy}q7XnS_~=g>PS& zqt!D*aVZ1Wgq|Lct_9515zpVAF*^Qsr3Kr2zG?se8BXs!5wFs2czlt7#_3D7#my2& zo||Z{T;ytT?1}q*?Zk;wElw(w-_$5ipVHX0?zNce!}~S5 z43l&DQ%{|=IB6lft!VcflbFz}HR^93TfDkIu~%9097i?CIhdV&T7Zf+1g%gMjPHwYeKNT;P5o>(isV zwX<`YS~aVbw%7TD^PDT5gk;}Sac-L%YABX3-uD0BB;BN*`iZj3bj-Us6j{EXNvEPtoHH+ql+?($T^5q`|5-NU ziZ#2ZYN|h0N!>p8`0Yy7hs!eCtP|h=j{Da)N0{+vk;da)b2`^3l*g)ny6t^s^2AE@ z6$(+3bJnQe-nq!NOpQCJ>QhLH0Wmj zSMFudPIh5W<2%H7*KW1jvPOri504)F@z+Ju<%#~JV-|g!iY$$*R!yp(&DimNl@4nv zvyWVxVbP0l+XkKbw7hE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/simple-excavators/textures/item/wooden_excavator.png b/src/main/resources/assets/simple-excavators/textures/item/wooden_excavator.png new file mode 100644 index 0000000000000000000000000000000000000000..90749e7ed15b3e41073c92e277372a2036aa83d5 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!j8!i<;h*8KqrN|d-plmzFem6RtI zr7{#GX6BXX<)xM=nCKbmnFu>%9097i;_2cTV&T7Zf+5!-2Lad1(UB3HFI_fn^3sjq zOv+5v&XWDWmo)M86PA}nt2px$4yBY|?KpbdSMC2_-r1ce;#JxeyMKl(&^i4g+JwWg zCU%?Gstf@>!=Hs(BJnAz6H^3s$(!vx^SN@nT)abr!laX7C(fA{c}i-mcwH6n=>M~9 z#u+)gr)#PUdmh_2Zdx2ySR(|aw)QqJ88AxM$I*;3r4^IV_@)f L^>bP0l+XkKdkKqS literal 0 HcmV?d00001 diff --git a/src/main/resources/data/fabric/tags/items/shovels.json b/src/main/resources/data/fabric/tags/items/shovels.json new file mode 100644 index 0000000..4477d07 --- /dev/null +++ b/src/main/resources/data/fabric/tags/items/shovels.json @@ -0,0 +1,61 @@ +{ + "replace": false, + "values": [ + { + "id": "simple-excavators:diamond_shovel", + "required": false + }, + { + "id": "simple-excavators:emerald_shovel", + "required": false + }, + { + "id": "simple-excavators:ender_shovel", + "required": false + }, + { + "id": "simple-excavators:fiery_shovel", + "required": false + }, + { + "id": "simple-excavators:golden_shovel", + "required": false + }, + { + "id": "simple-excavators:iron_shovel", + "required": false + }, + { + "id": "simple-excavators:lapis_shovel", + "required": false + }, + { + "id": "simple-excavators:netherite_shovel", + "required": false + }, + { + "id": "simple-excavators:obsidian_shovel", + "required": false + }, + { + "id": "simple-excavators:prismarine_shovel", + "required": false + }, + { + "id": "simple-excavators:quartz_shovel", + "required": false + }, + { + "id": "simple-excavators:slime_shovel", + "required": false + }, + { + "id": "simple-excavators:stone_shovel", + "required": false + }, + { + "id": "simple-excavators:wooden_shovel", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/items/piglin_loved.json b/src/main/resources/data/minecraft/tags/items/piglin_loved.json new file mode 100644 index 0000000..8aedcc0 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/items/piglin_loved.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "simple-excavators:golden_excavator" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/diamond_excavator.json b/src/main/resources/data/simple-excavators/recipes/diamond_excavator.json new file mode 100644 index 0000000..45349e0 --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/diamond_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:diamond_block" + }, + "d": { + "item": "minecraft:diamond" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:diamond_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/emerald_excavator.json b/src/main/resources/data/simple-excavators/recipes/emerald_excavator.json new file mode 100644 index 0000000..0498ee6 --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/emerald_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:emerald_block" + }, + "d": { + "item": "minecraft:emerald" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:emerald_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/ender_excavator.json b/src/main/resources/data/simple-excavators/recipes/ender_excavator.json new file mode 100644 index 0000000..cf63dda --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/ender_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:end_stone_bricks" + }, + "d": { + "item": "minecraft:dragon_head" + }, + "s": { + "item": "minecraft:obsidian" + } + }, + "result": { + "item": "simple-excavators:ender_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/fiery_excavator.json b/src/main/resources/data/simple-excavators/recipes/fiery_excavator.json new file mode 100644 index 0000000..327eff7 --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/fiery_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:magma_block" + }, + "d": { + "item": "minecraft:magma_cream" + }, + "s": { + "item": "minecraft:obsidian" + } + }, + "result": { + "item": "simple-excavators:fiery_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/golden_excavator.json b/src/main/resources/data/simple-excavators/recipes/golden_excavator.json new file mode 100644 index 0000000..3467d3a --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/golden_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:gold_block" + }, + "d": { + "item": "minecraft:gold_ingot" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:golden_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/iron_excavator.json b/src/main/resources/data/simple-excavators/recipes/iron_excavator.json new file mode 100644 index 0000000..07b0cdb --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/iron_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:iron_block" + }, + "d": { + "item": "minecraft:iron_ingot" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:iron_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/lapis_excavator.json b/src/main/resources/data/simple-excavators/recipes/lapis_excavator.json new file mode 100644 index 0000000..cd5ee6f --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/lapis_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:lapis_block" + }, + "d": { + "item": "minecraft:lapis_lazuli" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:lapis_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/netherite_excavator.json b/src/main/resources/data/simple-excavators/recipes/netherite_excavator.json new file mode 100644 index 0000000..e466edd --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/netherite_excavator.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smithing", + "base": { + "item": "simple-excavators:diamond_excavator" + }, + "addition": { + "item": "minecraft:netherite_ingot" + }, + "result": { + "item": "simple-excavators:netherite_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/obsidian_excavator.json b/src/main/resources/data/simple-excavators/recipes/obsidian_excavator.json new file mode 100644 index 0000000..93bc54e --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/obsidian_excavator.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " D ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:obsidian" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:obsidian_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/prismarine_excavator.json b/src/main/resources/data/simple-excavators/recipes/prismarine_excavator.json new file mode 100644 index 0000000..1887a2d --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/prismarine_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:prismarine" + }, + "d": { + "item": "minecraft:prismarine_shard" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:prismarine_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/quartz_excavator.json b/src/main/resources/data/simple-excavators/recipes/quartz_excavator.json new file mode 100644 index 0000000..614ee66 --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/quartz_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:quartz_block" + }, + "d": { + "item": "minecraft:quartz" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:quartz_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/slime_excavator.json b/src/main/resources/data/simple-excavators/recipes/slime_excavator.json new file mode 100644 index 0000000..bd4587a --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/slime_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:slime_block" + }, + "d": { + "item": "minecraft:slime_ball" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:slime_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/stone_excavator.json b/src/main/resources/data/simple-excavators/recipes/stone_excavator.json new file mode 100644 index 0000000..e2fb211 --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/stone_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "item": "minecraft:stone" + }, + "d": { + "item": "minecraft:cobblestone" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:stone_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/data/simple-excavators/recipes/wooden_excavator.json b/src/main/resources/data/simple-excavators/recipes/wooden_excavator.json new file mode 100644 index 0000000..87e15d8 --- /dev/null +++ b/src/main/resources/data/simple-excavators/recipes/wooden_excavator.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " d ", + "DsD", + " s " + ], + "key": { + "D": { + "tag": "minecraft:logs" + }, + "d": { + "tag": "minecraft:planks" + }, + "s": { + "item": "minecraft:stick" + } + }, + "result": { + "item": "simple-excavators:wooden_excavator" + } +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..5e2b628 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,32 @@ +{ + "schemaVersion": 1, + "id": "simple-excavators", + "version": "${version}", + "name": "Simple Excavators", + "description": "Adds excavators that break a 3x3 area. Forked from Draylar's Vanilla Excavators.", + "authors": [ + "Big Duckie", + "Draylar" + ], + "contact": { + "homepage": "https://bigduckie.dev/mc-mods/simple-excavators", + "sources": "https://git.bigduckie.dev/big-duckie/simple-excavators" + }, + "license": "MIT", + "icon": "assets/simple-excavators/icon.png", + "environment": "*", + "entrypoints": { + "main": [ + "dev.bigduckie.simpleexcavators.SimpleExcavators" + ] + }, + "mixins": [ + "simple-excavators.mixins.json" + ], + "depends": { + "fabricloader": ">=0.16.7", + "minecraft": "~1.20.1", + "java": ">=17", + "fabric-api": "*" + } +} \ No newline at end of file diff --git a/src/main/resources/simple-excavators.mixins.json b/src/main/resources/simple-excavators.mixins.json new file mode 100644 index 0000000..5072c20 --- /dev/null +++ b/src/main/resources/simple-excavators.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "package": "dev.bigduckie.simpleexcavators.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "ExcavatorKnockbackMixin", + "SilkTouchEnchantmentMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/diamond_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/diamond_excavator.json new file mode 100644 index 0000000..6e5b223 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/diamond_excavator.json @@ -0,0 +1,10 @@ +{ + "id": "diamond", + "miningLevel": 3, + "durability": 1561, + "blockBreakSpeed": 2.3, + "attackDamage": 5, + "attackSpeed": -3, + "enchantability": 10, + "repairIngredient": "minecraft:diamond" +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/emerald_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/emerald_excavator.json new file mode 100644 index 0000000..68694a5 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/emerald_excavator.json @@ -0,0 +1,11 @@ +{ + "id": "emerald", + "miningLevel": 3, + "durability": 750, + "blockBreakSpeed": 2.0, + "attackDamage": 5, + "attackSpeed": -3, + "enchantability": 10, + "repairIngredient": "minecraft:emerald", + "isExtra": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/ender_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/ender_excavator.json new file mode 100644 index 0000000..d17f4e1 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/ender_excavator.json @@ -0,0 +1,11 @@ +{ + "id": "ender", + "miningLevel": 3, + "durability": 1561, + "blockBreakSpeed": 2.85, + "attackDamage": 6, + "attackSpeed": -3.3, + "enchantability": 10, + "repairIngredient": "minecraft:ender_pearl", + "isExtra": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/fiery_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/fiery_excavator.json new file mode 100644 index 0000000..93e30b3 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/fiery_excavator.json @@ -0,0 +1,13 @@ +{ + "id": "fiery", + "miningLevel": 3, + "durability": 750, + "blockBreakSpeed": 2, + "attackDamage": 2, + "attackSpeed": -2.3, + "enchantability": 15, + "repairIngredient": "minecraft:magma_block", + "isExtra": true, + "isFireImmune": true, + "smelts": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/golden_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/golden_excavator.json new file mode 100644 index 0000000..bd3e601 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/golden_excavator.json @@ -0,0 +1,10 @@ +{ + "id": "golden", + "miningLevel": 0, + "durability": 100, + "blockBreakSpeed": 3.5, + "attackDamage": 2, + "attackSpeed": -2.5, + "enchantability": 22, + "repairIngredient": "minecraft:gold_ingot" +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/iron_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/iron_excavator.json new file mode 100644 index 0000000..d56b6a5 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/iron_excavator.json @@ -0,0 +1,10 @@ +{ + "id": "iron", + "miningLevel": 2, + "durability": 250, + "blockBreakSpeed": 1.7, + "attackDamage": 2, + "attackSpeed": -2.8, + "enchantability": 14, + "repairIngredient": "minecraft:iron_ingot" +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/lapis_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/lapis_excavator.json new file mode 100644 index 0000000..9cfffec --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/lapis_excavator.json @@ -0,0 +1,11 @@ +{ + "id": "lapis", + "miningLevel": 1, + "durability": 220, + "blockBreakSpeed": 1.7, + "attackDamage": 0, + "attackSpeed": -2, + "enchantability": 30, + "repairIngredient": "minecraft:lapis_lazuli", + "isExtra": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/netherite_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/netherite_excavator.json new file mode 100644 index 0000000..5b9533a --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/netherite_excavator.json @@ -0,0 +1,11 @@ +{ + "id": "netherite", + "miningLevel": 4, + "durability": 2031, + "blockBreakSpeed": 2.6, + "attackDamage": 6, + "attackSpeed": -3.1, + "enchantability": 15, + "repairIngredient": "minecraft:netherite_ingot", + "isFireImmune": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/obsidian_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/obsidian_excavator.json new file mode 100644 index 0000000..b375429 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/obsidian_excavator.json @@ -0,0 +1,11 @@ +{ + "id": "obsidian", + "miningLevel": 2, + "durability": 2048, + "blockBreakSpeed": 1.4, + "attackDamage": 3, + "attackSpeed": -3.5, + "enchantability": 5, + "repairIngredient": "minecraft:obsidian", + "isExtra": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/prismarine_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/prismarine_excavator.json new file mode 100644 index 0000000..0c45751 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/prismarine_excavator.json @@ -0,0 +1,11 @@ +{ + "id": "prismarine", + "miningLevel": 3, + "durability": 1028, + "blockBreakSpeed": 3.4, + "attackDamage": 2, + "attackSpeed": -2.3, + "enchantability": 25, + "repairIngredient": "minecraft:prismarine_shard", + "isExtra": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/quartz_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/quartz_excavator.json new file mode 100644 index 0000000..145fb02 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/quartz_excavator.json @@ -0,0 +1,11 @@ +{ + "id": "quartz", + "miningLevel": 2, + "durability": 1028, + "blockBreakSpeed": 2.3, + "attackDamage": 2, + "attackSpeed": -2.5, + "enchantability": 10, + "repairIngredient": "minecraft:quartz", + "isExtra": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/slime_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/slime_excavator.json new file mode 100644 index 0000000..5681424 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/slime_excavator.json @@ -0,0 +1,12 @@ +{ + "id": "slime", + "miningLevel": 2, + "durability": 1500, + "blockBreakSpeed": 1.7, + "attackDamage": 3, + "attackSpeed": -3, + "enchantability": 20, + "repairIngredient": "minecraft:slime_ball", + "isExtra": true, + "hasExtraKnockback": true +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/stone_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/stone_excavator.json new file mode 100644 index 0000000..1e403c1 --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/stone_excavator.json @@ -0,0 +1,10 @@ +{ + "id": "stone", + "miningLevel": 1, + "durability": 131, + "blockBreakSpeed": 1.15, + "attackDamage": 1, + "attackSpeed": -2.6, + "enchantability": 5, + "repairIngredient": "minecraft:stone" +} \ No newline at end of file diff --git a/src/main/resources/static_data/simple-excavators/excavators/wooden_excavator.json b/src/main/resources/static_data/simple-excavators/excavators/wooden_excavator.json new file mode 100644 index 0000000..79adbbb --- /dev/null +++ b/src/main/resources/static_data/simple-excavators/excavators/wooden_excavator.json @@ -0,0 +1,11 @@ +{ + "id": "wooden", + "miningLevel": 0, + "durability": 59, + "blockBreakSpeed": 0.57, + "attackDamage": 0, + "attackSpeed": -2.5, + "enchantability": 15, + "repairIngredient": "minecraft:oak_planks", + "burnTime": 400 +} \ No newline at end of file