Compare commits

...

9 Commits

Author SHA1 Message Date
triphora
3666b36d09
Fix Modrinth download badge (#20)
v1 of Modrinth's API has been deprecated since January 2022 and is scheduled to begin breaking in February, with a complete breakage being done by March. This pull request has been created as a courtesy to update it to use the dedicated shields.io badge rather than manually constructing the API request.

After merging this PR, please also update any usages on other pages, for example a CurseForge and/or Modrinth project description, and also cherry-pick/copy these changes to any other branches you might have.
2023-03-13 08:56:38 +02:00
54c77dced0
Topcheto eu/sodium compatibility issue (#19)
* chore: clean up codebase, note sodium incompatibility

* fix: some rendering issues due to refactoring
2023-01-15 21:34:48 +02:00
D1p4k
b9357832fb
Now works. (#18)
fix: dependency issues
2023-01-15 12:27:11 +02:00
5e95b1547e
Merge pull request #17 from RaptaG/patch-1
Upgrade `yarn_mappings` to `1.19.2+build.20`
2022-10-11 01:15:27 +03:00
RaptaG
0deff2fb69
Upgrade yarn_mappings to 1.19.2+build.20 2022-10-10 20:34:02 +03:00
b876173ae2 chore: update gradlew 2022-10-10 19:16:30 +03:00
c565f74e47 fix: enable fog 2022-10-10 19:16:23 +03:00
658915ddb9
Merge pull request #14 from RaptaG/edits
Some patches
2022-09-22 15:25:42 +03:00
RaptaG
d49e797f0e
Small changes 2022-09-22 13:58:09 +03:00
15 changed files with 464 additions and 418 deletions

View File

@ -2,20 +2,23 @@
<img src="src/main/resources/assets/animated-chunks/icon.png" width="100"> <img src="src/main/resources/assets/animated-chunks/icon.png" width="100">
# Smooth Chunks # Animated Chunks
[![Mod Loader](https://img.shields.io/badge/Mod%20Loader-Fabric-lightyellow?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTEyLTE2VDE2OjU0OjE3LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHN0RXZ0OndoZW49IjIwMTgtMTItMTZUMTY6NTQ6MTctMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4/HiGMAAAAtUlEQVRYw+XXrQqAMBQF4D2P2eBL+QIG8RnEJFaNBjEum+0+zMQLtwwv+wV3ZzhhMDgfJ0wUSinxZUQWgKos1JP/AbD4OneIDyQPwCFniA+EJ4CaXm4TxAXCC0BNHgLhAdAnx9hC8PwGSRtAFVMQjF7cNTWED8B1cgwW20yfJgAvrssAsZ1cB3g/xckAxr6FmCDU5N6f488BrpCQ4rQBJkiMYh4ACmLzwOQF0CExinkCsvw7vgGikl+OotaKRwAAAABJRU5ErkJggg==)](https://fabricmc.net) [![Mod Loader](https://img.shields.io/badge/Mod%20Loader-Fabric-lightyellow?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE4LTEyLTE2VDE2OjU0OjE3LTA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wNy0yOFQyMToxNzo0OC0wNzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MGVkYjFjMmMtZmY4Yy1lNDQxLTkzMWYtNDk1ZDRmMTRjNzYwIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowZWRiMWMyYy1mZjhjLWU0NDEtOTMxZi00OTVkNGYxNGM3NjAiIHN0RXZ0OndoZW49IjIwMTgtMTItMTZUMTY6NTQ6MTctMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4/HiGMAAAAtUlEQVRYw+XXrQqAMBQF4D2P2eBL+QIG8RnEJFaNBjEum+0+zMQLtwwv+wV3ZzhhMDgfJ0wUSinxZUQWgKos1JP/AbD4OneIDyQPwCFniA+EJ4CaXm4TxAXCC0BNHgLhAdAnx9hC8PwGSRtAFVMQjF7cNTWED8B1cgwW20yfJgAvrssAsZ1cB3g/xckAxr6FmCDU5N6f488BrpCQ4rQBJkiMYh4ACmLzwOQF0CExinkCsvw7vgGikl+OotaKRwAAAABJRU5ErkJggg==)](https://fabricmc.net)
![Enviroment](https://img.shields.io/badge/Enviroment-Client-purple) ![Enviroment](https://img.shields.io/badge/Enviroment-Client-purple)
[![Modrinth](https://img.shields.io/badge/dynamic/json?color=158000&label=downloads&prefix=+%20&query=downloads&url=https://api.modrinth.com/api/v1/mod/animated-chunks&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMSAxMSIgd2lkdGg9IjE0LjY2NyIgaGVpZ2h0PSIxNC42NjciICB4bWxuczp2PSJodHRwczovL3ZlY3RhLmlvL25hbm8iPjxkZWZzPjxjbGlwUGF0aCBpZD0iQSI+PHBhdGggZD0iTTAgMGgxMXYxMUgweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNBKSI+PHBhdGggZD0iTTEuMzA5IDcuODU3YTQuNjQgNC42NCAwIDAgMS0uNDYxLTEuMDYzSDBDLjU5MSA5LjIwNiAyLjc5NiAxMSA1LjQyMiAxMWMxLjk4MSAwIDMuNzIyLTEuMDIgNC43MTEtMi41NTZoMGwtLjc1LS4zNDVjLS44NTQgMS4yNjEtMi4zMSAyLjA5Mi0zLjk2MSAyLjA5MmE0Ljc4IDQuNzggMCAwIDEtMy4wMDUtMS4wNTVsMS44MDktMS40NzQuOTg0Ljg0NyAxLjkwNS0xLjAwM0w4LjE3NCA1LjgybC0uMzg0LS43ODYtMS4xMTYuNjM1LS41MTYuNjk0LS42MjYuMjM2LS44NzMtLjM4N2gwbC0uMjEzLS45MS4zNTUtLjU2Ljc4Ny0uMzcuODQ1LS45NTktLjcwMi0uNTEtMS44NzQuNzEzLTEuMzYyIDEuNjUxLjY0NSAxLjA5OC0xLjgzMSAxLjQ5MnptOS42MTQtMS40NEE1LjQ0IDUuNDQgMCAwIDAgMTEgNS41QzExIDIuNDY0IDguNTAxIDAgNS40MjIgMCAyLjc5NiAwIC41OTEgMS43OTQgMCA0LjIwNmguODQ4QzEuNDE5IDIuMjQ1IDMuMjUyLjgwOSA1LjQyMi44MDljMi42MjYgMCA0Ljc1OCAyLjEwMiA0Ljc1OCA0LjY5MSAwIC4xOS0uMDEyLjM3Ni0uMDM0LjU2bC43NzcuMzU3aDB6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiM1ZGE0MjYiLz48L2c+PC9zdmc+)](https://modrinth.com/mod/animated-chunks)
[![CurseForge](https://cf.way2muchnoise.eu/full_animated-chunks_downloads.svg)](https://curseforge.com/minecraft/mc-mods/animated-chunks) [![Modrinth](https://img.shields.io/modrinth/dt/animated-chunks?color=00AF5C&label=downloads&logo=modrinth)](https://modrinth.com/mod/animated-chunks)
[![CurseForge](https://cf.way2muchnoise.eu/full_678609_downloads.svg)](https://curseforge.com/minecraft/mc-mods/animated-chunks)
An enhanecd fork of [cadenkriese's mod](https://github.com/cadenkriese/smooth-chunks) for the latest versions of the game, with a completely different code base. An enhanecd fork of [cadenkriese's mod](https://github.com/cadenkriese/smooth-chunks) for the latest versions of the game, with a completely different code base.
</div> </div>
**NOTE: This mod WILL NOT support Sodium, since Sodium doesn't render separate chunks, but whole regions, hence separate chunk animations are rendered impossible. Anyone interested in making sodium compatibility, be my guest**
## What is this? ## What is this?
Smooth Chunks is a Fabric mod that adds animations of currently loading chunks. This makes chunk loading generally seem much more pleasant than them appearing out of thin air. There are multiple built-in animations and ease types, and if this isnt't enough, there's an API which will allow you to add your own animations and eases <br/> (with ease :trollface:) Animated Chunks is a Fabric mod that adds animations of currently loading chunks. This makes chunk loading generally seem much more pleasant than them appearing out of thin air. There are multiple built-in animations and ease types, and if this isnt't enough, there's an API which will allow you to add your own animations and eases<br/>(with ease :trollface:)
Generally, this is what you'd call an "eye-candy" mod. Generally, this is what you'd call an "eye-candy" mod.

View File

@ -14,6 +14,10 @@ repositories {
maven { maven {
url "https://maven.terraformersmc.com/releases" url "https://maven.terraformersmc.com/releases"
} }
// maven {
// url "https://jitpack.io/"
// }
mavenLocal()
} }
dependencies { dependencies {
@ -50,6 +54,7 @@ dependencies {
// include("me.sargunvohra.mcmods:autoconfig1u:${project.autoconfig_version}") // include("me.sargunvohra.mcmods:autoconfig1u:${project.autoconfig_version}")
modImplementation("com.terraformersmc:modmenu:${project.modmenu_version}") modImplementation("com.terraformersmc:modmenu:${project.modmenu_version}")
// modImplementation("com.github.CaffeineMC:sodium-fabric:${project.sodium_version}")
} }

View File

@ -4,8 +4,8 @@ org.gradle.jvmargs=-Xmx4G
# Fabric Properties # Fabric Properties
minecraft_version=1.19.2 minecraft_version=1.19.2
yarn_mappings=1.19.2+build.17 yarn_mappings=1.19.2+build.28
loader_version=0.14.9 loader_version=0.14.12
# Mod Properties # Mod Properties
mod_version=0.3.0 mod_version=0.3.0
@ -13,5 +13,6 @@ maven_group=me.topchetoeu
archives_base_name=animated-chunks archives_base_name=animated-chunks
# Dependencies # Dependencies
fabric_version=[0.0.0,) fabric_version=0.72.0+1.19.2
modmenu_version=[4.0.0,) modmenu_version=4.1.2
# sodium_version=mc1.19.2-0.4.3

Binary file not shown.

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

269
gradlew vendored
View File

@ -1,7 +1,7 @@
#!/usr/bin/env sh #!/bin/sh
# #
# Copyright 2015 the original author or authors. # Copyright © 2015-2021 the original authors.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -17,67 +17,101 @@
# #
############################################################################## ##############################################################################
## #
## Gradle start up script for UN*X # Gradle start up script for POSIX generated by Gradle.
## #
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
############################################################################## ##############################################################################
# Attempt to set APP_HOME # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
PRG="$0" app_path=$0
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do # Need this for daisy-chained symlinks.
ls=`ls -ld "$PRG"` while
link=`expr "$ls" : '.*-> \(.*\)$'` APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
if expr "$link" : '/.*' > /dev/null; then [ -h "$app_path" ]
PRG="$link" do
else ls=$( ls -ld "$app_path" )
PRG=`dirname "$PRG"`"/$link" link=${ls#*' -> '}
fi case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle" APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"` APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # 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"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum" MAX_FD=maximum
warn () { warn () {
echo "$*" echo "$*"
} } >&2
die () { die () {
echo echo
echo "$*" echo "$*"
echo echo
exit 1 exit 1
} } >&2
# OS specific support (must be 'true' or 'false'). # OS specific support (must be 'true' or 'false').
cygwin=false cygwin=false
msys=false msys=false
darwin=false darwin=false
nonstop=false nonstop=false
case "`uname`" in case "$( uname )" in #(
CYGWIN* ) CYGWIN* ) cygwin=true ;; #(
cygwin=true Darwin* ) darwin=true ;; #(
;; MSYS* | MINGW* ) msys=true ;; #(
Darwin* ) NONSTOP* ) nonstop=true ;;
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java" JAVACMD=$JAVA_HOME/jre/sh/java
else else
JAVACMD="$JAVA_HOME/bin/java" JAVACMD=$JAVA_HOME/bin/java
fi fi
if [ ! -x "$JAVACMD" ] ; then if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
else else
JAVACMD="java" 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. 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 Please set the JAVA_HOME variable in your environment to match the
@ -106,80 +140,95 @@ location of your Java installation."
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
MAX_FD_LIMIT=`ulimit -H -n` case $MAX_FD in #(
if [ $? -eq 0 ] ; then max*)
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD=$( ulimit -H -n ) ||
MAX_FD="$MAX_FD_LIMIT" warn "Could not query maximum file descriptor limit"
fi esac
ulimit -n $MAX_FD case $MAX_FD in #(
if [ $? -ne 0 ] ; then '' | soft) :;; #(
warn "Could not set maximum file descriptor limit: $MAX_FD" *)
fi ulimit -n "$MAX_FD" ||
else warn "Could not set maximum file descriptor limit to $MAX_FD"
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 esac
fi fi
# Escape application args # Collect all arguments for the java command, stacking in reverse order:
save () { # * args from the command line
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done # * the main class name
echo " " # * -classpath
} # * -D...appname settings
APP_ARGS=`save "$@"` # * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules # For Cygwin or MSYS, switch paths to Windows format before running java
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@" exec "$JAVACMD" "$@"

View File

@ -5,11 +5,10 @@ import java.io.File;
import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi; import com.terraformersmc.modmenu.api.ModMenuApi;
import me.topchetoeu.animatedchunks.Manager.RegisterEvent;
import me.topchetoeu.animatedchunks.animation.Animation; import me.topchetoeu.animatedchunks.animation.Animation;
import me.topchetoeu.animatedchunks.animation.FallAnimation; import me.topchetoeu.animatedchunks.animation.FallAnimation;
import me.topchetoeu.animatedchunks.animation.FlyInAnimation; import me.topchetoeu.animatedchunks.animation.FlyInAnimation;
import me.topchetoeu.animatedchunks.animation.ProgressManager; import me.topchetoeu.animatedchunks.animation.Animator;
import me.topchetoeu.animatedchunks.animation.RiseAnimation; import me.topchetoeu.animatedchunks.animation.RiseAnimation;
import me.topchetoeu.animatedchunks.animation.ScaleAnimation; import me.topchetoeu.animatedchunks.animation.ScaleAnimation;
import me.topchetoeu.animatedchunks.easing.Ease; import me.topchetoeu.animatedchunks.easing.Ease;
@ -20,54 +19,27 @@ import me.topchetoeu.animatedchunks.easing.SineEase;
import me.topchetoeu.animatedchunks.gui.AnimatedChunksScreen; import me.topchetoeu.animatedchunks.gui.AnimatedChunksScreen;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents;
import net.fabricmc.fabric.api.event.Event;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
public final class AnimatedChunks implements ClientModInitializer, ModMenuApi { public final class AnimatedChunks implements ClientModInitializer, ModMenuApi {
private static AnimatedChunks instance; private static AnimatedChunks instance;
/**
* Gets the currently running instance of this mod
*/
public static AnimatedChunks getInstance() { public static AnimatedChunks getInstance() {
return instance; return instance;
} }
/** /**
* An event, fired once, when eases are being registered * The animator used by the mod. Used to manage animation progress and animate chunks
*/ */
public final Event<RegisterEvent<Ease>> EASES_REGISTERING = Manager.createEvent(); public final Animator animator;
/** /**
* An event, fired once, when animations are being registered * The config manager used by the mod. Used to save/load config from disk
*/ */
public final Event<RegisterEvent<Animation>> ANIMATIONS_REGISTERING = Manager.createEvent(); public final ConfigManager config;
private ProgressManager progress;
private ConfigManager config;
private Manager<Ease> ease;
private Manager<Animation> animation;
/**
* Gets the config manager
*/
public ConfigManager getConfigManager() {
return config;
}
/**
* Gets the chunk progress manager
*/
public ProgressManager getProgressManager() {
return progress;
}
/**
* Gets the animation manager
*/
public Manager<Animation> getAnimationManager() {
return animation;
}
/**
* Gets the ease manager
*/
public Manager<Ease> getEaseManager() {
return ease;
}
private static void registerEases(Manager<Ease> manager) { private static void registerEases(Manager<Ease> manager) {
manager.register(new Descriptor<>(new LinearEase(), "linear") manager.register(new Descriptor<>(new LinearEase(), "linear")
@ -121,34 +93,35 @@ public final class AnimatedChunks implements ClientModInitializer, ModMenuApi {
@Override public void onInitializeClient() { @Override public void onInitializeClient() {
instance = this; instance = this;
progress = new ProgressManager();
ease = new Manager<>(x -> 1);
ease.get()
.description("Ends the animation as soon as it has started.")
.displayName("No animation");
animation = new Manager<>((a, b, c, d, e, f, g, h) -> {});
animation.get()
.description("Does nothing.")
.displayName("No animation");
registerEases(ease);
registerAnimations(animation);
config = new ConfigManager(new File("config/animated-chunks.dat"), animation, ease, progress);
EASES_REGISTERING.invoker().register(ease);
ANIMATIONS_REGISTERING.invoker().register(animation);
ClientChunkEvents.CHUNK_UNLOAD.register((world, chunk) -> { ClientChunkEvents.CHUNK_UNLOAD.register((world, chunk) -> {
BlockPos pos = chunk.getPos().getStartPos(); BlockPos pos = chunk.getPos().getStartPos();
progress.unload(pos.getX(), pos.getY(), pos.getZ()); animator.unload(pos.getX(), pos.getY(), pos.getZ());
}); });
} }
@Override @Override
public ConfigScreenFactory<?> getModConfigScreenFactory() { public ConfigScreenFactory<?> getModConfigScreenFactory() {
return (Screen parent) -> { return (Screen parent) -> {
var _this = getInstance(); var _this = getInstance();
return new AnimatedChunksScreen(parent, _this.animation, _this.ease, _this.config, _this.progress); return new AnimatedChunksScreen(parent, _this.config, _this.animator);
}; };
} }
public AnimatedChunks() {
var eases = new Manager<>(new Descriptor<Ease>(x -> 1, "default")
.author("TopchetoEU")
.description("Ends the animation as soon as it has started.")
.displayName("No animation")
);
var animations = new Manager<>(new Descriptor<Animation>((a, b, c, d, e, f, g, h) -> {}, "default")
.author("TopchetoEU")
.description("Does nothing.")
.displayName("No animation")
);
registerEases(eases);
registerAnimations(animations);
animator = new Animator(animations, eases);
config = new ConfigManager(new File("config/animated-chunks.dat"), animator);
}
} }

View File

@ -9,15 +9,11 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import me.topchetoeu.animatedchunks.animation.Animation; import me.topchetoeu.animatedchunks.animation.Animator;
import me.topchetoeu.animatedchunks.animation.ProgressManager;
import me.topchetoeu.animatedchunks.easing.Ease;
public class ConfigManager { public class ConfigManager {
public final File configFile; public final File configFile;
private final Manager<Animation> animation; private final Animator animator;
private final Manager<Ease> ease;
private final ProgressManager progress;
private String readString(InputStream reader) throws IOException { private String readString(InputStream reader) throws IOException {
String res = ""; String res = "";
@ -56,9 +52,9 @@ public class ConfigManager {
reader.close(); reader.close();
this.animation.set(animation); this.animator.ANIMATIONS.set(animation);
this.ease.set(ease); this.animator.EASES.set(ease);
this.progress.setDuration(duration); this.animator.setDuration(duration);
} }
catch (IOException e) { catch (IOException e) {
save(); save();
@ -67,9 +63,9 @@ public class ConfigManager {
public void save() { public void save() {
try { try {
var writer = new FileOutputStream(configFile); var writer = new FileOutputStream(configFile);
writeString(writer, animation.get().getName()); writeString(writer, this.animator.ANIMATIONS.get().getName());
writeString(writer, ease.get().getName()); writeString(writer, this.animator.EASES.get().getName());
writer.write(ByteBuffer.allocate(4).putFloat(progress.getDuration()).array()); writer.write(ByteBuffer.allocate(4).putFloat(animator.getDuration()).array());
writer.close(); writer.close();
} }
catch (IOException e) { catch (IOException e) {
@ -77,11 +73,9 @@ public class ConfigManager {
} }
} }
public ConfigManager(File configFile, Manager<Animation> animation, Manager<Ease> ease, ProgressManager progress) { public ConfigManager(File configFile, Animator animator) {
this.configFile = configFile; this.configFile = configFile;
this.animation = animation; this.animator = animator;
this.ease = ease;
this.progress = progress;
reload(); reload();
} }

View File

@ -7,21 +7,7 @@ import java.util.Map;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public final class Manager<T> { public final class Manager<T> {
public static interface RegisterEvent<T> {
public void register(Manager<T> manager);
}
public static final <T> Event<RegisterEvent<T>> createEvent() {
return EventFactory.createArrayBacked(RegisterEvent.class, (listeners) -> (manager) -> {
for (RegisterEvent<T> listener: listeners) {
listener.register(manager);
}
});
}
private String currName = null; private String currName = null;
private Map<String, Descriptor<T>> objects = new Hashtable<>(); private Map<String, Descriptor<T>> objects = new Hashtable<>();
@ -75,8 +61,8 @@ public final class Manager<T> {
return Collections.unmodifiableCollection(objects.values()); return Collections.unmodifiableCollection(objects.values());
} }
public Manager(T _default) { public Manager(Descriptor<T> _default) {
register(new Descriptor<>(_default, "default").displayName("Default").author("TopchetoEU")); register(_default);
set("default"); set("default");
} }
} }

View File

@ -4,7 +4,13 @@ import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Hashtable; import java.util.Hashtable;
public final class ProgressManager { import me.topchetoeu.animatedchunks.Manager;
import me.topchetoeu.animatedchunks.easing.Ease;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Vector3d;
import net.minecraft.util.math.BlockPos;
public final class Animator {
public static class ChunkLoc { public static class ChunkLoc {
public final int x; public final int x;
public final int y; public final int y;
@ -14,7 +20,6 @@ public final class ProgressManager {
public boolean equals(Object obj) { public boolean equals(Object obj) {
return obj instanceof ChunkLoc && ((ChunkLoc)obj).x == x && ((ChunkLoc)obj).y == y && ((ChunkLoc)obj).z == z; return obj instanceof ChunkLoc && ((ChunkLoc)obj).x == x && ((ChunkLoc)obj).y == y && ((ChunkLoc)obj).z == z;
} }
@Override @Override
public int hashCode() { public int hashCode() {
return 137 * x + 149 * y + 163 * z; return 137 * x + 149 * y + 163 * z;
@ -27,12 +32,16 @@ public final class ProgressManager {
} }
} }
public final Manager<Animation> ANIMATIONS;
public final Manager<Ease> EASES;
private Hashtable<ChunkLoc, Float> chunkToStage = new Hashtable<>(); private Hashtable<ChunkLoc, Float> chunkToStage = new Hashtable<>();
private HashSet<ChunkLoc> chunks = new HashSet<>(); private HashSet<ChunkLoc> chunks = new HashSet<>();
private float duration = 1; private float duration = 1;
public ProgressManager() { public Animator(Manager<Animation> animations, Manager<Ease> eases) {
ANIMATIONS = animations;
EASES = eases;
} }
public float getDuration() { public float getDuration() {
@ -143,4 +152,33 @@ public final class ProgressManager {
if (!chunkToStage.containsKey(new ChunkLoc(x, y, z))) return 1f; if (!chunkToStage.containsKey(new ChunkLoc(x, y, z))) return 1f;
return chunkToStage.get(new ChunkLoc(x, y, z)); return chunkToStage.get(new ChunkLoc(x, y, z));
} }
public void animate(MatrixStack matrices, float progress, BlockPos chunkPos, Vector3d playerPos) {
if (progress < 0) progress = 0;
if (progress > 1) progress = 1;
if (progress < 0.999) {
float _progress = EASES.getValue().ease(progress);
ANIMATIONS.getValue().animate(
_progress, matrices,
chunkPos.getX() * 16, chunkPos.getY() * 16, chunkPos.getZ() * 16,
(float)playerPos.x, (float)playerPos.y, (float)playerPos.z
);
// matrices.translate(0, 0, 16);
}
}
public void animate(MatrixStack matrices, BlockPos chunkPos, Vector3d playerPos) {
if (!isChunkLoaded(chunkPos.getX(), chunkPos.getY(), chunkPos.getZ())) {
matrices.scale(0, 0, 0);
}
else {
animate(matrices, getChunkProgress(chunkPos.getX(), chunkPos.getY(), chunkPos.getZ()), chunkPos, playerPos);
}
}
public void animate(MatrixStack matrices, BlockPos chunkPos) {
animate(matrices, chunkPos, new Vector3d(0, 0, 0));
}
public void animate(MatrixStack matrices, float progress, BlockPos chunkPos) {
animate(matrices, progress, chunkPos, new Vector3d(0, 0, 0));
}
} }

View File

@ -9,19 +9,15 @@ import net.minecraft.util.Formatting;
import net.minecraft.util.math.ColorHelper.Argb; import net.minecraft.util.math.ColorHelper.Argb;
import me.topchetoeu.animatedchunks.ConfigManager; import me.topchetoeu.animatedchunks.ConfigManager;
import me.topchetoeu.animatedchunks.Manager; import me.topchetoeu.animatedchunks.Manager;
import me.topchetoeu.animatedchunks.animation.Animation; import me.topchetoeu.animatedchunks.animation.Animator;
import me.topchetoeu.animatedchunks.animation.ProgressManager;
import me.topchetoeu.animatedchunks.easing.Ease;
import me.topchetoeu.animatedchunks.gui.Section.OrderType; import me.topchetoeu.animatedchunks.gui.Section.OrderType;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
public class AnimatedChunksScreen extends Screen { public class AnimatedChunksScreen extends Screen {
public final Screen parent; public final Screen parent;
private final HorizontalSection mainSection = new HorizontalSection(); private final HorizontalSection mainSection = new HorizontalSection();
private final Manager<Animation> animation;
private final Manager<Ease> ease;
private final ConfigManager config; private final ConfigManager config;
private final ProgressManager progress; private final Animator animator;
public static void playClick() { public static void playClick() {
MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0f)); MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0f));
@ -65,7 +61,7 @@ public class AnimatedChunksScreen extends Screen {
res.x = res.y = 5; res.x = res.y = 5;
res.title = Text.of("Preview:"); res.title = Text.of("Preview:");
res.children.addSelectableChild(new ChunkPreview(0, 0, 150, 150)); res.children.addSelectableChild(new ChunkPreview(0, 0, 150, 150, animator));
return res; return res;
} }
@ -100,10 +96,10 @@ public class AnimatedChunksScreen extends Screen {
private Section durationSection() { private Section durationSection() {
var res = new HorizontalSection(); var res = new HorizontalSection();
res.setTargetWidth(width / 2); res.setTargetWidth(width / 2);
var input = new NumberInput(res, 5, 5, progress.getDuration(), (sender, val) -> { var input = new NumberInput(res, 5, 5, animator.getDuration(), (sender, val) -> {
if (val <= 0) sender.invalid = true; if (val <= 0) sender.invalid = true;
else { else {
progress.setDuration(val); animator.setDuration(val);
sender.invalid = false; sender.invalid = false;
} }
}); });
@ -117,18 +113,16 @@ public class AnimatedChunksScreen extends Screen {
var res = new HorizontalSection(); var res = new HorizontalSection();
res.x = res.y = 5; res.x = res.y = 5;
res.title = Text.of("Animation config:"); res.title = Text.of("Animation config:");
res.children.addSelectableChild(selectionSection(animation, "Animation")); res.children.addSelectableChild(selectionSection(animator.ANIMATIONS, "Animation"));
res.children.addSelectableChild(selectionSection(ease, "Ease")); res.children.addSelectableChild(selectionSection(animator.EASES, "Ease"));
res.children.addSelectableChild(durationSection()); res.children.addSelectableChild(durationSection());
return res; return res;
} }
public AnimatedChunksScreen(Screen parent, Manager<Animation> animation, Manager<Ease> ease, ConfigManager config, ProgressManager progress) { public AnimatedChunksScreen(Screen parent, ConfigManager config, Animator animator) {
super(Text.of("Animated Chunks Config")); super(Text.of("Animated Chunks Config"));
config.reload(); config.reload();
this.progress = progress; this.animator = animator;
this.animation = animation;
this.ease = ease;
this.config = config; this.config = config;
mainSection.x = mainSection.y = 5; mainSection.x = mainSection.y = 5;

View File

@ -5,7 +5,7 @@ import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import me.topchetoeu.animatedchunks.AnimatedChunks; import me.topchetoeu.animatedchunks.animation.Animator;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.Drawable;
import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.gui.DrawableHelper;
@ -20,6 +20,7 @@ import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Matrix4f; import net.minecraft.util.math.Matrix4f;
import net.minecraft.util.math.Quaternion; import net.minecraft.util.math.Quaternion;
import net.minecraft.util.math.Vec3f; import net.minecraft.util.math.Vec3f;
@ -31,8 +32,10 @@ public class ChunkPreview extends DrawableHelper implements Drawable, Element, S
void onClick(); void onClick();
} }
public ClickAction clickAction;
public final MinecraftClient client; public final MinecraftClient client;
public final Animator animator;
public ClickAction clickAction;
private boolean clicked = false; private boolean clicked = false;
private boolean rotating = false; private boolean rotating = false;
private boolean focused = false; private boolean focused = false;
@ -158,23 +161,30 @@ public class ChunkPreview extends DrawableHelper implements Drawable, Element, S
RenderSystem.enableBlend(); RenderSystem.enableBlend();
} }
private void renderChunk(MatrixStack matrices, int x, int y, int n, float delta) { private void renderChunk(MatrixStack matrices, int x, int y, int n, float delta) {
duration = animator.getDuration();
float progress = globalProgress / duration - (float)Math.sqrt(x * x + y * y) / (float)n / 2;
if (progress > 1) progress = 1;
if (progress <= 0) return;
matrices.push(); matrices.push();
matrices.translate(x * 16 - 8, 0, y * 16 - 8); matrices.translate(x * 16 - 8, 0, y * 16 - 8);
// x += n; // x += n;
// y += n; // y += n;
float progress = globalProgress / duration - (float)Math.sqrt(x * x + y * y) / (float)n / 2; animator.animate(matrices, progress, new BlockPos(x * 16, 0, y * 16));
if (progress < 0) progress = 0;
if (progress > 1) progress = 1; // if (progress < 0) progress = 0;
if (progress < 0.999) { // if (progress > 1) progress = 1;
float _progress = AnimatedChunks.getInstance().getEaseManager().getValue().ease(progress); // if (progress < 0.999) {
AnimatedChunks.getInstance().getAnimationManager().getValue().animate( // float _progress = animator.EASES.getValue().ease(progress);
_progress, matrices, // AnimatedChunks.getInstance().getAnimationManager().getValue().animate(
x * 16, 0, y * 16, 0, 0, 0 // _progress, matrices,
); // x * 16, 0, y * 16, 0, 0, 0
// matrices.translate(0, 0, 16); // );
} // // matrices.translate(0, 0, 16);
// }
matrices.translate(0, 0, 16); matrices.translate(0, 0, 16);
matrices.multiply(rotation); matrices.multiply(rotation);
myFill(matrices, 2, 1, 14, 2, progress, 1, 1, 1); myFill(matrices, 2, 1, 14, 2, progress, 1, 1, 1);
@ -185,7 +195,6 @@ public class ChunkPreview extends DrawableHelper implements Drawable, Element, S
matrices.pop(); matrices.pop();
} }
private void renderChunks(MatrixStack matrices, float delta, int n) { private void renderChunks(MatrixStack matrices, float delta, int n) {
duration = AnimatedChunks.getInstance().getProgressManager().getDuration();
// globalProgress += (lastTime - (lastTime = System.nanoTime())) / -1000000000f; // globalProgress += (lastTime - (lastTime = System.nanoTime())) / -1000000000f;
globalProgress += delta * 0.05f; globalProgress += delta * 0.05f;
matrices.push(); matrices.push();
@ -316,16 +325,18 @@ public class ChunkPreview extends DrawableHelper implements Drawable, Element, S
return false; return false;
} }
public ChunkPreview(int x, int y) { public ChunkPreview(int x, int y, Animator animator) {
this.client = MinecraftClient.getInstance(); this.client = MinecraftClient.getInstance();
this.x = x; this.x = x;
this.y = y; this.y = y;
this.animator = animator;
} }
public ChunkPreview(int x, int y, int w, int h) { public ChunkPreview(int x, int y, int w, int h, Animator animator) {
this.client = MinecraftClient.getInstance(); this.client = MinecraftClient.getInstance();
this.x = x; this.x = x;
this.y = y; this.y = y;
this.width = w; this.width = w;
this.height = h; this.height = h;
this.animator = animator;
} }
} }

View File

@ -11,12 +11,12 @@ import net.minecraft.util.math.BlockPos;
// From flogic's mod // From flogic's mod
@Mixin(ChunkBuilder.BuiltChunk.class) @Mixin(ChunkBuilder.BuiltChunk.class)
abstract class BuiltChunkMixin { public abstract class BuiltChunkMixin {
@Inject(method = "clear", at = @At(value = "TAIL"), cancellable = true) @Inject(method = "clear", at = @At(value = "TAIL"), cancellable = true)
public void clear(CallbackInfo ci) { public void clear(CallbackInfo ci) {
// ci.cancel(); // ci.cancel();
// return; // return;
BlockPos origin = ((ChunkBuilder.BuiltChunk)(Object)this).getOrigin(); BlockPos origin = ((ChunkBuilder.BuiltChunk)(Object)this).getOrigin();
AnimatedChunks.getInstance().getProgressManager().unload(origin.getX(), 0, origin.getZ()); AnimatedChunks.getInstance().animator.unload(origin.getX(), 0, origin.getZ());
} }
} }

View File

@ -11,6 +11,8 @@ import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.render.WorldRenderer.ChunkInfo; import net.minecraft.client.render.WorldRenderer.ChunkInfo;
import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk; import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Vector3d;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Matrix4f; import net.minecraft.util.math.Matrix4f;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -22,22 +24,17 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import it.unimi.dsi.fastutil.objects.ObjectListIterator; import it.unimi.dsi.fastutil.objects.ObjectListIterator;
import me.topchetoeu.animatedchunks.AnimatedChunks; import me.topchetoeu.animatedchunks.AnimatedChunks;
import me.topchetoeu.animatedchunks.animation.ProgressManager;
@Mixin(WorldRenderer.class) @Mixin(WorldRenderer.class)
abstract class WorldRendererMixin { public abstract class WorldRendererMixin {
private long lastTime = System.nanoTime(); private long lastTime = System.nanoTime();
@Accessor abstract BuiltChunkStorage getChunks(); @Accessor abstract BuiltChunkStorage getChunks();
private ProgressManager getProgressManager() {
return AnimatedChunks.getInstance().getProgressManager();
}
@Inject(method = "render", at = @At(value = "HEAD")) @Inject(method = "render", at = @At(value = "HEAD"))
private void renderStart(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f positionMatrix, CallbackInfo ci) { private void renderStart(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f positionMatrix, CallbackInfo ci) {
long currTime = System.nanoTime(); long currTime = System.nanoTime();
getProgressManager().tick((currTime - lastTime) / 1000000000f); AnimatedChunks.getInstance().animator.tick((currTime - lastTime) / 1000000000f);
lastTime = currTime; lastTime = currTime;
} }
@ -51,7 +48,7 @@ abstract class WorldRendererMixin {
if (playerY < 0) chunkY--; if (playerY < 0) chunkY--;
if (playerZ < 0) chunkZ--; if (playerZ < 0) chunkZ--;
getProgressManager().unloadAllFar((int)((WorldRenderer)(Object)this).getViewDistance(), chunkX, chunkY, chunkZ); AnimatedChunks.getInstance().animator.unloadAllFar((int)((WorldRenderer)(Object)this).getViewDistance(), chunkX, chunkY, chunkZ);
} }
@Inject(method = "renderLayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/VertexBuffer;drawElements()V"), locals=LocalCapture.CAPTURE_FAILHARD) @Inject(method = "renderLayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/VertexBuffer;drawElements()V"), locals=LocalCapture.CAPTURE_FAILHARD)
private void renderChunkBefore(RenderLayer renderLayer, MatrixStack matrices, double playerX, double playerY, double playerZ, Matrix4f positionMatrix, CallbackInfo ci, private void renderChunkBefore(RenderLayer renderLayer, MatrixStack matrices, double playerX, double playerY, double playerZ, Matrix4f positionMatrix, CallbackInfo ci,
@ -59,30 +56,26 @@ abstract class WorldRendererMixin {
matrices.push(); matrices.push();
int x = chunk.getOrigin().getX(); AnimatedChunks.getInstance().animator.animate(matrices, new BlockPos(chunk.getOrigin().getX(), 0, chunk.getOrigin().getZ()), new Vector3d(playerX, playerY, playerZ));
int y = chunk.getOrigin().getY();
int z = chunk.getOrigin().getZ();
shader.fogStart.set(Float.POSITIVE_INFINITY); // if (getProgressManager().isChunkLoaded(x, 0, z)) {
// float progress = getProgressManager().getChunkProgress(x, 0, z);
if (getProgressManager().isChunkLoaded(x, 0, z)) { // if (progress < 0.999) {
float progress = getProgressManager().getChunkProgress(x, 0, z); // progress = AnimatedChunks.getInstance().getEaseManager().getValue().ease(progress);
if (progress < 0.999) { // float centerX = (float)playerX - x;
progress = AnimatedChunks.getInstance().getEaseManager().getValue().ease(progress); // float centerY = (float)playerY - y;
// float centerZ = (float)playerZ - z;
float centerX = (float)playerX - x; // matrices.translate(-centerX, -centerY, -centerZ);
float centerY = (float)playerY - y; // AnimatedChunks.getInstance().getAnimationManager().getValue().animate(progress, matrices, x, y, z, (float)playerX, (float)playerY, (float)playerZ);
float centerZ = (float)playerZ - z; // matrices.translate(centerX, centerY, centerZ);
// }
matrices.translate(-centerX, -centerY, -centerZ); // }
AnimatedChunks.getInstance().getAnimationManager().getValue().animate(progress, matrices, x, y, z, (float)playerX, (float)playerY, (float)playerZ); // else {
matrices.translate(centerX, centerY, centerZ); // matrices.scale(0, 0, 0);
} // }
}
else {
matrices.scale(0, 0, 0);
}
shader.modelViewMat.set(matrices.peek().getPositionMatrix()); shader.modelViewMat.set(matrices.peek().getPositionMatrix());
matrices.pop(); matrices.pop();
@ -93,6 +86,6 @@ abstract class WorldRendererMixin {
boolean _1, ObjectListIterator<?> _2, Shader shader, GlUniform _4, ChunkInfo _6, BuiltChunk chunk) { boolean _1, ObjectListIterator<?> _2, Shader shader, GlUniform _4, ChunkInfo _6, BuiltChunk chunk) {
int x = chunk.getOrigin().getX(); int x = chunk.getOrigin().getX();
int z = chunk.getOrigin().getZ(); int z = chunk.getOrigin().getZ();
getProgressManager().load(x, 0, z); AnimatedChunks.getInstance().animator.load(x, 0, z);
} }
} }

View File

@ -3,7 +3,7 @@
"id": "animated-chunks", "id": "animated-chunks",
"version": "0.3.0", "version": "0.3.0",
"name": "Animated Chunks", "name": "Animated Chunks",
"description": "animated chunk load animations.", "description": "Animated chunk load animations.",
"authors": [ "TopchetoEU" ], "authors": [ "TopchetoEU" ],
"license": "MIT", "license": "MIT",
"icon": "assets/animated-chunks/icon.png", "icon": "assets/animated-chunks/icon.png",
@ -27,7 +27,6 @@
"modmenu": ">=4.0.0" "modmenu": ">=4.0.0"
}, },
"breaks": { "breaks": {
"sodium": "*", "sodium": "*"
"iris": "*"
} }
} }