From 53af69ce43483df8f15957f7cb4b92ad55314ed1 Mon Sep 17 00:00:00 2001 From: npc-strider Date: Mon, 4 Jan 2021 00:29:12 +0800 Subject: [PATCH] Initial commit - basic functionality --- .github/workflows/build.yml | 41 ++++ .gitignore | 33 ++++ README.md | 3 + build.gradle | 82 ++++++++ gradle.properties | 16 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 +++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle | 10 + .../github/npc_strider/NukeMod/NukeMod.java | 47 +++++ .../npc_strider/NukeMod/NukeModClient.java | 45 +++++ .../BigFookingExplosionEmitterParticle.java | 64 ++++++ .../particle/BigFookingExplosionParticle.java | 79 ++++++++ .../BigFookingSmokeEmitterParticle.java | 81 ++++++++ .../particle/BigFookingSmokeParticle.java | 33 ++++ .../client/particle/FissioningParticle.java | 46 +++++ .../NukeMod/constant/TransformConstants.java | 52 +++++ .../NukeMod/entity/FastExplosion.java | 157 +++++++++++++++ .../NukeMod/fission/FissionBlock.java | 104 ++++++++++ .../NukeMod/fission/FissionEntity.java | 186 ++++++++++++++++++ .../NukeMod/mixin/ClientEntityMixin.java | 91 +++++++++ .../npc_strider/NukeMod/mixin/FireMixin.java | 59 ++++++ .../render/entity/FissionEntityRenderer.java | 54 +++++ src/main/resources/NukeMod.mixins.json | 15 ++ .../nuke-mod/blockstates/fission-device.json | 7 + src/main/resources/assets/nuke-mod/icon.png | Bin 0 -> 453 bytes .../particles/big-explosion-emitter.json | 1 + .../nuke-mod/particles/big-explosion.json | 20 ++ .../nuke-mod/particles/big-smoke-emitter.json | 1 + .../assets/nuke-mod/particles/big-smoke.json | 12 ++ .../nuke-mod/particles/fission-emission.json | 12 ++ .../resources/assets/nuke-mod/sounds.json | 14 ++ .../assets/nuke-mod/sounds/fission-alarm.ogg | Bin 0 -> 21312 bytes .../nuke-mod/sounds/fission-explosion.ogg | Bin 0 -> 55414 bytes src/main/resources/fabric.mod.json | 40 ++++ 36 files changed, 1684 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore 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 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/io/github/npc_strider/NukeMod/NukeMod.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/NukeModClient.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingExplosionEmitterParticle.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingExplosionParticle.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingSmokeEmitterParticle.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingSmokeParticle.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/client/particle/FissioningParticle.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/constant/TransformConstants.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/entity/FastExplosion.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/fission/FissionBlock.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/fission/FissionEntity.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/mixin/ClientEntityMixin.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/mixin/FireMixin.java create mode 100644 src/main/java/io/github/npc_strider/NukeMod/render/entity/FissionEntityRenderer.java create mode 100644 src/main/resources/NukeMod.mixins.json create mode 100644 src/main/resources/assets/nuke-mod/blockstates/fission-device.json create mode 100644 src/main/resources/assets/nuke-mod/icon.png create mode 100644 src/main/resources/assets/nuke-mod/particles/big-explosion-emitter.json create mode 100644 src/main/resources/assets/nuke-mod/particles/big-explosion.json create mode 100644 src/main/resources/assets/nuke-mod/particles/big-smoke-emitter.json create mode 100644 src/main/resources/assets/nuke-mod/particles/big-smoke.json create mode 100644 src/main/resources/assets/nuke-mod/particles/fission-emission.json create mode 100644 src/main/resources/assets/nuke-mod/sounds.json create mode 100644 src/main/resources/assets/nuke-mod/sounds/fission-alarm.ogg create mode 100644 src/main/resources/assets/nuke-mod/sounds/fission-explosion.ogg create mode 100644 src/main/resources/fabric.mod.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..31c38ee --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,41 @@ +# 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: [ + 1.8, # Minimum supported by Minecraft + 11, # Current Java LTS + 15 # Latest version + ] + # and run on both Linux and Windows + os: [ubuntu-20.04, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: checkout repository + uses: actions/checkout@v2 + - name: validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: setup jdk ${{ matrix.java }} + uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.java }} + - name: make gradle wrapper executable + if: ${{ runner.os != 'Windows' }} + run: chmod +x ./gradlew + - name: build + run: ./gradlew build + - name: capture build artifacts + if: ${{ runner.os == 'Linux' && matrix.java == '11' }} # Only upload artifacts built from LTS java on one OS + uses: actions/upload-artifact@v2 + with: + name: Artifacts + path: build/libs/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..09cd281 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# gradle + +.gradle/ +build/ +out/ +classes/ + +# eclipse + +*.launch + +# idea + +.idea/ +*.iml +*.ipr +*.iws + +# vscode + +.settings/ +.vscode/ +bin/ +.classpath +.project + +# macos + +*.DS_Store + +# fabric + +run/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..772af2d --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Nuke mod + +## In development. \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..62083f9 --- /dev/null +++ b/build.gradle @@ -0,0 +1,82 @@ +plugins { + id 'fabric-loom' version '0.5-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 + +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}" + + // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. + // You may need to force-disable transitiveness on them. +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +tasks.withType(JavaCompile).configureEach { + // 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 + // If Javadoc is generated, this must be specified in that task too. + it.options.encoding = "UTF-8" + + // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too + // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used. + // We'll use that if it's available, but otherwise we'll use the older option. + def targetVersion = 8 + if (JavaVersion.current().isJava9Compatible()) { + it.options.release = targetVersion + } +} + +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() +} + +jar { + from("LICENSE") { + rename { "${it}_${project.archivesBaseName}"} + } +} + +// configure the maven publication +publishing { + publications { + mavenJava(MavenPublication) { + // add all the jars that should be included when publishing to maven + artifact(remapJar) { + builtBy remapJar + } + artifact(sourcesJar) { + builtBy remapSourcesJar + } + } + } + + // Select the repositories you want to publish to + // To publish to maven local, no extra repositories are necessary. Just use the task `publishToMavenLocal`. + repositories { + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..76137f9 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,16 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G + +# Fabric Properties + # https://modmuss50.me/fabric.html + minecraft_version=1.16.4 + yarn_mappings=1.16.4+build.7 + loader_version=0.10.8 + + #Fabric api + fabric_version=0.28.4+1.16 + + # Mod Properties + mod_version = 0.1.0 + maven_group = io.github.npc_strider.NukeMod + archives_base_name = NukeMod diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..be52383 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/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 or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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=`expr $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" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@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 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%" == "0" goto execute + +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 execute + +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 + +: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%"=="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 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..5b60df3 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + jcenter() + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + gradlePluginPortal() + } +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/NukeMod.java b/src/main/java/io/github/npc_strider/NukeMod/NukeMod.java new file mode 100644 index 0000000..e73be62 --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/NukeMod.java @@ -0,0 +1,47 @@ +package io.github.npc_strider.NukeMod; + +import io.github.npc_strider.NukeMod.fission.FissionBlock; +import io.github.npc_strider.NukeMod.fission.FissionEntity; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; +import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; +import net.minecraft.block.Blocks; +import net.minecraft.entity.EntityDimensions; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnGroup; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +public class NukeMod implements ModInitializer { + + public static final String MOD_ID = "nuke-mod"; + // public static final EntityType FISSION_ENTITY; + + public static final Identifier FISSION_BLOCK_ID = new Identifier(MOD_ID, "fission-device"); + public static final FissionBlock FISSION_BLOCK = new FissionBlock(FabricBlockSettings.copy(Blocks.TNT)); + + public static final EntityType FISSION_ENTITY_TYPE = FabricEntityTypeBuilder.create(SpawnGroup.MISC, FissionEntity::new).dimensions(new EntityDimensions(0.98F, 0.98F, false)).trackRangeBlocks(10).trackedUpdateRate(10).fireImmune().build(); + public static final EntityType FISSION_ENTITY = FISSION_ENTITY_TYPE; + + public static final Identifier FISSION_ALARM_ID = new Identifier(MOD_ID, "fission-alarm"); + public static final Identifier FISSION_EXPLOSION_ID = new Identifier(MOD_ID, "fission-explosion"); + public static SoundEvent FISSION_ALARM = new SoundEvent(FISSION_ALARM_ID); + public static SoundEvent FISSION_EXPLOSION = new SoundEvent(FISSION_EXPLOSION_ID); + + @Override + public void onInitialize() { + Registry.register(Registry.BLOCK, FISSION_BLOCK_ID, FISSION_BLOCK); + Registry.register(Registry.ITEM, FISSION_BLOCK_ID, new BlockItem(FISSION_BLOCK, new Item.Settings().group(ItemGroup.REDSTONE))); + FlammableBlockRegistry.getDefaultInstance().add(FISSION_BLOCK, 15, 100); //Copy TNT settings + + Registry.register(Registry.ENTITY_TYPE, new Identifier(MOD_ID, "fission-entity"), FISSION_ENTITY); + + Registry.register(Registry.SOUND_EVENT, FISSION_ALARM_ID, FISSION_ALARM); + Registry.register(Registry.SOUND_EVENT, FISSION_EXPLOSION_ID, FISSION_EXPLOSION); + } +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/NukeModClient.java b/src/main/java/io/github/npc_strider/NukeMod/NukeModClient.java new file mode 100644 index 0000000..9f8f61f --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/NukeModClient.java @@ -0,0 +1,45 @@ +package io.github.npc_strider.NukeMod; + + +import io.github.npc_strider.NukeMod.client.particle.BigFookingExplosionEmitterParticle; +import io.github.npc_strider.NukeMod.client.particle.BigFookingExplosionParticle; +import io.github.npc_strider.NukeMod.client.particle.BigFookingSmokeEmitterParticle; +import io.github.npc_strider.NukeMod.client.particle.BigFookingSmokeParticle; +import io.github.npc_strider.NukeMod.client.particle.FissioningParticle; +import io.github.npc_strider.NukeMod.render.entity.FissionEntityRenderer; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; +import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; +import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +@Environment(EnvType.CLIENT) +public class NukeModClient implements ClientModInitializer { + public static final DefaultParticleType FISSION_PARTICLE = FabricParticleTypes.simple(false); + public static final DefaultParticleType BIG_FOOKING_EXPLOSION = FabricParticleTypes.simple(false); + public static final DefaultParticleType BIG_FOOKING_EXPLOSION_EMITTER = FabricParticleTypes.simple(false); + public static final DefaultParticleType BIG_FOOKING_SMOKE = FabricParticleTypes.simple(false); + public static final DefaultParticleType BIG_FOOKING_SMOKE_EMITTER = FabricParticleTypes.simple(false); + + private static final String MOD_ID = NukeMod.MOD_ID; + + @Override + public void onInitializeClient() { + Registry.register(Registry.PARTICLE_TYPE, new Identifier(MOD_ID, "fission-emission"), FISSION_PARTICLE); + Registry.register(Registry.PARTICLE_TYPE, new Identifier(MOD_ID, "big-explosion"), BIG_FOOKING_EXPLOSION); + Registry.register(Registry.PARTICLE_TYPE, new Identifier(MOD_ID, "big-explosion-emitter"), BIG_FOOKING_EXPLOSION_EMITTER); + Registry.register(Registry.PARTICLE_TYPE, new Identifier(MOD_ID, "big-smoke"), BIG_FOOKING_SMOKE); + Registry.register(Registry.PARTICLE_TYPE, new Identifier(MOD_ID, "big-smoke-emitter"), BIG_FOOKING_SMOKE_EMITTER); + ParticleFactoryRegistry.getInstance().register(FISSION_PARTICLE, FissioningParticle.Factory::new); + ParticleFactoryRegistry.getInstance().register(BIG_FOOKING_EXPLOSION, BigFookingExplosionParticle.Factory::new); + ParticleFactoryRegistry.getInstance().register(BIG_FOOKING_EXPLOSION_EMITTER, BigFookingExplosionEmitterParticle.Factory::new); + ParticleFactoryRegistry.getInstance().register(BIG_FOOKING_SMOKE, BigFookingSmokeParticle.Factory::new); + ParticleFactoryRegistry.getInstance().register(BIG_FOOKING_SMOKE_EMITTER, BigFookingSmokeEmitterParticle.Factory::new); + + EntityRendererRegistry.INSTANCE.register(NukeMod.FISSION_ENTITY, (dispatcher, context) -> new FissionEntityRenderer(dispatcher)); + } +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingExplosionEmitterParticle.java b/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingExplosionEmitterParticle.java new file mode 100644 index 0000000..4aaf09d --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingExplosionEmitterParticle.java @@ -0,0 +1,64 @@ +package io.github.npc_strider.NukeMod.client.particle; + +import io.github.npc_strider.NukeMod.NukeModClient; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider; +import net.minecraft.block.Material; +import net.minecraft.client.particle.NoRenderParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +@Environment(EnvType.CLIENT) +public class BigFookingExplosionEmitterParticle extends NoRenderParticle { + private int age_; + private final int maxAge_; + + private BigFookingExplosionEmitterParticle(ClientWorld world, double x, double y, double z) { + super(world, x, y, z, 0.0D, 0.0D, 0.0D); + this.maxAge_ = 10;//80; + } + + public void tick() { + double r = 40.0D; + // for (int i = 0; i < (int)Math.floor(32*(float)this.age_/(float)this.maxAge_); ++i) { + for (int i = 0; i < (int)Math.floor(64/(age_+1)); ++i) { + // double d = this.x + (this.random.nextDouble() - this.random.nextDouble()) * r; + // double e = this.y + (this.random.nextDouble() - this.random.nextDouble()) * r; + // double f = this.z + (this.random.nextDouble() - this.random.nextDouble()) * r; + float alpha = this.random.nextFloat() * 360; + float beta = this.random.nextFloat() * 360; + // Vec3d position = Vec3d.fromPolar(alpha, beta).multiply((this.random.nextDouble() - this.random.nextDouble()) * r).add(this.x, this.y, this.z); //Keeps our explosion spherical, rather than in a 3d box as with the vanilla method. + double r_ = Math.sqrt(this.random.nextDouble()) * r; + Vec3d position = Vec3d.fromPolar(alpha, beta).multiply(r_).add(this.x, this.y, this.z); //Keeps our explosion spherical, rather than in a 3d box as with the vanilla method. + if (world.getBlockState(new BlockPos(position)).getMaterial() == Material.AIR) { + Vec3d v = Vec3d.fromPolar(alpha, beta).normalize().multiply(r_*0.05F+0.05F*this.random.nextFloat()); + this.world.addParticle(NukeModClient.BIG_FOOKING_EXPLOSION, true, position.getX(), position.getY(), position.getZ(), v.getX(), v.getY(), v.getZ()); + } + } + + ++this.age_; + if (this.age_ == this.maxAge_) { + this.markDead(); + } + + } + + @Environment(EnvType.CLIENT) + public static class Factory implements ParticleFactory { + private final FabricSpriteProvider sprites; + + public Factory(FabricSpriteProvider sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(DefaultParticleType defaultParticleType, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + return new BigFookingExplosionEmitterParticle(clientWorld, d, e, f); + } + } +} \ No newline at end of file diff --git a/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingExplosionParticle.java b/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingExplosionParticle.java new file mode 100644 index 0000000..451c68a --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingExplosionParticle.java @@ -0,0 +1,79 @@ +package io.github.npc_strider.NukeMod.client.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.ParticleTextureSheet; +import net.minecraft.client.particle.SpriteBillboardParticle; +import net.minecraft.client.particle.SpriteProvider; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; + +@Environment(EnvType.CLIENT) +public class BigFookingExplosionParticle extends SpriteBillboardParticle { + private final SpriteProvider spriteProvider; + private final float scale_; + + private BigFookingExplosionParticle(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, SpriteProvider spriteProvider) { + super(world, x, y, z, vx, vy, vz); + // this.maxAge = 6 + this.random.nextInt(4); + this.maxAge = 10 + this.random.nextInt(10); + float f = this.random.nextFloat() * 0.6F + 0.4F; + this.colorRed = f; + this.colorGreen = f; + this.colorBlue = f; + this.velocityX = vx; + this.velocityY = vy; + this.velocityZ = vz; + this.prevAngle = this.angle = this.random.nextFloat()*2*(float)Math.PI; + // this.move((float)new Vec3d(vx, vy, vz).length()); + // this.move(100.0F); + this.scale = this.scale_ = 15.0F*this.random.nextFloat()+20.0F; //* (1.0F - (float)d * 0.5F); //Change maximum scale factor from 2.0F to 10.0F + this.collidesWithWorld = false; + this.spriteProvider = spriteProvider; + this.setSpriteForAge(spriteProvider); + } + + public int getColorMultiplier(float tint) { + return 15728880; + } + + public void tick() { + this.prevPosX = this.x; + this.prevPosY = this.y; + this.prevPosZ = this.z; + if (this.age++ >= this.maxAge) { + this.markDead(); + } else { + float factor = (float)age/(float)maxAge; + // this.scale = scale_*(float)(1.0F-factor); + // this.setColorAlpha(1.0F-factor*factor); + this.move(this.velocityX, this.velocityY, this.velocityZ); + // this.setColor( + // // this.random.nextFloat(), this.random.nextFloat(), this.random.nextFloat() + // (float)(1.0F-factor), + // (float)(1.0F-factor), + // (float)(1.0F-factor) + // ); + this.setSpriteForAge(this.spriteProvider); + } + } + + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_LIT; + } + + @Environment(EnvType.CLIENT) + public static class Factory implements ParticleFactory { + private final SpriteProvider spriteProvider; + + public Factory(SpriteProvider spriteProvider) { + this.spriteProvider = spriteProvider; + } + + public Particle createParticle(DefaultParticleType defaultParticleType, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + return new BigFookingExplosionParticle(clientWorld, d, e, f, g, h, i, this.spriteProvider); + } + } +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingSmokeEmitterParticle.java b/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingSmokeEmitterParticle.java new file mode 100644 index 0000000..53b680d --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingSmokeEmitterParticle.java @@ -0,0 +1,81 @@ +package io.github.npc_strider.NukeMod.client.particle; + +import io.github.npc_strider.NukeMod.NukeModClient; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider; +import net.minecraft.client.particle.NoRenderParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.math.Vec3d; + +public class BigFookingSmokeEmitterParticle extends NoRenderParticle { + private int age_; + private final int maxAge_; + + private double RADIUS_X = 60; + private final float m = 1.0F; + private final int[][] radiuses = { //For the big fission cloud + {(int)Math.floor(64*m), (int)Math.floor(RADIUS_X/2) }, + {(int)Math.floor(32*m), (int)Math.floor(RADIUS_X/3) }, + {(int)Math.floor(16*m), (int)Math.floor(RADIUS_X/4) }, + {(int)Math.floor(16*m), (int)Math.floor(RADIUS_X/5) }, + {(int)Math.floor(16*m), (int)Math.floor(RADIUS_X/6) }, + {(int)Math.floor(12*m), (int)Math.floor(RADIUS_X/7) }, + {(int)Math.floor(8*m), (int)Math.floor(RADIUS_X/8) }, + {(int)Math.floor(8*m), (int)Math.floor(RADIUS_X/9) }, + {(int)Math.floor(8*m), (int)Math.floor(RADIUS_X/10) }, + + {(int)Math.floor(32*m), (int)Math.floor(RADIUS_X/2) }, + {(int)Math.floor(32*m), (int)Math.floor(RADIUS_X/2) }, + {(int)Math.floor(32*m), (int)Math.floor(RADIUS_X/2) }, + {(int)Math.floor(32*m), (int)Math.floor(RADIUS_X/2.2) }, + {(int)Math.floor(24*m), (int)Math.floor(RADIUS_X/2.5) }, + {(int)Math.floor(16*m), (int)Math.floor(RADIUS_X/2.7) }, + {(int)Math.floor(8*m), (int)Math.floor(RADIUS_X/3) }, + {(int)Math.floor(8*m), (int)Math.floor(RADIUS_X/5.5) }, + {(int)Math.floor(8*m), (int)Math.floor(RADIUS_X/8) }, + }; // {(y+0n)=>r0,(y+1n)=>r1,(y+2n)=>r2, ... } + + private BigFookingSmokeEmitterParticle(ClientWorld world, double x, double y, double z) { + super(world, x, y, z, 0.0D, 0.0D, 0.0D); + this.maxAge_ = 1;//80; + } + + public void tick() { + double dy = 8.0D; + for (int j = 0; j < radiuses.length; ++j) { + for (int i = 0; i < radiuses[j][0]; ++i) { + float theta = this.random.nextFloat() * 360; + double r_ = Math.sqrt(this.random.nextDouble()) * radiuses[j][1]; + Vec3d position = Vec3d.fromPolar(0, theta).multiply(r_).add(this.x, this.y+(dy*(double)(j)), this.z); //Keeps our explosion spherical, rather than in a 3d box as with the vanilla method. + // if (world.getBlockState(new BlockPos(position)).getMaterial() == Material.AIR) { + Vec3d v = Vec3d.fromPolar(0, theta).normalize().multiply(r_*0.05F+0.05F*this.random.nextFloat()); + this.world.addParticle(NukeModClient.BIG_FOOKING_SMOKE, true, position.getX(), position.getY(), position.getZ(), v.getX(), v.getY()-0.25F, v.getZ()); + // } + } + } + + ++this.age_; + if (this.age_ == this.maxAge_) { + this.markDead(); + } + + } + + @Environment(EnvType.CLIENT) + public static class Factory implements ParticleFactory { + private final FabricSpriteProvider sprites; + + public Factory(FabricSpriteProvider sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(DefaultParticleType defaultParticleType, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + return new BigFookingSmokeEmitterParticle(clientWorld, d, e, f); + } + } +} \ No newline at end of file diff --git a/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingSmokeParticle.java b/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingSmokeParticle.java new file mode 100644 index 0000000..689afdf --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/client/particle/BigFookingSmokeParticle.java @@ -0,0 +1,33 @@ +package io.github.npc_strider.NukeMod.client.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.particle.AscendingParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.SpriteProvider; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; + +@Environment(EnvType.CLIENT) +public class BigFookingSmokeParticle extends AscendingParticle { + protected BigFookingSmokeParticle(ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ, SpriteProvider spriteProvider) { + // super(world, x, y, z, velocityX, velocityY, velocityZ, 2.5F, spriteProvider); + super(world, x, y, z, 0.1F, 0.1F, 0.1F, velocityX, velocityY, velocityZ, 1.0F, spriteProvider, 0.3F, 20*60, 0.0005D, false); + this.scale = 10.0F; + this.age = random.nextInt(160); + } + + @Environment(EnvType.CLIENT) + public static class Factory implements ParticleFactory { + private final SpriteProvider spriteProvider; + + public Factory(SpriteProvider spriteProvider) { + this.spriteProvider = spriteProvider; + } + + public Particle createParticle(DefaultParticleType defaultParticleType, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + return new BigFookingSmokeParticle(clientWorld, d, e, f, g, h, i, this.spriteProvider); + } + } +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/client/particle/FissioningParticle.java b/src/main/java/io/github/npc_strider/NukeMod/client/particle/FissioningParticle.java new file mode 100644 index 0000000..74f1d71 --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/client/particle/FissioningParticle.java @@ -0,0 +1,46 @@ +package io.github.npc_strider.NukeMod.client.particle; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.ParticleTextureSheet; +import net.minecraft.client.particle.SpriteBillboardParticle; +import net.minecraft.client.particle.SpriteProvider; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; + +@Environment(EnvType.CLIENT) +public class FissioningParticle extends SpriteBillboardParticle { + + protected FissioningParticle(ClientWorld clientWorld, double d, double e, double f, double g, double h, double i, SpriteProvider sprites) { + super(clientWorld, d, e, f, g, h, i); + setSprite(sprites.getSprite(world.random)); + float j = this.random.nextFloat() * 0.3F + 0.7F; + scale(2.0F * j); + this.setMaxAge((int)(10.0F / (this.random.nextFloat() * 0.9F + 0.1F))); //Just increasing the maxAge by increasing the max from 4.0F to 10.0F + this.colorRed = 1.0F * j; + this.colorGreen = 0.0F; + this.colorBlue = 0.0F; + } + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_OPAQUE; + } + + @Environment(EnvType.CLIENT) + public static class Factory implements ParticleFactory { + private final FabricSpriteProvider sprites; + + public Factory(FabricSpriteProvider sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(DefaultParticleType type, ClientWorld world, double x, double y, double z, double vX, double vY, double vZ) { + return new FissioningParticle(world, x, y, z, vX, vY, vZ, sprites); + } + } +} \ No newline at end of file diff --git a/src/main/java/io/github/npc_strider/NukeMod/constant/TransformConstants.java b/src/main/java/io/github/npc_strider/NukeMod/constant/TransformConstants.java new file mode 100644 index 0000000..e6e9a82 --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/constant/TransformConstants.java @@ -0,0 +1,52 @@ +package io.github.npc_strider.NukeMod.constant; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; + +public class TransformConstants { + + // private static final Map transform = ImmutableMap.of( + // Blocks.STONE, Blocks.COBBLESTONE, + // Blocks.DIRT, Blocks.SAND, + // Blocks.GRASS_BLOCK, Blocks.SAND, + // Blocks.SAND, Blocks.GLASS + // ); + + // private static final Map transformBlockTag = ImmutableMap.of( //Nah this is dumb. Have to look up each tag (one block can have multiple tags) which consumes time. + // BlockTags.BASE_STONE_OVERWORLD, Blocks.COBBLESTONE, + // ); + + public static Map transformMaterial; //We're using JAVA 8 so we can't use the new notation :( + static { + transformMaterial = new HashMap<>(); + // transformMaterial.put( Material.STONE, Blocks.GRAVEL ); //Bad idea - creates a shitton of lag due to FallingSand entities. + // transformMaterial.put( Material.SOLID_ORGANIC, Blocks.SAND ); + // transformMaterial.put( Material.SOIL, Blocks.SAND ); + transformMaterial.put( Material.AGGREGATE, Blocks.GLASS ); + transformMaterial.put( Material.PORTAL, Blocks.AIR ); + transformMaterial.put( Material.METAL, Blocks.LAVA ); + transformMaterial.put( Material.SNOW_BLOCK, Blocks.WATER ); + transformMaterial.put( Material.SNOW_LAYER, Blocks.WATER ); + transformMaterial.put( Material.ICE, Blocks.WATER ); + transformMaterial.put( Material.DENSE_ICE, Blocks.WATER ); + transformMaterial.put( Material.WOOD, Blocks.COAL_BLOCK ); + transformMaterial.put( Material.NETHER_WOOD, Blocks.COAL_BLOCK ); + transformMaterial.put( Material.NETHER_SHOOTS, Blocks.COAL_BLOCK ); + transformMaterial.put( Material.SOLID_ORGANIC, Blocks.COAL_BLOCK ); + } + + public static Map> transformToFallingTile; + static { + transformToFallingTile = new HashMap<>(); + transformToFallingTile.put( Material.STONE, Arrays.asList(Blocks.GRAVEL, Blocks.COBBLESTONE) ); + transformToFallingTile.put( Material.SOLID_ORGANIC, Arrays.asList(Blocks.SAND, Blocks.SANDSTONE) ); + transformToFallingTile.put( Material.SOIL, Arrays.asList(Blocks.SAND, Blocks.SANDSTONE) ); + } + +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/entity/FastExplosion.java b/src/main/java/io/github/npc_strider/NukeMod/entity/FastExplosion.java new file mode 100644 index 0000000..cf6e3a7 --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/entity/FastExplosion.java @@ -0,0 +1,157 @@ +package io.github.npc_strider.NukeMod.entity; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.github.npc_strider.NukeMod.NukeMod; +import io.github.npc_strider.NukeMod.NukeModClient; +import io.github.npc_strider.NukeMod.constant.TransformConstants; +import io.github.npc_strider.NukeMod.constant.TransformConstants.*; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class FastExplosion { + private final Vec3d radius; + private final Vec3d effectRadius; + private final World world; + private final Vec3d origin; + private final Entity entity; + + public FastExplosion(Entity entity, Vec3d radius, Vec3d effectRadius, Vec3d origin, World world) { + this.radius = radius; + this.effectRadius = effectRadius; + this.origin = origin; + this.world = world; + this.entity = entity; + } + + private void removeTiles() { + double radiusX = this.radius.getX(); + double radiusY = this.radius.getY(); + double radiusZ = this.radius.getZ(); + World wld = this.world; + for (double z = -radiusZ; z <= radiusZ; ++z) { //Note to self - don't try and parallize things... + for (double y = -radiusY; y <= radiusY; ++y) { + for (double x = -radiusX; x <= radiusX; ++x) { + Vec3d d = new Vec3d(x, y, z); + Vec3d ellipse_ = d.multiply(1/radiusZ, 1/radiusY, 1/radiusX); + double ellipseFactor = ellipse_.dotProduct(ellipse_); + BlockPos pos = new BlockPos(d.add(this.origin)); + BlockState blockState = wld.getBlockState(pos); + Block block = blockState.getBlock(); + // System.out.println("Position "+x+","+y+","+z+" "+ellipseFactor ); + if (blockState.getMaterial() != Material.AIR && ellipseFactor < 1 && block.getBlastResistance() < 1e6) { //Barrier and Adminium has a blast resistance of 3.6e+6 -- So this is OK! + // System.out.println("Removed "+block.getName().asString() ); + if (!wld.removeBlock(pos, false)) { + // System.out.println("Fluid"); + wld.setBlockState(pos, Blocks.AIR.getDefaultState(), 3); //This handles fluid. + } + } + } + } + } + } + + private static Map transformMaterial = TransformConstants.transformMaterial; + private static Map> transformToFallingTile = TransformConstants.transformToFallingTile; + + private void effectTiles() { + double radiusX = this.effectRadius.getX(); + double radiusY = this.effectRadius.getY(); + double radiusZ = this.effectRadius.getZ(); + World wld = this.world; + for (double z = -radiusZ; z <= radiusZ; ++z) { //Note to self - don't try and parallize things... + for (double y = -radiusY; y <= radiusY; ++y) { + for (double x = -radiusX; x <= radiusX; ++x) { + Vec3d d = new Vec3d(x, y, z); + Vec3d ellipse_ = d.multiply(1/radiusZ, 1/radiusY, 1/radiusX); + double ellipseFactor = ellipse_.dotProduct(ellipse_); + BlockPos pos = new BlockPos(d.add(this.origin)); + BlockState blockState = wld.getBlockState(pos); + Block block = blockState.getBlock(); + Material mat = blockState.getMaterial(); + if (mat != Material.AIR && block.getBlastResistance() < 1e6 && ellipseFactor < wld.random.nextDouble() && ellipseFactor < 1) { + if (transformMaterial.containsKey(mat)) { + wld.setBlockState(pos, transformMaterial.get(mat).getDefaultState()); + } else if (transformToFallingTile.containsKey(mat)) { //Prevent massive lag from creating falling entities - ensures gravity affected tiles have a solid tile beneath. + Material matBelow = wld.getBlockState(pos.down()).getMaterial(); + if (matBelow != Material.AIR && matBelow != Material.AGGREGATE) { + wld.setBlockState(pos, transformToFallingTile.get(mat).get(0).getDefaultState()); + } else { + wld.setBlockState(pos, transformToFallingTile.get(mat).get(1).getDefaultState()); + } + } else if (mat.isBurnable() && wld.getBlockState(pos.up()).getMaterial() == Material.AIR) { + wld.setBlockState(pos.up(), Blocks.FIRE.getDefaultState()); + } + + //else if (transform.containsKey(block)) { + // wld.setBlockState(pos, transform.get(block).getDefaultState()); + // } + } + } + } + } + } + + private void damageEntities() { + List list = this.world.getOtherEntities(this.entity, new Box(this.origin.subtract(effectRadius), this.origin.add(effectRadius))); + for (int x = 0; x < list.size(); ++x) { + Entity entity = (Entity)list.get(x); + Double distance = entity.getPos().distanceTo(this.origin); + Double effectFactor = Math.exp(-(0.01*distance)*(0.01*distance)); //IMPORTANT NOTE: We're treating all distances with the same effect falloff, but we need to use the ellipse formulae to calculate different falloffs that follow the ellipse shape. + entity.setVelocity(entity.getVelocity().add(entity.getPos().subtract(this.origin).add(0,0.2,0)).normalize().multiply(20*effectFactor)); //Knockback + if (!entity.isImmuneToExplosion() && entity.isLiving()) { + LivingEntity liveEntity = (LivingEntity)entity; + StatusEffects.POISON.applyUpdateEffect((LivingEntity)entity, 5); + // System.out.println(effectFactor); + liveEntity.damage(DamageSource.GENERIC, (float)(liveEntity.getMaxHealth()*effectFactor+2)); //Yeah, probably should use explosion damage source but whatever. + if (liveEntity.getHealth() <= 0) { + liveEntity.kill(); + } else { + liveEntity.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, (int)Math.floor(120*20*effectFactor), (int)Math.ceil(5*effectFactor))); + if (!liveEntity.isFireImmune()) { + liveEntity.setFireTicks(20); + } + } + } else if (entity.getType() == EntityType.ITEM) { + int rand = this.world.random.nextInt(11); + if (rand < 8) { //20% chance of item surviving + entity.remove(); + } + } + } + // List players = this.world.getPlayers(); //Was going to try some stuff with rendering a bright flash, but that seems way too hard... + // for (int x = 0; x < list.size(); ++x) { + // PlayerEntity player = players.get(x); + // } + } + + public void damageBlocksAndEntities() { + if (this.world.isClient) { + //this.world.playSound(this.origin.getX(), this.origin.getY(), this.origin.getZ(), SoundEvents.ENTITY_GENERIC_EXPLODE, SoundCategory.BLOCKS, 25.0F, (1.0F + (this.world.random.nextFloat() - this.world.random.nextFloat()) * 0.2F) * 0.7F, false); + this.world.playSound(this.origin.getX(), this.origin.getY(), this.origin.getZ(), NukeMod.FISSION_EXPLOSION, SoundCategory.BLOCKS, 25.0F, (1.0F + (this.world.random.nextFloat() - this.world.random.nextFloat()) * 0.2F) * 0.7F, false); + this.world.addParticle(NukeModClient.BIG_FOOKING_EXPLOSION_EMITTER, true, this.origin.getX(), this.origin.getY(), this.origin.getZ(), 1.0D, 0.0D, 0.0D); + this.world.addParticle(NukeModClient.BIG_FOOKING_SMOKE_EMITTER, true, this.origin.getX(), this.origin.getY(), this.origin.getZ(), 1.0D, 0.0D, 0.0D); + } else { + removeTiles(); + effectTiles(); + damageEntities(); //Apply damage to items created to reduce lag. + } + } +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/fission/FissionBlock.java b/src/main/java/io/github/npc_strider/NukeMod/fission/FissionBlock.java new file mode 100644 index 0000000..44466b2 --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/fission/FissionBlock.java @@ -0,0 +1,104 @@ +package io.github.npc_strider.NukeMod.fission; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.TntEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.ProjectileEntity; +// import net.minecraft.sound.SoundCategory; +// import net.minecraft.sound.SoundEvents; +import net.minecraft.text.LiteralText; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.explosion.Explosion; + +public class FissionBlock extends Block { //Copying code from TntBlock because I can't override some static stuff (private static void primeTnt method) + public FissionBlock(Settings settings) { + super(settings); + } + + public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { + if (!oldState.isOf(state.getBlock())) { + if (world.isReceivingRedstonePower(pos)) { + primeNuke(world, pos); + world.removeBlock(pos, false); + } + + } + } + + public void neighborUpdate(BlockState state, World world, BlockPos pos, Block block, BlockPos fromPos, boolean notify) { + if (world.isReceivingRedstonePower(pos)) { + primeNuke(world, pos); + world.removeBlock(pos, false); + } + + } + + public static void primeNuke(World world, BlockPos pos) { + primeNuke(world, pos, (LivingEntity)null); + } + + private static void primeNuke(World world, BlockPos pos, @Nullable LivingEntity igniter) { + if (!world.isClient) { + FissionEntity fissionEntity = new FissionEntity(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, igniter); + // FissionEntity fissionEntity = NukeMod.FISSION_ENTITY.create(world).updateFissionEntity(world, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, igniter); + + world.spawnEntity(fissionEntity); + // world.playSound((PlayerEntity)null, fissionEntity.getX(), fissionEntity.getY(), fissionEntity.getZ(), SoundEvents.BLOCK_CONDUIT_ACTIVATE, SoundCategory.BLOCKS, 1.0F, 1.0F); //test audio + } + } + + + + // Only explosive lenses + public void onDestroyedByExplosion(World world, BlockPos pos, Explosion explosion) { + if (!world.isClient) { + spawnFizzle( + world, + (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, + explosion.getCausingEntity() + ); + } + } + + // Only explosive lenses + public void onProjectileHit(World world, BlockState state, BlockHitResult hit, ProjectileEntity projectile) { + if (!world.isClient && projectile.isOnFire()) { + Entity entity = projectile.getOwner(); + BlockPos blockPos = hit.getBlockPos(); + spawnFizzle( + world, + (double)blockPos.getX() + 0.5D, (double)blockPos.getY(), (double)blockPos.getZ() + 0.5D, + entity instanceof LivingEntity ? (LivingEntity)entity : null + ); + world.removeBlock(blockPos, false); + } + } + + //Incomplete explosion - only explosive lenses detonate in a way that does not intiate fission + private static void spawnFizzle(World world, Double x, Double y, Double z, LivingEntity igniter) { + TntEntity tntEntity = new TntEntity(world, x, y, z, igniter); + // tntEntity.setFuse((short)(world.random.nextInt(tntEntity.getFuseTimer() / 4) + tntEntity.getFuseTimer() / 8)); + tntEntity.setFuse((short)(world.random.nextInt(tntEntity.getFuseTimer() / 24) + tntEntity.getFuseTimer() / 20)); + world.spawnEntity(tntEntity); + } + + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (!world.isClient) { + player.sendMessage(new LiteralText("Device ready: awaiting redstone signal . . ."), true); + } + return ActionResult.SUCCESS; + } + + public boolean shouldDropItemsOnExplosion(Explosion explosion) { + return false; + } +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/fission/FissionEntity.java b/src/main/java/io/github/npc_strider/NukeMod/fission/FissionEntity.java new file mode 100644 index 0000000..c4274d0 --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/fission/FissionEntity.java @@ -0,0 +1,186 @@ +package io.github.npc_strider.NukeMod.fission; + +import org.jetbrains.annotations.Nullable; + +import io.github.npc_strider.NukeMod.NukeMod; +import io.github.npc_strider.NukeMod.NukeModClient; +import io.github.npc_strider.NukeMod.entity.FastExplosion; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityDimensions; +import net.minecraft.entity.EntityPose; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.MovementType; +import net.minecraft.entity.TntEntity; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Packet; +import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; +import net.minecraft.sound.SoundCategory; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class FissionEntity extends Entity { // I frankly don't have time to mess about with extending TntEntity - just CTRL+C'd it + + private static final int FUSE_TIMER = 20*15; //Ticks + + private static final TrackedData FUSE; + @Nullable + private LivingEntity causingEntity; + private int fuseTimer; + + // private double RADIUS_X = 16; + private double RADIUS_X = 60; + private double RADIUS_Z = RADIUS_X; //Keep these the same! + // private double RADIUS_Y = 16; //I keep forgetting that minecraft vectors are weird and Z isn't the vertical axis... + private double RADIUS_Y = 96; //I keep forgetting that minecraft vectors are weird and Z isn't the vertical axis... + private Vec3d radius = new Vec3d(RADIUS_X, RADIUS_Y, RADIUS_Z); + + private double EFFECT_FACTOR = 3; //This is the radius to which effects such as radiation, vaporization and glassification occur.z + private Vec3d effectRadius = new Vec3d(Math.floor(RADIUS_X*EFFECT_FACTOR), Math.floor(RADIUS_Y*EFFECT_FACTOR), Math.floor(RADIUS_Z*EFFECT_FACTOR)); + + // public FissionEntity(World world, double x, double y, double z, @Nullable LivingEntity igniter) { + + protected FissionEntity(World world, double x, double y, double z, @Nullable LivingEntity igniter) { + this(NukeMod.FISSION_ENTITY, world); + this.updatePosition(x, y, z); + double d = world.random.nextDouble() * 6.2831854820251465D; + this.setVelocity(-Math.sin(d) * 0.02D, 0.20000000298023224D, -Math.cos(d) * 0.02D); + this.prevX = x; + this.prevY = y+5; + this.prevZ = z; + this.causingEntity = igniter; + // this(NukeMod.FISSION_ENTITY, world); + // super(world, x, y, z, igniter); //This calls the super implementation which results in the wrong tick method being used. + this.fuseTimer = FUSE_TIMER; + this.setFuse(FUSE_TIMER); + } + + public FissionEntity(@Nullable EntityType entityType, World world) { + super(entityType != null ? entityType : NukeMod.FISSION_ENTITY, world); + this.fuseTimer = FUSE_TIMER; + this.inanimate = true; + } + + @Override + public void tick() { + if (!this.hasNoGravity()) { + this.setVelocity(this.getVelocity().add(0.0D, -0.04D, 0.0D)); + } + + this.move(MovementType.SELF, this.getVelocity()); + this.setVelocity(this.getVelocity().multiply(0.98D)); + if (this.onGround) { + this.setVelocity(this.getVelocity().multiply(0.7D, -0.5D, 0.7D)); + } + + --this.fuseTimer; + if (this.fuseTimer <= 0) { + this.remove(); + this.explode(); + // if (!this.world.isClient) { + // this.explode(new Vec3d(this.getX(), this.getY(), this.getZ()), this.RADIUS_X, this.RADIUS_Y, this.RADIUS_Z); + // } + } else { + this.updateWaterState(); + // System.out.println(this.world.isClient); + if (this.world.isClient) { + double x = this.getX(); + double y = this.getY(); + double z = this.getZ(); + Vec3d v = this.getVelocity(); + double vx = v.getX(); + double vy = v.getY(); + double vz = v.getZ(); + for (int i = 0; i < 4; i++) { + spawnAlphaParticles(x, y, z, vx, vy, vz); + } + // this.world.addParticle(ParticleTypes.SMOKE, this.getX(), this.getY() + 0.5D, this.getZ(), 0.0D, 0.0D, 0.0D); + } + if (this.fuseTimer % 60 == 0 || this.fuseTimer == FUSE_TIMER - 1) { + world.playSound((PlayerEntity)null, this.getX(), this.getY(), this.getZ(), NukeMod.FISSION_ALARM, SoundCategory.BLOCKS, 15.0F, 1.0F); + } + } + } + + //Why use a custom explosion ? + //Because the vanilla method uses raytracing which works well for small explosions but does not scale to large explosions due to a limited number of rays. + //Also, raytracing is compartively more expensive/costly, which is evident by the lag generated by large explosions. + private void explode() { + //Vanilla method - small explosion // this.world.createExplosion(this, this.getX(), this.getBodyY(0.0625D), this.getZ(), 200.0F, Explosion.DestructionType.DESTROY); + FastExplosion explosion = new FastExplosion(this, radius, effectRadius, this.getPos(), this.world); + explosion.damageBlocksAndEntities(); + } + + private void spawnAlphaParticles(double x, double y, double z, double vx, double vy, double vz) { + this.world.addParticle( + NukeModClient.FISSION_PARTICLE, + true, + x + 0.0D + (random.nextDouble() - 0.5D) * 0.2D, + y + 0.7D + (random.nextDouble() - 0.5D) * 0.2D, + z + 0.0D + (random.nextDouble() - 0.5D) * 0.2D, + vx + (random.nextDouble() - 0.5D) * 0.25F, + vy + (random.nextDouble() - 0.0D) * 0.25F, + vz + (random.nextDouble() - 0.5D) * 0.25F + ); + } + + protected void initDataTracker() { + this.dataTracker.startTracking(FUSE, 80); + } + + protected boolean canClimb() { + return false; + } + + public boolean collides() { + return !this.removed; + } + + protected void writeCustomDataToTag(CompoundTag tag) { + tag.putShort("Fuse", (short)this.getFuseTimer()); + } + + protected void readCustomDataFromTag(CompoundTag tag) { + this.setFuse(tag.getShort("Fuse")); + } + + @Nullable + public LivingEntity getCausingEntity() { + return this.causingEntity; + } + + protected float getEyeHeight(EntityPose pose, EntityDimensions dimensions) { + return 0.15F; + } + + public void setFuse(int fuse) { + this.dataTracker.set(FUSE, fuse); + this.fuseTimer = fuse; + } + + public void onTrackedDataSet(TrackedData data) { + if (FUSE.equals(data)) { + this.fuseTimer = this.getFuse(); + } + } + + public int getFuse() { + return (Integer)this.dataTracker.get(FUSE); + } + + public int getFuseTimer() { + return this.fuseTimer; + } + + public Packet createSpawnPacket() { + return new EntitySpawnS2CPacket(this); + } + + static { + FUSE = DataTracker.registerData(TntEntity.class, TrackedDataHandlerRegistry.INTEGER); + } +} diff --git a/src/main/java/io/github/npc_strider/NukeMod/mixin/ClientEntityMixin.java b/src/main/java/io/github/npc_strider/NukeMod/mixin/ClientEntityMixin.java new file mode 100644 index 0000000..48c2fdf --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/mixin/ClientEntityMixin.java @@ -0,0 +1,91 @@ +// package io.github.npc_strider.NukeMod.mixin; +// import net.minecraft.client.network.ClientPlayNetworkHandler; +// import net.minecraft.entity.Entity; +// import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; +// 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.CallbackInfo; + +// import io.github.npc_strider.NukeMod.NukeMod; +// import io.github.npc_strider.NukeMod.fission.FissionEntity; + + +// @Mixin(ClientPlayNetworkHandler.class) +// public class Client { + +// @Inject(at = @At("TAIL"), method="onEntitySpawn") +// public void onEntitySpawn(EntitySpawnS2CPacket packet, CallbackInfo cbi) { +// System.out.l +// ClientPlayNetworkHandler cpnh = (ClientPlayNetworkHandler) (Object) this; + +// if (packet.getEntityTypeId() == NukeMod.FISSION_ENTITY_TYPE) { +// Entity e = new FissionEntity(null, cpnh.getWorld()); + +// int i = packet.getId(); +// e.updateTrackedPosition(packet.getX(), packet.getY(), packet.getZ()); +// e.pitch = (float)(packet.getPitch() * 360) / 256.0F; +// e.yaw = (float)(packet.getYaw() * 360) / 256.0F; +// e.setEntityId(i); +// e.setUuid(packet.getUuid()); +// cpnh.getWorld().addEntity(i, e); +// } +// } + +// } + +package io.github.npc_strider.NukeMod.mixin; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; +import net.minecraft.util.math.Vec3d; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import io.github.npc_strider.NukeMod.NukeMod; +import io.github.npc_strider.NukeMod.fission.FissionEntity; + +/* + Absolute bruh moment, wasted hours searching for the solution (why my non-living entity wasn't rendering/appearing on the clientside, including smoke and other effects...) + Found this solution here https://www.reddit.com/r/fabricmc/comments/g4xpm9/fabric_modding_custom_entity_rendering_on/. + The solution here https://www.reddit.com/r/fabricmc/comments/ft7ds1/entity_not_rendering/ works but it has a small (noticeable) delay until the client renders the entity, + so I'm using the first option. +*/ +@Mixin(ClientPlayNetworkHandler.class) +public abstract class ClientEntityMixin { + @Shadow + private ClientWorld world; + + @Inject( + method = "onEntitySpawn(Lnet/minecraft/network/packet/s2c/play/EntitySpawnS2CPacket;)V", + at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/network/packet/s2c/play/EntitySpawnS2CPacket;getEntityTypeId()Lnet/minecraft/entity/EntityType;"), + cancellable = true, + locals = LocalCapture.CAPTURE_FAILHARD + ) + private void onEntitySpawn(EntitySpawnS2CPacket packet, CallbackInfo ci, double x, double y, double z, EntityType type) { + Entity entity = null; + if (packet.getEntityTypeId() == NukeMod.FISSION_ENTITY_TYPE) { + entity = new FissionEntity(null, world); + } + if (entity != null) { + int entityId = packet.getId(); + entity.setVelocity(Vec3d.ZERO); + entity.updatePosition(x, y, z); + entity.updateTrackedPosition(x, y, z); + entity.pitch = (float) (packet.getPitch() * 360) / 256.0F; + entity.yaw = (float) (packet.getYaw() * 360) / 256.0F; + entity.setEntityId(entityId); + entity.setUuid(packet.getUuid()); + this.world.addEntity(entityId, entity); + ci.cancel(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/io/github/npc_strider/NukeMod/mixin/FireMixin.java b/src/main/java/io/github/npc_strider/NukeMod/mixin/FireMixin.java new file mode 100644 index 0000000..d1b11a1 --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/mixin/FireMixin.java @@ -0,0 +1,59 @@ +package io.github.npc_strider.NukeMod.mixin; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import io.github.npc_strider.NukeMod.fission.FissionBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.FireBlock; +import net.minecraft.block.TntBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +@Mixin(FireBlock.class) +public class FireMixin { + @Shadow + private int getSpreadChance(BlockState state) { + return 0; //I think this works?? + }; + + //private void trySpreadingFire(World world, BlockPos pos, int spreadFactor, Random rand, int currentAge) { + + @Inject( + method = "trySpreadingFire(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;ILjava/util/Random;I)V", + cancellable = true, + // remap = false, + at = @At("HEAD") + ) + private void trySpreadingFire(World world, BlockPos pos, int spreadFactor, Random rand, int currentAge, CallbackInfo callbackInfo) { + BlockState blockState = world.getBlockState(pos); + Block block = blockState.getBlock(); + if (block instanceof FissionBlock) { + int i = this.getSpreadChance(world.getBlockState(pos)); + if (rand.nextInt(spreadFactor) < i) { + TntBlock.primeTnt(world, pos); //Temporary + world.removeBlock(pos, false); + } + callbackInfo.cancel(); //Cannot just return when using inject mixin. Have to cancel first! + return; + } + }; +} +// +// +// +// @Mixin(ItemStack.class) //Why the fuck does this not compile??? It's copypasted from the fucking example documentation. https://fabricmc.net/wiki/tutorial:mixin_redirectors_methods +// //y'know what, IIIIIIIIIIII give up goodbye ! -Rick Astley +// abstract class ExampleMixin { +// @Redirect(method = "readTags", +// at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/item/ItemStack;fromTag(Lnet/minecraft/nbt/ListTag;)Lnet/minecraft/item/ItemStack;")) +// private static ItemStack returnNull(ListTag tag) { +// return null; +// } +// } \ No newline at end of file diff --git a/src/main/java/io/github/npc_strider/NukeMod/render/entity/FissionEntityRenderer.java b/src/main/java/io/github/npc_strider/NukeMod/render/entity/FissionEntityRenderer.java new file mode 100644 index 0000000..c29ac48 --- /dev/null +++ b/src/main/java/io/github/npc_strider/NukeMod/render/entity/FissionEntityRenderer.java @@ -0,0 +1,54 @@ +package io.github.npc_strider.NukeMod.render.entity; + +import io.github.npc_strider.NukeMod.NukeMod; +import io.github.npc_strider.NukeMod.fission.FissionEntity; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.TntMinecartEntityRenderer; +import net.minecraft.client.texture.SpriteAtlasTexture; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; + +@Environment(EnvType.CLIENT) +public class FissionEntityRenderer extends EntityRenderer { + + public FissionEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { + super(entityRenderDispatcher); + this.shadowRadius = 0.5F; + } + + public void render(FissionEntity tntEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { + matrixStack.push(); + matrixStack.translate(0.0D, 0.5D, 0.0D); + if ((float)tntEntity.getFuseTimer() - g + 1.0F < 10.0F) { + float h = 1.0F - ((float)tntEntity.getFuseTimer() - g + 1.0F) / 10.0F * 2.0F; + h = MathHelper.clamp(h, 0.0F, 1.0F); + h *= h; + h *= h; + float j = 1.0F + h * 0.3F; + matrixStack.scale(j, j, j); + } + + matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-90.0F)); + matrixStack.translate(-0.5D, -0.5D, 0.5D); + matrixStack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(90.0F)); + // FissionEntityRenderer.renderFlashingBlock(Blocks.WHITE_WOOL.getDefaultState(), matrixStack, vertexConsumerProvider, i, tntEntity.getFuseTimer() / 5 % 2 == 0); + TntMinecartEntityRenderer.renderFlashingBlock(NukeMod.FISSION_BLOCK.getDefaultState(), matrixStack, vertexConsumerProvider, i, tntEntity.getFuseTimer() / 5 % 2 == 0); + matrixStack.pop(); + super.render(tntEntity, f, g, matrixStack, vertexConsumerProvider, i); + } + + public Identifier getTexture(FissionEntity tntEntity) { + return SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE; + } +} + + + // MinecraftClient.getInstance().getBlockRenderManager().renderBlockAsEntity(Blocks.TNT.getDefaultState(), matrixStack, vertexConsumerProvider, i, (int)Math.floor(50*Math.sin(tntEntity.getFuseTimer()))); + // System.out.println((int)Math.floor(50*Math.sin(tntEntity.getFuseTimer()))); + \ No newline at end of file diff --git a/src/main/resources/NukeMod.mixins.json b/src/main/resources/NukeMod.mixins.json new file mode 100644 index 0000000..3eb4708 --- /dev/null +++ b/src/main/resources/NukeMod.mixins.json @@ -0,0 +1,15 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.npc_strider.NukeMod.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "FireMixin" + ], + "client": [ + "ClientEntityMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/assets/nuke-mod/blockstates/fission-device.json b/src/main/resources/assets/nuke-mod/blockstates/fission-device.json new file mode 100644 index 0000000..b281556 --- /dev/null +++ b/src/main/resources/assets/nuke-mod/blockstates/fission-device.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/e" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/nuke-mod/icon.png b/src/main/resources/assets/nuke-mod/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..047b91f2347de5cf95f23284476fddbe21ba23fe GIT binary patch literal 453 zcmV;$0XqJPP)QAFYGys`80vegN0XDFh0OXKz&i8?Le#x7{1X)R+00000NkvXXu0mjf73i~T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/nuke-mod/particles/big-explosion-emitter.json b/src/main/resources/assets/nuke-mod/particles/big-explosion-emitter.json new file mode 100644 index 0000000..5a93fec --- /dev/null +++ b/src/main/resources/assets/nuke-mod/particles/big-explosion-emitter.json @@ -0,0 +1 @@ +{"textures" : []} \ No newline at end of file diff --git a/src/main/resources/assets/nuke-mod/particles/big-explosion.json b/src/main/resources/assets/nuke-mod/particles/big-explosion.json new file mode 100644 index 0000000..7b53ead --- /dev/null +++ b/src/main/resources/assets/nuke-mod/particles/big-explosion.json @@ -0,0 +1,20 @@ +{ + "textures": [ + "minecraft:explosion_0", + "minecraft:explosion_1", + "minecraft:explosion_2", + "minecraft:explosion_3", + "minecraft:explosion_4", + "minecraft:explosion_5", + "minecraft:explosion_6", + "minecraft:explosion_7", + "minecraft:explosion_8", + "minecraft:explosion_9", + "minecraft:explosion_10", + "minecraft:explosion_11", + "minecraft:explosion_12", + "minecraft:explosion_13", + "minecraft:explosion_14", + "minecraft:explosion_15" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/nuke-mod/particles/big-smoke-emitter.json b/src/main/resources/assets/nuke-mod/particles/big-smoke-emitter.json new file mode 100644 index 0000000..5a93fec --- /dev/null +++ b/src/main/resources/assets/nuke-mod/particles/big-smoke-emitter.json @@ -0,0 +1 @@ +{"textures" : []} \ No newline at end of file diff --git a/src/main/resources/assets/nuke-mod/particles/big-smoke.json b/src/main/resources/assets/nuke-mod/particles/big-smoke.json new file mode 100644 index 0000000..f125834 --- /dev/null +++ b/src/main/resources/assets/nuke-mod/particles/big-smoke.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "minecraft:generic_7", + "minecraft:generic_6", + "minecraft:generic_5", + "minecraft:generic_4", + "minecraft:generic_3", + "minecraft:generic_2", + "minecraft:generic_1", + "minecraft:generic_0" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/nuke-mod/particles/fission-emission.json b/src/main/resources/assets/nuke-mod/particles/fission-emission.json new file mode 100644 index 0000000..f945bfa --- /dev/null +++ b/src/main/resources/assets/nuke-mod/particles/fission-emission.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "minecraft:generic_7", + "minecraft:generic_6", + "minecraft:generic_5", + "minecraft:generic_4", + "minecraft:generic_3", + "minecraft:generic_2", + "minecraft:generic_1", + "minecraft:generic_0" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/nuke-mod/sounds.json b/src/main/resources/assets/nuke-mod/sounds.json new file mode 100644 index 0000000..47e2af8 --- /dev/null +++ b/src/main/resources/assets/nuke-mod/sounds.json @@ -0,0 +1,14 @@ +{ + "fission-alarm": { + "subtitle": "subtitles.nuke-mod.fission-alarm", + "sounds": [ + "nuke-mod:fission-alarm" + ] + }, + "fission-explosion": { + "subtitle": "subtitles.nuke-mod.fission-explosion", + "sounds": [ + "nuke-mod:fission-explosion" + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/nuke-mod/sounds/fission-alarm.ogg b/src/main/resources/assets/nuke-mod/sounds/fission-alarm.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f82885996f57171930aa5c668a96707a89e76143 GIT binary patch literal 21312 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/nuke-mod/sounds/fission-explosion.ogg b/src/main/resources/assets/nuke-mod/sounds/fission-explosion.ogg new file mode 100644 index 0000000000000000000000000000000000000000..616bd5019f2d8248fe9dce0b389472c2c19e9427 GIT binary patch literal 55414 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.7.4", + "fabric": "*", + "minecraft": "1.16.x" + }, + "suggests": { + "another-mod": "*" + } +}