Compare commits

..

No commits in common. "b9d128a647c7bb80014666b9fdced2e23d485ccc" and "bba99d4e6a38bf88c9b737918a7bf429715b4ee7" have entirely different histories.

38 changed files with 808 additions and 1391 deletions

View file

@ -19,11 +19,11 @@ jobs:
build-and-create-release: build-and-create-release:
needs: check-release-exists needs: check-release-exists
if: ${{ needs.check-release-exists.outputs.status == '404' }} if: ${{ needs.check-release-exists.outputs.status == '404' }}
runs-on: highmem_self runs-on: any_archLinux
steps: steps:
- run: git clone --depth=1 --no-single-branch https://git.seodisparate.com/stephenseo/TurnBasedMinecraftMod.git TurnBasedMinecraftMod - run: git clone --depth=1 --no-single-branch https://git.seodisparate.com/stephenseo/TurnBasedMinecraftMod.git TurnBasedMinecraftMod
- run: cd TurnBasedMinecraftMod && git checkout ${GITHUB_REF_NAME} - run: cd TurnBasedMinecraftMod && git checkout ${GITHUB_REF_NAME}
- run: cd TurnBasedMinecraftMod && sed -i '/org.gradle.jvmargs/s/Xmx[0-9]\+[mMgG]/Xmx1024m/' gradle.properties && echo 'neogradle.subsystems.decompiler.maxThreads=1' >> gradle.properties - run: cd TurnBasedMinecraftMod && sed -i '/org.gradle.jvmargs/s/Xmx[0-9]\+m/Xmx1024m/' gradle.properties && echo 'neogradle.subsystems.decompiler.maxThreads=1' >> gradle.properties
- run: cd TurnBasedMinecraftMod && ./gradlew --console=plain build - run: cd TurnBasedMinecraftMod && ./gradlew --console=plain build
- run: cd TurnBasedMinecraftMod/build/libs && find . -type f -regex '.*all.jar$' -exec sha256sum '{}' ';' -exec bash -c 'sha256sum {} >> sha256sums.txt' ';' && java --version >> javaVersion.txt && javac --version >> javaVersion.txt - run: cd TurnBasedMinecraftMod/build/libs && find . -type f -regex '.*all.jar$' -exec sha256sum '{}' ';' -exec bash -c 'sha256sum {} >> sha256sums.txt' ';' && java --version >> javaVersion.txt && javac --version >> javaVersion.txt
- name: Create release and attach jar - name: Create release and attach jar

View file

@ -1,24 +1,5 @@
# Upcoming changes # Upcoming changes
# Version NeoForge-1.26.0
Make it possible to open the client-config from the Mod-list GUI.
Port to NeoForge 21.1.69 (Minecraft 1.21.1).
Fix volume handling of battle/silly music. (Previous implementation did not
properly reduce volume based on Minecraft's "music volume" setting.)
Move client-config to NeoForge's configuration.
Add GUI to edit client-config that can be opened with /tbm-client-edit command.
Add option in client-config to set battle/silly music volume, and an option for
whether or not battle/silly music volume is affected by global music volume
setting and whether or not it is affected by master volume setting.
Added Armadillo, Bogged, and Breeze to mob list in config.
# Version NeoForge-1.25.2 # Version NeoForge-1.25.2
Fix invalid use of throwable potions. (Previously, the Player would "drink" Fix invalid use of throwable potions. (Previously, the Player would "drink"

View file

@ -37,8 +37,7 @@ usually because a new entry has been added, the existing config is renamed to a
a timestamp in the filename of when it was replaced. One can set a config option in the a timestamp in the filename of when it was replaced. One can set a config option in the
config to prevent it being overwritten if necessary. config to prevent it being overwritten if necessary.
Some options in the config file only affect the Server, and ~~some only affect the Client~~. Some options in the config file only affect the Server, and some only affect the Client.
Client config has been moved to a separate system provided by NeoForge.
When playing multiplayer, some configuration of the config on the server may be needed. When playing multiplayer, some configuration of the config on the server may be needed.
# Features # Features
@ -73,7 +72,7 @@ configured for them.)
Simply invoke `./gradlew build` in the mod directory and after some time the Simply invoke `./gradlew build` in the mod directory and after some time the
finished jar will be saved at finished jar will be saved at
`build/libs/TurnBasedMinecraft-NeoForge-1.26.0-all.jar` `build/libs/TurnBasedMinecraft-NeoForge-1.25.2-all.jar`
# Reproducibility # Reproducibility

View file

@ -1,197 +1,119 @@
plugins { plugins {
id 'java-library' id 'eclipse'
id 'idea'
id 'maven-publish' id 'maven-publish'
id 'net.neoforged.moddev' version '1.0.20' id 'net.neoforged.gradle.userdev' version '7.0.80'
}
tasks.named('wrapper', Wrapper).configure {
// Define wrapper values here so as to not have to always do so when updating gradlew.properties.
// Switching this to Wrapper.DistributionType.ALL will download the full gradle sources that comes with
// documentation attached on cursor hover of gradle classes and methods. However, this comes with increased
// file size for Gradle. If you do switch this to ALL, run the Gradle wrapper task twice afterwards.
// (Verify by checking gradle/wrapper/gradle-wrapper.properties to see if distributionUrl now points to `-all`)
distributionType = Wrapper.DistributionType.BIN
} }
version = mod_version version = mod_version
group = mod_group_id group = mod_group_id
archivesBaseName = "TurnBasedMinecraft-NeoForge"
repositories { java.toolchain.languageVersion = JavaLanguageVersion.of(17)
mavenLocal()
flatDir {
dir 'libs'
}
}
base {
archivesName = "TurnBasedMinecraft-NeoForge"
}
// Mojang ships Java 21 to end users starting in 1.20.5, so mods should target Java 21.
java.toolchain.languageVersion = JavaLanguageVersion.of(21)
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
neoForge { jarJar.enable()
// Specify the version of NeoForge to use.
version = project.neo_version
parchment { // Default run configurations.
mappingsVersion = project.parchment_mappings_version // These can be tweaked, removed, or duplicated as needed.
minecraftVersion = project.parchment_minecraft_version runs {
// applies to all the run configs below
configureEach {
// Recommended logging data for a userdev environment
// The markers can be added/remove as needed separated by commas.
// "SCAN": For mods scan.
// "REGISTRIES": For firing of registry events.
// "REGISTRYDUMP": For getting the contents of all registries.
systemProperty 'forge.logging.markers', 'REGISTRIES'
// Recommended logging level for the console
// You can set various levels here.
// Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
systemProperty 'forge.logging.console.level', 'debug'
modSource project.sourceSets.main
} }
// This line is optional. Access Transformers are automatically detected client {
// accessTransformers = project.files('src/main/resources/META-INF/accesstransformer.cfg') // Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
// Default run configurations.
// These can be tweaked, removed, or duplicated as needed.
runs {
client {
client()
// Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
}
server {
server()
programArgument '--nogui'
systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
}
// This run config launches GameTestServer and runs all registered gametests, then exits.
// By default, the server will crash when no gametests are provided.
// The gametest system is also enabled by default for other run configs under the /test command.
gameTestServer {
type = "gameTestServer"
systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
}
data {
data()
// example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it
// gameDirectory = project.file('run-data')
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
}
// applies to all the run configs above
configureEach {
// Recommended logging data for a userdev environment
// The markers can be added/remove as needed separated by commas.
// "SCAN": For mods scan.
// "REGISTRIES": For firing of registry events.
// "REGISTRYDUMP": For getting the contents of all registries.
systemProperty 'forge.logging.markers', 'REGISTRIES'
// Recommended logging level for the console
// You can set various levels here.
// Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
logLevel = org.slf4j.event.Level.DEBUG
}
} }
mods { server {
// define mod <-> source bindings systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
// these are used to tell the game which sources are for which mod programArgument '--nogui'
// mostly optional in a single mod project }
// but multi mod projects should define one per mod
"${mod_id}" { // This run config launches GameTestServer and runs all registered gametests, then exits.
sourceSet(sourceSets.main) // By default, the server will crash when no gametests are provided.
} // The gametest system is also enabled by default for other run configs under the /test command.
gameTestServer {
systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
}
data {
// example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it
// workingDirectory project.file('run-data')
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
} }
} }
// Include resources generated by data generators. // Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' } sourceSets.main.resources { srcDir 'src/generated/resources' }
// Sets up a dependency configuration called 'localRuntime'. repositories {
// This configuration should be used instead of 'runtimeOnly' to declare flatDir {
// a dependency that will be present for runtime testing but that is dir 'libs'
// "optional", meaning it will not be pulled by dependents of this mod. }
configurations {
runtimeClasspath.extendsFrom localRuntime
} }
dependencies { dependencies {
// Example optional mod dependency with JEI // Specify the version of Minecraft to use.
// The JEI API is declared for compile time use, while the full JEI artifact is used at runtime // Depending on the plugin applied there are several options. We will assume you applied the userdev plugin as shown above.
// compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}" // The group for userdev is net.neoforged, the module name is neoforge, and the version is the same as the neoforge version.
// compileOnly "mezz.jei:jei-${mc_version}-neoforge-api:${jei_version}" // You can however also use the vanilla plugin (net.neoforged.gradle.vanilla) to use a version of Minecraft without the neoforge loader.
// We add the full version to localRuntime, not runtimeOnly, so that we do not publish a dependency on it // And its provides the option to then use net.minecraft as the group, and one of; client, server or joined as the module name, plus the game version as version.
// localRuntime "mezz.jei:jei-${mc_version}-neoforge:${jei_version}" // For all intends and purposes: You can treat this dependency as if it is a normal library you would use.
implementation "net.neoforged:neoforge:${neo_version}"
// Example mod dependency using a mod jar from ./libs with a flat dir repository
// This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar
// The group id is ignored when searching -- in this case, it is "blank"
// implementation "blank:coolmod-${mc_version}:${coolmod_version}"
// Example mod dependency using a file as dependency
// implementation files("libs/coolmod-${mc_version}-${coolmod_version}.jar")
// Example project dependency using a sister or child project:
// implementation project(":myproject")
// For more info:
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html
// implementation "net.neoforged:neoforge:${neo_version}"
// implementation files('libs/javamp3-1.0.3.jar') // implementation files('libs/javamp3-1.0.3.jar')
implementation 'fr.delthas:javamp3:1.0.3' implementation 'fr.delthas:javamp3:1.0.3'
implementation 'com.github.stephengold:j-ogg-vorbis:1.0.4' implementation 'com.github.stephengold:j-ogg-vorbis:1.0.4'
jarJar(implementation("fr.delthas:javamp3")) { jarJar(group: 'fr.delthas', name: 'javamp3', version: '[1.0.0,2.0.0)') {
version { jarJar.pin(it, '1.0.3')
strictly '[1.0.0,2.0.0)'
prefer '1.0.3'
}
} }
jarJar(implementation("com.github.stephengold:j-ogg-vorbis")) { jarJar(group: 'com.github.stephengold', name: 'j-ogg-vorbis', version: '[1.0.4, 2.0.0)') {
version { jarJar.pin(it, '1.0.4')
strictly '[1.0.4,2.0.0)'
prefer '1.0.4'
}
} }
} }
// This block of code expands all declared replace properties in the specified resource targets. // This block of code expands all declared replace properties in the specified resource targets.
// A missing property will result in an error. Properties are expanded using ${} Groovy notation. // A missing property will result in an error. Properties are expanded using ${} Groovy notation.
var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { // When "copyIdeResources" is enabled, this will also run before the game launches in IDE environments.
// See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html
tasks.withType(ProcessResources).configureEach {
var replaceProperties = [ var replaceProperties = [
minecraft_version : minecraft_version, minecraft_version : minecraft_version, minecraft_version_range: minecraft_version_range,
minecraft_version_range: minecraft_version_range, neo_version : neo_version, neo_version_range: neo_version_range,
neo_version : neo_version, loader_version_range: loader_version_range,
neo_version_range : neo_version_range, mod_id : mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version,
loader_version_range : loader_version_range, mod_authors : mod_authors, mod_description: mod_description,
mod_id : mod_id,
mod_name : mod_name,
mod_license : mod_license,
mod_version : mod_version,
mod_authors : mod_authors,
mod_description : mod_description
] ]
inputs.properties replaceProperties inputs.properties replaceProperties
expand replaceProperties
from "src/main/templates" filesMatching(['META-INF/mods.toml']) {
into "build/generated/sources/modMetadata" expand replaceProperties + [project: project]
}
} }
// Include the output of "generateModMetadata" as an input directory for the build
// this works with both building through Gradle and the IDE.
sourceSets.main.resources.srcDir generateModMetadata
// To avoid having to run "generateModMetadata" manually, make it run on every project reload
neoForge.ideSyncTask generateModMetadata
// Example for how to get properties into the manifest for reading by the runtime.. // Example for how to get properties into the manifest for reading by the runtime..
jar { jar {
archiveClassifier = 'all' archiveClassifier = 'slim'
manifest { manifest {
attributes([ attributes([
"Specification-Title": "TurnBasedMinecraftMod", "Specification-Title": "TurnBasedMinecraftMod",
@ -215,11 +137,3 @@ tasks.withType(AbstractArchiveTask).configureEach {
tasks.withType(JavaCompile).configureEach { tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
} }
// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior.
idea {
module {
downloadSources = true
downloadJavadoc = true
}
}

View file

@ -1,31 +1,25 @@
# Sets default memory used for gradle commands. Can be overridden by user or command line properties. org.gradle.jvmargs=-Xmx4096m
org.gradle.jvmargs=-Xmx1G
org.gradle.daemon=false org.gradle.daemon=false
org.gradle.parallel=true org.gradle.debug=false
org.gradle.caching=true
org.gradle.configuration-cache=true
#read more on this at https://github.com/neoforged/ModDevGradle?tab=readme-ov-file#better-minecraft-parameter-names--javadoc-parchment #read more on this at https://github.com/neoforged/NeoGradle/blob/NG_7.0/README.md#apply-parchment-mappings
# you can also find the latest versions at: https://parchmentmc.org/docs/getting-started # you can also find the latest versions at: https://parchmentmc.org/docs/getting-started
parchment_minecraft_version=1.21 neogradle.subsystems.parchment.minecraftVersion=1.20.3
parchment_mappings_version=2024.07.28 neogradle.subsystems.parchment.mappingsVersion=2023.12.31
# Environment Properties # Environment Properties
# You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge # You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge
# The Minecraft version must agree with the Neo version to get a valid artifact # The Minecraft version must agree with the Neo version to get a valid artifact
minecraft_version=1.21.1 minecraft_version=1.20.4
# The Minecraft version range can use any release version of Minecraft as bounds. # The Minecraft version range can use any release version of Minecraft as bounds.
# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly # Snapshots, pre-releases, and release candidates are not guaranteed to sort properly
# as they do not follow standard versioning conventions. # as they do not follow standard versioning conventions.
minecraft_version_range=[1.21.1, 1.22) minecraft_version_range=[1.20.4,1.21)
# The Neo version must agree with the Minecraft version to get a valid artifact # The Neo version must agree with the Minecraft version to get a valid artifact
neo_version=21.1.69 neo_version=20.4.109-beta
# The Neo version range can use any version of Neo as bounds # The Neo version range can use any version of Neo as bounds
neo_version_range=[21.1.0,) neo_version_range=[20.4,)
# The loader version range can only use the major version of FML as bounds # The loader version range can only use the major version of FML as bounds
loader_version_range=[4,) loader_version_range=[2,)
## Mod Properties ## Mod Properties
@ -37,7 +31,7 @@ mod_name=TurnBasedMinecraftMod
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=MIT mod_license=MIT
# The mod version. See https://semver.org/ # The mod version. See https://semver.org/
mod_version=1.26.0 mod_version=1.25.2
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources. # This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html # See https://maven.apache.org/guides/mini/guide-naming-conventions.html

Binary file not shown.

View file

@ -1,7 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

34
gradlew vendored
View file

@ -15,8 +15,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -57,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -85,9 +83,10 @@ done
# This is normally unused # This is normally unused
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit # 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. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -134,13 +133,10 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
if ! command -v java >/dev/null 2>&1 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
@ -148,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045 # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
@ -156,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045 # shellcheck disable=SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -201,15 +197,11 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# Collect all arguments for the java command: # * put everything else in single quotes, so that it's not re-expanded.
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \

22
gradlew.bat vendored
View file

@ -13,8 +13,6 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@ -45,11 +43,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2 echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo. 1>&2 echo.
echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation. 1>&2 echo location of your Java installation.
goto fail goto fail
@ -59,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. 1>&2 echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo. 1>&2 echo.
echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation. 1>&2 echo location of your Java installation.
goto fail goto fail

View file

@ -1,6 +1,5 @@
pluginManagement { pluginManagement {
repositories { repositories {
mavenLocal()
gradlePluginPortal() gradlePluginPortal()
maven { maven {
url = 'https://maven.neoforged.net/releases' url = 'https://maven.neoforged.net/releases'
@ -11,5 +10,5 @@ pluginManagement {
} }
plugins { plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
} }

View file

@ -275,16 +275,16 @@ public class BattleGui extends Screen {
setState(MenuState.ATTACK_TARGET); setState(MenuState.ATTACK_TARGET);
break; break;
case DEFEND: case DEFEND:
PacketDistributor.sendToServer(new PacketBattleDecision( PacketDistributor.SERVER.noArg().send(new PacketBattleDecision(
TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.DEFEND.getValue(), 0)); TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.DEFEND, 0));
setState(MenuState.WAITING); setState(MenuState.WAITING);
break; break;
case ITEM: case ITEM:
setState(MenuState.ITEM_ACTION); setState(MenuState.ITEM_ACTION);
break; break;
case FLEE: case FLEE:
PacketDistributor.sendToServer(new PacketBattleDecision( PacketDistributor.SERVER.noArg().send(new PacketBattleDecision(
TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.FLEE.getValue(), 0)); TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), Battle.Decision.FLEE, 0));
setState(MenuState.WAITING); setState(MenuState.WAITING);
break; break;
case ATTACK_TARGET: case ATTACK_TARGET:
@ -313,9 +313,9 @@ public class BattleGui extends Screen {
protected void entityButtonActionEvent(EntitySelectionButton button, ButtonAction action) { protected void entityButtonActionEvent(EntitySelectionButton button, ButtonAction action) {
if (action.equals(ButtonAction.ATTACK_TARGET)) { if (action.equals(ButtonAction.ATTACK_TARGET)) {
PacketDistributor.sendToServer( PacketDistributor.SERVER.noArg().send(
new PacketBattleDecision(TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), new PacketBattleDecision(TurnBasedMinecraftMod.proxy.getLocalBattle().getId(),
Battle.Decision.ATTACK.getValue(), ((EntitySelectionButton) button).getID())); Battle.Decision.ATTACK, ((EntitySelectionButton) button).getID()));
setState(MenuState.WAITING); setState(MenuState.WAITING);
} else { } else {
setState(MenuState.MAIN_MENU); setState(MenuState.MAIN_MENU);
@ -325,18 +325,18 @@ public class BattleGui extends Screen {
protected void itemButtonActionEvent(ItemSelectionButton button, ButtonAction action) { protected void itemButtonActionEvent(ItemSelectionButton button, ButtonAction action) {
switch (action) { switch (action) {
case DO_ITEM_SWITCH: case DO_ITEM_SWITCH:
PacketDistributor.sendToServer( PacketDistributor.SERVER.noArg().send(
new PacketBattleDecision(TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), new PacketBattleDecision(TurnBasedMinecraftMod.proxy.getLocalBattle().getId(),
Battle.Decision.SWITCH_ITEM.getValue(), button.getID())); Battle.Decision.SWITCH_ITEM, button.getID()));
if (button.getID() >= 0 && button.getID() < 9) { if (button.getID() >= 0 && button.getID() < 9) {
Minecraft.getInstance().player.getInventory().selected = button.getID(); Minecraft.getInstance().player.getInventory().selected = button.getID();
} }
setState(MenuState.WAITING); setState(MenuState.WAITING);
break; break;
case DO_USE_ITEM: case DO_USE_ITEM:
PacketDistributor.sendToServer( PacketDistributor.SERVER.noArg().send(
new PacketBattleDecision(TurnBasedMinecraftMod.proxy.getLocalBattle().getId(), new PacketBattleDecision(TurnBasedMinecraftMod.proxy.getLocalBattle().getId(),
Battle.Decision.USE_ITEM.getValue(), button.getID())); Battle.Decision.USE_ITEM, button.getID()));
setState(MenuState.WAITING); setState(MenuState.WAITING);
break; break;
default: default:

View file

@ -259,7 +259,7 @@ public class BattleMusic
// set volume // set volume
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(BattleMusic.percentageToDecibels(volume)); gainControl.setValue(volume * 20.0f - 20.0f); // in decibels
clip.loop(Clip.LOOP_CONTINUOUSLY); clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start(); clip.start();
@ -387,17 +387,6 @@ public class BattleMusic
return !sillyMusic.isEmpty(); return !sillyMusic.isEmpty();
} }
/// Percentage must be between 0 and 1.
public static float percentageToDecibels(float percentage) {
if (percentage > 1.0F) {
return 0.0F;
} else if (percentage <= 0.0F) {
return Float.NEGATIVE_INFINITY;
} else {
return (float) (Math.log10(percentage) * 20.0);
}
}
private class MP3Streamer implements Runnable private class MP3Streamer implements Runnable
{ {
private AtomicBoolean keepPlaying; private AtomicBoolean keepPlaying;
@ -449,7 +438,7 @@ public class BattleMusic
sdl.open(audioFormat); sdl.open(audioFormat);
{ {
FloatControl volumeControl = (FloatControl) sdl.getControl(FloatControl.Type.MASTER_GAIN); FloatControl volumeControl = (FloatControl) sdl.getControl(FloatControl.Type.MASTER_GAIN);
volumeControl.setValue(BattleMusic.percentageToDecibels(volume)); volumeControl.setValue(volume * 20.0f - 20.0f); // in decibels
} }
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
@ -547,7 +536,7 @@ public class BattleMusic
sdl.open(audioFormat); sdl.open(audioFormat);
{ {
FloatControl volumeControl = (FloatControl) sdl.getControl(FloatControl.Type.MASTER_GAIN); FloatControl volumeControl = (FloatControl) sdl.getControl(FloatControl.Type.MASTER_GAIN);
volumeControl.setValue(BattleMusic.percentageToDecibels(volume)); volumeControl.setValue(volume * 20.0f - 20.0f); // in decibels
} }
AudioInputStream ais = reader.getAudioInputStream(oggVorbisFile); AudioInputStream ais = reader.getAudioInputStream(oggVorbisFile);

View file

@ -1,68 +0,0 @@
package com.burnedkirby.TurnBasedMinecraft.client;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import net.neoforged.neoforge.common.ModConfigSpec;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
import java.util.List;
public class ClientConfig {
public static final ClientConfig CLIENT;
public static final ModConfigSpec CLIENT_SPEC;
static {
Pair<ClientConfig, ModConfigSpec> pair =
new ModConfigSpec.Builder().configure(ClientConfig::new);
CLIENT = pair.getKey();
CLIENT_SPEC = pair.getValue();
}
public final ModConfigSpec.ConfigValue<List<? extends String>> battleMusicList;
public final ModConfigSpec.ConfigValue<List<? extends String>> sillyMusicList;
public final ModConfigSpec.DoubleValue sillyMusicThreshold;
public final ModConfigSpec.BooleanValue volumeAffectedByMasterVolume;
public final ModConfigSpec.BooleanValue volumeAffectedByMusicVolume;
public final ModConfigSpec.DoubleValue musicVolume;
ClientConfig(ModConfigSpec.Builder builder) {
//builder.push("music");
List<String> battleMusicList = new ArrayList<String>(8);
battleMusicList.add("monster");
battleMusicList.add("animal");
battleMusicList.add("boss");
battleMusicList.add("player");
this.battleMusicList = builder.comment("What categories of mobs that play \"battle\" music")
.translation(TurnBasedMinecraftMod.MODID + ".clientconfig.battle_music_list")
.defineList("battleMusicList", battleMusicList, (v) -> v instanceof String);
List<String> sillyMusicList = new ArrayList<String>(4);
sillyMusicList.add("passive");
this.sillyMusicList = builder.comment("What categories of mobs that play \"silly\" music")
.translation(TurnBasedMinecraftMod.MODID + ".clientconfig.silly_music_list")
.defineList("sillyMusicList", sillyMusicList, (v) -> true);
this.sillyMusicThreshold =
builder.comment("Minimum percentage of silly entities in battle to use silly music")
.translation(TurnBasedMinecraftMod.MODID + ".clientconfig.silly_percentage")
.defineInRange("sillyMusicThreshold", 0.4, 0.0, 1.0);
this.volumeAffectedByMasterVolume = builder.comment(
"If \"true\", music volume will be affected by global Master volume setting")
.translation(TurnBasedMinecraftMod.MODID + ".clientconfig.volume_affected_by_master")
.define("volumeAffectedByMasterVolume", true);
this.volumeAffectedByMusicVolume = builder.comment(
"If \"true\", music volume will be affected by global Music volume setting")
.translation(TurnBasedMinecraftMod.MODID + ".clientconfig.volume_affected_by_volume")
.define("volumeAffectedByMusicVolume", true);
this.musicVolume =
builder.comment("Volume of battle/silly music as a percentage between 0.0 and 1.0")
.translation(TurnBasedMinecraftMod.MODID + ".clientconfig.music_volume")
.defineInRange("musicVolume", 0.7, 0.0, 1.0);
//builder.pop();
}
}

View file

@ -1,264 +0,0 @@
package com.burnedkirby.TurnBasedMinecraft.client;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.*;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.neoforged.fml.ModContainer;
import java.util.ArrayList;
import java.util.List;
public class ClientConfigGui extends net.minecraft.client.gui.screens.Screen {
private final int widget_height = 20;
private boolean dirtyFlag;
private boolean accepted;
private EditBox battleListEditBox = null;
private EditBox sillyListEditBox = null;
private SliderPercentage sillyMusicThresholdSlider = null;
private Checkbox affectedByMasterVolCheckbox = null;
private Checkbox affectedByMusicVolCheckbox = null;
private SliderPercentage volumeSlider = null;
public ClientConfigGui(ModContainer container, Screen parent) {
super(Component.literal("TurnBasedMC Client Config"));
dirtyFlag = true;
accepted = false;
}
public void onDirty() {
clearWidgets();
// Initialize GUI elements.
int widget_x_offset = 5;
int widget_width = this.width / 2 - widget_x_offset * 2;
int top_offset = 5;
addRenderableWidget(
new StringWidget(this.width / 2 - widget_width + widget_x_offset, top_offset,
widget_width, widget_height, Component.literal("Battle Music Categories"),
font));
if (battleListEditBox == null) {
battleListEditBox =
new EditBox(font, this.width / 2 + widget_x_offset, top_offset, widget_width,
widget_height, Component.literal("Battle Music Categories Edit Box"));
} else {
battleListEditBox.setPosition(this.width / 2 + widget_x_offset, top_offset);
battleListEditBox.setSize(widget_width, widget_height);
}
String tempString = "";
for (String category : ClientConfig.CLIENT.battleMusicList.get()) {
if (tempString.isEmpty()) {
tempString = category;
} else {
tempString += "," + category;
}
}
battleListEditBox.setMaxLength(128);
battleListEditBox.setValue(tempString);
addRenderableWidget(battleListEditBox);
top_offset += widget_height;
addRenderableWidget(
new StringWidget(this.width / 2 - widget_width + widget_x_offset, top_offset,
widget_width, widget_height, Component.literal("Silly Music Categories"),
font));
if (sillyListEditBox == null) {
sillyListEditBox =
new EditBox(font, this.width / 2 + widget_x_offset, top_offset, widget_width,
widget_height, Component.literal("Silly Music Categories Edit Box"));
} else {
sillyListEditBox.setPosition(this.width / 2 + widget_x_offset, top_offset);
sillyListEditBox.setSize(widget_width, widget_height);
}
tempString = "";
for (String category : ClientConfig.CLIENT.sillyMusicList.get()) {
if (tempString.isEmpty()) {
tempString = category;
} else {
tempString += "," + category;
}
}
sillyListEditBox.setMaxLength(128);
sillyListEditBox.setValue(tempString);
addRenderableWidget(sillyListEditBox);
top_offset += widget_height;
StringWidget stringWidget =
new StringWidget(this.width / 2 - widget_width + widget_x_offset, top_offset,
widget_width, widget_height, Component.literal("Silly Music Threshold"), font);
stringWidget.setTooltip(Tooltip.create(
Component.literal("Ratio of minimum of silly mobs in battle to play silly music")));
addRenderableWidget(stringWidget);
if (sillyMusicThresholdSlider == null) {
sillyMusicThresholdSlider =
new SliderPercentage(this.width / 2 + widget_x_offset, top_offset, widget_width,
widget_height, Component.literal("Silly Music Threshold: " +
String.format("%.1f%%", ClientConfig.CLIENT.sillyMusicThreshold.get() * 100.0)),
ClientConfig.CLIENT.sillyMusicThreshold.get(), "Silly Music Threshold: ");
} else {
sillyMusicThresholdSlider.setPosition(this.width / 2 + widget_x_offset, top_offset);
sillyMusicThresholdSlider.setSize(widget_width, widget_height);
}
addRenderableWidget(sillyMusicThresholdSlider);
top_offset += widget_height;
stringWidget =
new StringWidget(this.width / 2 - widget_width + widget_x_offset, top_offset,
widget_width, widget_height, Component.literal("Affected by Master Vol."),
font);
stringWidget.setTooltip(Tooltip.create(
Component.literal("If enabled, volume is affected by global master volume.")));
addRenderableWidget(stringWidget);
if (affectedByMasterVolCheckbox == null) {
affectedByMasterVolCheckbox = Checkbox.builder(Component.literal(""), font)
.pos(this.width / 2 + widget_x_offset, top_offset).build();
} else {
affectedByMasterVolCheckbox.setPosition(this.width / 2 + widget_x_offset,
top_offset);
}
if ((ClientConfig.CLIENT.volumeAffectedByMasterVolume.get() &&
!affectedByMasterVolCheckbox.selected()) ||
(!ClientConfig.CLIENT.volumeAffectedByMasterVolume.get() &&
affectedByMasterVolCheckbox.selected())) {
affectedByMasterVolCheckbox.onPress();
}
addRenderableWidget(affectedByMasterVolCheckbox);
top_offset += widget_height;
stringWidget =
new StringWidget(this.width / 2 - widget_width + widget_x_offset, top_offset,
widget_width, widget_height, Component.literal("Affected by Music Vol."), font);
stringWidget.setTooltip(Tooltip.create(
Component.literal("If enabled, volume is affected by global music volume.")));
addRenderableWidget(stringWidget);
if (affectedByMusicVolCheckbox == null) {
affectedByMusicVolCheckbox = Checkbox.builder(Component.literal(""), font)
.pos(this.width / 2 + widget_x_offset, top_offset).build();
} else {
affectedByMusicVolCheckbox.setPosition(this.width / 2 + widget_x_offset,
top_offset);
}
if ((ClientConfig.CLIENT.volumeAffectedByMusicVolume.get() &&
!affectedByMusicVolCheckbox.selected()) ||
(!ClientConfig.CLIENT.volumeAffectedByMusicVolume.get() &&
affectedByMusicVolCheckbox.selected())) {
affectedByMusicVolCheckbox.onPress();
}
addRenderableWidget(affectedByMusicVolCheckbox);
top_offset += widget_height;
stringWidget =
new StringWidget(this.width / 2 - widget_width + widget_x_offset, top_offset,
widget_width, widget_height, Component.literal("Music Volume"), font);
stringWidget.setTooltip(
Tooltip.create(Component.literal("Volume of battle/silly music")));
addRenderableWidget(stringWidget);
if (volumeSlider == null) {
volumeSlider =
new SliderPercentage(this.width / 2 + widget_x_offset, top_offset, widget_width,
widget_height, Component.literal(
"Volume: " + String.format("%.1f%%", ClientConfig.CLIENT.musicVolume.get() * 100.0)),
ClientConfig.CLIENT.musicVolume.get(), "Volume: ");
} else {
volumeSlider.setPosition(this.width / 2 + widget_x_offset, top_offset);
volumeSlider.setSize(widget_width, widget_height);
}
addRenderableWidget(volumeSlider);
addRenderableWidget(Button.builder(Component.literal("Cancel"),
(b) -> Minecraft.getInstance().setScreen(null))
.bounds(this.width / 2 - widget_width + widget_x_offset,
this.height - widget_height, widget_width, widget_height).build());
addRenderableWidget(Button.builder(Component.literal("Accept"), (b) -> {
accepted = true;
}).bounds(this.width / 2 + widget_x_offset, this.height - widget_height, widget_width,
widget_height).build());
dirtyFlag = false;
}
private void doAccepted() {
String temp = battleListEditBox.getValue();
{
List<String> battleList = new ArrayList<String>();
for (String category : temp.split(",")) {
battleList.add(category.strip());
}
ClientConfig.CLIENT.battleMusicList.set(battleList);
}
temp = sillyListEditBox.getValue();
{
List<String> sillyList = new ArrayList<String>();
for (String category : temp.split(",")) {
sillyList.add(category.strip());
}
ClientConfig.CLIENT.sillyMusicList.set(sillyList);
}
ClientConfig.CLIENT.sillyMusicThreshold.set(sillyMusicThresholdSlider.percentage);
ClientConfig.CLIENT.volumeAffectedByMasterVolume.set(affectedByMasterVolCheckbox.selected());
ClientConfig.CLIENT.volumeAffectedByMusicVolume.set(affectedByMusicVolCheckbox.selected());
ClientConfig.CLIENT.musicVolume.set(volumeSlider.percentage);
ClientConfig.CLIENT_SPEC.save();
}
@Override
public boolean isPauseScreen() {
return true;
}
@Override
public void render(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) {
if (accepted) {
doAccepted();
Minecraft.getInstance().setScreen(null);
return;
}
if (dirtyFlag) {
onDirty();
}
super.render(pGuiGraphics, pMouseX, pMouseY, pPartialTick);
}
@Override
public void resize(Minecraft pMinecraft, int pWidth, int pHeight) {
dirtyFlag = true;
super.resize(pMinecraft, pWidth, pHeight);
}
private static class SliderPercentage extends AbstractSliderButton {
private final String messagePrefix;
private double percentage;
public SliderPercentage(int x, int y, int width, int height, Component message, double percentage, String messagePrefix) {
super(x, y, width, height, message, percentage);
this.percentage = percentage;
this.messagePrefix = messagePrefix;
}
@Override
protected void updateMessage() {
setMessage(
Component.literal(messagePrefix + String.format("%.1f%%", percentage * 100.0)));
}
@Override
protected void applyValue() {
percentage = value;
}
}
}

View file

@ -15,7 +15,7 @@ import net.minecraft.resources.ResourceKey;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.PlayPayloadContext;
public class ClientProxy extends CommonProxy { public class ClientProxy extends CommonProxy {
private BattleGui battleGui = null; private BattleGui battleGui = null;
@ -94,27 +94,13 @@ public class ClientProxy extends CommonProxy {
@Override @Override
public void playBattleMusic() { public void playBattleMusic() {
Options gs = Minecraft.getInstance().options; Options gs = Minecraft.getInstance().options;
float volume = ClientConfig.CLIENT.musicVolume.get().floatValue(); battleMusic.playBattle(gs.getSoundSourceVolume(SoundSource.MUSIC) * gs.getSoundSourceVolume(SoundSource.MASTER));
if (ClientConfig.CLIENT.volumeAffectedByMasterVolume.get()) {
volume *= gs.getSoundSourceVolume(SoundSource.MASTER);
}
if (ClientConfig.CLIENT.volumeAffectedByMusicVolume.get()) {
volume *= gs.getSoundSourceVolume(SoundSource.MUSIC);
}
battleMusic.playBattle(volume);
} }
@Override @Override
public void playSillyMusic() { public void playSillyMusic() {
Options gs = Minecraft.getInstance().options; Options gs = Minecraft.getInstance().options;
float volume = ClientConfig.CLIENT.musicVolume.get().floatValue(); battleMusic.playSilly(gs.getSoundSourceVolume(SoundSource.MUSIC) * gs.getSoundSourceVolume(SoundSource.MASTER));
if (ClientConfig.CLIENT.volumeAffectedByMasterVolume.get()) {
volume *= gs.getSoundSourceVolume(SoundSource.MASTER);
}
if (ClientConfig.CLIENT.volumeAffectedByMusicVolume.get()) {
volume *= gs.getSoundSourceVolume(SoundSource.MUSIC);
}
battleMusic.playSilly(volume);
} }
@Override @Override
@ -130,9 +116,9 @@ public class ClientProxy extends CommonProxy {
if (localBattle == null) { if (localBattle == null) {
return; return;
} }
if (type == null || type.isEmpty() || ClientConfig.CLIENT.battleMusicList.get().contains(type)) { if (type == null || type.isEmpty() || getConfig().isBattleMusicType(type)) {
++battleMusicCount; ++battleMusicCount;
} else if (ClientConfig.CLIENT.sillyMusicList.get().contains(type)) { } else if (getConfig().isSillyMusicType(type)) {
++sillyMusicCount; ++sillyMusicCount;
} else { } else {
++battleMusicCount; ++battleMusicCount;
@ -146,9 +132,9 @@ public class ClientProxy extends CommonProxy {
battleMusicCount = 0; battleMusicCount = 0;
sillyMusicCount = 0; sillyMusicCount = 0;
return; return;
} else if (type == null || type.isEmpty() || ClientConfig.CLIENT.battleMusicList.get().contains(type)) { } else if (type == null || type.isEmpty() || getConfig().isBattleMusicType(type)) {
--battleMusicCount; --battleMusicCount;
} else if (ClientConfig.CLIENT.sillyMusicList.get().contains(type)) { } else if (getConfig().isSillyMusicType(type)) {
--sillyMusicCount; --sillyMusicCount;
} else { } else {
--battleMusicCount; --battleMusicCount;
@ -190,16 +176,16 @@ public class ClientProxy extends CommonProxy {
return; return;
} }
double percentage = 0.0; float percentage = 0.0f;
if (sillyMusicCount == 0 && battleMusicCount == 0) { if (sillyMusicCount == 0 && battleMusicCount == 0) {
percentage = 0.0; percentage = 0.0f;
} else if (battleMusicCount == 0) { } else if (battleMusicCount == 0) {
percentage = 1.0; percentage = 100.0f;
} else { } else {
percentage = (double) sillyMusicCount / (double) (sillyMusicCount + battleMusicCount); percentage = 100.0f * (float) sillyMusicCount / (float) (sillyMusicCount + battleMusicCount);
} }
if (percentage >= ClientConfig.CLIENT.sillyMusicThreshold.get()) { if (percentage >= (float) getConfig().getSillyMusicThreshold()) {
if (battleMusic.isPlaying()) { if (battleMusic.isPlaying()) {
if (!battleMusic.isPlayingSilly() && battleMusic.hasSillyMusic()) { if (!battleMusic.isPlayingSilly() && battleMusic.hasSillyMusic()) {
stopMusic(false); stopMusic(false);
@ -236,7 +222,7 @@ public class ClientProxy extends CommonProxy {
} }
@Override @Override
public <MSG> void handlePacket(final MSG msg, final IPayloadContext ctx) { public <MSG> void handlePacket(final MSG msg, final PlayPayloadContext ctx) {
if (msg.getClass() == PacketBattleMessage.class) { if (msg.getClass() == PacketBattleMessage.class) {
PacketBattleMessage pkt = (PacketBattleMessage) msg; PacketBattleMessage pkt = (PacketBattleMessage) msg;
Entity fromEntity = getEntity(pkt.getEntityIDFrom(), pkt.getDimension()); Entity fromEntity = getEntity(pkt.getEntityIDFrom(), pkt.getDimension());
@ -1473,9 +1459,4 @@ public class ClientProxy extends CommonProxy {
} }
} }
} }
@Override
public void showClientConfigGui() {
Minecraft.getInstance().setScreen(new ClientConfigGui(null, null));
}
} }

View file

@ -1,21 +1,22 @@
package com.burnedkirby.TurnBasedMinecraft.common; package com.burnedkirby.TurnBasedMinecraft.common;
import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketBattleMessage;
import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketEditingMessage;
import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketGeneralMessage;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.world.entity.monster.Creeper;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.event.entity.living.LivingChangeTargetEvent;
import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent;
import net.neoforged.neoforge.network.PacketDistributor;
import java.util.Iterator; import java.util.Iterator;
import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketBattleMessage;
import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketEditingMessage;
import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketGeneralMessage;
import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.world.entity.monster.Creeper;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.neoforge.event.entity.living.LivingAttackEvent;
import net.neoforged.neoforge.event.entity.living.LivingChangeTargetEvent;
import net.neoforged.neoforge.network.PacketDistributor;
import net.neoforged.bus.api.SubscribeEvent;
public class AttackEventHandler public class AttackEventHandler
{ {
private boolean isAttackerValid(LivingIncomingDamageEvent event) private boolean isAttackerValid(LivingAttackEvent event)
{ {
if(event.getSource().getEntity() == null) if(event.getSource().getEntity() == null)
{ {
@ -58,7 +59,7 @@ public class AttackEventHandler
} }
@SubscribeEvent @SubscribeEvent
public void entityAttacked(LivingIncomingDamageEvent event) public void entityAttacked(LivingAttackEvent event)
{ {
if(event.getEntity().level().isClientSide) if(event.getEntity().level().isClientSide)
{ {
@ -81,7 +82,7 @@ public class AttackEventHandler
if(!event.getEntity().hasCustomName()) if(!event.getEntity().hasCustomName())
{ {
TurnBasedMinecraftMod.logger.error("Cannot edit custom name from entity without custom name"); TurnBasedMinecraftMod.logger.error("Cannot edit custom name from entity without custom name");
PacketDistributor.sendToPlayer((ServerPlayer)editingInfo.editor, new PacketGeneralMessage("Cannot edit custom name from entity without custom name")); PacketDistributor.PLAYER.with((ServerPlayer)editingInfo.editor).send(new PacketGeneralMessage("Cannot edit custom name from entity without custom name"));
return; return;
} }
editingInfo.entityInfo = config.getCustomEntityInfo(event.getEntity().getCustomName().getString()); editingInfo.entityInfo = config.getCustomEntityInfo(event.getEntity().getCustomName().getString());
@ -90,9 +91,9 @@ public class AttackEventHandler
editingInfo.entityInfo = new EntityInfo(); editingInfo.entityInfo = new EntityInfo();
editingInfo.entityInfo.customName = event.getEntity().getCustomName().getString(); editingInfo.entityInfo.customName = event.getEntity().getCustomName().getString();
} }
PacketDistributor.sendToPlayer((ServerPlayer)editingInfo.editor, new PacketGeneralMessage("Editing custom name \"" + event.getEntity().getCustomName().getString() + "\"")); PacketDistributor.PLAYER.with((ServerPlayer)editingInfo.editor).send(new PacketGeneralMessage("Editing custom name \"" + event.getEntity().getCustomName().getString() + "\""));
TurnBasedMinecraftMod.logger.info("Begin editing custom \"" + event.getEntity().getCustomName().getString() + "\""); TurnBasedMinecraftMod.logger.info("Begin editing custom \"" + event.getEntity().getCustomName().getString() + "\"");
PacketDistributor.sendToPlayer((ServerPlayer)editingInfo.editor, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with((ServerPlayer)editingInfo.editor).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} }
else else
{ {
@ -106,9 +107,9 @@ public class AttackEventHandler
{ {
editingInfo.entityInfo = editingInfo.entityInfo.clone(); editingInfo.entityInfo = editingInfo.entityInfo.clone();
} }
PacketDistributor.sendToPlayer((ServerPlayer)editingInfo.editor, new PacketGeneralMessage("Editing entity \"" + editingInfo.entityInfo.classType.getName() + "\"")); PacketDistributor.PLAYER.with((ServerPlayer)editingInfo.editor).send(new PacketGeneralMessage("Editing entity \"" + editingInfo.entityInfo.classType.getName() + "\""));
TurnBasedMinecraftMod.logger.info("Begin editing \"" + editingInfo.entityInfo.classType.getName() + "\""); TurnBasedMinecraftMod.logger.info("Begin editing \"" + editingInfo.entityInfo.classType.getName() + "\"");
PacketDistributor.sendToPlayer((ServerPlayer)editingInfo.editor, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with((ServerPlayer)editingInfo.editor).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} }
return; return;
} }
@ -153,16 +154,16 @@ public class AttackEventHandler
if(event.getEntity().level().isClientSide if(event.getEntity().level().isClientSide
|| config.isOldBattleBehaviorEnabled() || config.isOldBattleBehaviorEnabled()
|| (event.getEntity() != null && battleManager.isRecentlyLeftBattle(event.getEntity().getId())) || (event.getEntity() != null && battleManager.isRecentlyLeftBattle(event.getEntity().getId()))
|| (event.getNewAboutToBeSetTarget() != null && battleManager.isRecentlyLeftBattle(event.getNewAboutToBeSetTarget().getId())) || (event.getNewTarget() != null && battleManager.isRecentlyLeftBattle(event.getNewTarget().getId()))
|| (event.getEntity() != null && event.getNewAboutToBeSetTarget() != null && Utility.distanceBetweenEntities(event.getEntity(), event.getNewAboutToBeSetTarget()) > (double)config.getAggroStartBattleDistance())) || (event.getEntity() != null && event.getNewTarget() != null && Utility.distanceBetweenEntities(event.getEntity(), event.getNewTarget()) > (double)config.getAggroStartBattleDistance()))
{ {
return; return;
} }
else if(event.getEntity() != null else if(event.getEntity() != null
&& event.getNewAboutToBeSetTarget() != null && event.getNewTarget() != null
&& !config.getBattleIgnoringPlayers().contains(event.getEntity().getId()) && !config.getBattleIgnoringPlayers().contains(event.getEntity().getId())
&& !config.getBattleIgnoringPlayers().contains(event.getNewAboutToBeSetTarget().getId()) && !config.getBattleIgnoringPlayers().contains(event.getNewTarget().getId())
&& event.getEntity().level().dimension().equals(event.getNewAboutToBeSetTarget().level().dimension())) && event.getEntity().level().dimension().equals(event.getNewTarget().level().dimension()))
{ {
TurnBasedMinecraftMod.proxy.getBattleManager().checkTargeted(event); TurnBasedMinecraftMod.proxy.getBattleManager().checkTargeted(event);
} }

View file

@ -449,7 +449,7 @@ public class Battle {
} }
PacketBattleInfo infoPacket = new PacketBattleInfo(getSideAIDs(), getSideBIDs(), timer, TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(), !TurnBasedMinecraftMod.proxy.getConfig().isBattleDecisionDurationForever()); PacketBattleInfo infoPacket = new PacketBattleInfo(getSideAIDs(), getSideBIDs(), timer, TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(), !TurnBasedMinecraftMod.proxy.getConfig().isBattleDecisionDurationForever());
for (Combatant p : players.values()) { for (Combatant p : players.values()) {
PacketDistributor.sendToPlayer((ServerPlayer)p.entity, infoPacket); PacketDistributor.PLAYER.with((ServerPlayer)p.entity).send(infoPacket);
} }
} }
@ -464,7 +464,7 @@ public class Battle {
PacketBattleMessage packet = new PacketBattleMessage(type, from, to, dimension, amount, custom); PacketBattleMessage packet = new PacketBattleMessage(type, from, to, dimension, amount, custom);
for (Combatant p : players.values()) { for (Combatant p : players.values()) {
if (p.entity.isAlive()) { if (p.entity.isAlive()) {
PacketDistributor.sendToPlayer((ServerPlayer)p.entity, packet); PacketDistributor.PLAYER.with((ServerPlayer)p.entity).send(packet);
} }
} }
} }
@ -574,7 +574,7 @@ public class Battle {
private void removeCombatantPostRemove(Combatant c) { private void removeCombatantPostRemove(Combatant c) {
if (c.entity instanceof Player) { if (c.entity instanceof Player) {
PacketDistributor.sendToPlayer((ServerPlayer)c.entity, new PacketBattleMessage(PacketBattleMessage.MessageType.ENDED, 0, 0, dimension, 0)); PacketDistributor.PLAYER.with((ServerPlayer)c.entity).send(new PacketBattleMessage(PacketBattleMessage.MessageType.ENDED, 0, 0, dimension, 0));
} }
battleManager.addRecentlyLeftBattle(c); battleManager.addRecentlyLeftBattle(c);
} }
@ -779,7 +779,7 @@ public class Battle {
final Entity targetEntity = target.entity; final Entity targetEntity = target.entity;
final float yawDirection = Utility.yawDirection(next.entity.getX(), next.entity.getZ(), target.entity.getX(), target.entity.getZ()); final float yawDirection = Utility.yawDirection(next.entity.getX(), next.entity.getZ(), target.entity.getX(), target.entity.getZ());
final float pitchDirection = Utility.pitchDirection(next.entity.getX(), next.entity.getY(), next.entity.getZ(), target.entity.getX(), target.entity.getY(), target.entity.getZ()); final float pitchDirection = Utility.pitchDirection(next.entity.getX(), next.entity.getY(), next.entity.getZ(), target.entity.getX(), target.entity.getY(), target.entity.getZ());
final int randomTimeLeft = random.nextInt(heldItemStack.getItem().getUseDuration(heldItemStack, (LivingEntity)next.entity) / 3); final int randomTimeLeft = random.nextInt(heldItemStack.getItem().getUseDuration(heldItemStack) / 3);
if (TurnBasedMinecraftMod.proxy.getConfig().isFreezeCombatantsEnabled()) { if (TurnBasedMinecraftMod.proxy.getConfig().isFreezeCombatantsEnabled()) {
next.yaw = yawDirection; next.yaw = yawDirection;
next.pitch = pitchDirection; next.pitch = pitchDirection;
@ -1087,7 +1087,7 @@ public class Battle {
debugLog += " null"; debugLog += " null";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getId(), 0, PacketBattleMessage.UsedItemAction.USED_NOTHING.getValue()); sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getId(), 0, PacketBattleMessage.UsedItemAction.USED_NOTHING.getValue());
break; break;
} else if (Utility.isItemEdible(targetItemStack, (LivingEntity)next.entity)) { } else if (targetItem.isEdible()) {
debugLog += " food"; debugLog += " food";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getId(), 0, PacketBattleMessage.UsedItemAction.USED_FOOD.getValue(), targetItemStack.getDisplayName().getString()); sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getId(), 0, PacketBattleMessage.UsedItemAction.USED_FOOD.getValue(), targetItemStack.getDisplayName().getString());
final Entity nextEntity = next.entity; final Entity nextEntity = next.entity;
@ -1096,7 +1096,7 @@ public class Battle {
} else { } else {
// then check vanilla foods // then check vanilla foods
final CreativeModeTab foodAndDrinksTab = CreativeModeTabRegistry.getTab(CreativeModeTabs.FOOD_AND_DRINKS.location()); final CreativeModeTab foodAndDrinksTab = CreativeModeTabRegistry.getTab(CreativeModeTabs.FOOD_AND_DRINKS.location());
if (foodAndDrinksTab.contains(targetItemStack) && Utility.isItemEdible(targetItemStack, (LivingEntity)next.entity)) { if (foodAndDrinksTab.contains(targetItemStack) && targetItem.isEdible()) {
debugLog += " food"; debugLog += " food";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getId(), 0, PacketBattleMessage.UsedItemAction.USED_FOOD.getValue(), targetItemStack.getDisplayName().getString()); sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getId(), 0, PacketBattleMessage.UsedItemAction.USED_FOOD.getValue(), targetItemStack.getDisplayName().getString());
final Entity nextEntity = next.entity; final Entity nextEntity = next.entity;

View file

@ -8,8 +8,8 @@ import net.minecraft.world.entity.monster.Creeper;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.living.LivingAttackEvent;
import net.neoforged.neoforge.event.entity.living.LivingChangeTargetEvent; import net.neoforged.neoforge.event.entity.living.LivingChangeTargetEvent;
import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent;
import net.neoforged.neoforge.network.PacketDistributor; import net.neoforged.neoforge.network.PacketDistributor;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -44,7 +44,7 @@ public class BattleManager
* @param event * @param event
* @return True if event should be canceled * @return True if event should be canceled
*/ */
public boolean checkAttack(final LivingIncomingDamageEvent event) public boolean checkAttack(final LivingAttackEvent event)
{ {
Config config = TurnBasedMinecraftMod.proxy.getConfig(); Config config = TurnBasedMinecraftMod.proxy.getConfig();
String receiverClassName = event.getEntity().getClass().getName(); String receiverClassName = event.getEntity().getClass().getName();
@ -183,13 +183,13 @@ public class BattleManager
{ {
// Check if "player_only_battles" is enabled and if both entities are players. // Check if "player_only_battles" is enabled and if both entities are players.
if (TurnBasedMinecraftMod.proxy.getConfig().isPlayerOnlyBattlesEnabled() && if (TurnBasedMinecraftMod.proxy.getConfig().isPlayerOnlyBattlesEnabled() &&
(!(event.getEntity() instanceof Player) || !(event.getNewAboutToBeSetTarget() instanceof Player))) { (!(event.getEntity() instanceof Player) || !(event.getNewTarget() instanceof Player))) {
return; return;
} }
String targetedCustomName; String targetedCustomName;
try { try {
targetedCustomName = event.getNewAboutToBeSetTarget().getCustomName().getString(); targetedCustomName = event.getNewTarget().getCustomName().getString();
} catch (NullPointerException e) { } catch (NullPointerException e) {
targetedCustomName = null; targetedCustomName = null;
} }
@ -207,7 +207,7 @@ public class BattleManager
} }
EntityInfo targetedInfo; EntityInfo targetedInfo;
if(event.getNewAboutToBeSetTarget() instanceof Player) if(event.getNewTarget() instanceof Player)
{ {
targetedInfo = null; targetedInfo = null;
} }
@ -216,10 +216,10 @@ public class BattleManager
targetedInfo = TurnBasedMinecraftMod.proxy.getConfig().getCustomEntityInfoReference(targetedCustomName); targetedInfo = TurnBasedMinecraftMod.proxy.getConfig().getCustomEntityInfoReference(targetedCustomName);
if(targetedInfo == null) if(targetedInfo == null)
{ {
targetedInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(event.getNewAboutToBeSetTarget()); targetedInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(event.getNewTarget());
} }
} }
if((event.getNewAboutToBeSetTarget() instanceof Player && ((Player)event.getNewAboutToBeSetTarget()).isCreative()) if((event.getNewTarget() instanceof Player && ((Player)event.getNewTarget()).isCreative())
|| attackerInfo == null || attackerInfo == null
|| attackerInfo.ignoreBattle || attackerInfo.ignoreBattle
|| TurnBasedMinecraftMod.proxy.getConfig().isIgnoreBattleType(attackerInfo.category) || TurnBasedMinecraftMod.proxy.getConfig().isIgnoreBattleType(attackerInfo.category)
@ -235,8 +235,8 @@ public class BattleManager
if(attackerBattle != null && !attackerBattle.hasCombatant(event.getEntity().getId())) { if(attackerBattle != null && !attackerBattle.hasCombatant(event.getEntity().getId())) {
attackerBattle = null; attackerBattle = null;
} }
Battle defenderBattle = battleMap.get(entityToBattleMap.get(new EntityIDDimPair(event.getNewAboutToBeSetTarget()))); Battle defenderBattle = battleMap.get(entityToBattleMap.get(new EntityIDDimPair(event.getNewTarget())));
if(defenderBattle != null && !defenderBattle.hasCombatant(event.getNewAboutToBeSetTarget().getId())) { if(defenderBattle != null && !defenderBattle.hasCombatant(event.getNewTarget().getId())) {
defenderBattle = null; defenderBattle = null;
} }
@ -244,13 +244,13 @@ public class BattleManager
return; return;
} else if(attackerBattle == null && defenderBattle == null) { } else if(attackerBattle == null && defenderBattle == null) {
// neither in battle // neither in battle
if(event.getEntity() instanceof Player || event.getNewAboutToBeSetTarget() instanceof Player) if(event.getEntity() instanceof Player || event.getNewTarget() instanceof Player)
{ {
// at least one is a player, create battle // at least one is a player, create battle
Collection<Entity> sideA = new ArrayList<Entity>(1); Collection<Entity> sideA = new ArrayList<Entity>(1);
Collection<Entity> sideB = new ArrayList<Entity>(1); Collection<Entity> sideB = new ArrayList<Entity>(1);
sideA.add(event.getEntity()); sideA.add(event.getEntity());
sideB.add(event.getNewAboutToBeSetTarget()); sideB.add(event.getNewTarget());
createBattle(sideA, sideB, event.getEntity().level().dimension()); createBattle(sideA, sideB, event.getEntity().level().dimension());
logger.debug("neither in battle, at least one is player, creating new battle"); logger.debug("neither in battle, at least one is player, creating new battle");
} }
@ -261,16 +261,16 @@ public class BattleManager
// battle max reached, cannot add to battle // battle max reached, cannot add to battle
return; return;
} else if (attackerBattle.hasCombatantInSideA(event.getEntity().getId())) { } else if (attackerBattle.hasCombatantInSideA(event.getEntity().getId())) {
attackerBattle.addCombatantToSideB(event.getNewAboutToBeSetTarget()); attackerBattle.addCombatantToSideB(event.getNewTarget());
} else { } else {
attackerBattle.addCombatantToSideA(event.getNewAboutToBeSetTarget()); attackerBattle.addCombatantToSideA(event.getNewTarget());
} }
entityToBattleMap.put(new EntityIDDimPair(event.getNewAboutToBeSetTarget()), attackerBattle.getId()); entityToBattleMap.put(new EntityIDDimPair(event.getNewTarget()), attackerBattle.getId());
} else { } else {
if (defenderBattle.getSize() >= TurnBasedMinecraftMod.proxy.getConfig().getMaxInBattle()) { if (defenderBattle.getSize() >= TurnBasedMinecraftMod.proxy.getConfig().getMaxInBattle()) {
// battle max reached, cannot add to battle // battle max reached, cannot add to battle
return; return;
} else if (defenderBattle.hasCombatantInSideA(event.getNewAboutToBeSetTarget().getId())) { } else if (defenderBattle.hasCombatantInSideA(event.getNewTarget().getId())) {
defenderBattle.addCombatantToSideB(event.getEntity()); defenderBattle.addCombatantToSideB(event.getEntity());
} else { } else {
defenderBattle.addCombatantToSideA(event.getEntity()); defenderBattle.addCombatantToSideA(event.getEntity());
@ -317,7 +317,7 @@ public class BattleManager
c.time = System.nanoTime(); c.time = System.nanoTime();
Config config = TurnBasedMinecraftMod.proxy.getConfig(); Config config = TurnBasedMinecraftMod.proxy.getConfig();
if(c.entity instanceof ServerPlayer) { if(c.entity instanceof ServerPlayer) {
PacketDistributor.sendToPlayer((ServerPlayer)c.entity, new PacketGeneralMessage("You just left battle! " + config.getLeaveBattleCooldownSeconds() + " seconds until you can attack/be-attacked again!")); PacketDistributor.PLAYER.with((ServerPlayer)c.entity).send(new PacketGeneralMessage("You just left battle! " + config.getLeaveBattleCooldownSeconds() + " seconds until you can attack/be-attacked again!"));
} }
recentlyLeftBattle.put(c.entity.getId(), c); recentlyLeftBattle.put(c.entity.getId(), c);
entityToBattleMap.remove(new EntityIDDimPair(c.entity)); entityToBattleMap.remove(new EntityIDDimPair(c.entity));
@ -337,7 +337,7 @@ public class BattleManager
iter.remove(); iter.remove();
if(entry.getValue().entity instanceof ServerPlayer) if(entry.getValue().entity instanceof ServerPlayer)
{ {
PacketDistributor.sendToPlayer((ServerPlayer)entry.getValue().entity, new PacketGeneralMessage("Timer ended, you can now attack/be-attacked again.")); PacketDistributor.PLAYER.with((ServerPlayer)entry.getValue().entity).send(new PacketGeneralMessage("Timer ended, you can now attack/be-attacked again."));
} }
} }
} }

View file

@ -2,7 +2,7 @@ package com.burnedkirby.TurnBasedMinecraft.common;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.event.tick.ServerTickEvent; import net.neoforged.neoforge.event.TickEvent;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@ -25,9 +25,8 @@ public class BattleUpdater
} }
@SubscribeEvent @SubscribeEvent
public void update(ServerTickEvent.Post tickEvent) { public void update(TickEvent.ServerTickEvent tickEvent) {
//if(tickEvent.phase != TickEvent.Phase.START && isRunning.get() && ++tick > tickLimit) { if(tickEvent.phase != TickEvent.Phase.START && isRunning.get() && ++tick > tickLimit) {
if(isRunning.get() && ++tick > tickLimit) {
tick = 0; tick = 0;
manager.battleMap.entrySet().removeIf(entry -> entry.getValue().update()); manager.battleMap.entrySet().removeIf(entry -> entry.getValue().update());
manager.updateRecentlyLeftBattle(); manager.updateRecentlyLeftBattle();

View file

@ -1,12 +1,12 @@
package com.burnedkirby.TurnBasedMinecraft.common; package com.burnedkirby.TurnBasedMinecraft.common;
import net.minecraft.world.effect.MobEffectInstance; import java.util.Comparator;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.effect.MobEffectInstance;
import java.util.Comparator; import net.minecraft.world.effect.MobEffects;
public class Combatant public class Combatant
{ {

View file

@ -1,18 +1,18 @@
package com.burnedkirby.TurnBasedMinecraft.common; package com.burnedkirby.TurnBasedMinecraft.common;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.PlayPayloadContext;
import net.neoforged.neoforge.server.ServerLifecycleHooks; import net.neoforged.neoforge.server.ServerLifecycleHooks;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.util.*; import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
public class CommonProxy public class CommonProxy
{ {
@ -172,9 +172,5 @@ public class CommonProxy
return ServerLifecycleHooks.getCurrentServer().getLevel(dim).getEntity(id); return ServerLifecycleHooks.getCurrentServer().getLevel(dim).getEntity(id);
} }
public <MSG> void handlePacket(final MSG msg, final IPayloadContext ctx) {} public <MSG> void handlePacket(final MSG msg, final PlayPayloadContext ctx) {}
public static final StreamCodec<ByteBuf, Collection<Integer>> COLLECTION_INT_CODEC = ByteBufCodecs.INT.apply(ByteBufCodecs.collection(ArrayList::new));
public void showClientConfigGui() {}
} }

View file

@ -1,17 +1,18 @@
package com.burnedkirby.TurnBasedMinecraft.common; package com.burnedkirby.TurnBasedMinecraft.common;
import com.electronwill.nightconfig.core.file.CommentedFileConfig;
import com.electronwill.nightconfig.core.file.FileConfig;
import com.electronwill.nightconfig.toml.TomlFormat;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.registries.VanillaRegistries;
import org.apache.logging.log4j.Logger;
import java.io.*; import java.io.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import com.electronwill.nightconfig.core.file.CommentedFileConfig;
import com.electronwill.nightconfig.toml.TomlFormat;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.registries.VanillaRegistries;
import org.apache.logging.log4j.Logger;
import com.electronwill.nightconfig.core.file.FileConfig;
public class Config public class Config
{ {
public static final long BATTLE_DECISION_DURATION_SEC_MIN = 5L; public static final long BATTLE_DECISION_DURATION_SEC_MIN = 5L;
@ -36,7 +37,10 @@ public class Config
private int fleeBadProbability = 35; private int fleeBadProbability = 35;
private int minimumHitPercentage = 4; private int minimumHitPercentage = 4;
private int maxInBattle = 8; private int maxInBattle = 8;
private Set<String> musicBattleTypes;
private Set<String> musicSillyTypes;
private boolean freezeCombatantsInBattle = false; private boolean freezeCombatantsInBattle = false;
private int sillyMusicThreshold = 40;
private int configVersion = 0; private int configVersion = 0;
private Set<Integer> battleIgnoringPlayers = null; private Set<Integer> battleIgnoringPlayers = null;
private boolean onlyOPsSelfDisableTB = true; private boolean onlyOPsSelfDisableTB = true;
@ -59,6 +63,8 @@ public class Config
customEntityInfoMap = new HashMap<String, EntityInfo>(); customEntityInfoMap = new HashMap<String, EntityInfo>();
ignoreBattleTypes = new HashSet<String>(); ignoreBattleTypes = new HashSet<String>();
this.logger = logger; this.logger = logger;
musicBattleTypes = new HashSet<String>();
musicSillyTypes = new HashSet<String>();
battleIgnoringPlayers = new HashSet<Integer>(); battleIgnoringPlayers = new HashSet<Integer>();
possibleIgnoreHurtDamageSources = new HashSet<String>(); possibleIgnoreHurtDamageSources = new HashSet<String>();
ignoreHurtDamageSources = new HashSet<String>(); ignoreHurtDamageSources = new HashSet<String>();
@ -150,6 +156,56 @@ public class Config
{ {
CommentedFileConfig conf = getConfigObj(configFile); CommentedFileConfig conf = getConfigObj(configFile);
// client config
try {
Collection<String> battle_music_categories = conf.get("client_config.battle_music");
if (battle_music_categories != null) {
for (String category : battle_music_categories) {
musicBattleTypes.add(category);
}
} else {
musicBattleTypes.add("monster");
musicBattleTypes.add("animal");
musicBattleTypes.add("boss");
musicBattleTypes.add("player");
logNotFound("client_config.battle_music");
}
} catch (ClassCastException e) {
musicBattleTypes.add("monster");
musicBattleTypes.add("animal");
musicBattleTypes.add("boss");
musicBattleTypes.add("player");
logTOMLInvalidValue("client_config.battle_music");
}
try {
Collection<String> silly_music_categories = conf.get("client_config.silly_music");
if (silly_music_categories != null) {
for (String category : silly_music_categories) {
musicSillyTypes.add(category);
}
} else {
musicSillyTypes.add("passive");
logNotFound("client_config.silly_music");
}
} catch (ClassCastException e) {
musicSillyTypes.add("passive");
logTOMLInvalidValue("client_config.silly_music");
}
try {
OptionalInt silly_music_threshold = conf.getOptionalInt("client_config.silly_music_threshold");
if(silly_music_threshold.isPresent()) {
this.sillyMusicThreshold = silly_music_threshold.getAsInt();
} else {
this.sillyMusicThreshold = 40;
logNotFound("client_config.silly_music_threshold", "40");
}
} catch (ClassCastException e) {
this.sillyMusicThreshold = 40;
logTOMLInvalidValue("client_config.silly_music_threshold", "40");
}
// server_config // server_config
try { try {
OptionalInt leave_battle_cooldown = conf.getOptionalInt("server_config.leave_battle_cooldown"); OptionalInt leave_battle_cooldown = conf.getOptionalInt("server_config.leave_battle_cooldown");
@ -1272,6 +1328,16 @@ public class Config
this.maxInBattle = maxInBattle; this.maxInBattle = maxInBattle;
} }
public boolean isBattleMusicType(String type)
{
return musicBattleTypes.contains(type.toLowerCase());
}
public boolean isSillyMusicType(String type)
{
return musicSillyTypes.contains(type.toLowerCase());
}
public boolean isFreezeCombatantsEnabled() public boolean isFreezeCombatantsEnabled()
{ {
return freezeCombatantsInBattle; return freezeCombatantsInBattle;
@ -1281,6 +1347,11 @@ public class Config
freezeCombatantsInBattle = enabled; freezeCombatantsInBattle = enabled;
} }
public int getSillyMusicThreshold()
{
return sillyMusicThreshold;
}
public int getConfigVersion() public int getConfigVersion()
{ {
return configVersion; return configVersion;

View file

@ -2,8 +2,8 @@ package com.burnedkirby.TurnBasedMinecraft.common;
import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketGeneralMessage; import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketGeneralMessage;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.event.entity.EntityTravelToDimensionEvent; import net.neoforged.neoforge.event.entity.EntityTravelToDimensionEvent;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.network.PacketDistributor; import net.neoforged.neoforge.network.PacketDistributor;
public class DimensionChangedHandler { public class DimensionChangedHandler {
@ -14,7 +14,7 @@ public class DimensionChangedHandler {
} }
if(TurnBasedMinecraftMod.proxy.getBattleManager().forceLeaveBattle(new EntityIDDimPair(event.getEntity())) if(TurnBasedMinecraftMod.proxy.getBattleManager().forceLeaveBattle(new EntityIDDimPair(event.getEntity()))
&& event.getEntity() instanceof ServerPlayer) { && event.getEntity() instanceof ServerPlayer) {
PacketDistributor.sendToPlayer((ServerPlayer)event.getEntity(), new PacketGeneralMessage("Left battle due to moving to a different dimension")); PacketDistributor.PLAYER.with((ServerPlayer)event.getEntity()).send(new PacketGeneralMessage("Left battle due to moving to a different dimension"));
} }
} }
} }

View file

@ -1,12 +1,9 @@
package com.burnedkirby.TurnBasedMinecraft.common; package com.burnedkirby.TurnBasedMinecraft.common;
import io.netty.buffer.ByteBuf;
import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import java.nio.charset.StandardCharsets;
public class EntityInfo public class EntityInfo
{ {
public Class classType; public Class classType;
@ -279,7 +276,7 @@ public class EntityInfo
{ {
if(this == FIRE) if(this == FIRE)
{ {
entity.setRemainingFireTicks(duration / 2); entity.setSecondsOnFire(duration / 20);
return; return;
} }
else if(this != UNKNOWN) else if(this != UNKNOWN)
@ -376,28 +373,6 @@ public class EntityInfo
customName = new String(); customName = new String();
} }
public EntityInfo(Class classType, boolean ignoreBattle, int attackPower, int attackProbability, int attackVariance,
Effect attackEffect, int attackEffectProbability, int defenseDamage, int defenseDamageProbability,
int evasion, int speed, String category, int decisionAttack, int decisionDefend, int decisionFlee,
String customName) {
this.classType = classType;
this.ignoreBattle = ignoreBattle;
this.attackPower = attackPower;
this.attackProbability = attackProbability;
this.attackVariance = attackVariance;
this.attackEffect = attackEffect;
this.attackEffectProbability = attackEffectProbability;
this.defenseDamage = defenseDamage;
this.defenseDamageProbability = defenseDamageProbability;
this.evasion = evasion;
this.speed = speed;
this.category = category;
this.decisionAttack = decisionAttack;
this.decisionDefend = decisionDefend;
this.decisionFlee = decisionFlee;
this.customName = customName;
}
public EntityInfo clone() public EntityInfo clone()
{ {
EntityInfo newEntityInfo = new EntityInfo(); EntityInfo newEntityInfo = new EntityInfo();
@ -419,93 +394,4 @@ public class EntityInfo
newEntityInfo.customName = new String(customName); newEntityInfo.customName = new String(customName);
return newEntityInfo; return newEntityInfo;
} }
public EntityInfo(ByteBuf buffer) {
int name_bytes_len = buffer.readInt();
if (name_bytes_len > 0) {
ByteBuf name_bytes = buffer.readBytes(name_bytes_len);
try {
classType = Class.forName(name_bytes.toString(StandardCharsets.UTF_8));
} catch (ClassNotFoundException e) {
TurnBasedMinecraftMod.logger.warn("Failed to decode EntityInfo.classType", e);
classType = null;
}
} else {
classType = null;
}
ignoreBattle = buffer.readBoolean();
attackPower = buffer.readInt();
attackProbability = buffer.readInt();
attackVariance = buffer.readInt();
int effect_len = buffer.readInt();
ByteBuf effect_bytes = buffer.readBytes(effect_len);
attackEffect = Effect.fromString(effect_bytes.toString(StandardCharsets.UTF_8));
attackEffectProbability = buffer.readInt();
defenseDamage = buffer.readInt();
defenseDamageProbability = buffer.readInt();
evasion = buffer.readInt();
speed = buffer.readInt();
int category_len = buffer.readInt();
ByteBuf category_bytes = buffer.readBytes(category_len);
category = category_bytes.toString(StandardCharsets.UTF_8);
decisionAttack = buffer.readInt();
decisionDefend = buffer.readInt();
decisionFlee = buffer.readInt();
int custom_len = buffer.readInt();
if (custom_len > 0) {
ByteBuf custom_bytes = buffer.readBytes(custom_len);
customName = custom_bytes.toString(StandardCharsets.UTF_8);
} else {
customName = "";
}
}
public void encode(ByteBuf buffer) {
if (classType == null) {
buffer.writeInt(0);
} else {
String name = classType.getName();
byte[] name_bytes = name.getBytes(StandardCharsets.UTF_8);
buffer.writeInt(name_bytes.length);
buffer.writeBytes(name_bytes);
}
buffer.writeBoolean(ignoreBattle);
buffer.writeInt(attackPower);
buffer.writeInt(attackProbability);
buffer.writeInt(attackVariance);
String effect_name = attackEffect.toString();
byte[] effect_bytes = effect_name.getBytes(StandardCharsets.UTF_8);
buffer.writeInt(effect_bytes.length);
buffer.writeBytes(effect_bytes);
buffer.writeInt(attackEffectProbability);
buffer.writeInt(defenseDamage);
buffer.writeInt(defenseDamageProbability);
buffer.writeInt(evasion);
buffer.writeInt(speed);
byte[] category_bytes = category.getBytes(StandardCharsets.UTF_8);
buffer.writeInt(category_bytes.length);
buffer.writeBytes(category_bytes);
buffer.writeInt(decisionAttack);
buffer.writeInt(decisionDefend);
buffer.writeInt(decisionFlee);
if (customName.isEmpty()) {
buffer.writeInt(0);
} else {
byte[] custom_bytes = customName.getBytes(StandardCharsets.UTF_8);
buffer.writeInt(custom_bytes.length);
buffer.writeBytes(custom_bytes);
}
}
} }

View file

@ -1,11 +1,11 @@
package com.burnedkirby.TurnBasedMinecraft.common; package com.burnedkirby.TurnBasedMinecraft.common;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent; import net.neoforged.neoforge.event.entity.living.LivingHurtEvent;
public class HurtEventHandler { public class HurtEventHandler {
@SubscribeEvent @SubscribeEvent
public void handleHurtEvent(LivingIncomingDamageEvent event) { public void handleHurtEvent(LivingHurtEvent event) {
CommonProxy proxy = TurnBasedMinecraftMod.proxy; CommonProxy proxy = TurnBasedMinecraftMod.proxy;
if (event.getEntity().level().isClientSide || proxy.getBattleManager() == null) { if (event.getEntity().level().isClientSide || proxy.getBattleManager() == null) {
return; return;

View file

@ -1,15 +0,0 @@
package com.burnedkirby.TurnBasedMinecraft.common;
import com.burnedkirby.TurnBasedMinecraft.client.ClientConfig;
import com.burnedkirby.TurnBasedMinecraft.client.ClientConfigGui;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
@Mod(value = TurnBasedMinecraftMod.MODID, dist = Dist.CLIENT)
public class TBMM_Client {
public TBMM_Client(ModContainer container) {
container.registerExtensionPoint(IConfigScreenFactory.class, ClientConfigGui::new);
}
}

View file

@ -1,6 +1,6 @@
package com.burnedkirby.TurnBasedMinecraft.common; package com.burnedkirby.TurnBasedMinecraft.common;
import com.burnedkirby.TurnBasedMinecraft.client.ClientConfig; import ca.weblite.objc.Client;
import com.burnedkirby.TurnBasedMinecraft.client.ClientProxy; import com.burnedkirby.TurnBasedMinecraft.client.ClientProxy;
import com.burnedkirby.TurnBasedMinecraft.common.networking.*; import com.burnedkirby.TurnBasedMinecraft.common.networking.*;
import com.mojang.brigadier.LiteralMessage; import com.mojang.brigadier.LiteralMessage;
@ -19,22 +19,20 @@ import net.minecraft.network.chat.HoverEvent;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.config.ModConfig;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent;
import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.server.ServerStartingEvent; import net.neoforged.neoforge.event.server.ServerStartingEvent;
import net.neoforged.neoforge.event.server.ServerStoppingEvent; import net.neoforged.neoforge.event.server.ServerStoppingEvent;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent;
import net.neoforged.neoforge.network.registration.IPayloadRegistrar;
import net.neoforged.neoforge.network.PacketDistributor; import net.neoforged.neoforge.network.PacketDistributor;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -42,7 +40,7 @@ import org.apache.logging.log4j.Logger;
public class TurnBasedMinecraftMod { public class TurnBasedMinecraftMod {
public static final String MODID = "com_burnedkirby_turnbasedminecraft"; public static final String MODID = "com_burnedkirby_turnbasedminecraft";
public static final String NAME = "Turn Based Minecraft Mod"; public static final String NAME = "Turn Based Minecraft Mod";
public static final String VERSION = "1.26.0"; public static final String VERSION = "1.25.2";
public static final String CONFIG_FILENAME = "TBM_Config.toml"; public static final String CONFIG_FILENAME = "TBM_Config.toml";
public static final String DEFAULT_CONFIG_FILENAME = "TBM_Config_DEFAULT.toml"; public static final String DEFAULT_CONFIG_FILENAME = "TBM_Config_DEFAULT.toml";
public static final String CONFIG_DIRECTORY = "config/TurnBasedMinecraft/"; public static final String CONFIG_DIRECTORY = "config/TurnBasedMinecraft/";
@ -54,7 +52,7 @@ public class TurnBasedMinecraftMod {
public static final String MUSIC_BATTLE = MUSIC_ROOT + "battle/"; public static final String MUSIC_BATTLE = MUSIC_ROOT + "battle/";
private static final String PROTOCOL_VERSION = Integer.toString(3); private static final String PROTOCOL_VERSION = Integer.toString(3);
private static final ResourceLocation HANDLER_ID = ResourceLocation.fromNamespaceAndPath(MODID, "main_channel"); private static final ResourceLocation HANDLER_ID = new ResourceLocation(MODID, "main_channel");
protected static Logger logger = LogManager.getLogger(); protected static Logger logger = LogManager.getLogger();
public static ResourceLocation getNetResourceLocation() { public static ResourceLocation getNetResourceLocation() {
@ -63,31 +61,34 @@ public class TurnBasedMinecraftMod {
public static CommonProxy proxy; public static CommonProxy proxy;
public TurnBasedMinecraftMod(ModContainer container) { public TurnBasedMinecraftMod(IEventBus eventBus) {
container.getEventBus().addListener(this::firstInit); eventBus.addListener(this::firstInit);
container.getEventBus().addListener(this::secondInitClient); eventBus.addListener(this::secondInitClient);
container.getEventBus().addListener(this::secondInitServer); eventBus.addListener(this::secondInitServer);
container.getEventBus().addListener(this::registerNetwork); eventBus.addListener(this::registerNetwork);
NeoForge.EVENT_BUS.register(this); NeoForge.EVENT_BUS.register(this);
container.registerConfig(ModConfig.Type.CLIENT, ClientConfig.CLIENT_SPEC);
} }
private void registerNetwork(final RegisterPayloadHandlersEvent event) { private void registerNetwork(final RegisterPayloadHandlerEvent event) {
final PayloadRegistrar registrar = event.registrar(PROTOCOL_VERSION); final IPayloadRegistrar registrar = event.registrar(MODID);
registrar.playToServer(PacketBattleDecision.TYPE, PacketBattleDecision.STREAM_CODEC, new PacketBattleDecision.PayloadHandler()); registrar.play(PacketBattleDecision.ID, PacketBattleDecision::new, handler -> handler
.server(PacketBattleDecision.PayloadHandler.getInstance()::handleData));
registrar.playToClient(PacketBattleInfo.TYPE, PacketBattleInfo.STREAM_CODEC, new PacketBattleInfo.PayloadHandler()); registrar.play(PacketBattleInfo.ID, PacketBattleInfo::new, handler -> handler
.client(PacketBattleInfo.PayloadHandler.getInstance()::handleData));
registrar.playToClient(PacketBattleMessage.TYPE, PacketBattleMessage.STREAM_CODEC, new PacketBattleMessage.PayloadHandler()); registrar.play(PacketBattleMessage.ID, PacketBattleMessage::new, handler -> handler
.client(PacketBattleMessage.PayloadHandler.getInstance()::handleData));
registrar.playToServer(PacketBattleRequestInfo.TYPE, PacketBattleRequestInfo.STREAM_CODEC, new PacketBattleRequestInfo.PayloadHandler()); registrar.play(PacketBattleRequestInfo.ID, PacketBattleRequestInfo::new, handler -> handler
.server(PacketBattleRequestInfo.PayloadHandler.getInstance()::handleData));
registrar.playToClient(PacketEditingMessage.TYPE, PacketEditingMessage.STREAM_CODEC, new PacketEditingMessage.PayloadHandler()); registrar.play(PacketEditingMessage.ID, PacketEditingMessage::new, handler -> handler
.client(PacketEditingMessage.PayloadHandler.getInstance()::handleData));
registrar.playToClient(PacketGeneralMessage.TYPE, PacketGeneralMessage.STREAM_CODEC, new PacketGeneralMessage.PayloadHandler()); registrar.play(PacketGeneralMessage.ID, PacketGeneralMessage::new, handler -> handler
.client(PacketGeneralMessage.PayloadHandler.getInstance()::handleData));
registrar.playToClient(PacketClientGUI.TYPE, PacketClientGUI.STREAM_CODEC, new PacketClientGUI.PayloadHandler());
logger.debug("Register packets com_burnedkirby_turnbasedminecraft"); logger.debug("Register packets com_burnedkirby_turnbasedminecraft");
} }
@ -151,8 +152,7 @@ public class TurnBasedMinecraftMod {
proxy.getConfig().setBattleDisabledForAll(true); proxy.getConfig().setBattleDisabledForAll(true);
for (ServerPlayer player : c.getSource().getServer().getPlayerList().getPlayers()) { for (ServerPlayer player : c.getSource().getServer().getPlayerList().getPlayers()) {
proxy.getConfig().addBattleIgnoringPlayer(player.getId()); proxy.getConfig().addBattleIgnoringPlayer(player.getId());
PacketDistributor.sendToPlayer(player, new PacketGeneralMessage("OP disabled turn-based-combat for everyone")); PacketDistributor.PLAYER.with(player).send(new PacketGeneralMessage("OP disabled turn-based-combat for everyone"));
PacketDistributor.sendToPlayer(player, new PacketGeneralMessage("OP disabled turn-based-combat for everyone"));
} }
return 1; return 1;
})); }));
@ -173,7 +173,7 @@ public class TurnBasedMinecraftMod {
proxy.getConfig().setBattleDisabledForAll(false); proxy.getConfig().setBattleDisabledForAll(false);
proxy.getConfig().clearBattleIgnoringPlayers(); proxy.getConfig().clearBattleIgnoringPlayers();
for (ServerPlayer player : c.getSource().getServer().getPlayerList().getPlayers()) { for (ServerPlayer player : c.getSource().getServer().getPlayerList().getPlayers()) {
PacketDistributor.sendToPlayer(player, new PacketGeneralMessage("OP enabled turn-based-combat for everyone")); PacketDistributor.PLAYER.with(player).send(new PacketGeneralMessage("OP enabled turn-based-combat for everyone"));
} }
return 1; return 1;
})); }));
@ -184,7 +184,7 @@ public class TurnBasedMinecraftMod {
.then(Commands.argument("targets", EntityArgument.players()).executes(c -> { .then(Commands.argument("targets", EntityArgument.players()).executes(c -> {
for (ServerPlayer player : EntityArgument.getPlayers(c, "targets")) { for (ServerPlayer player : EntityArgument.getPlayers(c, "targets")) {
proxy.getConfig().addBattleIgnoringPlayer(player.getId()); proxy.getConfig().addBattleIgnoringPlayer(player.getId());
PacketDistributor.sendToPlayer(player, new PacketGeneralMessage("OP enabled turn-based-combat for you")); PacketDistributor.PLAYER.with(player).send(new PacketGeneralMessage("OP enabled turn-based-combat for you"));
c.getSource().sendSuccess(() -> Component.literal("Enabled turn-based-combat for " + player.getDisplayName().getString()), true); c.getSource().sendSuccess(() -> Component.literal("Enabled turn-based-combat for " + player.getDisplayName().getString()), true);
} }
return 1; return 1;
@ -196,7 +196,7 @@ public class TurnBasedMinecraftMod {
.then(Commands.argument("targets", EntityArgument.players()).executes(c -> { .then(Commands.argument("targets", EntityArgument.players()).executes(c -> {
for (ServerPlayer player : EntityArgument.getPlayers(c, "targets")) { for (ServerPlayer player : EntityArgument.getPlayers(c, "targets")) {
proxy.getConfig().removeBattleIgnoringPlayer(player.getId()); proxy.getConfig().removeBattleIgnoringPlayer(player.getId());
PacketDistributor.sendToPlayer(player, new PacketGeneralMessage("OP disabled turn-based-combat for you")); PacketDistributor.PLAYER.with(player).send(new PacketGeneralMessage("OP disabled turn-based-combat for you"));
c.getSource().sendSuccess(() -> Component.literal("Disabled turn-based-combat for " + player.getDisplayName().getString()), true); c.getSource().sendSuccess(() -> Component.literal("Disabled turn-based-combat for " + player.getDisplayName().getString()), true);
} }
return 1; return 1;
@ -209,12 +209,12 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
proxy.setEditingPlayer(player); proxy.setEditingPlayer(player);
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
logger.info("Begin editing TBM Entity for player \"" + player.getDisplayName().getString() + "\" (\"" + c.getSource().getDisplayName() + "\")"); logger.info("Begin editing TBM Entity for player \"" + player.getDisplayName().getString() + "\" (\"" + c.getSource().getDisplayName() + "\")");
} }
return 1; return 1;
@ -225,14 +225,14 @@ public class TurnBasedMinecraftMod {
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
if (!proxy.getConfig().editEntityEntry(editingInfo.entityInfo)) { if (!proxy.getConfig().editEntityEntry(editingInfo.entityInfo)) {
PacketDistributor.sendToPlayer(player, new PacketGeneralMessage("An error occurred while attempting to save an entry to the config")); PacketDistributor.PLAYER.with(player).send(new PacketGeneralMessage("An error occurred while attempting to save an entry to the config"));
proxy.removeEditingInfo(player.getId()); proxy.removeEditingInfo(player.getId());
} else { } else {
proxy.removeEditingInfo(player.getId()); proxy.removeEditingInfo(player.getId());
PacketDistributor.sendToPlayer(player, new PacketGeneralMessage("Entity info saved in config and loaded.")); PacketDistributor.PLAYER.with(player).send(new PacketGeneralMessage("Entity info saved in config and loaded."));
} }
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -245,7 +245,7 @@ public class TurnBasedMinecraftMod {
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null) { if (editingInfo != null) {
proxy.removeEditingInfo(player.getId()); proxy.removeEditingInfo(player.getId());
PacketDistributor.sendToPlayer(player, new PacketGeneralMessage("Cancelled editing entry.")); PacketDistributor.PLAYER.with(player).send(new PacketGeneralMessage("Cancelled editing entry."));
} }
return 1; return 1;
})) }))
@ -257,11 +257,11 @@ public class TurnBasedMinecraftMod {
Message exceptionMessage = new LiteralMessage("Invalid action for tbm-edit"); Message exceptionMessage = new LiteralMessage("Invalid action for tbm-edit");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
proxy.setEditingPlayer(player); proxy.setEditingPlayer(player);
proxy.getEditingInfo(player.getId()).isEditingCustomName = true; proxy.getEditingInfo(player.getId()).isEditingCustomName = true;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
logger.info("Begin editing custom TBM Entity for player \"" + player.getDisplayName().getString() + "\" (\"" + c.getSource().getDisplayName() + "\")"); logger.info("Begin editing custom TBM Entity for player \"" + player.getDisplayName().getString() + "\" (\"" + c.getSource().getDisplayName() + "\")");
} }
return 1; return 1;
@ -271,9 +271,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -285,9 +285,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_IGNORE_BATTLE)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_IGNORE_BATTLE));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -301,9 +301,9 @@ public class TurnBasedMinecraftMod {
boolean ignoreBattle = BoolArgumentType.getBool(c, "ignoreBattle"); boolean ignoreBattle = BoolArgumentType.getBool(c, "ignoreBattle");
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.ignoreBattle = ignoreBattle; editingInfo.entityInfo.ignoreBattle = ignoreBattle;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -316,9 +316,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_POWER)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_POWER));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -335,9 +335,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.attackPower = attackPower; editingInfo.entityInfo.attackPower = attackPower;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -350,9 +350,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_PROBABILITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_PROBABILITY));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -371,9 +371,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.attackProbability = attackProbability; editingInfo.entityInfo.attackProbability = attackProbability;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -386,9 +386,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_VARIANCE)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_VARIANCE));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -405,9 +405,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.attackVariance = attackVariance; editingInfo.entityInfo.attackVariance = attackVariance;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -420,9 +420,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_EFFECT)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_EFFECT));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -436,9 +436,9 @@ public class TurnBasedMinecraftMod {
EntityInfo.Effect effect = EntityInfo.Effect.fromString(StringArgumentType.getString(c, "attackEffect")); EntityInfo.Effect effect = EntityInfo.Effect.fromString(StringArgumentType.getString(c, "attackEffect"));
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.attackEffect = effect; editingInfo.entityInfo.attackEffect = effect;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -451,9 +451,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_EFFECT_PROBABILITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_ATTACK_EFFECT_PROBABILITY));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -472,9 +472,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.attackEffectProbability = attackEffectProbability; editingInfo.entityInfo.attackEffectProbability = attackEffectProbability;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -487,9 +487,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DEFENSE_DAMAGE)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DEFENSE_DAMAGE));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -506,9 +506,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.defenseDamage = defenseDamage; editingInfo.entityInfo.defenseDamage = defenseDamage;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -521,9 +521,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DEFENSE_DAMAGE_PROBABILITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DEFENSE_DAMAGE_PROBABILITY));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -542,9 +542,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.defenseDamageProbability = defenseDamageProbability; editingInfo.entityInfo.defenseDamageProbability = defenseDamageProbability;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -557,9 +557,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_EVASION)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_EVASION));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -578,9 +578,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.evasion = evasion; editingInfo.entityInfo.evasion = evasion;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -593,9 +593,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_SPEED)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_SPEED));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -612,9 +612,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.speed = speed; editingInfo.entityInfo.speed = speed;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -627,9 +627,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_CATEGORY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_CATEGORY));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -643,9 +643,9 @@ public class TurnBasedMinecraftMod {
String category = StringArgumentType.getString(c, "category"); String category = StringArgumentType.getString(c, "category");
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.category = category; editingInfo.entityInfo.category = category;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -658,9 +658,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DECISION_ATTACK)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DECISION_ATTACK));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -679,9 +679,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.decisionAttack = decisionAttack; editingInfo.entityInfo.decisionAttack = decisionAttack;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -694,9 +694,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DECISION_DEFEND)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DECISION_DEFEND));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -715,9 +715,9 @@ public class TurnBasedMinecraftMod {
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.decisionDefend = decisionDefend; editingInfo.entityInfo.decisionDefend = decisionDefend;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -730,9 +730,9 @@ public class TurnBasedMinecraftMod {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DECISION_FLEE)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_DECISION_FLEE));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -746,9 +746,9 @@ public class TurnBasedMinecraftMod {
int decisionFlee = IntegerArgumentType.getInteger(c, "decisionFlee"); int decisionFlee = IntegerArgumentType.getInteger(c, "decisionFlee");
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.decisionFlee = decisionFlee; editingInfo.entityInfo.decisionFlee = decisionFlee;
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo));
} else if (editingInfo != null) { } else if (editingInfo != null) {
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY));
} else { } else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\")."); Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage); throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
@ -764,7 +764,7 @@ public class TurnBasedMinecraftMod {
.requires(c -> c.hasPermission(2)) .requires(c -> c.hasPermission(2))
.executes(c -> { .executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
PacketDistributor.sendToPlayer(player, new PacketEditingMessage(PacketEditingMessage.Type.SERVER_EDIT)); PacketDistributor.PLAYER.with(player).send(new PacketEditingMessage(PacketEditingMessage.Type.SERVER_EDIT));
return 1; return 1;
}) })
.then(Commands.literal("leave_battle_cooldown").executes(c -> { .then(Commands.literal("leave_battle_cooldown").executes(c -> {
@ -1671,15 +1671,6 @@ public class TurnBasedMinecraftMod {
return 1; return 1;
}))) })))
); );
// tbm-client-edit
event.getDispatcher().register(
Commands.literal("tbm-client-edit").executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException();
PacketDistributor.sendToPlayer(player, new PacketClientGUI(0));
return 1;
})
);
} }
@SubscribeEvent @SubscribeEvent

View file

@ -4,14 +4,10 @@ import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ArrowItem; import net.minecraft.world.item.ArrowItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import javax.annotation.Nullable;
public class Utility public class Utility
{ {
public static float yawDirection(double posX, double posZ, double targetX, double targetZ) public static float yawDirection(double posX, double posZ, double targetX, double targetZ)
@ -63,11 +59,7 @@ public class Utility
} }
public static ResourceKey<Level> deserializeDimension(String dimString) { public static ResourceKey<Level> deserializeDimension(String dimString) {
ResourceLocation dimRes = ResourceLocation.parse(dimString); ResourceLocation dimRes = new ResourceLocation(dimString);
return ResourceKey.create(Registries.DIMENSION, dimRes); return ResourceKey.create(Registries.DIMENSION, dimRes);
} }
public static boolean isItemEdible(ItemStack itemStack, @Nullable LivingEntity entity) {
return itemStack.getFoodProperties(entity) != null;
}
} }

View file

@ -2,49 +2,69 @@ package com.burnedkirby.TurnBasedMinecraft.common.networking;
import com.burnedkirby.TurnBasedMinecraft.common.Battle; import com.burnedkirby.TurnBasedMinecraft.common.Battle;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod; import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import io.netty.buffer.ByteBuf; import com.burnedkirby.TurnBasedMinecraft.common.Battle.Decision;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.PlayPayloadContext;
import net.neoforged.neoforge.network.handling.IPayloadHandler;
import org.jetbrains.annotations.NotNull;
public record PacketBattleDecision(int battleID, int decision, int targetIDorItemID) implements CustomPacketPayload public class PacketBattleDecision implements CustomPacketPayload
{ {
public static final CustomPacketPayload.Type<PacketBattleDecision> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetbattledecision")); public static final ResourceLocation ID = new ResourceLocation(TurnBasedMinecraftMod.MODID, "network_packetbattledecision");
public static final StreamCodec<ByteBuf, PacketBattleDecision> STREAM_CODEC = StreamCodec.composite( private int battleID;
ByteBufCodecs.INT, private Battle.Decision decision;
PacketBattleDecision::battleID, private int targetIDOrItemID;
ByteBufCodecs.VAR_INT,
PacketBattleDecision::decision,
ByteBufCodecs.INT,
PacketBattleDecision::targetIDorItemID,
PacketBattleDecision::new
);
@Override public PacketBattleDecision() {}
public Type<? extends CustomPacketPayload> type() {
return TYPE; public PacketBattleDecision(int battleID, Battle.Decision decision, int targetIDOrItemID)
{
this.battleID = battleID;
this.decision = decision;
this.targetIDOrItemID = targetIDOrItemID;
} }
public static class PayloadHandler implements IPayloadHandler<PacketBattleDecision> { public PacketBattleDecision(final FriendlyByteBuf buf) {
@Override this.battleID = buf.readInt();
public void handle(final @NotNull PacketBattleDecision pkt, final IPayloadContext ctx) { this.decision = Decision.valueOf(buf.readInt());
ctx.enqueueWork(() -> { this.targetIDOrItemID = buf.readInt();
Battle b = TurnBasedMinecraftMod.proxy.getBattleManager().getBattleByID(pkt.battleID); }
if(b != null) {
Player player = ctx.player(); @Override
b.setDecision(player.getId(), Battle.Decision.valueOf(pkt.decision), pkt.targetIDorItemID); public void write(FriendlyByteBuf buf) {
} buf.writeInt(battleID);
}).exceptionally(e -> { buf.writeInt(decision.getValue());
ctx.disconnect(Component.literal("Exception handling PacketBattleDecision! " + e.getMessage())); buf.writeInt(targetIDOrItemID);
return null; }
});
@Override
public ResourceLocation id() {
return ID;
}
public static class PayloadHandler {
private static final PayloadHandler INSTANCE = new PayloadHandler();
public static PayloadHandler getInstance() {
return INSTANCE;
}
public void handleData(final PacketBattleDecision pkt, final PlayPayloadContext ctx) {
ctx.workHandler().submitAsync(() -> {
Battle b = TurnBasedMinecraftMod.proxy.getBattleManager().getBattleByID(pkt.battleID);
if(b != null)
{
Player player = ctx.player().get();
b.setDecision(player.getId(), pkt.decision, pkt.targetIDOrItemID);
}
}).exceptionally(e -> {
ctx.packetHandler().disconnect(Component.literal("Exception handling PacketBattleDecision! " + e.getMessage()));
return null;
});
} }
} }
} }

View file

@ -1,48 +1,91 @@
package com.burnedkirby.TurnBasedMinecraft.common.networking; package com.burnedkirby.TurnBasedMinecraft.common.networking;
import com.burnedkirby.TurnBasedMinecraft.common.CommonProxy; import java.util.ArrayList;
import java.util.Collection;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod; import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.minecraft.network.FriendlyByteBuf;
import net.neoforged.neoforge.network.handling.IPayloadHandler; import net.neoforged.neoforge.network.handling.PlayPayloadContext;
import org.jetbrains.annotations.NotNull;
import java.util.Collection; public class PacketBattleInfo implements CustomPacketPayload
public record PacketBattleInfo(Collection<Integer> sideA, Collection<Integer> sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled) implements CustomPacketPayload
{ {
public static final CustomPacketPayload.Type<PacketBattleInfo> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetbattleinfo")); public static final ResourceLocation ID = new ResourceLocation(TurnBasedMinecraftMod.MODID, "network_packetbattleinfo");
private Collection<Integer> sideA;
private Collection<Integer> sideB;
private long decisionNanos;
public static final StreamCodec<ByteBuf, PacketBattleInfo> STREAM_CODEC = StreamCodec.composite( private long maxDecisionNanos;
CommonProxy.COLLECTION_INT_CODEC, private boolean turnTimerEnabled;
PacketBattleInfo::sideA,
CommonProxy.COLLECTION_INT_CODEC,
PacketBattleInfo::sideB,
ByteBufCodecs.VAR_LONG,
PacketBattleInfo::decisionNanos,
ByteBufCodecs.VAR_LONG,
PacketBattleInfo::maxDecisionNanos,
ByteBufCodecs.BOOL,
PacketBattleInfo::turnTimerEnabled,
PacketBattleInfo::new
);
@Override public PacketBattleInfo()
public Type<? extends CustomPacketPayload> type() { {
return TYPE; sideA = new ArrayList<Integer>();
sideB = new ArrayList<Integer>();
decisionNanos = TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos();
maxDecisionNanos = decisionNanos;
turnTimerEnabled = false;
} }
public static class PayloadHandler implements IPayloadHandler<PacketBattleInfo> { public PacketBattleInfo(Collection<Integer> sideA, Collection<Integer> sideB, long decisionNanos, long maxDecisionNanos, boolean turnTimerEnabled)
@Override {
public void handle(final @NotNull PacketBattleInfo pkt, final IPayloadContext ctx) { this.sideA = sideA;
ctx.enqueueWork(() -> { this.sideB = sideB;
this.decisionNanos = decisionNanos;
this.maxDecisionNanos = maxDecisionNanos;
this.turnTimerEnabled = turnTimerEnabled;
}
public PacketBattleInfo(final FriendlyByteBuf buf) {
int sideACount = buf.readInt();
int sideBCount = buf.readInt();
this.sideA = new ArrayList<>(sideACount);
this.sideB = new ArrayList<>(sideBCount);
for (int i = 0; i < sideACount; ++i) {
this.sideA.add(buf.readInt());
}
for (int i = 0; i < sideBCount; ++i) {
this.sideB.add(buf.readInt());
}
this.decisionNanos = buf.readLong();
this.maxDecisionNanos = buf.readLong();
this.turnTimerEnabled = buf.readBoolean();
}
@Override
public void write(FriendlyByteBuf buf) {
buf.writeInt(sideA.size());
buf.writeInt(sideB.size());
for(Integer id : sideA) {
buf.writeInt(id);
}
for(Integer id : sideB) {
buf.writeInt(id);
}
buf.writeLong(decisionNanos);
buf.writeLong(maxDecisionNanos);
buf.writeBoolean(turnTimerEnabled);
}
@Override
public ResourceLocation id() {
return ID;
}
public static class PayloadHandler {
private static final PayloadHandler INSTANCE = new PayloadHandler();
public static PayloadHandler getInstance() {
return INSTANCE;
}
public void handleData(final PacketBattleInfo pkt, final PlayPayloadContext ctx) {
ctx.workHandler().submitAsync(() -> {
if(TurnBasedMinecraftMod.proxy.getLocalBattle() == null) if(TurnBasedMinecraftMod.proxy.getLocalBattle() == null)
{ {
return; return;
@ -69,7 +112,7 @@ public record PacketBattleInfo(Collection<Integer> sideA, Collection<Integer> si
TurnBasedMinecraftMod.proxy.setBattleGuiTurnTimerEnabled(pkt.turnTimerEnabled); TurnBasedMinecraftMod.proxy.setBattleGuiTurnTimerEnabled(pkt.turnTimerEnabled);
TurnBasedMinecraftMod.proxy.setBattleGuiTurnTimerMax((int)(pkt.maxDecisionNanos / 1000000000L)); TurnBasedMinecraftMod.proxy.setBattleGuiTurnTimerMax((int)(pkt.maxDecisionNanos / 1000000000L));
}).exceptionally(e -> { }).exceptionally(e -> {
ctx.disconnect(Component.literal("Exception handling PacketBattleInfo! " + e.getMessage())); ctx.packetHandler().disconnect(Component.literal("Exception handling PacketBattleInfo! " + e.getMessage()));
return null; return null;
}); });
} }

View file

@ -1,46 +1,37 @@
package com.burnedkirby.TurnBasedMinecraft.common.networking; package com.burnedkirby.TurnBasedMinecraft.common.networking;
import java.util.HashMap;
import java.util.Map;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod; import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import com.burnedkirby.TurnBasedMinecraft.common.Utility; import com.burnedkirby.TurnBasedMinecraft.common.Utility;
import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.PlayPayloadContext;
import net.neoforged.neoforge.network.handling.IPayloadHandler;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
public class PacketBattleMessage implements CustomPacketPayload public class PacketBattleMessage implements CustomPacketPayload
{ {
public static final CustomPacketPayload.Type<PacketBattleMessage> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetbattlemessage")); public static final ResourceLocation ID = new ResourceLocation(TurnBasedMinecraftMod.MODID, "network_packetbattlemessage");
public static final StreamCodec<ByteBuf, PacketBattleMessage> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.VAR_INT.map(MessageType::valueOf, MessageType::getValue),
PacketBattleMessage::getMessageType,
ByteBufCodecs.INT,
PacketBattleMessage::getEntityIDFrom,
ByteBufCodecs.INT,
PacketBattleMessage::getEntityIDTo,
ByteBufCodecs.STRING_UTF8.map(Utility::deserializeDimension, Utility::serializeDimension),
PacketBattleMessage::getDimension,
ByteBufCodecs.INT,
PacketBattleMessage::getAmount,
ByteBufCodecs.STRING_UTF8,
PacketBattleMessage::getCustom,
PacketBattleMessage::new
);
@Override @Override
public Type<? extends CustomPacketPayload> type() { public void write(FriendlyByteBuf buf) {
return TYPE; buf.writeInt(messageType.getValue());
buf.writeInt(entityIDFrom);
buf.writeInt(entityIDTo);
buf.writeUtf(Utility.serializeDimension(dimension));
buf.writeInt(amount);
buf.writeUtf(custom);
}
@Override
public ResourceLocation id() {
return ID;
} }
public enum MessageType public enum MessageType
@ -160,11 +151,6 @@ public class PacketBattleMessage implements CustomPacketPayload
public ResourceKey<Level> getDimension() { public ResourceKey<Level> getDimension() {
return dimension; return dimension;
} }
public String getDimensionSerialized() {
return Utility.serializeDimension(dimension);
}
public PacketBattleMessage() { custom = new String(); } public PacketBattleMessage() { custom = new String(); }
public PacketBattleMessage(MessageType messageType, int entityIDFrom, int entityIDTo, ResourceKey<Level> dimension, int amount) public PacketBattleMessage(MessageType messageType, int entityIDFrom, int entityIDTo, ResourceKey<Level> dimension, int amount)
@ -187,15 +173,29 @@ public class PacketBattleMessage implements CustomPacketPayload
this.custom = custom; this.custom = custom;
} }
public static class PayloadHandler implements IPayloadHandler<PacketBattleMessage> { public PacketBattleMessage(final FriendlyByteBuf buf) {
@Override this.messageType = MessageType.valueOf(buf.readInt());
public void handle(final @NotNull PacketBattleMessage pkt, final IPayloadContext ctx) { this.entityIDFrom = buf.readInt();
ctx.enqueueWork(() -> { this.entityIDTo = buf.readInt();
this.dimension = Utility.deserializeDimension(buf.readUtf());
this.amount = buf.readInt();
this.custom = buf.readUtf();
}
public static class PayloadHandler {
private static final PayloadHandler INSTANCE = new PayloadHandler();
public static PayloadHandler getInstance() {
return INSTANCE;
}
public void handleData(final PacketBattleMessage pkt, final PlayPayloadContext ctx) {
ctx.workHandler().submitAsync(() -> {
if (FMLEnvironment.dist.isClient()) { if (FMLEnvironment.dist.isClient()) {
TurnBasedMinecraftMod.proxy.handlePacket(pkt, ctx); TurnBasedMinecraftMod.proxy.handlePacket(pkt, ctx);
} }
}).exceptionally(e -> { }).exceptionally(e -> {
ctx.disconnect(Component.literal("Exception handling PacketBattleMessage! " + e.getMessage())); ctx.packetHandler().disconnect(Component.literal("Exception handling PacketBattleMessage! " + e.getMessage()));
return null; return null;
}); });
} }

View file

@ -2,52 +2,61 @@ package com.burnedkirby.TurnBasedMinecraft.common.networking;
import com.burnedkirby.TurnBasedMinecraft.common.Battle; import com.burnedkirby.TurnBasedMinecraft.common.Battle;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod; import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.PlayPayloadContext;
import net.neoforged.neoforge.network.handling.IPayloadHandler;
import org.jetbrains.annotations.NotNull;
public record PacketBattleRequestInfo(int battleID) implements CustomPacketPayload public class PacketBattleRequestInfo implements CustomPacketPayload
{ {
public static final CustomPacketPayload.Type<PacketBattleRequestInfo> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetbattlerequestinfo")); public static final ResourceLocation ID = new ResourceLocation(TurnBasedMinecraftMod.MODID, "network_packetbattlerequestinfo");
public static final StreamCodec<ByteBuf, PacketBattleRequestInfo> STREAM_CODEC = StreamCodec.composite( private int battleID;
ByteBufCodecs.INT,
PacketBattleRequestInfo::battleID, public PacketBattleRequestInfo() {}
PacketBattleRequestInfo::new
);
public PacketBattleRequestInfo(int battleID) public PacketBattleRequestInfo(int battleID)
{ {
this.battleID = battleID; this.battleID = battleID;
} }
@Override public PacketBattleRequestInfo(final FriendlyByteBuf buf) {
public Type<? extends CustomPacketPayload> type() { battleID = buf.readInt();
return TYPE;
} }
public static class PayloadHandler implements IPayloadHandler<PacketBattleRequestInfo> { @Override
@Override public void write(FriendlyByteBuf buf) {
public void handle(final @NotNull PacketBattleRequestInfo pkt, final IPayloadContext ctx) { buf.writeInt(battleID);
ctx.enqueueWork(() -> { }
@Override
public ResourceLocation id() {
return ID;
}
public static class PayloadHandler {
private static final PayloadHandler INSTANCE = new PayloadHandler();
public static PayloadHandler getInstance() {
return INSTANCE;
}
public void handleData(final PacketBattleRequestInfo pkt, final PlayPayloadContext ctx) {
ctx.workHandler().submitAsync(() -> {
Battle b = TurnBasedMinecraftMod.proxy.getBattleManager().getBattleByID(pkt.battleID); Battle b = TurnBasedMinecraftMod.proxy.getBattleManager().getBattleByID(pkt.battleID);
if(b == null) { if(b == null) {
return; return;
} }
ctx.reply(new PacketBattleInfo( ctx.replyHandler().send(new PacketBattleInfo(
b.getSideAIDs(), b.getSideAIDs(),
b.getSideBIDs(), b.getSideBIDs(),
b.getTimerNanos(), b.getTimerNanos(),
TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(), TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationNanos(),
!TurnBasedMinecraftMod.proxy.getConfig().isBattleDecisionDurationForever())); !TurnBasedMinecraftMod.proxy.getConfig().isBattleDecisionDurationForever()));
}).exceptionally(e -> { }).exceptionally(e -> {
ctx.disconnect(Component.literal("Exception handling PacketBattleRequestInfo! " + e.getMessage())); ctx.packetHandler().disconnect(Component.literal("Exception handling PacketBattleRequestInfo! " + e.getMessage()));
return null; return null;
}); });
} }

View file

@ -1,42 +0,0 @@
package com.burnedkirby.TurnBasedMinecraft.common.networking;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.network.handling.IPayloadContext;
import net.neoforged.neoforge.network.handling.IPayloadHandler;
import org.jetbrains.annotations.NotNull;
public record PacketClientGUI(int reserved) implements CustomPacketPayload {
public static final CustomPacketPayload.Type<PacketClientGUI> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetclientgui"));
public static final StreamCodec<ByteBuf, PacketClientGUI> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.VAR_INT,
PacketClientGUI::reserved,
PacketClientGUI::new
);
@Override
public Type<? extends CustomPacketPayload> type() {
return TYPE;
}
public static class PayloadHandler implements IPayloadHandler<PacketClientGUI> {
@Override
public void handle(final @NotNull PacketClientGUI pkt, final IPayloadContext ctx) {
ctx.enqueueWork(() -> {
if (FMLEnvironment.dist.isClient()) {
TurnBasedMinecraftMod.proxy.showClientConfigGui();
}
}).exceptionally(e -> {
ctx.disconnect(Component.literal("Exception handling PacketClientGUI! " + e.getMessage()));
return null;
});
}
}
}

View file

@ -2,36 +2,48 @@ package com.burnedkirby.TurnBasedMinecraft.common.networking;
import com.burnedkirby.TurnBasedMinecraft.common.EntityInfo; import com.burnedkirby.TurnBasedMinecraft.common.EntityInfo;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod; import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.PlayPayloadContext;
import net.neoforged.neoforge.network.handling.IPayloadHandler;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class PacketEditingMessage implements CustomPacketPayload public class PacketEditingMessage implements CustomPacketPayload
{ {
public static final CustomPacketPayload.Type<PacketEditingMessage> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packeteditingmessage")); public static final ResourceLocation ID = new ResourceLocation(TurnBasedMinecraftMod.MODID, "network_packeteditingmessage");
public static final StreamCodec<ByteBuf, PacketEditingMessage> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.INT.map(Type::valueOf, Type::getValue),
PacketEditingMessage::getType,
StreamCodec.ofMember(EntityInfo::encode, EntityInfo::new),
PacketEditingMessage::getEntityInfo,
PacketEditingMessage::new
);
@Override @Override
public CustomPacketPayload.Type<? extends CustomPacketPayload> type() { public void write(FriendlyByteBuf buf) {
return TYPE; buf.writeInt(type.getValue());
if(entityInfo.classType != null) {
buf.writeUtf(entityInfo.classType.getName());
} else {
buf.writeUtf("unknown");
}
buf.writeBoolean(entityInfo.ignoreBattle);
buf.writeInt(entityInfo.attackPower);
buf.writeInt(entityInfo.attackProbability);
buf.writeInt(entityInfo.attackVariance);
buf.writeUtf(entityInfo.attackEffect.toString());
buf.writeInt(entityInfo.attackEffectProbability);
buf.writeInt(entityInfo.defenseDamage);
buf.writeInt(entityInfo.defenseDamageProbability);
buf.writeInt(entityInfo.evasion);
buf.writeInt(entityInfo.speed);
buf.writeUtf(entityInfo.category);
buf.writeInt(entityInfo.decisionAttack);
buf.writeInt(entityInfo.decisionDefend);
buf.writeInt(entityInfo.decisionFlee);
buf.writeUtf(entityInfo.customName);
}
@Override
public ResourceLocation id() {
return ID;
} }
public enum Type public enum Type
@ -132,15 +144,20 @@ public class PacketEditingMessage implements CustomPacketPayload
this.entityInfo.customName = buf.readUtf(); this.entityInfo.customName = buf.readUtf();
} }
public static class PayloadHandler implements IPayloadHandler<PacketEditingMessage> { public static class PayloadHandler {
@Override private static final PayloadHandler INSTANCE = new PayloadHandler();
public void handle(final @NotNull PacketEditingMessage pkt, final IPayloadContext ctx) {
ctx.enqueueWork(() -> { public static PayloadHandler getInstance() {
return INSTANCE;
}
public void handleData(final PacketEditingMessage pkt, final PlayPayloadContext ctx) {
ctx.workHandler().submitAsync(() -> {
if (FMLEnvironment.dist.isClient()) { if (FMLEnvironment.dist.isClient()) {
TurnBasedMinecraftMod.proxy.handlePacket(pkt, ctx); TurnBasedMinecraftMod.proxy.handlePacket(pkt, ctx);
} }
}).exceptionally(e -> { }).exceptionally(e -> {
ctx.disconnect(Component.literal("Exception handling PacketEditingMessage! " + e.getMessage())); ctx.packetHandler().disconnect(Component.literal("Exception handling PacketEditingMessage! " + e.getMessage()));
return null; return null;
}); });
} }

View file

@ -1,50 +1,62 @@
package com.burnedkirby.TurnBasedMinecraft.common.networking; package com.burnedkirby.TurnBasedMinecraft.common.networking;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod; import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.PlayPayloadContext;
import net.neoforged.neoforge.network.handling.IPayloadHandler;
import org.jetbrains.annotations.NotNull;
public record PacketGeneralMessage(String message) implements CustomPacketPayload public class PacketGeneralMessage implements CustomPacketPayload
{ {
public static final CustomPacketPayload.Type<PacketGeneralMessage> TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(TurnBasedMinecraftMod.MODID, "network_packetgeneralmessage")); public static final ResourceLocation ID = new ResourceLocation(TurnBasedMinecraftMod.MODID, "network_packetgeneralmessage");
public static final StreamCodec<ByteBuf, PacketGeneralMessage> STREAM_CODEC = StreamCodec.composite( String message;
ByteBufCodecs.STRING_UTF8,
PacketGeneralMessage::message,
PacketGeneralMessage::new
);
public String getMessage() { public String getMessage() {
return message; return message;
} }
public PacketGeneralMessage()
{
message = new String();
}
public PacketGeneralMessage(String message) public PacketGeneralMessage(String message)
{ {
this.message = message; this.message = message;
} }
@Override public PacketGeneralMessage(final FriendlyByteBuf buf) {
public Type<? extends CustomPacketPayload> type() { this.message = buf.readUtf();
return TYPE;
} }
public static class PayloadHandler implements IPayloadHandler<PacketGeneralMessage> { @Override
@Override public void write(FriendlyByteBuf buf) {
public void handle(final @NotNull PacketGeneralMessage pkt, final IPayloadContext ctx) { buf.writeUtf(message);
ctx.enqueueWork(() -> { }
@Override
public ResourceLocation id() {
return ID;
}
public static class PayloadHandler {
private static final PayloadHandler INSTANCE = new PayloadHandler();
public static PayloadHandler getInstance() {
return INSTANCE;
}
public void handleData(final PacketGeneralMessage pkt, final PlayPayloadContext ctx) {
ctx.workHandler().submitAsync(() -> {
if (FMLEnvironment.dist.isClient()) { if (FMLEnvironment.dist.isClient()) {
TurnBasedMinecraftMod.proxy.handlePacket(pkt, ctx); TurnBasedMinecraftMod.proxy.handlePacket(pkt, ctx);
} }
}).exceptionally(e -> { }).exceptionally(e -> {
ctx.disconnect(Component.literal("Exception handling PacketGeneralMessage! " + e.getMessage())); ctx.packetHandler().disconnect(Component.literal("Exception handling PacketGeneralMessage! " + e.getMessage()));
return null; return null;
}); });
} }

View file

@ -0,0 +1,54 @@
# This is an example mods.toml file. It contains the data relating to the loading mods.
# There are several mandatory fields (#mandatory), and many more that are optional (#optional).
# The overall format is standard TOML format, v0.5.0.
# Note that there are a couple of TOML lists in this file.
# Find more information on toml format here: https://github.com/toml-lang/toml
# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml
modLoader="javafml" #mandatory
# A version range to match for said mod loader - for regular FML @Mod it will be the forge version
loaderVersion="${loader_version_range}" #mandatory (34 is current forge version)
# A URL to refer people to when problems occur with this mod
issueTrackerURL="https://github.com/Stephen-Seo/TurnBasedMinecraftMod/issues" #optional
license="${mod_license}"
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] #mandatory
# The modid of the mod
modId="${mod_id}" #mandatory
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
version="${mod_version}" #mandatory
# A display name for the mod
displayName="${mod_name}" #mandatory
# A URL to query for updates for this mod. See the JSON update specification <here>
#updateJSONURL="" #optional
# A URL for the "homepage" for this mod, displayed in the mod UI
displayURL="https://github.com/Stephen-Seo/TurnBasedMinecraftMod" #optional
# A file name (in the root of the mod JAR) containing a logo for display
#logoFile="" #optional
# A text field displayed in the mod UI
credits="Thanks for this mod goes to Java" #optional
# A text field displayed in the mod UI
authors="${mod_authors}" #optional
# The description text for the mod (multi line!) (#mandatory)
description='''${mod_description}'''
logoFile="assets/com_burnedkirby_turnbasedminecraft/tbmm_icon.png"
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.com_burnedkirby_turnbasedminecraft]] #optional
# the modid of the dependency
modId="neoforge" #mandatory
# Does this dependency have to exist - if not, ordering below must be specified
type="required" #mandatory
# The version range of the dependency
versionRange="${neo_version_range}" #mandatory
# An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
ordering="NONE"
# Side this dependency is applied on - BOTH, CLIENT or SERVER
side="BOTH"
# Here's another dependency
[[dependencies.com_burnedkirby_turnbasedminecraft]]
modId="minecraft"
type="required"
versionRange="${minecraft_version_range}"
ordering="NONE"
side="BOTH"

View file

@ -1,13 +1,21 @@
# Please do not change this option, the mod uses this to keep track of what new # Please do not change this option, the mod uses this to keep track of what new
# changes to add to the config. # changes to add to the config.
version = 11 version = 10
# Change this to "true" if you want the config to never be replaced. This means # Change this to "true" if you want the config to never be replaced. This means
# that you will not get new mob listings from future updates unless this remains # that you will not get new mob listings from future updates unless this remains
# "false"! # "false"!
do_not_overwrite = false do_not_overwrite = false
[client_config]
# What categories play this type of music (battle_music). Unknown categories will default to this type.
battle_music = ["monster", "animal", "boss", "player"]
# What categories play this type of music (silly_music).
silly_music = ["passive"]
# Minimum percentage of silly entities in battle to use silly music.
silly_music_threshold = 40
# Note that client config is no longer stored here but rather in the settings.
[server_config] [server_config]
@ -130,37 +138,6 @@ decision_defend_probability = 0
decision_flee_probability = 0 decision_flee_probability = 0
ignore_battle = false ignore_battle = false
[[server_config.entity]]
name = "net.minecraft.world.entity.monster.Bogged"
attack_power = 3
attack_probability = 75
attack_variance = 1
attack_effect = "poison"
attack_effect_probability = 50
defense_damage = 0
evasion = 10
category = "monster"
speed = 20
decision_attack_probability = 100
decision_defend_probability = 0
decision_flee_probability = 0
ignore_battle = false
[[server_config.entity]]
name = "net.minecraft.world.entity.monster.breeze.Breeze"
attack_power = 1
attack_probability = 50
attack_effect = "unknown"
attack_variance = 0
defense_damage = 0
evasion = 45
category = "monster"
speed = 45
decision_attack_probability = 100
decision_defend_probability = 0
decision_flee_probability = 0
ignore_battle = false
[[server_config.entity]] [[server_config.entity]]
name = "net.minecraft.world.entity.monster.CaveSpider" name = "net.minecraft.world.entity.monster.CaveSpider"
attack_power = 2 attack_power = 2
@ -707,21 +684,6 @@ decision_defend_probability = 0
decision_flee_probability = 100 decision_flee_probability = 100
ignore_battle = false ignore_battle = false
[[server_config.entity]]
name = "net.minecraft.world.entity.animal.armadillo.Armadillo"
attack_power = 0
attack_probability = 0
attack_variance = 0
attack_effect = "unknown"
defense_damage = 0
evasion = 10
category = "passive"
speed = 20
decision_attack_probability = 0
decision_defend_probability = 50
decision_flee_probability = 50
ignore_battle = false
[[server_config.entity]] [[server_config.entity]]
name = "net.minecraft.world.entity.animal.axolotl.Axolotl" name = "net.minecraft.world.entity.animal.axolotl.Axolotl"
attack_power = 2 attack_power = 2

View file

@ -1,93 +0,0 @@
# This is an example neoforge.mods.toml file. It contains the data relating to the loading mods.
# There are several mandatory fields (#mandatory), and many more that are optional (#optional).
# The overall format is standard TOML format, v0.5.0.
# Note that there are a couple of TOML lists in this file.
# Find more information on toml format here: https://github.com/toml-lang/toml
# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml
modLoader="javafml" #mandatory
# A version range to match for said mod loader - for regular FML @Mod it will be the FML version. This is currently 2.
loaderVersion="${loader_version_range}" #mandatory
# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties.
# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here.
license="${mod_license}"
# A URL to refer people to when problems occur with this mod
#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] #mandatory
# The modid of the mod
modId="${mod_id}" #mandatory
# The version number of the mod
version="${mod_version}" #mandatory
# A display name for the mod
displayName="${mod_name}" #mandatory
# A URL to query for updates for this mod. See the JSON update specification https://docs.neoforged.net/docs/misc/updatechecker/
#updateJSONURL="https://change.me.example.invalid/updates.json" #optional
# A URL for the "homepage" for this mod, displayed in the mod UI
#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional
# A file name (in the root of the mod JAR) containing a logo for display
#logoFile="examplemod.png" #optional
logoFile="assets/com_burnedkirby_turnbasedminecraft/tbmm_icon.png"
# A text field displayed in the mod UI
#credits="" #optional
# A text field displayed in the mod UI
authors="${mod_authors}" #optional
# The description text for the mod (multi line!) (#mandatory)
description='''${mod_description}'''
# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded.
#[[mixins]]
#config="${mod_id}.mixins.json"
# The [[accessTransformers]] block allows you to declare where your AT file is.
# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg
#[[accessTransformers]]
#file="META-INF/accesstransformer.cfg"
# The coremods config file path is not configurable and is always loaded from META-INF/coremods.json
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.${mod_id}]] #optional
# the modid of the dependency
modId="neoforge" #mandatory
# The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive).
# 'required' requires the mod to exist, 'optional' does not
# 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning
type="required" #mandatory
# Optional field describing why the dependency is required or why it is incompatible
# reason="..."
# The version range of the dependency
versionRange="${neo_version_range}" #mandatory
# An ordering relationship for the dependency.
# BEFORE - This mod is loaded BEFORE the dependency
# AFTER - This mod is loaded AFTER the dependency
ordering="NONE"
# Side this dependency is applied on - BOTH, CLIENT, or SERVER
side="BOTH"
# Here's another dependency
[[dependencies.${mod_id}]]
modId="minecraft"
type="required"
# This version range declares a minimum of the current minecraft version up to but not including the next major version
versionRange="${minecraft_version_range}"
ordering="NONE"
side="BOTH"
# Features are specific properties of the game environment, that you may want to declare you require. This example declares
# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't
# stop your mod loading on the server for example.
#[features.${mod_id}]
#openGLVersion="[3.2,)"