port to fabric
This commit is contained in:
		
						commit
						4b43c6d6be
					
				
							
								
								
									
										21
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					#Gradle
 | 
				
			||||||
 | 
					.gradle/
 | 
				
			||||||
 | 
					build/
 | 
				
			||||||
 | 
					out/
 | 
				
			||||||
 | 
					classes/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#IDEA
 | 
				
			||||||
 | 
					.idea/
 | 
				
			||||||
 | 
					*.iml
 | 
				
			||||||
 | 
					*.ipr
 | 
				
			||||||
 | 
					*.iws
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#vscode
 | 
				
			||||||
 | 
					.settings/
 | 
				
			||||||
 | 
					.vscode/
 | 
				
			||||||
 | 
					bin/
 | 
				
			||||||
 | 
					.classpath
 | 
				
			||||||
 | 
					.project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#fabric
 | 
				
			||||||
 | 
					run/
 | 
				
			||||||
							
								
								
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2020 QuImUfu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
							
								
								
									
										79
									
								
								build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								build.gradle
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					plugins {
 | 
				
			||||||
 | 
						id 'fabric-loom' version '0.2.6-SNAPSHOT'
 | 
				
			||||||
 | 
						id 'maven-publish'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sourceCompatibility = JavaVersion.VERSION_1_8
 | 
				
			||||||
 | 
					targetCompatibility = JavaVersion.VERSION_1_8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					archivesBaseName = project.archives_base_name
 | 
				
			||||||
 | 
					version = project.mod_version
 | 
				
			||||||
 | 
					group = project.maven_group
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					minecraft {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					processResources {
 | 
				
			||||||
 | 
						inputs.property "version", project.version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						from(sourceSets.main.resources.srcDirs) {
 | 
				
			||||||
 | 
							include "fabric.mod.json"
 | 
				
			||||||
 | 
							expand "version": project.version
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						from(sourceSets.main.resources.srcDirs) {
 | 
				
			||||||
 | 
							exclude "fabric.mod.json"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ensure that the encoding is set to UTF-8, no matter what the system default is
 | 
				
			||||||
 | 
					// this fixes some edge cases with special characters not displaying correctly
 | 
				
			||||||
 | 
					// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
 | 
				
			||||||
 | 
					tasks.withType(JavaCompile) {
 | 
				
			||||||
 | 
						options.encoding = "UTF-8"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
 | 
				
			||||||
 | 
					// if it is present.
 | 
				
			||||||
 | 
					// If you remove this task, sources will not be generated.
 | 
				
			||||||
 | 
					task sourcesJar(type: Jar, dependsOn: classes) {
 | 
				
			||||||
 | 
						classifier = "sources"
 | 
				
			||||||
 | 
						from sourceSets.main.allSource
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jar {
 | 
				
			||||||
 | 
						from "LICENSE"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// configure the maven publication
 | 
				
			||||||
 | 
					publishing {
 | 
				
			||||||
 | 
						publications {
 | 
				
			||||||
 | 
							mavenJava(MavenPublication) {
 | 
				
			||||||
 | 
								// add all the jars that should be included when publishing to maven
 | 
				
			||||||
 | 
								artifact(jar) {
 | 
				
			||||||
 | 
									builtBy remapJar
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								artifact("${project.buildDir.absolutePath}/libs/${archivesBaseName}-${project.version}.jar"){
 | 
				
			||||||
 | 
									builtBy remapJar
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								artifact(sourcesJar) {
 | 
				
			||||||
 | 
									builtBy remapSourcesJar
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// select the repositories you want to publish to
 | 
				
			||||||
 | 
						repositories {
 | 
				
			||||||
 | 
							// uncomment to publish to the local maven
 | 
				
			||||||
 | 
							// mavenLocal()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								gradle.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								gradle.properties
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					org.gradle.jvmargs  = -Xmx1G
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Fabric properties
 | 
				
			||||||
 | 
					minecraft_version   = 1.15.2
 | 
				
			||||||
 | 
					yarn_mappings       = 1.15.2+build.15
 | 
				
			||||||
 | 
					loader_version      = 0.8.2+build.194
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Mod properties
 | 
				
			||||||
 | 
					mod_version         = 0.7.0
 | 
				
			||||||
 | 
					maven_group         = quimufu.structure_item
 | 
				
			||||||
 | 
					archives_base_name  = structure_item
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Dependencies
 | 
				
			||||||
 | 
					fabric_api_version  = 0.5.1+build.294-1.15
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										5
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					distributionBase=GRADLE_USER_HOME
 | 
				
			||||||
 | 
					distributionPath=wrapper/dists
 | 
				
			||||||
 | 
					distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip
 | 
				
			||||||
 | 
					zipStoreBase=GRADLE_USER_HOME
 | 
				
			||||||
 | 
					zipStorePath=wrapper/dists
 | 
				
			||||||
							
								
								
									
										188
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										188
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@ -0,0 +1,188 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright 2015 the original author or 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.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					##  Gradle start up script for UN*X
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Attempt to set APP_HOME
 | 
				
			||||||
 | 
					# Resolve links: $0 may be a link
 | 
				
			||||||
 | 
					PRG="$0"
 | 
				
			||||||
 | 
					# Need this for relative symlinks.
 | 
				
			||||||
 | 
					while [ -h "$PRG" ] ; do
 | 
				
			||||||
 | 
					    ls=`ls -ld "$PRG"`
 | 
				
			||||||
 | 
					    link=`expr "$ls" : '.*-> \(.*\)$'`
 | 
				
			||||||
 | 
					    if expr "$link" : '/.*' > /dev/null; then
 | 
				
			||||||
 | 
					        PRG="$link"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        PRG=`dirname "$PRG"`"/$link"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					SAVED="`pwd`"
 | 
				
			||||||
 | 
					cd "`dirname \"$PRG\"`/" >/dev/null
 | 
				
			||||||
 | 
					APP_HOME="`pwd -P`"
 | 
				
			||||||
 | 
					cd "$SAVED" >/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP_NAME="Gradle"
 | 
				
			||||||
 | 
					APP_BASE_NAME=`basename "$0"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 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"'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
				
			||||||
 | 
					MAX_FD="maximum"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					warn () {
 | 
				
			||||||
 | 
					    echo "$*"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					die () {
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    echo "$*"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 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
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					  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"
 | 
				
			||||||
 | 
					    which java >/dev/null 2>&1 || 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Increase the maximum file descriptors if we can.
 | 
				
			||||||
 | 
					if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
 | 
				
			||||||
 | 
					    MAX_FD_LIMIT=`ulimit -H -n`
 | 
				
			||||||
 | 
					    if [ $? -eq 0 ] ; then
 | 
				
			||||||
 | 
					        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
 | 
				
			||||||
 | 
					            MAX_FD="$MAX_FD_LIMIT"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        ulimit -n $MAX_FD
 | 
				
			||||||
 | 
					        if [ $? -ne 0 ] ; then
 | 
				
			||||||
 | 
					            warn "Could not set maximum file descriptor limit: $MAX_FD"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# For Darwin, add options to specify how the application appears in the dock
 | 
				
			||||||
 | 
					if $darwin; then
 | 
				
			||||||
 | 
					    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# For Cygwin, switch paths to Windows format before running java
 | 
				
			||||||
 | 
					if $cygwin ; then
 | 
				
			||||||
 | 
					    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
 | 
				
			||||||
 | 
					    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
 | 
				
			||||||
 | 
					    JAVACMD=`cygpath --unix "$JAVACMD"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # We build the pattern for arguments to be converted via cygpath
 | 
				
			||||||
 | 
					    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
 | 
				
			||||||
 | 
					    SEP=""
 | 
				
			||||||
 | 
					    for dir in $ROOTDIRSRAW ; do
 | 
				
			||||||
 | 
					        ROOTDIRS="$ROOTDIRS$SEP$dir"
 | 
				
			||||||
 | 
					        SEP="|"
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    OURCYGPATTERN="(^($ROOTDIRS))"
 | 
				
			||||||
 | 
					    # Add a user-defined pattern to the cygpath arguments
 | 
				
			||||||
 | 
					    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
 | 
				
			||||||
 | 
					        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    # Now convert the arguments - kludge to limit ourselves to /bin/sh
 | 
				
			||||||
 | 
					    i=0
 | 
				
			||||||
 | 
					    for arg in "$@" ; do
 | 
				
			||||||
 | 
					        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
 | 
				
			||||||
 | 
					        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
 | 
				
			||||||
 | 
					            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            eval `echo args$i`="\"$arg\""
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        i=$((i+1))
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    case $i in
 | 
				
			||||||
 | 
					        (0) set -- ;;
 | 
				
			||||||
 | 
					        (1) set -- "$args0" ;;
 | 
				
			||||||
 | 
					        (2) set -- "$args0" "$args1" ;;
 | 
				
			||||||
 | 
					        (3) set -- "$args0" "$args1" "$args2" ;;
 | 
				
			||||||
 | 
					        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
 | 
				
			||||||
 | 
					        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
 | 
				
			||||||
 | 
					        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
 | 
				
			||||||
 | 
					        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
 | 
				
			||||||
 | 
					        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
 | 
				
			||||||
 | 
					        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Escape application args
 | 
				
			||||||
 | 
					save () {
 | 
				
			||||||
 | 
					    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
 | 
				
			||||||
 | 
					    echo " "
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					APP_ARGS=$(save "$@")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Collect all arguments for the java command, following the shell quoting and substitution rules
 | 
				
			||||||
 | 
					eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
 | 
				
			||||||
 | 
					if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
 | 
				
			||||||
 | 
					  cd "$(dirname "$0")"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exec "$JAVACMD" "$@"
 | 
				
			||||||
							
								
								
									
										100
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,100 @@
 | 
				
			|||||||
 | 
					@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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@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=.
 | 
				
			||||||
 | 
					set APP_BASE_NAME=%~n0
 | 
				
			||||||
 | 
					set APP_HOME=%DIRNAME%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@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%" == "0" goto init
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo.
 | 
				
			||||||
 | 
					echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
				
			||||||
 | 
					echo.
 | 
				
			||||||
 | 
					echo Please set the JAVA_HOME variable in your environment to match the
 | 
				
			||||||
 | 
					echo location of your Java installation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					goto fail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:findJavaFromJavaHome
 | 
				
			||||||
 | 
					set JAVA_HOME=%JAVA_HOME:"=%
 | 
				
			||||||
 | 
					set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if exist "%JAVA_EXE%" goto init
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo.
 | 
				
			||||||
 | 
					echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
 | 
				
			||||||
 | 
					echo.
 | 
				
			||||||
 | 
					echo Please set the JAVA_HOME variable in your environment to match the
 | 
				
			||||||
 | 
					echo location of your Java installation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					goto fail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:init
 | 
				
			||||||
 | 
					@rem Get command-line arguments, handling Windows variants
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if not "%OS%" == "Windows_NT" goto win9xME_args
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:win9xME_args
 | 
				
			||||||
 | 
					@rem Slurp the command line arguments.
 | 
				
			||||||
 | 
					set CMD_LINE_ARGS=
 | 
				
			||||||
 | 
					set _SKIP=2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:win9xME_args_slurp
 | 
				
			||||||
 | 
					if "x%~1" == "x" goto execute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set CMD_LINE_ARGS=%*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: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 %CMD_LINE_ARGS%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:end
 | 
				
			||||||
 | 
					@rem End local scope for the variables with windows NT shell
 | 
				
			||||||
 | 
					if "%ERRORLEVEL%"=="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!
 | 
				
			||||||
 | 
					if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
 | 
				
			||||||
 | 
					exit /b 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:mainEnd
 | 
				
			||||||
 | 
					if "%OS%"=="Windows_NT" endlocal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:omega
 | 
				
			||||||
							
								
								
									
										10
									
								
								settings.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								settings.gradle
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					pluginManagement {
 | 
				
			||||||
 | 
					    repositories {
 | 
				
			||||||
 | 
					        jcenter()
 | 
				
			||||||
 | 
					        maven {
 | 
				
			||||||
 | 
					            name = 'Fabric'
 | 
				
			||||||
 | 
					            url = 'https://maven.fabricmc.net/'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        gradlePluginPortal()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										247
									
								
								src/main/java/quimufu/structure_item/MyItem.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								src/main/java/quimufu/structure_item/MyItem.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,247 @@
 | 
				
			|||||||
 | 
					package quimufu.structure_item;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.collect.Lists;
 | 
				
			||||||
 | 
					import com.mojang.datafixers.Dynamic;
 | 
				
			||||||
 | 
					import net.minecraft.block.Block;
 | 
				
			||||||
 | 
					import net.minecraft.client.item.TooltipContext;
 | 
				
			||||||
 | 
					import net.minecraft.datafixer.NbtOps;
 | 
				
			||||||
 | 
					import net.minecraft.item.Item;
 | 
				
			||||||
 | 
					import net.minecraft.item.ItemGroup;
 | 
				
			||||||
 | 
					import net.minecraft.item.ItemStack;
 | 
				
			||||||
 | 
					import net.minecraft.item.ItemUsageContext;
 | 
				
			||||||
 | 
					import net.minecraft.nbt.CompoundTag;
 | 
				
			||||||
 | 
					import net.minecraft.nbt.ListTag;
 | 
				
			||||||
 | 
					import net.minecraft.nbt.Tag;
 | 
				
			||||||
 | 
					import net.minecraft.network.MessageType;
 | 
				
			||||||
 | 
					import net.minecraft.network.packet.s2c.play.TitleS2CPacket;
 | 
				
			||||||
 | 
					import net.minecraft.server.network.ServerPlayNetworkHandler;
 | 
				
			||||||
 | 
					import net.minecraft.server.network.ServerPlayerEntity;
 | 
				
			||||||
 | 
					import net.minecraft.server.world.ServerWorld;
 | 
				
			||||||
 | 
					import net.minecraft.structure.Structure;
 | 
				
			||||||
 | 
					import net.minecraft.text.LiteralText;
 | 
				
			||||||
 | 
					import net.minecraft.text.Text;
 | 
				
			||||||
 | 
					import net.minecraft.text.TranslatableText;
 | 
				
			||||||
 | 
					import net.minecraft.util.*;
 | 
				
			||||||
 | 
					import net.minecraft.util.math.BlockPos;
 | 
				
			||||||
 | 
					import net.minecraft.util.math.Direction;
 | 
				
			||||||
 | 
					import net.minecraft.util.registry.DefaultedRegistry;
 | 
				
			||||||
 | 
					import net.minecraft.util.registry.Registry;
 | 
				
			||||||
 | 
					import net.minecraft.world.World;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static quimufu.structure_item.StructureItemMod.LOGGER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class MyItem extends Item {
 | 
				
			||||||
 | 
					    static Item.Settings p = (new Item.Settings()).group(ItemGroup.REDSTONE).maxCount(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public MyItem() {
 | 
				
			||||||
 | 
					        super(p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void appendTooltip(ItemStack itemStack, World world, List<Text> texts, TooltipContext tooltipFlag) {
 | 
				
			||||||
 | 
					        if (!itemStack.hasTag() || !itemStack.getTag().contains("structure", 8)) {
 | 
				
			||||||
 | 
					            texts.add((new TranslatableText("item.structure_item.item.tooltip.tag.invalid")).formatted(Formatting.RED));
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            CompoundTag tag = itemStack.getTag();
 | 
				
			||||||
 | 
					            if (tooltipFlag.isAdvanced()) {
 | 
				
			||||||
 | 
					                texts.add(new TranslatableText("item.structure_item.item.tooltip.structure"));
 | 
				
			||||||
 | 
					                texts.add(new LiteralText("  " + tag.getString("structure")));
 | 
				
			||||||
 | 
					                if (tag.contains("allowedOn", 8)) {
 | 
				
			||||||
 | 
					                    texts.add(new TranslatableText("item.structure_item.item.tooltip.allowed.on"));
 | 
				
			||||||
 | 
					                    texts.add(new LiteralText("  " + tag.getString("allowedOn")));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (tag.contains("offset")) {
 | 
				
			||||||
 | 
					                    BlockPos offset = BlockPos.deserialize(new Dynamic<Tag>(NbtOps.INSTANCE, tag.get("offset")));
 | 
				
			||||||
 | 
					                    texts.add(new TranslatableText("item.structure_item.item.tooltip.fixed.offset"));
 | 
				
			||||||
 | 
					                    Text c = new TranslatableText("item.structure_item.item.tooltip.xyz",
 | 
				
			||||||
 | 
					                            new LiteralText(String.valueOf(offset.getX())),
 | 
				
			||||||
 | 
					                            new LiteralText(String.valueOf(offset.getY())),
 | 
				
			||||||
 | 
					                            new LiteralText(String.valueOf(offset.getZ())));
 | 
				
			||||||
 | 
					                    texts.add(c);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    texts.add(new TranslatableText("item.structure_item.item.tooltip.dynamic.offset"));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (tag.contains("blacklist", 9)) {
 | 
				
			||||||
 | 
					                    texts.add(new TranslatableText("item.structure_item.item.tooltip.blacklist"));
 | 
				
			||||||
 | 
					                    ListTag bl = tag.getList("blacklist", 8);
 | 
				
			||||||
 | 
					                    int i = 0;
 | 
				
			||||||
 | 
					                    for ( Tag entry : bl) {
 | 
				
			||||||
 | 
					                        texts.add(new LiteralText("  " + entry.asString()));
 | 
				
			||||||
 | 
					                        i++;
 | 
				
			||||||
 | 
					                        if (i == 4) {
 | 
				
			||||||
 | 
					                            texts.add(new TranslatableText("item.structure_item.item.tooltip.blacklist.more",
 | 
				
			||||||
 | 
					                                    new LiteralText(String.valueOf(bl.size() - i))));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public ActionResult useOnBlock(ItemUsageContext c) {
 | 
				
			||||||
 | 
					        if (!c.getWorld().isClient) {
 | 
				
			||||||
 | 
					            ServerPlayerEntity player;
 | 
				
			||||||
 | 
					            if (c.getPlayer() instanceof ServerPlayerEntity) {
 | 
				
			||||||
 | 
					                player = ((ServerPlayerEntity) c.getPlayer());
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                player = null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            CompoundTag tag = c.getStack().getTag();
 | 
				
			||||||
 | 
					            if (tag == null) {
 | 
				
			||||||
 | 
					                TranslatableText message =
 | 
				
			||||||
 | 
					                        new TranslatableText("items.structure.spawner.no.tag");
 | 
				
			||||||
 | 
					                sendPlayerChat(player, message);
 | 
				
			||||||
 | 
					                return ActionResult.FAIL;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Block allowed = null;
 | 
				
			||||||
 | 
					            if (tag.contains("allowedOn", 8)) {
 | 
				
			||||||
 | 
					                String allowedOn = tag.getString("allowedOn");
 | 
				
			||||||
 | 
					                allowed = getBlock(allowedOn);
 | 
				
			||||||
 | 
					                if (allowed == null) {
 | 
				
			||||||
 | 
					                    TranslatableText message =
 | 
				
			||||||
 | 
					                            new TranslatableText("items.structure.spawner.invalid.block",
 | 
				
			||||||
 | 
					                                    new LiteralText(allowedOn));
 | 
				
			||||||
 | 
					                    sendPlayerChat(player, message);
 | 
				
			||||||
 | 
					                    return ActionResult.FAIL;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Block current = c.getWorld().getBlockState(c.getBlockPos()).getBlock();
 | 
				
			||||||
 | 
					            if (allowed != null && !current.equals(allowed)) {
 | 
				
			||||||
 | 
					                TranslatableText message =
 | 
				
			||||||
 | 
					                        new TranslatableText("items.structure.spawner.invalid.block.clicked",
 | 
				
			||||||
 | 
					                                current.getName(), allowed.getName());
 | 
				
			||||||
 | 
					                sendPlayer(player, message);
 | 
				
			||||||
 | 
					                return ActionResult.FAIL;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (!tag.contains("structure", 8)) {
 | 
				
			||||||
 | 
					                LOGGER.info("No structure name set");
 | 
				
			||||||
 | 
					                TranslatableText message =
 | 
				
			||||||
 | 
					                        new TranslatableText("items.structure.spawner.no.structure");
 | 
				
			||||||
 | 
					                sendPlayerChat(player, message);
 | 
				
			||||||
 | 
					                return ActionResult.FAIL;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            String structureName = tag.getString("structure");
 | 
				
			||||||
 | 
					            Identifier structureResourceID = Identifier.tryParse(structureName);
 | 
				
			||||||
 | 
					            if (structureResourceID == null) {
 | 
				
			||||||
 | 
					                TranslatableText message =
 | 
				
			||||||
 | 
					                        new TranslatableText("items.structure.spawner.invalid.structure.name");
 | 
				
			||||||
 | 
					                sendPlayerChat(player, message);
 | 
				
			||||||
 | 
					                return ActionResult.FAIL;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Structure x = ((ServerWorld) c.getWorld()).getStructureManager().getStructure(structureResourceID);
 | 
				
			||||||
 | 
					            if (x == null) {
 | 
				
			||||||
 | 
					                TranslatableText message =
 | 
				
			||||||
 | 
					                        new TranslatableText("items.structure.spawner.structure.nonexistent",
 | 
				
			||||||
 | 
					                                new LiteralText(structureResourceID.toString()));
 | 
				
			||||||
 | 
					                sendPlayerChat(player, message);
 | 
				
			||||||
 | 
					                return ActionResult.FAIL;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            BlockPos loc = c.getBlockPos().offset(c.getSide());
 | 
				
			||||||
 | 
					            if (tag.contains("offset")) {
 | 
				
			||||||
 | 
					                BlockPos offset = BlockPos.deserialize(new Dynamic<Tag>(NbtOps.INSTANCE, tag.get("offset")));
 | 
				
			||||||
 | 
					                loc = loc.add(offset);
 | 
				
			||||||
 | 
					            } else if (c.getPlayer() != null) {
 | 
				
			||||||
 | 
					                Direction direction = Direction.getEntityFacingOrder(c.getPlayer())[0];
 | 
				
			||||||
 | 
					                BlockPos size = x.getSize();
 | 
				
			||||||
 | 
					                loc = loc.add(getDirectionalOffset(direction, size));
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                LOGGER.info("No player & no offset");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            MyPlacementSettings ps = (new MyPlacementSettings());
 | 
				
			||||||
 | 
					            if (tag.contains("blacklist", 9)) {
 | 
				
			||||||
 | 
					                ListTag bl = tag.getList("blacklist", 8);
 | 
				
			||||||
 | 
					                List<Block> blacklist = Lists.newArrayList();
 | 
				
			||||||
 | 
					                for (Tag b : bl) {
 | 
				
			||||||
 | 
					                    Block block = getBlock(b.asString());
 | 
				
			||||||
 | 
					                    if (block != null) {
 | 
				
			||||||
 | 
					                        blacklist.add(block);
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        TranslatableText message =
 | 
				
			||||||
 | 
					                                new TranslatableText("items.structure.spawner.invalid.block",
 | 
				
			||||||
 | 
					                                        new LiteralText(b.asString()));
 | 
				
			||||||
 | 
					                        sendPlayerChat(player, message);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                ps.forbidOverwrite(blacklist);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            ps.setWorld(c.getWorld())
 | 
				
			||||||
 | 
					                    .setSize(x.getSize())
 | 
				
			||||||
 | 
					                    .setMirrored(BlockMirror.NONE)
 | 
				
			||||||
 | 
					                    .setRotation(BlockRotation.NONE)
 | 
				
			||||||
 | 
					                    .setChunkPosition(null);
 | 
				
			||||||
 | 
					            boolean succes = x.method_15172(c.getWorld(), loc, ps, 2);
 | 
				
			||||||
 | 
					            if (succes) {
 | 
				
			||||||
 | 
					                c.getStack().decrement(1);
 | 
				
			||||||
 | 
					                return ActionResult.SUCCESS;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            TranslatableText message =
 | 
				
			||||||
 | 
					                    new TranslatableText("items.structure.spawner.invalid.location");
 | 
				
			||||||
 | 
					            sendPlayer(player, message);
 | 
				
			||||||
 | 
					            return ActionResult.FAIL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return ActionResult.FAIL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static void sendPlayer(ServerPlayerEntity player, Text message) {
 | 
				
			||||||
 | 
					        if (player == null)
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        ServerPlayNetworkHandler connection = player.networkHandler;
 | 
				
			||||||
 | 
					        TitleS2CPacket packet = new TitleS2CPacket(TitleS2CPacket.Action.SUBTITLE, message);
 | 
				
			||||||
 | 
					        connection.sendPacket(packet);
 | 
				
			||||||
 | 
					        packet = new TitleS2CPacket(TitleS2CPacket.Action.TITLE, new LiteralText(""));
 | 
				
			||||||
 | 
					        connection.sendPacket(packet);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static void sendPlayerChat(ServerPlayerEntity player, Text message) {
 | 
				
			||||||
 | 
					        if (player != null)
 | 
				
			||||||
 | 
					            player.sendChatMessage(message, MessageType.SYSTEM);
 | 
				
			||||||
 | 
					        LOGGER.info(message.asFormattedString());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private BlockPos getDirectionalOffset(Direction direction, BlockPos size) {
 | 
				
			||||||
 | 
					        BlockPos loc = new BlockPos(0, 0, 0);
 | 
				
			||||||
 | 
					        switch (direction) {
 | 
				
			||||||
 | 
					            case WEST:
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.NORTH, size.getZ() / 2);
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.WEST, size.getX() - 1);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case EAST: //positive x
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.NORTH, size.getZ() / 2);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case NORTH:
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.NORTH, size.getZ() - 1);
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.WEST, size.getX() / 2);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case SOUTH: //positive z
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.WEST, size.getX() / 2);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case UP:    //positive y
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.NORTH, size.getZ() / 2);
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.WEST, size.getX() / 2);
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.UP);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case DOWN:
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.NORTH, size.getZ() / 2);
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.WEST, size.getX() / 2);
 | 
				
			||||||
 | 
					                loc = loc.offset(Direction.DOWN, size.getY());
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return loc;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private Block getBlock(String loc) {
 | 
				
			||||||
 | 
					        Identifier location = Identifier.tryParse(loc);
 | 
				
			||||||
 | 
					        DefaultedRegistry<Block> blocks = Registry.BLOCK;
 | 
				
			||||||
 | 
					        if (location == null || !blocks.containsId(location)) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return blocks.get(location);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					package quimufu.structure_item;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.collect.Lists;
 | 
				
			||||||
 | 
					import net.minecraft.block.Block;
 | 
				
			||||||
 | 
					import net.minecraft.entity.Entity;
 | 
				
			||||||
 | 
					import net.minecraft.structure.Structure;
 | 
				
			||||||
 | 
					import net.minecraft.structure.StructurePlacementData;
 | 
				
			||||||
 | 
					import net.minecraft.util.math.BlockPos;
 | 
				
			||||||
 | 
					import net.minecraft.util.math.Box;
 | 
				
			||||||
 | 
					import net.minecraft.util.math.Vec3d;
 | 
				
			||||||
 | 
					import net.minecraft.world.World;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class MyPlacementSettings extends StructurePlacementData {
 | 
				
			||||||
 | 
					    private List<Block> blacklist;
 | 
				
			||||||
 | 
					    private World world;
 | 
				
			||||||
 | 
					    private BlockPos size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public MyPlacementSettings forbidOverwrite(List<Block> blocks) {
 | 
				
			||||||
 | 
					        if (blocks.size() == 0) {
 | 
				
			||||||
 | 
					            blacklist = null;
 | 
				
			||||||
 | 
					            return this;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        blacklist = Lists.newArrayList(blocks);
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public MyPlacementSettings setWorld(World w) {
 | 
				
			||||||
 | 
					        world = w;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public MyPlacementSettings setSize(BlockPos p) {
 | 
				
			||||||
 | 
					        size = p;
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<Structure.StructureBlockInfo> method_15121(List<List<Structure.StructureBlockInfo>> blocks, BlockPos pos) {
 | 
				
			||||||
 | 
					        if (world == null || pos == null || size == null) {
 | 
				
			||||||
 | 
					            return super.method_15121(blocks, pos);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<List<Structure.StructureBlockInfo>> eligibleStructures = new ArrayList<>();
 | 
				
			||||||
 | 
					        if (blacklist == null) {
 | 
				
			||||||
 | 
					            eligibleStructures = blocks;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            for (List<Structure.StructureBlockInfo> struct : blocks) {
 | 
				
			||||||
 | 
					                if (isValid(struct, pos)) {
 | 
				
			||||||
 | 
					                    eligibleStructures.add(struct);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (eligibleStructures.size() == 0)
 | 
				
			||||||
 | 
					            setIgnoreEntities(true);
 | 
				
			||||||
 | 
					        List<Structure.StructureBlockInfo> locs = super.method_15121(eligibleStructures, pos);
 | 
				
			||||||
 | 
					        if (!locs.isEmpty()) {
 | 
				
			||||||
 | 
					            List<Entity> entitiesWithinAABB = world.getNonSpectatingEntities(Entity.class, new Box(pos,pos.add(size)));
 | 
				
			||||||
 | 
					            for (Structure.StructureBlockInfo blockInfo : locs) {
 | 
				
			||||||
 | 
					                BlockPos posToClean = blockInfo.pos.add(pos);
 | 
				
			||||||
 | 
					                for (Entity e : entitiesWithinAABB) {
 | 
				
			||||||
 | 
					                    e.getBoundingBox().contains(new Vec3d(posToClean));
 | 
				
			||||||
 | 
					                    if (e.getBoundingBox().intersects(new Box(posToClean))) {
 | 
				
			||||||
 | 
					                        e.remove();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return locs;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private boolean isValid(List<Structure.StructureBlockInfo> struct, BlockPos pos) {
 | 
				
			||||||
 | 
					        for (Structure.StructureBlockInfo bi : struct) {
 | 
				
			||||||
 | 
					            BlockPos posToCheck = bi.pos.add(pos);
 | 
				
			||||||
 | 
					            if (World.isValid(posToCheck)) {
 | 
				
			||||||
 | 
					                Block blockToCheck = world.getBlockState(posToCheck).getBlock();
 | 
				
			||||||
 | 
					                for (Block b : blacklist) {
 | 
				
			||||||
 | 
					                    if (blockToCheck.equals(b)) {
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										29
									
								
								src/main/java/quimufu/structure_item/StructureItemMod.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/main/java/quimufu/structure_item/StructureItemMod.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					package quimufu.structure_item;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import net.fabricmc.api.ModInitializer;
 | 
				
			||||||
 | 
					import net.minecraft.item.Item;
 | 
				
			||||||
 | 
					import net.minecraft.util.registry.Registry;
 | 
				
			||||||
 | 
					import org.apache.logging.log4j.Level;
 | 
				
			||||||
 | 
					import org.apache.logging.log4j.LogManager;
 | 
				
			||||||
 | 
					import org.apache.logging.log4j.Logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class StructureItemMod implements ModInitializer {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static Logger LOGGER = LogManager.getLogger();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final String MOD_ID = "structure_item";
 | 
				
			||||||
 | 
					    public static final String MOD_NAME = "Structure Item Mod (Fabric)";
 | 
				
			||||||
 | 
					    public static final Item item = new MyItem();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void onInitialize() {
 | 
				
			||||||
 | 
					        log(Level.INFO, "Initializing");
 | 
				
			||||||
 | 
					        Registry.register(Registry.ITEM, MOD_ID + ":item", item);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void log(Level level, String message) {
 | 
				
			||||||
 | 
					        LOGGER.log(level, "[" + MOD_NAME + "] " + message);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								src/main/resources/assets/structure_item/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/main/resources/assets/structure_item/icon.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 23 KiB  | 
							
								
								
									
										18
									
								
								src/main/resources/assets/structure_item/lang/en_us.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/main/resources/assets/structure_item/lang/en_us.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "items.structure.spawner.invalid.block.clicked": "Digga %s is net %s, maan.",
 | 
				
			||||||
 | 
					  "items.structure.spawner.invalid.location": "An irreplaceable block is in the way!",
 | 
				
			||||||
 | 
					  "items.structure.spawner.invalid.structure.name": "Invalid structure name",
 | 
				
			||||||
 | 
					  "items.structure.spawner.structure.nonexistent": "Structure: %s does not exist",
 | 
				
			||||||
 | 
					  "items.structure.spawner.invalid.block": "Block %s invalid",
 | 
				
			||||||
 | 
					  "items.structure.spawner.no.tag": "Item has no NBT tag",
 | 
				
			||||||
 | 
					  "items.structure.spawner.no.structure": "Item has no String \"structure\": tag",
 | 
				
			||||||
 | 
					  "item.structure_item.item": "Structure Spawner",
 | 
				
			||||||
 | 
					  "item.structure_item.item.tooltip.tag.invalid": "Invalid item!",
 | 
				
			||||||
 | 
					  "item.structure_item.item.tooltip.structure": "Places down: ",
 | 
				
			||||||
 | 
					  "item.structure_item.item.tooltip.allowed.on": "Can be placed on: ",
 | 
				
			||||||
 | 
					  "item.structure_item.item.tooltip.fixed.offset": "Offset:",
 | 
				
			||||||
 | 
					  "item.structure_item.item.tooltip.xyz":"  x: %s y: %s z: %s",
 | 
				
			||||||
 | 
					  "item.structure_item.item.tooltip.dynamic.offset": "Dynamic offset",
 | 
				
			||||||
 | 
					  "item.structure_item.item.tooltip.blacklist": "Blacklist:",
 | 
				
			||||||
 | 
					  "item.structure_item.item.tooltip.blacklist.more": "  And %s more..."
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "parent": "item/handheld",
 | 
				
			||||||
 | 
					    "textures": {
 | 
				
			||||||
 | 
					        "layer0": "item/stick"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								src/main/resources/fabric.mod.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/main/resources/fabric.mod.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "schemaVersion": 1,
 | 
				
			||||||
 | 
					  "id": "structure_item",
 | 
				
			||||||
 | 
					  "version": "${version}",
 | 
				
			||||||
 | 
					  "name": "Structure Item Mod (Fabric)",
 | 
				
			||||||
 | 
					  "description": "This mod adds an item, that, with proper NBT might help you build a modpack... maybe",
 | 
				
			||||||
 | 
					  "authors": [
 | 
				
			||||||
 | 
					    "QuImUfu"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "contributors": [],
 | 
				
			||||||
 | 
					  "contact": {},
 | 
				
			||||||
 | 
					  "license": "MIT",
 | 
				
			||||||
 | 
					  "icon": "assets/structure_item/icon.png",
 | 
				
			||||||
 | 
					  "environment": "*",
 | 
				
			||||||
 | 
					  "entrypoints": {
 | 
				
			||||||
 | 
					    "main": [
 | 
				
			||||||
 | 
					      "quimufu.structure_item.StructureItemMod"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "client": [],
 | 
				
			||||||
 | 
					    "server": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "mixins": [],
 | 
				
			||||||
 | 
					  "depends": {
 | 
				
			||||||
 | 
					    "fabricloader": ">=0.4.0",
 | 
				
			||||||
 | 
					    "fabric": "*"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user