diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 3e0b8b2..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: CI - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - build-api: - name: Build ReiParticlesAPI - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: 17 - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 - - name: Build API module - working-directory: forge-port-api - run: ./gradlew build - - name: Upload API jar - uses: actions/upload-artifact@v4 - with: - name: reiparticlesapi-jar - path: forge-port-api/build/libs/*.jar - - build-mod: - name: Build ReiParticleSkill - needs: build-api - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: 17 - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 - - name: Build API dependency first - working-directory: forge-port-api - run: ./gradlew build -x test - - name: Build & test main mod - working-directory: forge-port - run: ./gradlew build - - name: Upload mod jar - uses: actions/upload-artifact@v4 - with: - name: reiparticleskill-jar - path: forge-port/build/libs/*.jar diff --git a/.gitignore b/.gitignore index 43bad79..5f6ebcd 100644 Binary files a/.gitignore and b/.gitignore differ diff --git a/.reuse/dep5 b/.reuse/dep5 deleted file mode 100644 index 43f9271..0000000 --- a/.reuse/dep5 +++ /dev/null @@ -1,49 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: ReiParticleSkill -Upstream-Contact: Reiasu - -Files: * -Copyright: 2025 Reiasu -License: LGPL-3.0-only - -Files: LICENSES/LGPL-3.0.txt -Copyright: 2007 Free Software Foundation, Inc. -License: LGPL-3.0-only - -Files: LICENSES/GPL-3.0.txt -Copyright: 2007 Free Software Foundation, Inc. -License: GPL-3.0-only - -Files: LICENSES/README.md -Copyright: 2025 Reiasu -License: LGPL-3.0-only - -Files: THIRD_PARTY_NOTICES.md -Copyright: 2025 Reiasu -License: LGPL-3.0-only -Comment: Contains third-party license texts reproduced for compliance. - -Files: forge-port/src/main/resources/assets/reiparticleskill/sounds/*.ogg -Copyright: 2025 Reiasu -License: LGPL-3.0-only - -Files: forge-port/*.gradle forge-port/gradle.properties forge-port-api/*.gradle forge-port-api/gradle.properties -Copyright: 2025 Reiasu -License: LGPL-3.0-only - -Files: forge-port/settings.gradle forge-port-api/settings.gradle -Copyright: 2025 Reiasu -License: LGPL-3.0-only - -Files: forge-port/gradlew forge-port/gradlew.bat forge-port-api/gradlew forge-port-api/gradlew.bat -Copyright: Gradle Inc. -License: Apache-2.0 - -Files: forge-port/gradle/wrapper/* forge-port-api/gradle/wrapper/* -Copyright: Gradle Inc. -License: Apache-2.0 - -Files: .github/workflows/* -Copyright: 2025 Reiasu -License: LGPL-3.0-only - diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index c4e3722..326937f 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -1,22 +1,8 @@ # Attribution -## Author +Author: Reiasu -- **Reiasu** — original author and maintainer +Some of the particle math uses rhodonea curves and Lissajous figures. +Dragon respawn timing is based on vanilla's `DragonRespawnAnimation`. -## Algorithms & Inspirations - -- **Rhodonea (rose) curves** — parametric polar curves `r = cos(kθ)` used in - center particle patterns (`ClientCenterEmitter`). -- **Lissajous figures** — `x = A sin(at + δ), y = B sin(bt)` used for - oscillating particle trails. -- **Ender Dragon respawn sequence** — timing constants derived from vanilla - Minecraft's `DragonRespawnAnimation` state machine (Mojang Studios). - -## Third-Party Libraries - -See `THIRD_PARTY_NOTICES.md` for full license texts of bundled/runtime dependencies. - -## License - -This project is licensed under LGPL-3.0-only. See `LICENSE` and `NOTICE` for details. +License: LGPL-3.0-only (see `LICENSE`) diff --git a/NOTICE b/NOTICE index c72874a..4347f8b 100644 --- a/NOTICE +++ b/NOTICE @@ -1,33 +1,10 @@ -Project: ReiParticleSkill Forge Workspace -SPDX-License-Identifier: LGPL-3.0-only - +ReiParticleSkill Copyright (C) 2025 Reiasu -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, version 3 of the License only (LGPL-3.0-only). -No "or later version" clause applies. - -Note: This project is licensed solely under LGPL-3.0-only. The LGPL-3.0 text -incorporates GPLv3 conditions by reference, so the GPL-3.0 full text is -included in LICENSES/ for ease of review — not as a separate grant of rights. -See LICENSES/LGPL-3.0.txt and LICENSES/GPL-3.0.txt. - -Modules: -1. ReiParticleSkill - Forge 1.20.1 particle effects mod -2. ReiParticlesAPI - Particle system API - -License scope: -- All files in this project, including source code, build scripts, and - audio/visual assets, are licensed under LGPL-3.0-only. +Licensed under LGPL-3.0-only. +See LICENSE and LICENSES/ for full text. -Source code availability: -- If you redistribute the binary (jar), you must also make the corresponding - source code available (e.g., by providing the repository URL + version tag, - or otherwise as described in the LGPL-3.0). -- Source: https://github.com/reiasu2/ReiParticleSkill - For release builds, use the matching version tag (e.g., /tree/v1.0). +Source: https://github.com/reiasu2/ReiParticleSkill -Trademark notice: -- Minecraft is a trademark of Mojang Studios. -- This project is community-maintained and not endorsed by Mojang Studios. +Minecraft is a trademark of Mojang Studios. +This project is not affiliated with or endorsed by Mojang. diff --git a/README.md b/README.md index 6020034..19d41ce 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,23 @@ -# ReiParticleSkill Forge (1.20.1) +# ReiParticleSkill -[![License: LGPL-3.0-only](https://img.shields.io/badge/License-LGPL--3.0--only-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) +Particle effects mod for NeoForge 1.21.1. Custom dragon respawn animations, skill VFX, etc. -A Minecraft Forge 1.20.1 particle effects mod featuring custom Ender Dragon respawn animations and visual effects. +## Structure -## Modules +- `forge-port/` — single module containing both ReiParticleSkill and ReiParticlesAPI -| Module | Description | Output Jar | -|--------|-------------|------------| -| `forge-port/` | ReiParticleSkill — main mod | `reiparticleskill-1.0-SNAPSHOT-forge-port.jar` | -| `forge-port-api/` | ReiParticlesAPI — runtime library | `reiparticlesapi-1.0-SNAPSHOT-forge-port.jar` | +One jar goes in `mods/`. -Both jars must be placed in the `mods/` folder. - -## Requirements - -- Minecraft 1.20.1 -- Forge 47.2.0 -- Java 17 - -## Building +## Build ```bash -# API module -cd forge-port-api -.\gradlew build - -# Main mod cd forge-port .\gradlew build ``` -Jars are output to `build/libs/` in each module. - -## Development - -```bash -cd forge-port -.\gradlew runClient -``` +Requires Java 21 + NeoForge 21.1.173. ## License -This project is licensed under **LGPL-3.0-only**. See `LICENSE`, `ATTRIBUTION.md`, and the `LICENSES/` directory for details. - -### For Modpack Authors / Players - -- **Modpack distribution is allowed** — just keep the original `LICENSE` and `NOTICE` files - bundled with the mod jar intact. Do not prevent users from replacing or updating this mod. -- If you redistribute the jar, also provide a link to the corresponding source code - (repository URL + version tag or commit hash). -- You do **not** need to open-source your modpack or other mods just because you include this one. - -### For Mod Developers - -- You may depend on `ReiParticlesAPI` without your mod becoming LGPL, as long as users can - replace the API jar independently (which is the default in Forge's `mods/` folder). -- If you **modify and redistribute** this mod's source code, you must make your changes - available under LGPL-3.0 and clearly mark what you changed. - -*The above is a simplified summary, not legal advice. See the full license texts for authoritative terms.* +LGPL-3.0-only. Modpack redistribution is fine, just keep the license files and link back to the source. +If you depend on the API, your mod doesn't need to be LGPL. diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index d39d868..b391b57 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -1,65 +1,19 @@ # Third-Party Notices -This file lists third-party libraries used by this project, along with their -respective licenses. These notices are provided in compliance with the license -terms of each dependency. - ---- - ## ClassGraph -- **Artifact:** `io.github.classgraph:classgraph:4.8.174` -- **License:** MIT -- **Homepage:** https://github.com/classgraph/classgraph -- **Used by:** `forge-port-api` (runtime classpath scanning) - -MIT License - -Copyright (c) 2019 Luke Hutchison - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +`io.github.classgraph:classgraph:4.8.174` — MIT +https://github.com/classgraph/classgraph -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Used for runtime classpath scanning in forge-port-api. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +## NeoForge ---- +`net.neoforged:neoforge:21.1.173` — LGPL-2.1 +https://neoforged.net -## Minecraft Forge - -- **Artifact:** `net.minecraftforge:forge:1.20.1-47.2.0` -- **License:** LGPL-2.1-only (Forge), Minecraft EULA (Mojang) -- **Homepage:** https://minecraftforge.net -- **Note:** Forge is a modding platform; it is not bundled in the output jars. - Minecraft is proprietary software owned by Mojang Studios / Microsoft. - Forge's license has varied across versions; LGPL-2.1 is a simplified - description for the 1.20.x era. See Forge's own LICENSE for authoritative terms. - ---- +Not bundled in output jars. ## JUnit 5 -- **Artifact:** `org.junit.jupiter:junit-jupiter` (test only) -- **License:** EPL-2.0 -- **Homepage:** https://junit.org/junit5/ -- **Note:** Test-scoped only; not included in release jars. - ---- - -*This file is informational and does not constitute legal advice.* - -*Maintainer note: If any third-party library is shaded/bundled into the -output jar in the future, its license and copyright notice must be added -to this file and included in the jar's `META-INF/` directory.* +`org.junit.jupiter:junit-jupiter` — EPL-2.0 (test only) diff --git a/forge-port-api/README.md b/forge-port-api/README.md deleted file mode 100644 index cb47ecb..0000000 --- a/forge-port-api/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# ReiParticlesAPI Forge Module - -Minecraft Forge 1.20.1 particle API library providing runtime support for ReiParticleSkill. - -## Features - -- Controllable particle system (ControlableParticle) -- Particle group styles with network synchronization -- Custom particle rendering (additive blending, etc.) -- Server-side RenderEntity management -- Tick-driven scheduler with lag-resistant timing -- Event bus with annotation-based listener scanning - -## Building - -```bash -.\gradlew build -``` - -Output: `build/libs/reiparticlesapi-1.0-SNAPSHOT-forge-port.jar` - -## Usage - -Place alongside `forge-port` (ReiParticleSkill) in the `mods/` folder. - -## API Stability - -### Stable (recommended for third-party mods) -- **`ParticleEmittersManager`** — emitter lifecycle (spawn/cancel/tick) -- **`ParticleEmitters` / `AutoParticleEmitters`** — emitter base classes -- **`ReiEventBus`** — event registration and dispatch -- **`ReiScheduler`** — deferred task scheduling -- **`ServerCameraUtil`** — camera shake packets -- **`CodecHelper`** — buffer codec type registry - -### Experimental / Internal -- **`ParticleGroupStyle` / `SequencedParticleStyle`** — API may change -- **`registerParticleStyles()` / `registerKeyBindings()`** — no-op stubs, not yet implemented -- **`ParticleComposition`** — composition system under development -- **`RenderEntity`** — render entity system under development -- **`BarrageManager`** — barrage/hitbox system, internal use - -## API Quick Start - -### 1. Creating a Custom Emitter - -```java -public class MyEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = - new ResourceLocation("mymod", "my_emitter"); - - private double radius; - - public MyEmitter() {} - - public MyEmitter(double radius, int durationTicks) { - this.radius = radius; - setMaxTick(durationTicks); - } - - public static MyEmitter decode(FriendlyByteBuf buf) { - MyEmitter e = new MyEmitter(); - e.decodeFromBuffer(buf); - return e; - } - - @Override - protected void emitTick() { - if (level().isClientSide()) { - // Spawn particles on the client - double angle = getTick() * 0.1; - double x = position().x + Math.cos(angle) * radius; - double z = position().z + Math.sin(angle) * radius; - level().addAlwaysVisibleParticle( - ParticleTypes.END_ROD, x, position().y, z, 0, 0.05, 0); - } - } - - @Override - protected void writePayload(FriendlyByteBuf buf) { - buf.writeDouble(radius); - } - - @Override - protected void readPayload(FriendlyByteBuf buf) { - this.radius = buf.readDouble(); - } -} -``` - -### 2. Spawning an Emitter (Server Side) - -```java -MyEmitter emitter = new MyEmitter(5.0, 200); -ParticleEmittersManager.spawnEmitters(emitter, serverLevel, x, y, z); -``` - -### 3. Registering Codecs - -Emitters annotated with `@ReiAutoRegister` are registered automatically. -For manual registration: - -```java -ParticleEmittersManager.registerCodec(MyEmitter.CODEC_ID, MyEmitter::decode); -``` - -### 4. Event Listeners - -> **Note:** `scanListeners()` uses ClassGraph to discover `@EventListener` classes -> in packages registered via `ReiAPIScanner.registerPackage()`. If no packages are -> registered, it logs an info message and returns. You can also register listeners -> explicitly: - -```java -// Option A: package scanning (discovered via ClassGraph when initEventListeners() is called) -ReiParticlesAPI.INSTANCE.appendEventListenerTarget("mymod", "com.example.mymod.listeners"); -ReiParticlesAPI.INSTANCE.initEventListeners(); - -// Option B: direct instance registration -ReiParticlesAPI.INSTANCE.registerEventListener("mymod", new MyListener()); -``` - -### 5. Scheduling Deferred Tasks - -```java -// One-shot: run after 20 ticks (1 second) -ReiParticlesAPI.reiScheduler().runTask(20, () -> { - // Your deferred logic here -}); - -// Repeating: run every 5 ticks -ReiParticlesAPI.reiScheduler().runTaskTimer(5, () -> { - // Repeating logic here -}); -``` diff --git a/forge-port-api/build.gradle b/forge-port-api/build.gradle deleted file mode 100644 index c0f6ff4..0000000 --- a/forge-port-api/build.gradle +++ /dev/null @@ -1,85 +0,0 @@ -plugins { - id 'eclipse' - id 'idea' - id 'maven-publish' - id 'net.minecraftforge.gradle' version '[6.0.36,6.2)' -} - -version = mod_version -group = mod_group_id - -base { archivesName = mod_id } - -java { - toolchain { languageVersion = JavaLanguageVersion.of(17) } -} - -minecraft { - mappings channel: 'official', version: minecraft_version - copyIdeResources = true - - runs { - configureEach { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - mods { - "${mod_id}" { - source sourceSets.main - } - } - } - client {} - server { args '--nogui' } - } -} - -repositories { - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() -} - -dependencies { - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - - // ClassGraph — runtime classpath scanning (used by ReiAPIScanner) - implementation 'io.github.classgraph:classgraph:4.8.174' - - testImplementation platform('org.junit:junit-bom:5.11.4') - testImplementation 'org.junit.jupiter:junit-jupiter' -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' -} - -processResources { - var replaceProperties = [ - mod_id : mod_id, - mod_name : mod_name, - mod_license : mod_license, - mod_version : mod_version, - loader_version_range : loader_version_range, - minecraft_version_range: minecraft_version_range - ] - inputs.properties replaceProperties - filesMatching(['META-INF/mods.toml']) { - expand replaceProperties - } -} - -jar { - into('META-INF') { - from rootProject.file('../LICENSE') - from rootProject.file('../NOTICE') - from rootProject.file('../THIRD_PARTY_NOTICES.md') - } - into('META-INF/LICENSES') { - from rootProject.file('../LICENSES/LGPL-3.0.txt') - from rootProject.file('../LICENSES/GPL-3.0.txt') - } -} - -tasks.withType(Test).configureEach { - useJUnitPlatform() -} diff --git a/forge-port-api/gradle.properties b/forge-port-api/gradle.properties deleted file mode 100644 index 647a785..0000000 --- a/forge-port-api/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -org.gradle.jvmargs=-Xmx2G -org.gradle.daemon=true -org.gradle.parallel=true - -mod_id=reiparticlesapi -mod_name=ReiParticlesAPI -mod_license=LGPL-3.0-only -mod_version=1.0-SNAPSHOT-forge-port -mod_group_id=com.reiasu.reiparticlesapi - -minecraft_version=1.20.1 -forge_version=47.2.0 -loader_version_range=[47,) -minecraft_version_range=[1.20.1,1.21) - -org.gradle.java.installations.auto-download=true -org.gradle.java.installations.auto-detect=true diff --git a/forge-port-api/gradle/wrapper/gradle-wrapper.jar b/forge-port-api/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 61285a6..0000000 Binary files a/forge-port-api/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/forge-port-api/gradle/wrapper/gradle-wrapper.properties b/forge-port-api/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 66cd5a0..0000000 --- a/forge-port-api/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/forge-port-api/gradlew b/forge-port-api/gradlew deleted file mode 100755 index adff685..0000000 --- a/forge-port-api/gradlew +++ /dev/null @@ -1,248 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/forge-port-api/gradlew.bat b/forge-port-api/gradlew.bat deleted file mode 100644 index c4bdd3a..0000000 --- a/forge-port-api/gradlew.bat +++ /dev/null @@ -1,93 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/forge-port-api/settings.gradle b/forge-port-api/settings.gradle deleted file mode 100644 index 5d99451..0000000 --- a/forge-port-api/settings.gradle +++ /dev/null @@ -1,13 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } -} - -plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' -} - -rootProject.name = 'reiparticlesapi-forge-port' diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPI.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPI.java deleted file mode 100644 index 9799871..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPI.java +++ /dev/null @@ -1,171 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi; - -import com.reiasu.reiparticlesapi.event.ReiEventBus; -import com.reiasu.reiparticlesapi.event.api.ReiEvent; -import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmittersManager; -import com.reiasu.reiparticlesapi.scheduler.ReiScheduler; -import com.reiasu.reiparticlesapi.test.SimpleTestGroupBuilder; -import com.reiasu.reiparticlesapi.test.TestManager; -import com.mojang.logging.LogUtils; -import net.minecraft.server.level.ServerPlayer; -import org.slf4j.Logger; - - -/** - * Main entry point for the ReiParticles API. - *

- * Provides lifecycle management (initialization, scanner loading, hook registration), - * a {@link com.reiasu.reiparticlesapi.scheduler.ReiScheduler ReiScheduler} for deferred tasks, - * and convenience methods for the {@link com.reiasu.reiparticlesapi.event.ReiEventBus ReiEventBus} - * event system. - *

- * Typical mod integration: - *

{@code
- * // During mod construction
- * ReiParticlesAPI.init();
- *
- * // Register event listener packages (scanned via ClassGraph)
- * ReiParticlesAPI.INSTANCE.appendEventListenerTarget("mymod", "com.example.mymod.listeners");
- * ReiParticlesAPI.INSTANCE.initEventListeners();
- *
- * // Schedule a deferred task (20 ticks = 1 second)
- * ReiParticlesAPI.reiScheduler().runTask(20, () -> { ... });
- * }
- */ -public final class ReiParticlesAPI { - public static final ReiParticlesAPI INSTANCE = new ReiParticlesAPI(); - /** @deprecated Use {@link #reiScheduler()} for new code. This scheduler only supports one-shot server tasks. */ - @Deprecated - public static final Scheduler scheduler = new Scheduler(); - private static final Logger LOGGER = LogUtils.getLogger(); - private static boolean initialized; - private static boolean scannersLoaded; - private static boolean testHooksRegistered; - - private ReiParticlesAPI() { - } - - /** Initializes the API. Safe to call multiple times; only the first call takes effect. */ - public static void init() { - if (initialized) { - LOGGER.debug("init() called again — already initialized, skipping"); - return; - } - initialized = true; - ParticleEmittersManager.registerBuiltinCodecs(); - LOGGER.info("ReiParticlesAPI init completed"); - } - - /** Returns {@code true} if {@link #init()} has been called. */ - public static boolean isInitialized() { - return initialized; - } - - /** Scans and initializes event listener packages. Call once after all listener targets are registered. */ - public void loadScannerPackages() { - if (scannersLoaded) { - LOGGER.debug("loadScannerPackages() called again — already loaded, skipping"); - return; - } - scannersLoaded = true; - if (!initialized) { - LOGGER.warn("loadScannerPackages() called before init() — call init() first"); - } - LOGGER.info("ReiParticlesAPI scanner packages loaded"); - ReiEventBus.INSTANCE.initListeners(); - } - - public boolean scannersLoaded() { - return scannersLoaded; - } - - public void registerTest() { - if (testHooksRegistered) return; - testHooksRegistered = true; - TestManager.INSTANCE.register("api-test-group-builder", user -> buildSmokeTestGroup(user)); - LOGGER.info("ReiParticlesAPI test hooks registered"); - } - - public boolean testHooksRegistered() { - return testHooksRegistered; - } - - /** - * Registers a package for {@link com.reiasu.reiparticlesapi.annotations.events.EventListener @EventListener} - * class scanning. The package is scanned via ClassGraph when {@link #initEventListeners()} is called. - * - * @param modId the mod identifier - * @param packageName fully-qualified package name to scan (e.g. {@code "com.example.mymod.listeners"}) - */ - public void appendEventListenerTarget(String modId, String packageName) { - ReiEventBus.INSTANCE.appendListenerTarget(modId, packageName); - } - - /** Initializes all registered event listeners. Call after all targets have been appended. */ - public void initEventListeners() { - if (!scannersLoaded) { - LOGGER.debug("initEventListeners() called before loadScannerPackages() — Forge scanning is a no-op, listeners must be registered explicitly"); - } - ReiEventBus.INSTANCE.initListeners(); - } - - /** - * Manually registers a single event listener instance. - * - * @param modId the mod identifier - * @param listener the listener object (must have methods annotated with event handler annotations) - */ - public void registerEventListener(String modId, Object listener) { - ReiEventBus.INSTANCE.registerListenerInstance(modId, listener); - } - - /** - * Fires an event through the {@link com.reiasu.reiparticlesapi.event.ReiEventBus ReiEventBus}. - * - * @param event the event to dispatch - * @param event type - * @return the same event instance (may have been modified by listeners) - */ - public T callEvent(T event) { - return ReiEventBus.call(event); - } - - /** - * Returns the primary scheduler. Supports one-shot, repeating, max-tick, - * cancel predicates, and finish callbacks. Ticked on both server and client. - * - * @see com.reiasu.reiparticlesapi.scheduler.ReiScheduler - */ - public static ReiScheduler reiScheduler() { - return ReiScheduler.INSTANCE; - } - - /** - * Legacy scheduler stub that delegates all calls to {@link ReiScheduler}. - * - * @deprecated Use {@link #reiScheduler()} instead. This class is a thin delegate - * and will be removed in a future version. - */ - @Deprecated - public static final class Scheduler { - - /** Delegates to {@link ReiScheduler#runTask(int, Runnable)}. */ - public void runTask(int ticks, Runnable task) { - ReiScheduler.INSTANCE.runTask(Math.max(1, ticks), task); - } - - /** No-op — {@link ReiScheduler} is ticked by the API tick handler. */ - public void tick() { - } - - /** No-op — lifecycle managed by {@link ReiScheduler}. */ - public void shutdown() { - } - } - - private static SimpleTestGroupBuilder buildSmokeTestGroup(ServerPlayer user) { - return new SimpleTestGroupBuilder("api-test-group-builder", user); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPIForge.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPIForge.java deleted file mode 100644 index 473aa55..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPIForge.java +++ /dev/null @@ -1,183 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi; - -import com.reiasu.reiparticlesapi.animation.AnimateManager; -import com.reiasu.reiparticlesapi.client.ClientTickEventForwarder; -import com.reiasu.reiparticlesapi.commands.APICommand; -import com.reiasu.reiparticlesapi.config.APIConfig; -import com.reiasu.reiparticlesapi.display.DisplayEntityManager; -import com.reiasu.reiparticlesapi.event.ForgeEventForwarder; -import com.reiasu.reiparticlesapi.event.ReiEventBus; -import com.reiasu.reiparticlesapi.event.events.server.ServerPostTickEvent; -import com.reiasu.reiparticlesapi.event.events.server.ServerPreTickEvent; -import com.reiasu.reiparticlesapi.network.ReiParticlesNetwork; -import com.reiasu.reiparticlesapi.network.animation.PathMotionManager; -import com.reiasu.reiparticlesapi.network.particle.composition.manager.ParticleCompositionManager; -import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmittersManager; -import com.reiasu.reiparticlesapi.network.particle.emitters.environment.wind.WindDirections; -import com.reiasu.reiparticlesapi.network.particle.emitters.type.EmittersShootTypes; -import com.reiasu.reiparticlesapi.network.particle.style.ParticleStyleManager; -import com.reiasu.reiparticlesapi.particles.ControllableParticleEffectManager; -import com.reiasu.reiparticlesapi.particles.ReiModParticles; -import com.reiasu.reiparticlesapi.particles.control.group.ClientParticleGroupManager; -import com.reiasu.reiparticlesapi.particles.impl.particles.*; -import com.reiasu.reiparticlesapi.renderer.client.ClientRenderEntityManager; -import com.reiasu.reiparticlesapi.renderer.server.ServerRenderEntityManager; -import com.reiasu.reiparticlesapi.scheduler.ReiScheduler; -import com.reiasu.reiparticlesapi.test.TestManager; -import com.reiasu.reiparticlesapi.utils.ClientCameraUtil; -import com.mojang.logging.LogUtils; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RegisterParticleProvidersEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import org.slf4j.Logger; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -@Mod(ReiParticlesAPIForge.MOD_ID) -public final class ReiParticlesAPIForge { - public static final String MOD_ID = "reiparticlesapi"; - private static final Logger LOGGER = LogUtils.getLogger(); - public ReiParticlesAPIForge() { - registerConfig(); - registerTickCallbacks(); - registerCommands(); - initSystems(); - - LOGGER.info("ReiParticlesAPI Forge runtime initialized"); - } - - // ---- Lifecycle phases ---- - - private void registerConfig() { - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, APIConfig.SPEC); - } - - private void registerTickCallbacks() { - var modBus = FMLJavaModLoadingContext.get().getModEventBus(); - modBus.addListener((FMLClientSetupEvent event) -> onClientSetup()); - ReiModParticles.register(modBus); - modBus.addListener(this::onRegisterParticleProviders); - - MinecraftForge.EVENT_BUS.addListener((TickEvent.ClientTickEvent event) -> { - if (event.phase == TickEvent.Phase.START) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClientTickEventForwarder::onClientStartTick); - } - }); - MinecraftForge.EVENT_BUS.addListener((TickEvent.ClientTickEvent event) -> { - if (event.phase == TickEvent.Phase.END) { - onClientEndTick(); - } - }); - MinecraftForge.EVENT_BUS.addListener((TickEvent.ServerTickEvent event) -> { - if (event.phase == TickEvent.Phase.START && event.getServer() != null) { - ReiEventBus.call(new ServerPreTickEvent(event.getServer())); - } - }); - MinecraftForge.EVENT_BUS.addListener((TickEvent.ServerTickEvent event) -> { - if (event.phase == TickEvent.Phase.END && event.getServer() != null) { - onServerEndTick(event.getServer()); - } - }); - } - - private void registerCommands() { - MinecraftForge.EVENT_BUS.addListener( - (RegisterCommandsEvent event) -> - APICommand.INSTANCE.register(event.getDispatcher()) - ); - } - - private void initSystems() { - ReiParticlesNetwork.init(); - ParticleEmittersManager.registerBuiltinCodecs(); - EmittersShootTypes.INSTANCE.init(); - WindDirections.INSTANCE.init(); - ControllableParticleEffectManager.INSTANCE.init(); - ReiParticlesAPI.init(); - ForgeEventForwarder.init(); - ReiParticlesAPI.INSTANCE.loadScannerPackages(); - ReiParticlesAPI.INSTANCE.registerTest(); - } - - // ---- Tick handlers (each manager wrapped in try-catch) ---- - - private void onClientEndTick() { - safeTick("ClientTickEventForwarder", () -> - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClientTickEventForwarder::onClientEndTick)); - safeTick("AnimateManager.client", () -> AnimateManager.INSTANCE.tickClient()); - safeTick("ParticleEmittersManager.client", ParticleEmittersManager::tickClient); - safeTick("DisplayEntityManager.client", () -> DisplayEntityManager.INSTANCE.tickClient()); - safeTick("ParticleCompositionManager.client", () -> ParticleCompositionManager.INSTANCE.tickClient()); - safeTick("ParticleStyleManager.client", ParticleStyleManager::doTickClient); - safeTick("ClientParticleGroupManager", () -> ClientParticleGroupManager.INSTANCE.doClientTick()); - safeTick("ClientRenderEntityManager", () -> ClientRenderEntityManager.INSTANCE.doClientTick()); - safeTick("PathMotionManager", () -> PathMotionManager.INSTANCE.tick()); - safeTick("ReiScheduler", () -> ReiScheduler.INSTANCE.doTick()); - safeTick("ClientCameraUtil", () -> ClientCameraUtil.INSTANCE.tick()); - } - - private void onServerEndTick(net.minecraft.server.MinecraftServer server) { - safeTick("AnimateManager.server", () -> AnimateManager.INSTANCE.tickServer()); - safeTick("ParticleEmittersManager.server", ParticleEmittersManager::tickAll); - safeTick("DisplayEntityManager.server", () -> DisplayEntityManager.INSTANCE.tickAll()); - safeTick("ParticleCompositionManager.server", () -> ParticleCompositionManager.INSTANCE.tickAll()); - safeTick("ParticleStyleManager.server", ParticleStyleManager::doTickServer); - safeTick("ServerRenderEntityManager.tick", () -> ServerRenderEntityManager.INSTANCE.tick()); - safeTick("ServerRenderEntityManager.upgrade", () -> ServerRenderEntityManager.INSTANCE.upgrade(server)); - safeTick("TestManager", () -> TestManager.INSTANCE.doTickServer()); - safeTick("ReiScheduler.server", () -> ReiScheduler.INSTANCE.doTick()); - safeTick("ServerPostTickEvent", () -> ReiEventBus.call(new ServerPostTickEvent(server))); - } - - private static final Map LAST_ERROR_LOG = new ConcurrentHashMap<>(); - private static final long ERROR_LOG_INTERVAL_MS = 10_000L; - - private static void safeTick(String name, Runnable tick) { - try { - tick.run(); - } catch (Exception e) { - long now = System.currentTimeMillis(); - Long last = LAST_ERROR_LOG.get(name); - if (last == null || now - last >= ERROR_LOG_INTERVAL_MS) { - LAST_ERROR_LOG.put(name, now); - LOGGER.warn("Tick handler '{}' threw (throttled to once per {}s):", - name, ERROR_LOG_INTERVAL_MS / 1000, e); - } - } - } - - // ---- Setup callbacks ---- - - private void onClientSetup() { - LOGGER.info("ReiParticlesAPI client setup completed"); - } - - private void onRegisterParticleProviders(RegisterParticleProvidersEvent event) { - event.registerSpriteSet(ReiModParticles.CONTROLLABLE_END_ROD.get(), - ControllableEndRodParticle.Factory::new); - event.registerSpriteSet(ReiModParticles.CONTROLLABLE_ENCHANTMENT.get(), - ControllableEnchantmentParticle.Factory::new); - event.registerSpriteSet(ReiModParticles.CONTROLLABLE_CLOUD.get(), - ControllableCloudParticle.Factory::new); - event.registerSpriteSet(ReiModParticles.CONTROLLABLE_FLASH.get(), - ControllableFlashParticle.Factory::new); - event.registerSpriteSet(ReiModParticles.CONTROLLABLE_FIREWORK.get(), - ControllableFireworkParticle.Factory::new); - event.registerSpecial(ReiModParticles.CONTROLLABLE_FALLING_DUST.get(), - new ControllableFallingDustParticle.Factory()); - event.registerSpriteSet(ReiModParticles.CONTROLLABLE_SPLASH.get(), - ControllableSplashParticle.Factory::new); - LOGGER.info("Registered ReiParticlesAPI particle providers (7 types)"); - } -} \ No newline at end of file diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Ease.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Ease.java deleted file mode 100644 index 6fb4fe2..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Ease.java +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.animation.timeline; - -/** - * Easing function interface for timeline animations. - * Takes a progress value t in [0,1] and returns the eased value. - */ -@FunctionalInterface -public interface Ease { - double cal(double t); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/CodecField.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/CodecField.java deleted file mode 100644 index 0a8eb9d..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/CodecField.java +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Marks a field for inclusion in automatic codec serialization/deserialization. - *

- * Fields are serialized in ascending {@link #index()} order. Two fields with the - * same index fall back to declaration order (which is JVM-dependent and fragile). - * Always assign explicit indices when wire compatibility matters. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface CodecField { - /** - * Explicit serialization order index. Lower values are encoded first. - * Default {@code 0} — fields sharing the same index are sorted by name as a fallback. - */ - int index() default 0; -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/BufferCodec.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/BufferCodec.java deleted file mode 100644 index 0cb9276..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/BufferCodec.java +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.annotations.codec; - -import net.minecraft.network.FriendlyByteBuf; - -/** - * Replacement for Fabric/Mojang's {@code StreamCodec} which - * was introduced in Minecraft 1.20.5 and does not exist in Forge 1.20.1. - *

- * Provides symmetric encode/decode for a type {@code T} to/from a - * {@link FriendlyByteBuf}. - * - * @param the type to serialize - */ -public interface BufferCodec { - - /** - * Creates a {@link BufferCodec} from explicit encoder and decoder lambdas. - */ - static BufferCodec of(Encoder encoder, Decoder decoder) { - return new BufferCodec() { - @Override - public void encode(FriendlyByteBuf buf, T value) { - encoder.encode(buf, value); - } - - @Override - public T decode(FriendlyByteBuf buf) { - return decoder.decode(buf); - } - }; - } - - /** - * Writes {@code value} into the buffer. - */ - void encode(FriendlyByteBuf buf, T value); - - /** - * Reads a value from the buffer. - */ - T decode(FriendlyByteBuf buf); - - @FunctionalInterface - interface Encoder { - void encode(FriendlyByteBuf buf, T value); - } - - @FunctionalInterface - interface Decoder { - T decode(FriendlyByteBuf buf); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/Barrage.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/Barrage.java deleted file mode 100644 index 32c0210..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/Barrage.java +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.barrages; - -import com.reiasu.reiparticlesapi.network.particle.ServerController; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.phys.Vec3; -import net.minecraft.server.level.ServerLevel; - -import javax.annotation.Nullable; -import java.util.UUID; - -/** - * A projectile-like entity that travels in a direction, detects hits against - * blocks, entities, and other barrages, and can pass through targets. - *

- * Implementations should use {@link AbstractBarrage} as a base class. - */ -public interface Barrage { - - /** - * Current world position. - */ - Vec3 getLoc(); - - void setLoc(Vec3 loc); - - /** - * The server world this barrage exists in. - */ - ServerLevel getWorld(); - - /** - * The axis-aligned hit box for collision detection. - */ - HitBox getHitBox(); - - void setHitBox(HitBox hitBox); - - /** - * The entity that shot this barrage (may be null). - */ - @Nullable - LivingEntity getShooter(); - - void setShooter(@Nullable LivingEntity shooter); - - /** - * The movement direction vector. - */ - Vec3 getDirection(); - - void setDirection(Vec3 direction); - - /** - * Whether this barrage has been launched (is actively ticking/moving). - */ - boolean getLaunch(); - - void setLaunch(boolean launch); - - /** - * Whether this barrage is still valid (not yet removed). - */ - boolean getValid(); - - /** - * Barrage configuration options. - */ - BarrageOption getOptions(); - - /** - * Unique identifier for this barrage instance. - */ - UUID getUuid(); - - /** - * The server-side particle/display controller bound to this barrage. - */ - ServerController getBindControl(); - - /** - * Called when a hit is detected. Implementations should invoke - * {@link #onHit(BarrageHitResult)} then handle removal/pass-through logic. - */ - void hit(BarrageHitResult result); - - /** - * User-overridable callback when a hit occurs. - */ - void onHit(BarrageHitResult result); - - /** - * Whether this barrage currently ignores collisions - * (e.g. during initial no-hitbox grace period). - */ - boolean noclip(); - - /** - * Called each server tick to update position, detect hits, etc. - */ - void tick(); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/ReiRenderTypesProvider.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/ReiRenderTypesProvider.java deleted file mode 100644 index a91fc63..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/ReiRenderTypesProvider.java +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.display; - -import net.minecraft.client.renderer.RenderType; - -/** - * Provider interface for custom glow render types used by display entities. - */ -public interface ReiRenderTypesProvider { - /** - * Return the glow {@link RenderType} for rendering display entities with bloom/glow effects. - * - * @return a RenderType configured for glow rendering - */ - RenderType glow(); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/enums/DistType.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/enums/DistType.java deleted file mode 100644 index 56498fa..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/enums/DistType.java +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.enums; - -/** - * Distribution side indicator. - */ -public enum DistType { - CLIENT, - SERVER -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/ReiEvent.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/ReiEvent.java deleted file mode 100644 index 54eed78..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/ReiEvent.java +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.event.api; - -public abstract class ReiEvent { -} - diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/BlockPosExtendsKt.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/BlockPosExtendsKt.java deleted file mode 100644 index 115fe08..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/BlockPosExtendsKt.java +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.extend; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.Vec3; - -/** - * Extension utility for {@link BlockPos} providing conversion from {@link Vec3}. - * Originally a Kotlin extension function, ported as a static utility method. - */ -public final class BlockPosExtendsKt { - - private BlockPosExtendsKt() { - } - - /** - * Returns the {@link BlockPos} containing the given {@link Vec3} position - * (equivalent to flooring each component). - */ - public static BlockPos ofFloored(Vec3 vec) { - return BlockPos.containing(vec.x, vec.y, vec.z); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/ItemStackExtendKt.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/ItemStackExtendKt.java deleted file mode 100644 index 4d9361d..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/ItemStackExtendKt.java +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.extend; - -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; - -/** - * Extension utilities for {@link ItemStack}. - * Originally Kotlin extension functions, ported as static utility methods. - */ -public final class ItemStackExtendKt { - - private ItemStackExtendKt() { - } - - /** - * Checks whether this stack's item matches the given {@link Item}. - */ - public static boolean isOf(ItemStack stack, Item item) { - return stack.is(item); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3iExtendsKt.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3iExtendsKt.java deleted file mode 100644 index 076aad5..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3iExtendsKt.java +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.extend; - -import net.minecraft.core.Vec3i; -import net.minecraft.world.phys.Vec3; - -/** - * Extension utility for {@link Vec3i} providing conversion to {@link Vec3}. - * Originally a Kotlin extension function, ported as a static utility method. - */ -public final class Vec3iExtendsKt { - - private Vec3iExtendsKt() { - } - - /** - * Converts a {@link Vec3i} to a {@link Vec3} (double-precision). - */ - public static Vec3 asVec3(Vec3i v) { - return new Vec3(v.getX(), v.getY(), v.getZ()); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/ReiParticlesNetwork.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/ReiParticlesNetwork.java deleted file mode 100644 index db8adff..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/ReiParticlesNetwork.java +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network; - -import com.reiasu.reiparticlesapi.ReiParticlesAPIForge; -import com.reiasu.reiparticlesapi.network.packet.CameraShakeS2CPacket; -import com.reiasu.reiparticlesapi.network.packet.PacketCameraShakeS2C; -import com.reiasu.reiparticlesapi.network.packet.PacketDisplayEntityS2C; -import com.reiasu.reiparticlesapi.network.packet.PacketKeyActionC2S; -import com.reiasu.reiparticlesapi.network.packet.PacketParticleCompositionS2C; -import com.reiasu.reiparticlesapi.network.packet.PacketParticleEmittersS2C; -import com.reiasu.reiparticlesapi.network.packet.PacketParticleGroupS2C; -import com.reiasu.reiparticlesapi.network.packet.PacketParticleS2C; -import com.reiasu.reiparticlesapi.network.packet.PacketParticleStyleS2C; -import com.reiasu.reiparticlesapi.network.packet.PacketRenderEntityS2C; -import com.mojang.logging.LogUtils; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.network.simple.SimpleChannel; -import org.slf4j.Logger; - -public final class ReiParticlesNetwork { - private static final Logger LOGGER = LogUtils.getLogger(); - private static final int PROTOCOL_VERSION = 1; - private static int packetId = 0; - - public static final SimpleChannel CHANNEL = NetworkRegistry.ChannelBuilder - .named(new ResourceLocation(ReiParticlesAPIForge.MOD_ID, "main")) - .networkProtocolVersion(() -> Integer.toString(PROTOCOL_VERSION)) - .clientAcceptedVersions(v -> true) - .serverAcceptedVersions(v -> true) - .simpleChannel(); - - private ReiParticlesNetwork() { - } - - public static void init() { - CHANNEL.registerMessage(packetId++, CameraShakeS2CPacket.class, CameraShakeS2CPacket::encode, CameraShakeS2CPacket::decode, CameraShakeS2CPacket::handle); - CHANNEL.registerMessage(packetId++, PacketCameraShakeS2C.class, PacketCameraShakeS2C::encode, PacketCameraShakeS2C::decode, PacketCameraShakeS2C::handle); - CHANNEL.registerMessage(packetId++, PacketParticleS2C.class, PacketParticleS2C::encode, PacketParticleS2C::decode, PacketParticleS2C::handle); - CHANNEL.registerMessage(packetId++, PacketParticleEmittersS2C.class, PacketParticleEmittersS2C::encode, PacketParticleEmittersS2C::decode, PacketParticleEmittersS2C::handle); - CHANNEL.registerMessage(packetId++, PacketParticleCompositionS2C.class, PacketParticleCompositionS2C::encode, PacketParticleCompositionS2C::decode, PacketParticleCompositionS2C::handle); - CHANNEL.registerMessage(packetId++, PacketDisplayEntityS2C.class, PacketDisplayEntityS2C::encode, PacketDisplayEntityS2C::decode, PacketDisplayEntityS2C::handle); - CHANNEL.registerMessage(packetId++, PacketParticleStyleS2C.class, PacketParticleStyleS2C::encode, PacketParticleStyleS2C::decode, PacketParticleStyleS2C::handle); - CHANNEL.registerMessage(packetId++, PacketParticleGroupS2C.class, PacketParticleGroupS2C::encode, PacketParticleGroupS2C::decode, PacketParticleGroupS2C::handle); - CHANNEL.registerMessage(packetId++, PacketRenderEntityS2C.class, PacketRenderEntityS2C::encode, PacketRenderEntityS2C::decode, PacketRenderEntityS2C::handle); - CHANNEL.registerMessage(packetId++, PacketKeyActionC2S.class, PacketKeyActionC2S::encode, PacketKeyActionC2S::decode, PacketKeyActionC2S::handle); - } - - public static void sendTo(ServerPlayer player, Object packet) { - try { - CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), packet); - } catch (IllegalArgumentException e) { - LOGGER.debug("Player {} lacks channel — packet {} dropped", - player.getName().getString(), packet.getClass().getSimpleName()); - } catch (RuntimeException e) { - LOGGER.debug("Failed to send packet {} to {}: {}", packet.getClass().getSimpleName(), - player.getName().getString(), e.getMessage()); - } - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/LambdaParticlePathMotion.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/LambdaParticlePathMotion.java deleted file mode 100644 index 45f8121..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/LambdaParticlePathMotion.java +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.animation; - -import com.reiasu.reiparticlesapi.particles.ControllableParticle; -import net.minecraft.world.phys.Vec3; - -import java.util.function.IntFunction; - -/** - * Concrete path motion that uses a lambda to compute the path offset. - * The function takes the current tick index and returns a Vec3 offset from origin. - *

- * Inherits teleport and validity logic from {@link ParticlePathMotion}. - */ -public final class LambdaParticlePathMotion extends ParticlePathMotion { - private final IntFunction path; - - /** - * @param origin the world origin position - * @param particle the target particle - * @param path function from tick index to Vec3 offset - */ - public LambdaParticlePathMotion(Vec3 origin, ControllableParticle particle, IntFunction path) { - super(origin, particle); - this.path = path; - } - - public IntFunction getPath() { - return path; - } - - @Override - public Vec3 pathFunction() { - return path.apply(getCurrentTick()); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/PathMotion.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/PathMotion.java deleted file mode 100644 index e64e533..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/PathMotion.java +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.animation.api; - -import net.minecraft.world.phys.Vec3; - -/** - * Interface defining path-based motion for particle entities. - * Implementations compute per-tick offsets from an origin, and apply - * the resulting world position to their target. - */ -public interface PathMotion { - int getCurrentTick(); - - void setCurrentTick(int tick); - - Vec3 getOrigin(); - - void setOrigin(Vec3 origin); - - /** - * Apply the computed world position to the motion target - * (e.g. teleport a style/emitter to this position). - */ - void apply(Vec3 actualPos); - - /** - * Compute and return the next path offset from origin. - * This also advances the internal tick counter. - */ - Vec3 next(); - - /** - * Check whether the motion target is still alive/valid. - * Returns false if the target has been removed or cancelled. - */ - boolean checkValid(); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketDisplayEntityS2C.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketDisplayEntityS2C.java deleted file mode 100644 index 7cce080..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketDisplayEntityS2C.java +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.packet; - -import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientDisplayEntityPacketHandler; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; - -import java.util.UUID; -import java.util.function.Supplier; - -public record PacketDisplayEntityS2C(UUID uuid, String type, byte[] data) { - public static void encode(PacketDisplayEntityS2C packet, FriendlyByteBuf buf) { - buf.writeUtf(packet.type); - buf.writeUUID(packet.uuid); - buf.writeInt(packet.data.length); - buf.writeBytes(packet.data); - } - - public static PacketDisplayEntityS2C decode(FriendlyByteBuf buf) { - String type = buf.readUtf(); - UUID uuid = buf.readUUID(); - int size = buf.readInt(); - byte[] data = new byte[size]; - buf.readBytes(data); - return new PacketDisplayEntityS2C(uuid, type, data); - } - - public static void handle(PacketDisplayEntityS2C packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientDisplayEntityPacketHandler.receive(packet))); - context.setPacketHandled(true); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleS2C.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleS2C.java deleted file mode 100644 index 91a551e..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleS2C.java +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.packet; - -import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientParticlePacketHandler; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.core.particles.ParticleType; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; - -import java.util.function.Supplier; - -public record PacketParticleS2C(ParticleOptions type, Vec3 pos, Vec3 velocity) { - public static void encode(PacketParticleS2C packet, FriendlyByteBuf buf) { - ResourceLocation id = BuiltInRegistries.PARTICLE_TYPE.getKey(packet.type.getType()); - buf.writeResourceLocation(id); - packet.type.writeToNetwork(buf); - buf.writeDouble(packet.pos.x); - buf.writeDouble(packet.pos.y); - buf.writeDouble(packet.pos.z); - buf.writeDouble(packet.velocity.x); - buf.writeDouble(packet.velocity.y); - buf.writeDouble(packet.velocity.z); - } - - public static PacketParticleS2C decode(FriendlyByteBuf buf) { - ResourceLocation id = buf.readResourceLocation(); - ParticleType particleType = BuiltInRegistries.PARTICLE_TYPE.get(id); - if (particleType == null) { - particleType = ParticleTypes.END_ROD; - } - ParticleOptions options = readParticleOptions(particleType, buf); - Vec3 pos = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); - Vec3 velocity = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); - return new PacketParticleS2C(options, pos, velocity); - } - - public static void handle(PacketParticleS2C packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientParticlePacketHandler.receive(packet))); - context.setPacketHandled(true); - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - private static ParticleOptions readParticleOptions(ParticleType type, FriendlyByteBuf buf) { - return ((ParticleOptions.Deserializer) type.getDeserializer()).fromNetwork((ParticleType) type, buf); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoSequencedParticleComposition.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoSequencedParticleComposition.java deleted file mode 100644 index ddfb3fd..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoSequencedParticleComposition.java +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.composition; - -import com.reiasu.reiparticlesapi.annotations.codec.BufferCodec; -import com.reiasu.reiparticlesapi.annotations.composition.handler.ParticleCompositionHelper; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; - -/** - * Abstract sequenced composition that auto-generates its network codec - * via {@link ParticleCompositionHelper}. - *

- * Subclasses must: - *

    - *
  • Provide a public constructor {@code (Vec3, Level)}
  • - *
  • Annotate serializable fields with {@link com.reiasu.reiparticlesapi.annotations.CodecField}
  • - *
  • Implement {@link #getParticleSequenced()} and {@link #onDisplay()}
  • - *
- */ -public abstract class AutoSequencedParticleComposition extends SequencedParticleComposition { - - protected AutoSequencedParticleComposition(Vec3 position, Level world) { - super(position, world); - } - - protected AutoSequencedParticleComposition(Vec3 position) { - super(position); - } - - /** - * Returns the auto-generated codec for this composition type. - * Uses reflection to serialize all {@link com.reiasu.reiparticlesapi.annotations.CodecField} - * annotated fields. - */ - public BufferCodec getCodec() { - return ParticleCompositionHelper.INSTANCE.generateCodec(this); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeData.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeData.java deleted file mode 100644 index 542b20b..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeData.java +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.data; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * A range of integer values with random sampling support. - *

- * The {@link #random()} method returns a value in {@code [min, max)} following - * the original Kotlin Random.nextInt(min, max) semantics. - */ -public final class IntRangeData extends RangeData { - - public IntRangeData(int min, int max) { - super(min, max); - } - - /** - * Returns a random integer in {@code [min, max)}. - */ - public int random() { - return ThreadLocalRandom.current().nextInt(getMin(), getMax()); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeDataKt.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeDataKt.java deleted file mode 100644 index 8f61d96..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeDataKt.java +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.data; - -/** - * Utility methods for {@link IntRangeData}, ported from Kotlin extension functions. - */ -public final class IntRangeDataKt { - - private IntRangeDataKt() { - } - - /** - * Checks whether the given integer falls within the range (inclusive on both ends). - */ - public static boolean isIn(int value, IntRangeData range) { - return value >= range.getMin() && value <= range.getMax(); - } - - /** - * Creates an {@link IntRangeData} where the receiver is the min. - */ - public static IntRangeData minRangeTo(int min, int max) { - return new IntRangeData(min, max); - } - - /** - * Creates an {@link IntRangeData} where the receiver is the max. - */ - public static IntRangeData maxRangeTo(int max, int min) { - return new IntRangeData(min, max); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/SerializableData.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/SerializableData.java deleted file mode 100644 index 6393038..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/SerializableData.java +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.data; - -import com.reiasu.reiparticlesapi.particles.ParticleDisplayer; - -/** - * Marker interface for data objects that can be network-serialized and - * used to create a {@link ParticleDisplayer} on the client side. - *

- * Forge port note: the original Fabric {@code getCodec()} returned a - * StreamCodec for network serialization. In the Forge port, serialization - * is handled at a higher level using FriendlyByteBuf directly, so the - * codec method is omitted. Implementations should still support - * clone and createDisplayer. - */ -public interface SerializableData { - - /** - * Returns a deep copy of this data. - */ - SerializableData clone(); - - /** - * Creates a {@link ParticleDisplayer} that renders the particle - * described by this data. - */ - ParticleDisplayer createDisplayer(); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleDataFactory.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleDataFactory.java deleted file mode 100644 index 79b20fd..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleDataFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.emitters; - -/** - * Factory interface for creating {@link ControllableParticleData} instances. - *

- * Used by emitter implementations to produce the initial per-particle data - * when spawning new particles each tick. - */ -@FunctionalInterface -public interface ParticleDataFactory { - - /** - * Creates a new {@link ControllableParticleData} with default values. - */ - ControllableParticleData create(); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/PhysicConstant.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/PhysicConstant.java deleted file mode 100644 index 952fcd6..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/PhysicConstant.java +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.emitters; - -/** - * Physics constants used by particle emitter simulations. - * Values are tuned for Minecraft's coordinate and tick system. - */ -public final class PhysicConstant { - public static final PhysicConstant INSTANCE = new PhysicConstant(); - - /** Gravity acceleration per tick (blocks/tick^2). Minecraft default ~0.05 */ - public static final double EARTH_GRAVITY = 0.05; - - /** Sea-level air density (kg/m^3) */ - public static final double SEA_AIR_DENSITY = 1.225; - - /** Drag coefficient for particle air resistance */ - public static final double DRAG_COEFFICIENT = 0.01; - - /** Cross-sectional area for drag calculations */ - public static final double CROSS_SECTIONAL_AREA = 0.01; - - private PhysicConstant() { - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommand.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommand.java deleted file mode 100644 index 2866a7d..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommand.java +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.emitters.command; - -import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; -import com.reiasu.reiparticlesapi.particles.ControllableParticle; - -/** - * A command that mutates particle state during the emitter tick loop. - */ -@FunctionalInterface -public interface ParticleCommand { - - /** - * Execute this command against the given particle data and particle instance. - * - * @param data the mutable particle data - * @param particle the particle instance - */ - void execute(ControllableParticleData data, ControllableParticle particle); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirection.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirection.java deleted file mode 100644 index 56050f9..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirection.java +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.emitters.environment.wind; - -import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmitters; -import net.minecraft.world.phys.Vec3; - -/** - * Defines a wind effect that applies directional force to particles within an emitter. - *

- * Wind can be absolute (fixed direction) or relative to the emitter position. - * The {@code windSpeedExpress} field allows configuring wind strength; in the original - * Fabric version this was a math expression with variable {@code l} (distance), - * but in the Forge port it is parsed as a constant double for simplicity. - *

- * Forge port note: {@code getCodec()} from Fabric StreamCodec is omitted. - */ -public interface WindDirection { - - /** - * The base wind direction vector. - */ - Vec3 getDirection(); - - void setDirection(Vec3 direction); - - /** - * Whether wind is relative to the emitter position (true) or absolute (false). - */ - boolean getRelative(); - - void setRelative(boolean relative); - - /** - * Wind speed expression string. Parsed as a constant double in Forge port. - * In Fabric, this was a math expression with variable {@code l} = distance. - */ - String getWindSpeedExpress(); - - void setWindSpeedExpress(String express); - - /** - * Bind this wind direction to an emitter instance for relative calculations. - */ - WindDirection loadEmitters(ParticleEmitters emitters); - - /** - * Whether an emitter has been bound. - */ - boolean hasLoadedEmitters(); - - /** - * Unique string identifier for this wind type. - */ - String getID(); - - /** - * Compute the wind vector at a given particle position. - * - * @param particlePos the particle's current world position - * @return the wind force vector - */ - Vec3 getWind(Vec3 particlePos); - - /** - * Check whether the given position is within this wind's area of effect. - */ - boolean inRange(Vec3 pos); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEvent.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEvent.java deleted file mode 100644 index 259e1de..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEvent.java +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.emitters.event; - -import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; -import com.reiasu.reiparticlesapi.particles.ControllableParticle; - -/** - * Base interface for particle-level events fired during emitter simulation. - */ -public interface ParticleEvent { - - /** - * Returns the unique string identifier for this event type. - */ - String getEventID(); - - /** - * Gets the particle instance. - */ - ControllableParticle getParticle(); - - /** - * Sets the particle instance. - */ - void setParticle(ControllableParticle particle); - - /** - * Gets the particle's mutable data. - */ - ControllableParticleData getParticleData(); - - /** - * Sets the particle's mutable data. - */ - void setParticleData(ControllableParticleData data); - - /** - * Whether this event has been canceled by a handler. - */ - boolean getCanceled(); - - /** - * Cancel or un-cancel this event. - */ - void setCanceled(boolean canceled); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandler.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandler.java deleted file mode 100644 index c857ea6..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.emitters.event; - -/** - * A handler that reacts to a specific {@link ParticleEvent} type. - * Handlers are ordered by priority (lower priority value = executed first). - */ -public interface ParticleEventHandler extends Comparable { - - /** - * Process the given event. May mutate event state or cancel it. - */ - void handle(ParticleEvent event); - - /** - * The event ID this handler targets (must match {@link ParticleEvent#getEventID()}). - */ - String getTargetEventID(); - - /** - * Unique identifier for this handler instance. - */ - String getHandlerID(); - - /** - * Execution priority. Lower values run first. - */ - int getPriority(); - - @Override - default int compareTo(ParticleEventHandler other) { - return this.getPriority() - other.getPriority(); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandlerManager.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandlerManager.java deleted file mode 100644 index b80b6c2..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandlerManager.java +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.emitters.event; - -import java.util.HashMap; -import java.util.Map; - -/** - * Singleton registry for {@link ParticleEventHandler} instances. - *

- * Forge port note: The Fabric version used {@code ReiAPIScanner} for classpath-scanning - * auto-registration. In the Forge port, handlers must be registered explicitly via - * {@link #register(ParticleEventHandler)}. - */ -public final class ParticleEventHandlerManager { - - public static final ParticleEventHandlerManager INSTANCE = new ParticleEventHandlerManager(); - - private final Map registerHandlers = new HashMap<>(); - - private ParticleEventHandlerManager() { - } - - /** - * Look up a handler by its handler ID. - */ - public ParticleEventHandler getHandlerById(String id) { - return registerHandlers.get(id); - } - - /** - * Register a handler. Replaces any existing handler with the same ID. - */ - public void register(ParticleEventHandler handler) { - registerHandlers.put(handler.getHandlerID(), handler); - } - - /** - * Check whether a handler with the given ID is already registered. - */ - public boolean hasRegister(String id) { - return registerHandlers.containsKey(id); - } - - /** - * Called during mod init. In the Forge port this is a no-op; - * handlers should register themselves explicitly. - */ - public void init() { - // Fabric version used ReiAPIScanner for auto-registration. - // Forge port: register handlers explicitly or use Forge event bus. - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootType.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootType.java deleted file mode 100644 index fac8214..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootType.java +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.network.particle.emitters.type; - -import net.minecraft.world.phys.Vec3; - -import java.util.List; - -/** - * Defines how particles are spatially distributed when an emitter fires. - *

- * Each implementation produces a list of spawn positions relative to the emitter origin - * and computes a default direction vector for each particle. - *

- * Forge port note: {@code getCodec()} from Fabric StreamCodec is omitted; - * Forge networking uses FriendlyByteBuf directly where needed. - */ -public interface EmittersShootType { - - /** - * Returns the unique string identifier for this shoot type (e.g. "point", "line"). - */ - String getID(); - - /** - * Computes the list of spawn positions for a batch of particles. - * - * @param origin the emitter world position - * @param tick the current emitter tick - * @param count the number of particles to produce - * @return list of world-space spawn positions (size == count) - */ - List getPositions(Vec3 origin, int tick, int count); - - /** - * Computes the default movement direction for a particle. - * - * @param enter the emitter's base direction vector (may be zero) - * @param tick the current emitter tick - * @param pos the individual particle spawn position - * @param origin the emitter world position - * @return the direction vector for the particle - */ - Vec3 getDefaultDirection(Vec3 enter, int tick, Vec3 pos, Vec3 origin); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/Controllable.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/Controllable.java deleted file mode 100644 index 9fea7de..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/Controllable.java +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.particles; - -import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; -import com.reiasu.reiparticlesapi.utils.RelativeLocation; -import net.minecraft.world.phys.Vec3; - -import java.util.Map; -import java.util.UUID; - -/** - * Base interface for objects that can be remotely controlled (particles, compositions, etc.). - * - * @param the type of the underlying controlled object - */ -public interface Controllable { - - /** - * The unique control UUID for this controllable. - */ - UUID controlUUID(); - - /** - * Rotate this controllable to face the given point. - */ - void rotateToPoint(RelativeLocation to); - - /** - * Rotate this controllable to face the given point with an additional angle offset. - */ - void rotateToWithAngle(RelativeLocation to, double radian); - - /** - * Rotate this controllable around its axis by the given angle. - */ - void rotateAsAxis(double radian); - - /** - * Teleport this controllable to the given position. - */ - void teleportTo(Vec3 pos); - - /** - * Teleport this controllable to the given coordinates. - */ - void teleportTo(double x, double y, double z); - - /** - * Remove/destroy this controllable. - */ - void remove(); - - /** - * Get the underlying controlled object. - */ - T getControlObject(); - - /** - * Get the controlled object cast to type S. - */ - @SuppressWarnings("unchecked") - default S getControlCasted() { - return (S) getControlObject(); - } - - /** - * Get the controlled object cast to type S, or null if the cast fails. - */ - @SuppressWarnings("unchecked") - default S getControlCastedOrNull() { - try { - return (S) getControlObject(); - } catch (Exception e) { - return null; - } - } - - // ---- Buffer-based load/change (used by composition system) ---- - - default void load(Map> args) { - } - - default Map> toArgs() { - return Map.of(); - } - - default void change(Map> args) { - load(args); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffect.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffect.java deleted file mode 100644 index 5ceae1c..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffect.java +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.particles; - -import net.minecraft.core.particles.ParticleOptions; - -import java.util.UUID; - -/** - * Marker interface for controllable particle effects. - *

- * Extends {@link ParticleOptions} so implementations can be used with - * {@link net.minecraft.client.particle.ParticleProvider} factories. - * The actual serialization is handled by the ReiParticles custom network, - * so {@link ParticleOptions} methods are implemented with defaults in - * each concrete class. - */ -public interface ControllableParticleEffect extends ParticleOptions { - UUID getControlUUID(); - void setControlUUID(UUID uuid); - boolean getFaceToPlayer(); - ControllableParticleEffect clone(); -} \ No newline at end of file diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleLerpInterpolator.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleLerpInterpolator.java deleted file mode 100644 index 4d4920a..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleLerpInterpolator.java +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.particles; - -import net.minecraft.world.phys.Vec3; - -/** - * Interpolator for particle position lerping between ticks. - */ -public interface ParticleLerpInterpolator { - /** - * Compute an interpolated position between previous and current tick positions. - * - * @param prev the position at the previous tick - * @param current the position at the current tick - * @param delta the partial-tick fraction (0..1) - * @return the interpolated position - */ - Vec3 consume(Vec3 prev, Vec3 current, float delta); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ReiModParticles.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ReiModParticles.java deleted file mode 100644 index 2d6fc56..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ReiModParticles.java +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.particles; - -import com.reiasu.reiparticlesapi.particles.impl.*; -import com.mojang.brigadier.StringReader; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - -import java.util.UUID; -import java.util.function.BiFunction; - -/** - * Registry for all ReiParticlesAPI custom particle types. - *

- * Forge port: uses {@link DeferredRegister} with custom {@link ParticleType} - * instances that carry {@link ControllableParticleEffect} data (UUID + faceToPlayer). - */ -public final class ReiModParticles { - public static final ReiModParticles INSTANCE = new ReiModParticles(); - - private static final DeferredRegister> PARTICLES = - DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, "reiparticlesapi"); - - public static final RegistryObject> CONTROLLABLE_END_ROD = - PARTICLES.register("controllable_end_rod", - () -> createType(ControllableEndRodEffect::new)); - - public static final RegistryObject> CONTROLLABLE_ENCHANTMENT = - PARTICLES.register("controllable_enchantment", - () -> createType(ControllableEnchantmentEffect::new)); - - public static final RegistryObject> CONTROLLABLE_CLOUD = - PARTICLES.register("controllable_cloud", - () -> createType(ControllableCloudEffect::new)); - - public static final RegistryObject> CONTROLLABLE_FLASH = - PARTICLES.register("controllable_flash", - () -> createType(ControllableFlashEffect::new)); - - public static final RegistryObject> CONTROLLABLE_FIREWORK = - PARTICLES.register("controllable_firework", - () -> createType(ControllableFireworkEffect::new)); - - public static final RegistryObject> CONTROLLABLE_FALLING_DUST = - PARTICLES.register("controllable_falling_dust", - () -> createType((uuid, face) -> new ControllableFallingDustEffect( - uuid, net.minecraft.world.level.block.Blocks.SAND.defaultBlockState(), face))); - - public static final RegistryObject> CONTROLLABLE_SPLASH = - PARTICLES.register("controllable_splash", - () -> createType(ControllableSplashEffect::new)); - - private ReiModParticles() {} - - /** - * Creates a {@link ParticleType} with a deserializer that reads UUID + boolean - * from the network/command, matching all {@link ControllableParticleEffect} subtypes. - */ - @SuppressWarnings("deprecation") - private static ParticleType createType( - BiFunction factory) { - ParticleOptions.Deserializer deserializer = new ParticleOptions.Deserializer() { - @Override - public T fromCommand(ParticleType type, StringReader reader) { - return factory.apply(UUID.randomUUID(), false); - } - - @Override - public T fromNetwork(ParticleType type, FriendlyByteBuf buf) { - return factory.apply(buf.readUUID(), buf.readBoolean()); - } - }; - return new ParticleType(true, deserializer) { - @Override - public com.mojang.serialization.Codec codec() { - return com.mojang.serialization.Codec.unit(() -> factory.apply(UUID.randomUUID(), false)); - } - }; - } - - /** - * Register the particle types with the Forge event bus. - * Call this during mod construction. - */ - public static void register(IEventBus modBus) { - PARTICLES.register(modBus); - } - - public void reg() { - // No-op, registration is handled by DeferredRegister - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlParticleManager.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlParticleManager.java deleted file mode 100644 index 5bb6dee..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlParticleManager.java +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.particles.control; - -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Manages the mapping between control UUIDs and their {@link ParticleController} instances. - *

- * Each controlled particle gets a UUID; the manager stores and retrieves the - * corresponding controller so the particle can be mutated from server-driven - * commands. - */ -public final class ControlParticleManager { - - public static final ControlParticleManager INSTANCE = new ControlParticleManager(); - - private final ConcurrentHashMap controls = new ConcurrentHashMap<>(); - - private ControlParticleManager() { - } - - /** - * Look up a controller by UUID. Returns {@code null} if none is registered. - */ - public ParticleController getControl(UUID uuid) { - return controls.get(uuid); - } - - /** - * Remove a controller by UUID. - */ - public void removeControl(UUID uuid) { - controls.remove(uuid); - } - - /** - * Create a new controller for the given UUID and register it. - * - * @param uuid the control UUID - * @return the newly created controller - */ - public ParticleController createControl(UUID uuid) { - ParticleController controller = new ParticleController(uuid); - controls.put(uuid, controller); - return controller; - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroupProvider.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroupProvider.java deleted file mode 100644 index ff43293..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroupProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.particles.control.group; - -import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; - -import java.util.Map; -import java.util.UUID; - -/** - * Provider (factory) for creating and modifying {@link ControllableParticleGroup} instances. - *

- * Registered with {@link ClientParticleGroupManager} for client-side group creation - * when receiving server-side packets. - * - * @deprecated Use ParticleGroupStyle instead. - */ -@Deprecated -public interface ControllableParticleGroupProvider { - - /** - * Create a new particle group with the given UUID and initialization args. - */ - ControllableParticleGroup createGroup(UUID uuid, Map> args); - - /** - * Apply changes to an existing group with the given args. - */ - void changeGroup(ControllableParticleGroup group, Map> args); -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/reflect/SimpleClassInfo.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/reflect/SimpleClassInfo.java deleted file mode 100644 index 35923ca..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/reflect/SimpleClassInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.reflect; - -import java.lang.annotation.Annotation; -import java.util.HashSet; - -/** - * Lightweight class metadata holder storing a class name and its annotation names. - * Used by classpath scanning to defer class loading until needed. - */ -public final class SimpleClassInfo { - - private final String type; - private final HashSet annotations; - - public SimpleClassInfo(String type, HashSet annotations) { - this.type = type; - this.annotations = annotations; - } - - public String getType() { - return type; - } - - public HashSet getAnnotations() { - return annotations; - } - - /** - * Checks whether this class info contains the given annotation type. - */ - public boolean isAnnotationPresent(Class anno) { - return annotations.contains(anno.getName()); - } - - /** - * Loads and returns the actual {@link Class} represented by this info. - * - * @throws ClassNotFoundException if the class cannot be found - */ - public Class toClass() throws ClassNotFoundException { - return Class.forName(type); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/GraphMathHelper.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/GraphMathHelper.java deleted file mode 100644 index a1a37b8..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/GraphMathHelper.java +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.utils; - -import net.minecraft.world.phys.Vec3; - -public final class GraphMathHelper { - private GraphMathHelper() { - } - - public static float lerp(float alpha, float from, float to) { - return from + (to - from) * alpha; - } - - public static double lerp(double alpha, double from, double to) { - return from + (to - from) * alpha; - } - - /** - * Linearly interpolate between two {@link Vec3} positions. - * - * @param alpha interpolation factor (0 = from, 1 = to) - * @param from start position - * @param to end position - * @return interpolated position - */ - public static Vec3 lerp(float alpha, Vec3 from, Vec3 to) { - return new Vec3( - lerp((double) alpha, from.x, to.x), - lerp((double) alpha, from.y, to.y), - lerp((double) alpha, from.z, to.z) - ); - } - - public static double inverseLerp(double value, double min, double max) { - if (max == min) { - return 0.0; - } - return (value - min) / (max - min); - } - - public static double smoothstep(double edge0, double edge1, double x) { - double t = Math3DUtil.clamp(inverseLerp(x, edge0, edge1), 0.0, 1.0); - return t * t * (3.0 - 2.0 * t); - } - - /** - * Inverse-power distance falloff. Returns a value in [0, 1] that decreases - * with distance according to {@code 1 / (1 + (dist/range)^power)}. - *

- * When {@code dist == 0}, returns 1.0. When {@code dist == range}, returns 0.5 - * for {@code power == 1}. - * - * @param dist the distance from the source - * @param range the characteristic range (half-strength distance at power=1) - * @param power the falloff exponent (higher = steeper) - * @return falloff factor in [0, 1] - */ - public static double inversePowerFalloff(double dist, double range, double power) { - if (range <= 0.0) { - return 0.0; - } - double ratio = dist / range; - return 1.0 / (1.0 + Math.pow(ratio, power)); - } - - /** - * Exponential damping factor for velocity drag. - * Returns {@code exp(-damping * dt)}, clamped to [0, 1]. - * - * @param damping the damping coefficient (higher = more drag) - * @param dt the time step - * @return multiplicative factor in [0, 1] - */ - public static double expDampFactor(double damping, double dt) { - double factor = Math.exp(-damping * dt); - return Math.max(0.0, Math.min(1.0, factor)); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ReflectUtil.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ReflectUtil.java deleted file mode 100644 index 6debd4d..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ReflectUtil.java +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.utils; - -import com.mojang.logging.LogUtils; -import org.slf4j.Logger; - -import java.util.function.Supplier; - -/** - * Reflection and timing utilities. - *

- * Provides class references for common Minecraft types (useful for reflection-based - * annotation processing) and timed execution helpers that log elapsed time - * to the mod logger. - */ -public final class ReflectUtil { - - private static final Logger LOGGER = LogUtils.getLogger(); - - private ReflectUtil() { - } - - /** - * Runs a {@link Runnable} and logs the elapsed time in milliseconds. - * - * @param name the operation name for logging - * @param invoker the code to run - */ - public static void infoTimeWith(String name, Runnable invoker) { - long start = System.currentTimeMillis(); - invoker.run(); - long end = System.currentTimeMillis(); - LOGGER.info("Executed " + name + " completed: took " + (end - start) + "ms"); - } - - /** - * Overload with default empty name. - */ - public static void infoTimeWith(Runnable invoker) { - infoTimeWith("", invoker); - } - - /** - * Runs a {@link Supplier} and logs the elapsed time, returning the result. - * - * @param name the operation name for logging - * @param invoker the code to run - * @param return type - * @return the result of the supplier - */ - public static T infoTimeCallable(String name, Supplier invoker) { - long start = System.currentTimeMillis(); - T result = invoker.get(); - long end = System.currentTimeMillis(); - LOGGER.info("Executed and returned " + name + " completed: took " + (end - start) + "ms"); - return result; - } - - /** - * Overload with default empty name. - */ - public static T infoTimeCallable(Supplier invoker) { - return infoTimeCallable("", invoker); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/api/ModelPartPointCollector.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/api/ModelPartPointCollector.java deleted file mode 100644 index a44efde..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/api/ModelPartPointCollector.java +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.utils.api; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.world.phys.Vec3; - -import java.util.List; - -/** - * Collects sample points from a {@link ModelPart} hierarchy for particle placement. - *

- * Implementations walk the model-part tree and emit world-space positions - * that can be used to spawn particles along the model's surface. - */ -public interface ModelPartPointCollector { - /** - * Collect sample points from the given model-part tree. - * - * @param root the root model part - * @param poseStack the current pose stack (transformations applied to the model) - * @param density how many sample points to generate (higher = denser) - * @param pixelToUnit whether to convert pixel coordinates to unit (1/16) scale - * @return a list of sample positions in model-local space - */ - List collectSamplePoints(ModelPart root, PoseStack poseStack, int density, boolean pixelToUnit); - - /** - * Convenience overload with {@code pixelToUnit} defaulting to {@code true}. - */ - default List collectSamplePoints(ModelPart root, PoseStack poseStack, int density) { - return collectSamplePoints(root, poseStack, density, true); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/emitters/LinearResistanceHelper.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/emitters/LinearResistanceHelper.java deleted file mode 100644 index 0947818..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/emitters/LinearResistanceHelper.java +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.utils.helper.emitters; - -import net.minecraft.world.phys.Vec3; - -/** - * Utility for applying linear resistance (velocity scaling) to emitter motion. - */ -public final class LinearResistanceHelper { - public static final LinearResistanceHelper INSTANCE = new LinearResistanceHelper(); - - private LinearResistanceHelper() { - } - - /** - * Scale the velocity vector by a percentage factor. - * - * @param enter the current velocity - * @param percent the scaling factor (e.g. 0.95 for 5% deceleration per tick) - * @return the scaled velocity - */ - public Vec3 setPercentageVelocity(Vec3 enter, double percent) { - return enter.scale(percent); - } -} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorData.java b/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorData.java deleted file mode 100644 index 07bbcf3..0000000 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorData.java +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticlesapi.utils.interpolator.data; - -/** - * Generic interpolation data container. - * Stores a current value and provides interpolated results based on a progress factor. - * - * @param the value type - */ -public interface InterpolatorData { - InterpolatorData update(T current); - - T getWithInterpolator(Number progress); - - T getCurrent(); -} diff --git a/forge-port-api/src/main/resources/META-INF/mods.toml b/forge-port-api/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 3cd0d4e..0000000 --- a/forge-port-api/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,28 +0,0 @@ -modLoader="javafml" -loaderVersion="${loader_version_range}" -license="${mod_license}" - -[[mods]] -modId="${mod_id}" -version="${mod_version}" -displayName="${mod_name}" -displayTest="IGNORE_ALL_VERSION" -authors="Reiasu" -description=''' -ReiParticlesAPI runtime for Forge 1.20.x. -Includes animation, emitter, display and test lifecycle services used by ReiParticleSkill. -''' - -[[dependencies.${mod_id}]] -modId="forge" -mandatory=true -versionRange="${loader_version_range}" -ordering="NONE" -side="BOTH" - -[[dependencies.${mod_id}]] -modId="minecraft" -mandatory=true -versionRange="${minecraft_version_range}" -ordering="NONE" -side="BOTH" diff --git a/forge-port-api/src/main/resources/pack.mcmeta b/forge-port-api/src/main/resources/pack.mcmeta deleted file mode 100644 index 73613b9..0000000 --- a/forge-port-api/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "pack_format": 15, - "description": "ReiParticlesAPI resources" - } -} \ No newline at end of file diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/ReiParticlesAPISchedulerTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/ReiParticlesAPISchedulerTest.java deleted file mode 100644 index 6f03d10..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/ReiParticlesAPISchedulerTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi; - -import org.junit.jupiter.api.Test; - -import java.util.concurrent.atomic.AtomicBoolean; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class ReiParticlesAPISchedulerTest { - - private ReiParticlesAPI.Scheduler createScheduler() { - return new ReiParticlesAPI.Scheduler(); - } - - @Test - void shouldExecuteScheduledTask() { - ReiParticlesAPI.Scheduler scheduler = createScheduler(); - AtomicBoolean executed = new AtomicBoolean(false); - - scheduler.runTask(1, () -> executed.set(true)); - - // tick 1: currentTick becomes 1, executionTick is 1 → should fire - scheduler.tick(); - assertTrue(executed.get()); - } - - @Test - void shouldExecuteWhenTickIsZero() { - ReiParticlesAPI.Scheduler scheduler = createScheduler(); - AtomicBoolean executed = new AtomicBoolean(false); - - // runTask(0) clamps to 1, so executionTick = 0 + 1 = 1 - scheduler.runTask(0, () -> executed.set(true)); - - // Before tick: not yet executed - assertFalse(executed.get()); - // tick 1: should fire - scheduler.tick(); - assertTrue(executed.get()); - } -} diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/ReiParticlesAPITest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/ReiParticlesAPITest.java deleted file mode 100644 index 6fe760f..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/ReiParticlesAPITest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class ReiParticlesAPITest { - @Test - void shouldAllowRepeatedLifecycleCalls() { - assertDoesNotThrow(ReiParticlesAPI::init); - assertDoesNotThrow(ReiParticlesAPI::init); - assertTrue(ReiParticlesAPI.isInitialized()); - - assertDoesNotThrow(() -> ReiParticlesAPI.INSTANCE.loadScannerPackages()); - assertDoesNotThrow(() -> ReiParticlesAPI.INSTANCE.loadScannerPackages()); - assertTrue(ReiParticlesAPI.INSTANCE.scannersLoaded()); - - assertDoesNotThrow(() -> ReiParticlesAPI.INSTANCE.registerTest()); - assertDoesNotThrow(() -> ReiParticlesAPI.INSTANCE.registerTest()); - assertTrue(ReiParticlesAPI.INSTANCE.testHooksRegistered()); - } -} diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/animation/AnimateRuntimeTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/animation/AnimateRuntimeTest.java deleted file mode 100644 index aaac104..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/animation/AnimateRuntimeTest.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi.animation; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class AnimateRuntimeTest { - @AfterEach - void cleanup() { - AnimateManager.INSTANCE.clear(); - } - - @Test - void shouldDriveAnimateToCompletionByServerTicks() { - CountingAction action = new CountingAction(3); - Animate animate = new Animate().addNode(new AnimateNode().addAction(action)); - - AnimateManager.INSTANCE.displayAnimateServer(animate); - assertEquals(1, AnimateManager.INSTANCE.activeCount()); - - AnimateManager.INSTANCE.tickServer(); - AnimateManager.INSTANCE.tickServer(); - assertEquals(1, AnimateManager.INSTANCE.activeCount()); - - AnimateManager.INSTANCE.tickServer(); - assertEquals(1, AnimateManager.INSTANCE.activeCount()); - AnimateManager.INSTANCE.tickServer(); - assertEquals(0, AnimateManager.INSTANCE.activeCount()); - assertTrue(animate.getDone()); - assertEquals(3, action.ticks); - } - - @Test - void shouldCancelWhenPredicateIsSatisfied() { - CountingAction action = new CountingAction(20); - Animate animate = new Animate() - .addNode(new AnimateNode().addAction(action)) - .addCancelPredicate(a -> action.ticks >= 2); - - AnimateManager.INSTANCE.displayAnimateServer(animate); - AnimateManager.INSTANCE.tickServer(); - AnimateManager.INSTANCE.tickServer(); - AnimateManager.INSTANCE.tickServer(); - - assertTrue(animate.getDone()); - assertEquals(0, AnimateManager.INSTANCE.activeCount()); - assertTrue(action.ticks >= 2); - } - - private static final class CountingAction extends AnimateAction { - private final int maxTicks; - private int ticks; - - private CountingAction(int maxTicks) { - this.maxTicks = maxTicks; - } - - @Override - public boolean checkDone() { - return ticks >= maxTicks; - } - - @Override - public void tick() { - ticks++; - } - - @Override - public void onStart() { - ticks = 0; - } - - @Override - public void onDone() { - } - } -} diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/display/DisplayEntityManagerTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/display/DisplayEntityManagerTest.java deleted file mode 100644 index c3ad21c..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/display/DisplayEntityManagerTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi.display; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class DisplayEntityManagerTest { - @AfterEach - void cleanup() { - DisplayEntityManager.INSTANCE.clear(); - } - - @Test - void shouldTickAndRemoveCanceledDisplays() { - DisplayEntityManager.INSTANCE.spawn(new DebugDisplayEntity(0.0, 64.0, 0.0, "group")); - assertEquals(1, DisplayEntityManager.INSTANCE.activeCount()); - - DisplayEntity entity = DisplayEntityManager.INSTANCE.getDisplays().get(0); - entity.cancel(); - DisplayEntityManager.INSTANCE.tickAll(); - - assertEquals(0, DisplayEntityManager.INSTANCE.activeCount()); - } - - @Test - void shouldIgnoreUnknownDisplayObjects() { - DisplayEntityManager.INSTANCE.spawn("invalid"); - assertEquals(0, DisplayEntityManager.INSTANCE.activeCount()); - } -} diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/event/ReiEventBusTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/event/ReiEventBusTest.java deleted file mode 100644 index 8d06a7a..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/event/ReiEventBusTest.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi.event; - -import com.reiasu.reiparticlesapi.annotations.events.EventHandler; -import com.reiasu.reiparticlesapi.event.api.ReiEvent; -import com.reiasu.reiparticlesapi.event.api.EventInterruptible; -import com.reiasu.reiparticlesapi.event.api.EventPriority; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -import java.util.concurrent.atomic.AtomicInteger; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class ReiEventBusTest { - @AfterEach - void clean() { - ReiEventBus.INSTANCE.clear(); - } - - @Test - void shouldDispatchHandlersByPriorityOrder() { - StringBuilder order = new StringBuilder(); - ReiEventBus.INSTANCE.registerListenerInstance("test", new PriorityListener(order)); - - ReiEventBus.call(new BaseEvent()); - - assertEquals("HIGHEST,HIGH,NORMAL,LOW,LOWEST", order.toString()); - } - - @Test - void shouldStopWhenEventIsInterrupted() { - AtomicInteger calls = new AtomicInteger(); - ReiEventBus.INSTANCE.registerListenerInstance("test", new InterruptingListener(calls)); - - ReiEventBus.call(new InterruptEvent()); - - assertEquals(1, calls.get()); - } - - @Test - void shouldDispatchChildThenParentEventHandlers() { - StringBuilder order = new StringBuilder(); - ReiEventBus.INSTANCE.registerListenerInstance("test", new HierarchyListener(order)); - - ReiEventBus.call(new ChildEvent()); - - assertEquals("child,parent", order.toString()); - } - - private static class BaseEvent extends ReiEvent { - } - - private static final class ChildEvent extends BaseEvent { - } - - private static final class InterruptEvent extends ReiEvent implements EventInterruptible { - private boolean interrupted; - - @Override - public boolean isInterrupted() { - return interrupted; - } - - @Override - public void setInterrupted(boolean interrupted) { - this.interrupted = interrupted; - } - } - - private static final class PriorityListener { - private final StringBuilder order; - - private PriorityListener(StringBuilder order) { - this.order = order; - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void highest(BaseEvent event) { - append("HIGHEST"); - } - - @EventHandler(priority = EventPriority.HIGH) - public void high(BaseEvent event) { - append("HIGH"); - } - - @EventHandler(priority = EventPriority.NORMAL) - public void normal(BaseEvent event) { - append("NORMAL"); - } - - @EventHandler(priority = EventPriority.LOW) - public void low(BaseEvent event) { - append("LOW"); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void lowest(BaseEvent event) { - append("LOWEST"); - } - - private void append(String value) { - if (order.length() > 0) { - order.append(','); - } - order.append(value); - } - } - - private static final class InterruptingListener { - private final AtomicInteger calls; - - private InterruptingListener(AtomicInteger calls) { - this.calls = calls; - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void first(InterruptEvent event) { - calls.incrementAndGet(); - event.setInterrupted(true); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void second(InterruptEvent event) { - calls.incrementAndGet(); - } - } - - private static final class HierarchyListener { - private final StringBuilder order; - - private HierarchyListener(StringBuilder order) { - this.order = order; - } - - @EventHandler - public void onChild(ChildEvent event) { - append("child"); - } - - @EventHandler - public void onParent(BaseEvent event) { - append("parent"); - } - - private void append(String value) { - if (order.length() > 0) { - order.append(','); - } - order.append(value); - } - } -} - diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffersTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffersTest.java deleted file mode 100644 index 8e75245..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffersTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi.network.buffer; - -import org.junit.jupiter.api.Test; - -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -class ParticleControllerDataBuffersTest { - @Test - void shouldRoundTripBufferWithEnvelopeEncoding() { - StringControllerBuffer source = ParticleControllerDataBuffers.INSTANCE.string("forge-runtime"); - byte[] encoded = ParticleControllerDataBuffers.INSTANCE.encode(source); - ParticleControllerDataBuffer decoded = ParticleControllerDataBuffers.INSTANCE.decodeToBuffer(encoded); - - assertInstanceOf(StringControllerBuffer.class, decoded); - assertEquals("forge-runtime", decoded.getLoadedValue()); - } - - @Test - void shouldDecodeByBufferId() { - UUID uuid = UUID.randomUUID(); - UUIDControllerBuffer source = ParticleControllerDataBuffers.INSTANCE.uuid(uuid); - - ParticleControllerDataBuffer decoded = - ParticleControllerDataBuffers.INSTANCE.withIdDecode(UUIDControllerBuffer.ID, source.encode()); - - assertNotNull(decoded); - assertEquals(uuid, decoded.getLoadedValue()); - } - - @Test - void shouldResolveWrapperClassToPrimitiveRegistration() { - ParticleControllerDataBuffer buffer = ParticleControllerDataBuffers.INSTANCE.fromBufferType(42, Integer.class); - - assertNotNull(buffer); - assertInstanceOf(IntControllerBuffer.class, buffer); - assertEquals(42, buffer.getLoadedValue()); - } - - @Test - void shouldRoundTripPrimitiveArrays() { - int[] input = new int[]{2, 4, 6, 8}; - IntArrayControllerBuffer source = ParticleControllerDataBuffers.INSTANCE.intArray(input); - - ParticleControllerDataBuffer decoded = - ParticleControllerDataBuffers.INSTANCE.withIdDecode(IntArrayControllerBuffer.ID, source.encode()); - - assertNotNull(decoded); - assertArrayEquals(input, (int[]) decoded.getLoadedValue()); - } -} - diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacketTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacketTest.java deleted file mode 100644 index 01701a1..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacketTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi.network.packet; - -import io.netty.buffer.Unpooled; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.phys.Vec3; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class CameraShakeS2CPacketTest { - @Test - void shouldEncodeAndDecodeWithoutLosingData() { - CameraShakeS2CPacket input = new CameraShakeS2CPacket(12.5, new Vec3(1.25, 80.0, -4.5), 0.85, 40); - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); - - CameraShakeS2CPacket.encode(input, buf); - CameraShakeS2CPacket output = CameraShakeS2CPacket.decode(buf); - - assertEquals(input.range(), output.range()); - assertEquals(input.origin().x, output.origin().x); - assertEquals(input.origin().y, output.origin().y); - assertEquals(input.origin().z, output.origin().z); - assertEquals(input.amplitude(), output.amplitude()); - assertEquals(input.tick(), output.tick()); - } -} diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManagerTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManagerTest.java deleted file mode 100644 index 8da5aa6..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManagerTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi.network.particle.emitters; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class ParticleEmittersManagerTest { - @AfterEach - void cleanup() { - ParticleEmittersManager.clear(); - } - - @Test - void shouldTickAndPruneEmittersAtMaxTick() { - CountingEmitter emitter = new CountingEmitter(); - emitter.setMaxTick(3); - ParticleEmittersManager.spawnEmitters(emitter); - - assertEquals(1, ParticleEmittersManager.activeCount()); - - ParticleEmittersManager.tickAll(); - ParticleEmittersManager.tickAll(); - assertEquals(1, ParticleEmittersManager.activeCount()); - - ParticleEmittersManager.tickAll(); - assertEquals(0, ParticleEmittersManager.activeCount()); - assertEquals(3, emitter.emittedTicks); - } - - @Test - void shouldIgnoreNonEmitterObjects() { - ParticleEmittersManager.spawnEmitters("not-an-emitter"); - assertEquals(0, ParticleEmittersManager.activeCount()); - } - - private static final class CountingEmitter extends ParticleEmitters { - private int emittedTicks; - - @Override - protected void emitTick() { - emittedTicks++; - } - } -} diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/utils/builder/PointsAndFourierBuilderTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/utils/builder/PointsAndFourierBuilderTest.java deleted file mode 100644 index 69d4cf2..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/utils/builder/PointsAndFourierBuilderTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi.utils.builder; - -import com.reiasu.reiparticlesapi.utils.RelativeLocation; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -final class PointsAndFourierBuilderTest { - @Test - void fourierBuilderKeepsRequestedCount() { - FourierSeriesBuilder builder = new FourierSeriesBuilder() - .count(314) - .scale(0.2857142857142857) - .addFourier(2.0, 4.0) - .addFourier(-5.0, -3.0); - assertEquals(314, builder.build().size()); - } - - @Test - void discreteCircleProducesExpectedSamples() { - PointsBuilder builder = new PointsBuilder() - .addDiscreteCircleXZ(48.0, 200, 8.0); - assertEquals(200, builder.create().size()); - } - - @Test - void createWithStyleDataMapsEachPoint() { - PointsBuilder builder = new PointsBuilder().addCircle(10.0, 32); - Map mapped = builder.createWithStyleData(point -> point.getX() > 0 ? "A" + point.getX() : "B" + point.getZ()); - assertFalse(mapped.isEmpty()); - assertTrue(mapped.values().stream().allMatch(point -> point != null)); - } -} diff --git a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/utils/helper/StyleHelperRuntimeTest.java b/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/utils/helper/StyleHelperRuntimeTest.java deleted file mode 100644 index 394fa88..0000000 --- a/forge-port-api/src/test/java/com/reiasu/reiparticlesapi/utils/helper/StyleHelperRuntimeTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2025 Reiasu - * - * This file is part of ReiParticlesAPI. - * - * ReiParticlesAPI is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * ReiParticlesAPI is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with ReiParticlesAPI. If not, see . - */ -// SPDX-License-Identifier: LGPL-3.0-only -package com.reiasu.reiparticlesapi.utils.helper; - -import com.reiasu.reiparticlesapi.network.particle.style.ParticleGroupStyle; -import com.reiasu.reiparticlesapi.utils.RelativeLocation; -import com.reiasu.reiparticlesapi.utils.helper.impl.StyleStatusHelper; -import org.junit.jupiter.api.Test; - -import java.util.Collections; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -final class StyleHelperRuntimeTest { - @Test - void statusHelperRemovesStyleAfterClosedInterval() { - ParticleGroupStyle style = new ParticleGroupStyle() { - @Override public Map getCurrentFrames() { return Collections.emptyMap(); } - @Override public void onDisplay() {} - }; - StyleStatusHelper statusHelper = HelperUtil.INSTANCE.styleStatus(3); - statusHelper.loadController(style); - statusHelper.setStatus(StatusHelper.Status.DISABLE); - - style.tick(); - style.tick(); - style.tick(); - - assertTrue(style.getCanceled()); - } - - @Test - void styleScaleHelperMovesScaleForward() { - ParticleGroupStyle style = new ParticleGroupStyle() { - @Override public Map getCurrentFrames() { return Collections.emptyMap(); } - @Override public void onDisplay() {} - }; - ScaleHelper helper = HelperUtil.INSTANCE.scaleStyle(0.1, 1.0, 10); - helper.loadController(style); - helper.doScale(); - helper.doScale(); - helper.doScale(); - - assertTrue(style.getScale() > 0.1); - assertTrue(style.getScale() <= 1.0); - } - - @Test - void bezierScaleHelperProducesBoundedScale() { - ParticleGroupStyle style = new ParticleGroupStyle() { - @Override public Map getCurrentFrames() { return Collections.emptyMap(); } - @Override public void onDisplay() {} - }; - BezierValueScaleHelper helper = HelperUtil.INSTANCE.bezierValueScaleStyle( - 0.01, - 1.0, - 20, - new RelativeLocation(17.0, 1.0, 0.0), - new RelativeLocation(-3.0, 0.0, 0.0) - ); - helper.loadController(style); - for (int i = 0; i < 8; i++) { - helper.doScale(); - } - - assertTrue(style.getScale() >= 0.01); - assertTrue(style.getScale() <= 1.0); - } -} diff --git a/forge-port-api/wrapper-bootstrap.gradle b/forge-port-api/wrapper-bootstrap.gradle deleted file mode 100644 index e2b3c3e..0000000 --- a/forge-port-api/wrapper-bootstrap.gradle +++ /dev/null @@ -1,4 +0,0 @@ -tasks.register('wrapper', Wrapper) { - gradleVersion = '8.10' - distributionType = Wrapper.DistributionType.ALL -} \ No newline at end of file diff --git a/forge-port/build.gradle b/forge-port/build.gradle index 8658105..351e6f8 100644 --- a/forge-port/build.gradle +++ b/forge-port/build.gradle @@ -2,7 +2,7 @@ plugins { id 'eclipse' id 'idea' id 'maven-publish' - id 'net.minecraftforge.gradle' version '[6.0.36,6.2)' + id 'net.neoforged.moddev' version '2.0.140' } version = mod_version @@ -14,78 +14,50 @@ base { java { toolchain { - languageVersion = JavaLanguageVersion.of(17) + languageVersion = JavaLanguageVersion.of(21) } } -// Merged dev output for the reiparticlesapi module. -// Combines API classes + resources into one directory so Forge discovers it as a mod. -def reiApiMergedDir = file("${buildDir}/reiapi-dev") - -// Source set whose output points to the merged dir. No actual compilation — -// the Sync task (prepareReiApiDev) populates reiApiMergedDir instead. -sourceSets { - reiapi { - java.srcDirs = [] - resources.srcDirs = [] - } -} -sourceSets.reiapi.output.resourcesDir = reiApiMergedDir - -minecraft { - mappings channel: 'official', version: minecraft_version +sourceSets.main.resources { srcDir 'src/generated/resources' } - copyIdeResources = true +neoForge { + version = neo_version runs { - configureEach { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - mods { - "${mod_id}" { - source sourceSets.main - } - reiparticlesapi { - source sourceSets.reiapi - } - } + client { + client() } - - client {} - server { - args '--nogui' + server() + programArgument '--nogui' } - data { - args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + data() + programArguments.addAll '--mod', mod_id, '--all', + '--output', file('src/generated/resources/').absolutePath, + '--existing', file('src/main/resources/').absolutePath } } -} -sourceSets.main.resources { srcDir 'src/generated/resources' } + mods { + "reiparticlesapi" { + sourceSet(sourceSets.main) + } + "${mod_id}" { + sourceSet(sourceSets.main) + } + } +} repositories { - maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://maven.neoforged.net/releases' } mavenCentral() } -// Sync task: merge API classes + processed resources into a single directory for dev runtime -tasks.register('prepareReiApiDev', Sync) { - from '../forge-port-api/build/classes/java/main' - from '../forge-port-api/build/resources/main' - into reiApiMergedDir -} -['runClient', 'runServer', 'runData'].each { taskName -> - tasks.matching { it.name == taskName }.configureEach { dependsOn 'prepareReiApiDev' } -} - dependencies { - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - // Resolved via composite build (see settings.gradle includeBuild) - compileOnly 'com.reiasu.reiparticlesapi:reiparticlesapi:1.0-SNAPSHOT-forge-port' - testImplementation 'com.reiasu.reiparticlesapi:reiparticlesapi:1.0-SNAPSHOT-forge-port' + // ClassGraph — runtime classpath scanning (used by ReiAPIScanner) + implementation 'io.github.classgraph:classgraph:4.8.174' + testImplementation platform('org.junit:junit-bom:5.11.4') testImplementation 'org.junit.jupiter:junit-jupiter' } @@ -100,11 +72,12 @@ processResources { mod_name : mod_name, mod_license : mod_license, mod_version : mod_version, + neo_version_range : neo_version_range, loader_version_range : loader_version_range, minecraft_version_range: minecraft_version_range ] inputs.properties replaceProperties - filesMatching(['META-INF/mods.toml']) { + filesMatching(['META-INF/neoforge.mods.toml']) { expand replaceProperties } } diff --git a/forge-port/gradle.properties b/forge-port/gradle.properties index 4cdeceb..9c386b8 100644 --- a/forge-port/gradle.properties +++ b/forge-port/gradle.properties @@ -1,3 +1,4 @@ +org.gradle.java.home=C:\\Program Files\\Microsoft\\jdk-21.0.10.7-hotspot org.gradle.jvmargs=-Xmx2G org.gradle.daemon=true org.gradle.parallel=true @@ -5,13 +6,14 @@ org.gradle.parallel=true mod_id=reiparticleskill mod_name=ReiParticleSkill mod_license=LGPL-3.0-only -mod_version=1.0-SNAPSHOT-forge-port +mod_version=1.0-SNAPSHOT-neoforge mod_group_id=com.reiasu.reiparticleskill -minecraft_version=1.20.1 -forge_version=47.2.0 -loader_version_range=[47,) -minecraft_version_range=[1.20.1,1.21) +minecraft_version=1.21.1 +neo_version=21.1.173 +neo_version_range=[21.1,) +loader_version_range=[4,) +minecraft_version_range=[1.21.1,1.22) org.gradle.java.installations.auto-download=true org.gradle.java.installations.auto-detect=true diff --git a/forge-port/settings.gradle b/forge-port/settings.gradle index 2ca17ed..6c2e2ec 100644 --- a/forge-port/settings.gradle +++ b/forge-port/settings.gradle @@ -1,7 +1,7 @@ pluginManagement { repositories { gradlePluginPortal() - maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://maven.neoforged.net/releases' } mavenCentral() } } @@ -10,11 +10,6 @@ plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } -rootProject.name = 'reiparticleskill-forge-port' +rootProject.name = 'reiparticleskill-neoforge' -// Composite build: resolve forge-port-api from the sibling project instead of a pre-built jar. -includeBuild('../forge-port-api') { - dependencySubstitution { - substitute module('com.reiasu.reiparticlesapi:reiparticlesapi') using project(':') - } -} +// forge-port-api merged into this module — single jar build diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPI.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPI.java new file mode 100644 index 0000000..7065016 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPI.java @@ -0,0 +1,73 @@ +package com.reiasu.reiparticlesapi; + +import net.neoforged.neoforge.common.NeoForge; +import com.reiasu.reiparticlesapi.event.ReiEventBus; +import com.reiasu.reiparticlesapi.event.api.ReiEvent; +import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmittersManager; +import com.reiasu.reiparticlesapi.scheduler.ReiScheduler; +import com.reiasu.reiparticlesapi.test.SimpleTestGroupBuilder; +import com.reiasu.reiparticlesapi.test.TestManager; +import net.minecraft.server.level.ServerPlayer; +public final class ReiParticlesAPI { + public static final ReiParticlesAPI INSTANCE = new ReiParticlesAPI(); + private static boolean initialized; + private static boolean scannersLoaded; + private static boolean testHooksRegistered; + + private ReiParticlesAPI() { + } + + public static void init() { + if (initialized) return; + initialized = true; + ParticleEmittersManager.registerBuiltinCodecs(); + } + + public static boolean isInitialized() { + return initialized; + } + + public void loadScannerPackages() { + if (scannersLoaded) return; + scannersLoaded = true; + ReiEventBus.INSTANCE.initListeners(); + } + + public boolean scannersLoaded() { + return scannersLoaded; + } + + public void registerTest() { + if (testHooksRegistered) return; + testHooksRegistered = true; + TestManager.INSTANCE.register("api-test-group-builder", user -> buildSmokeTestGroup(user)); + } + + public boolean testHooksRegistered() { + return testHooksRegistered; + } + + public void appendEventListenerTarget(String modId, String packageName) { + ReiEventBus.INSTANCE.appendListenerTarget(modId, packageName); + } + + public void initEventListeners() { + ReiEventBus.INSTANCE.initListeners(); + } + + public void registerEventListener(String modId, Object listener) { + ReiEventBus.INSTANCE.registerListenerInstance(modId, listener); + } + + public T callEvent(T event) { + return NeoForge.EVENT_BUS.post(event); + } + + public static ReiScheduler reiScheduler() { + return ReiScheduler.INSTANCE; + } + + private static SimpleTestGroupBuilder buildSmokeTestGroup(ServerPlayer user) { + return new SimpleTestGroupBuilder("api-test-group-builder", user); + } +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPIForge.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPIForge.java new file mode 100644 index 0000000..304d11b --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesAPIForge.java @@ -0,0 +1,183 @@ +package com.reiasu.reiparticlesapi; + +import com.reiasu.reiparticlesapi.animation.AnimateManager; +import com.reiasu.reiparticlesapi.client.ClientTickEventForwarder; +import com.reiasu.reiparticlesapi.commands.APICommand; +import com.reiasu.reiparticlesapi.config.APIConfig; +import com.reiasu.reiparticlesapi.display.DisplayEntityManager; +import com.reiasu.reiparticlesapi.event.ForgeEventForwarder; +import com.reiasu.reiparticlesapi.event.ReiEventBus; +import com.reiasu.reiparticlesapi.event.events.server.ServerPostTickEvent; +import com.reiasu.reiparticlesapi.event.events.server.ServerPreTickEvent; +import com.reiasu.reiparticlesapi.network.ReiParticlesNetwork; +import com.reiasu.reiparticlesapi.network.animation.PathMotionManager; +import com.reiasu.reiparticlesapi.network.particle.composition.manager.ParticleCompositionManager; +import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmittersManager; +import com.reiasu.reiparticlesapi.network.particle.emitters.environment.wind.WindDirections; +import com.reiasu.reiparticlesapi.network.particle.emitters.type.EmittersShootTypes; +import com.reiasu.reiparticlesapi.network.particle.style.ParticleStyleManager; +import com.reiasu.reiparticlesapi.particles.ControllableParticleEffectManager; +import com.reiasu.reiparticlesapi.particles.ReiModParticles; +import com.reiasu.reiparticlesapi.particles.control.group.ClientParticleGroupManager; +import com.reiasu.reiparticlesapi.particles.impl.particles.*; +import com.reiasu.reiparticlesapi.renderer.client.ClientRenderEntityManager; +import com.reiasu.reiparticlesapi.renderer.server.ServerRenderEntityManager; +import com.reiasu.reiparticlesapi.scheduler.ReiScheduler; +import com.reiasu.reiparticlesapi.test.TestManager; +import com.reiasu.reiparticlesapi.utils.ClientCameraUtil; +import com.mojang.logging.LogUtils; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; +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.loading.FMLEnvironment; +import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.event.tick.ServerTickEvent; +import org.slf4j.Logger; + +@Mod(ReiParticlesAPIForge.MOD_ID) +public final class ReiParticlesAPIForge { + public static final String MOD_ID = "reiparticlesapi"; + private static final Logger LOGGER = LogUtils.getLogger(); + + private record TickHandler(String name, Runnable action) {} + private static final int ERROR_THROTTLE_TICKS = 200; // ~10 seconds at 20 tps + private static final int[] errorCooldowns = new int[32]; // indexed per handler slot + private static int tickCounter; + + private final TickHandler[] clientHandlers; + private final TickHandler[] serverHandlers; + public ReiParticlesAPIForge(IEventBus modBus, ModContainer container) { + clientHandlers = buildClientHandlers(); + serverHandlers = buildServerHandlers(serverRef); + registerConfig(container); + registerTickCallbacks(modBus); + registerCommands(); + initSystems(modBus); + + + } + private void registerConfig(ModContainer container) { + container.registerConfig(ModConfig.Type.COMMON, APIConfig.SPEC); + } + + private void registerTickCallbacks(IEventBus modBus) { + modBus.addListener((FMLClientSetupEvent event) -> onClientSetup()); + ReiModParticles.register(modBus); + modBus.addListener(this::onRegisterParticleProviders); + + NeoForge.EVENT_BUS.addListener((ClientTickEvent.Pre event) -> { + if (FMLEnvironment.dist == Dist.CLIENT) { + ClientTickEventForwarder.onClientStartTick(); + } + }); + NeoForge.EVENT_BUS.addListener((ClientTickEvent.Post event) -> onClientEndTick()); + NeoForge.EVENT_BUS.addListener((ServerTickEvent.Pre event) -> + NeoForge.EVENT_BUS.post(new ServerPreTickEvent(event.getServer()))); + NeoForge.EVENT_BUS.addListener((ServerTickEvent.Post event) -> + onServerEndTick(event.getServer())); + } + + private void registerCommands() { + NeoForge.EVENT_BUS.addListener( + (RegisterCommandsEvent event) -> + APICommand.INSTANCE.register(event.getDispatcher()) + ); + } + + private void initSystems(IEventBus modBus) { + modBus.addListener(ReiParticlesNetwork::registerPayloads); + ParticleEmittersManager.registerBuiltinCodecs(); + EmittersShootTypes.INSTANCE.init(); + WindDirections.INSTANCE.init(); + ControllableParticleEffectManager.INSTANCE.init(); + ReiParticlesAPI.init(); + ReiParticlesAPI.INSTANCE.loadScannerPackages(); + ReiParticlesAPI.INSTANCE.registerTest(); + } + private TickHandler[] buildClientHandlers() { + return new TickHandler[] { + new TickHandler("ClientTickEventForwarder", ClientTickEventForwarder::onClientEndTick), + new TickHandler("AnimateManager.client", () -> AnimateManager.INSTANCE.tickClient()), + new TickHandler("ParticleEmittersManager.client", ParticleEmittersManager::tickClient), + new TickHandler("DisplayEntityManager.client", () -> DisplayEntityManager.INSTANCE.tickClient()), + new TickHandler("ParticleCompositionManager.client", () -> ParticleCompositionManager.INSTANCE.tickClient()), + new TickHandler("ParticleStyleManager.client", ParticleStyleManager::doTickClient), + new TickHandler("ClientParticleGroupManager", () -> ClientParticleGroupManager.INSTANCE.doClientTick()), + new TickHandler("ClientRenderEntityManager", () -> ClientRenderEntityManager.INSTANCE.doClientTick()), + new TickHandler("PathMotionManager", () -> PathMotionManager.INSTANCE.tick()), + new TickHandler("ReiScheduler", () -> ReiScheduler.INSTANCE.doTick()), + new TickHandler("ClientCameraUtil", () -> ClientCameraUtil.INSTANCE.tick()), + }; + } + + private TickHandler[] buildServerHandlers(net.minecraft.server.MinecraftServer[] serverRef) { + return new TickHandler[] { + new TickHandler("AnimateManager.server", () -> AnimateManager.INSTANCE.tickServer()), + new TickHandler("ParticleEmittersManager.server", ParticleEmittersManager::tickAll), + new TickHandler("DisplayEntityManager.server", () -> DisplayEntityManager.INSTANCE.tickAll()), + new TickHandler("ParticleCompositionManager.server", () -> ParticleCompositionManager.INSTANCE.tickAll()), + new TickHandler("ParticleStyleManager.server", ParticleStyleManager::doTickServer), + new TickHandler("ServerRenderEntityManager.tick", () -> ServerRenderEntityManager.INSTANCE.tick()), + new TickHandler("ServerRenderEntityManager.upgrade", () -> ServerRenderEntityManager.INSTANCE.upgrade(serverRef[0])), + new TickHandler("TestManager", () -> TestManager.INSTANCE.doTickServer()), + new TickHandler("ReiScheduler.server", () -> ReiScheduler.INSTANCE.doTick()), + new TickHandler("ServerPostTickEvent", () -> NeoForge.EVENT_BUS.post(new ServerPostTickEvent(serverRef[0]))), + }; + } + + private void onClientEndTick() { + tickCounter++; + runHandlers(clientHandlers, 0); + } + + private void onServerEndTick(net.minecraft.server.MinecraftServer server) { + serverRef[0] = server; + runHandlers(serverHandlers, clientHandlers.length); + } + + private final net.minecraft.server.MinecraftServer[] serverRef = new net.minecraft.server.MinecraftServer[1]; + + private static void runHandlers(TickHandler[] handlers, int cooldownOffset) { + for (int i = 0; i < handlers.length; i++) { + try { + handlers[i].action.run(); + } catch (Exception e) { + int slot = cooldownOffset + i; + if (errorCooldowns[slot] <= 0) { + errorCooldowns[slot] = ERROR_THROTTLE_TICKS; + LOGGER.warn("Tick handler '{}' threw (throttled to once per ~10s):", + handlers[i].name, e); + } else { + errorCooldowns[slot]--; + } + } + } + } + private void onClientSetup() { + + } + + private void onRegisterParticleProviders(RegisterParticleProvidersEvent event) { + event.registerSpriteSet(ReiModParticles.CONTROLLABLE_END_ROD.get(), + ControllableEndRodParticle.Factory::new); + event.registerSpriteSet(ReiModParticles.CONTROLLABLE_ENCHANTMENT.get(), + ControllableEnchantmentParticle.Factory::new); + event.registerSpriteSet(ReiModParticles.CONTROLLABLE_CLOUD.get(), + ControllableCloudParticle.Factory::new); + event.registerSpriteSet(ReiModParticles.CONTROLLABLE_FLASH.get(), + ControllableFlashParticle.Factory::new); + event.registerSpriteSet(ReiModParticles.CONTROLLABLE_FIREWORK.get(), + ControllableFireworkParticle.Factory::new); + event.registerSpecial(ReiModParticles.CONTROLLABLE_FALLING_DUST.get(), + new ControllableFallingDustParticle.Factory()); + event.registerSpriteSet(ReiModParticles.CONTROLLABLE_SPLASH.get(), + ControllableSplashParticle.Factory::new); + + } +} \ No newline at end of file diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesConstants.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesConstants.java similarity index 75% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesConstants.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesConstants.java index 7b3602b..1f8255a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesConstants.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/ReiParticlesConstants.java @@ -1,13 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * Shared constants for the ReiParticles API. - */ public final class ReiParticlesConstants { public static final String MOD_ID = "reiparticlesapi"; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/Animate.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/Animate.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/Animate.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/Animate.java index b7b5ef8..85f2d7a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/Animate.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/Animate.java @@ -1,29 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.animation; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; -/** - * A sequential animation state machine that plays a chain of {@link AnimateNode}s. - *

- * Nodes are added via {@link #addNode(AnimateNode, int)} with an optional interval - * (in ticks) between the current node finishing and the next starting. - * Call {@link #start()} once, then {@link #tick()} every game tick. - *

- * Cancel predicates can abort the entire chain early via - * {@link #addCancelPredicate(java.util.function.Predicate)}. - *

- * Key state accessors: - *

    - *
  • {@link #getTimestamp()} — ticks elapsed since the current node started
  • - *
  • {@link #getCurrentIndex()} — index of the current node in the chain
  • - *
  • {@link #getDone()} — whether the animation has finished or been cancelled
  • - *
  • {@link #getDisplay()} — whether the animation is currently running
  • - *
- */ public class Animate { private final List nodes = new ArrayList<>(); private final List> cancelPredicates = new ArrayList<>(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateAction.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateAction.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateAction.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateAction.java index 2f5d0bf..0b44dd2 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateAction.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateAction.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.animation; public abstract class AnimateAction { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateManager.java similarity index 97% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateManager.java index 79b94a3..f2ec99c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.animation; import java.util.ArrayList; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateNode.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateNode.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateNode.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateNode.java index fa3e4b8..7ffe71a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateNode.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/AnimateNode.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.animation; import java.util.ArrayList; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/AngleAnimator.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/AngleAnimator.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/AngleAnimator.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/AngleAnimator.java index 0fa795e..a42ce8f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/AngleAnimator.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/AngleAnimator.java @@ -1,11 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.animation.timeline; -/** - * Animates an angle value over a given duration using an easing function. - * Provides delta-based progress for both "glow" (forward) and "fade" (reverse) animations. - */ public final class AngleAnimator { private final int durationTicks; private final double targetAngle; @@ -28,10 +22,7 @@ public boolean getFinished() { return this.finished; } - /** - * Returns the angle delta for a forward (growing) animation step. - */ - public double glowDelta() { + public double glowDelta() { if (this.finished) { return 0.0; } @@ -47,10 +38,7 @@ public double glowDelta() { return delta; } - /** - * Returns the angle delta for a reverse (fading) animation step. - */ - public double fadeDelta() { + public double fadeDelta() { if (this.finished && this.tick >= this.durationTicks) { this.finished = false; this.tick = 0; diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Ease.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Ease.java new file mode 100644 index 0000000..721c51a --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Ease.java @@ -0,0 +1,6 @@ +package com.reiasu.reiparticlesapi.animation.timeline; + +@FunctionalInterface +public interface Ease { + double cal(double t); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Eases.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Eases.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Eases.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Eases.java index e82f266..d683619 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Eases.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Eases.java @@ -1,14 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.animation.timeline; import com.reiasu.reiparticlesapi.utils.RelativeLocation; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec2; -/** - * Collection of standard easing functions and factory methods. - */ public final class Eases { public static final Eases INSTANCE = new Eases(); @@ -105,11 +100,7 @@ public static Ease outBounce() { return outBounce(7.5625, 2.75); } - /** - * Create a cubic bezier easing function using RelativeLocation handles. - * Start at (0,0), end at (1,1). startHandle and endHandle define the two control points. - */ - public Ease bezierEase(RelativeLocation startHandle, RelativeLocation endHandle) { + public Ease bezierEase(RelativeLocation startHandle, RelativeLocation endHandle) { RelativeLocation target = new RelativeLocation(1, 1, 0); RelativeLocation end = new RelativeLocation( target.getX() + endHandle.getX(), @@ -129,10 +120,7 @@ public Ease bezierEase(RelativeLocation startHandle, RelativeLocation endHandle) }; } - /** - * Create a cubic bezier easing function using Vec3 handles. - */ - public Ease bezierEase(Vec3 startHandle, Vec3 endHandle) { + public Ease bezierEase(Vec3 startHandle, Vec3 endHandle) { Vec3 target = new Vec3(1.0, 1.0, 0.0); Vec3 end = target.add(endHandle); return x -> { @@ -148,10 +136,7 @@ public Ease bezierEase(Vec3 startHandle, Vec3 endHandle) { }; } - /** - * Create a cubic bezier easing function using Vec2 handles. - */ - public Ease bezierEase(Vec2 startHandle, Vec2 endHandle) { + public Ease bezierEase(Vec2 startHandle, Vec2 endHandle) { Vec2 target = new Vec2(1.0f, 1.0f); Vec2 end = new Vec2(target.x + endHandle.x, target.y + endHandle.y); return x -> { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Timeline.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Timeline.java similarity index 70% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Timeline.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Timeline.java index af01a0b..e830ad5 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Timeline.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/animation/timeline/Timeline.java @@ -1,16 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.animation.timeline; import java.util.ArrayDeque; import java.util.Deque; import java.util.function.BooleanSupplier; -/** - * A simple sequential step-based timeline. - * Each step is a BooleanSupplier that returns true when the step is done. - * On each tick, the current step is polled; when it returns true, the next step begins. - */ public final class Timeline { private final Deque steps = new ArrayDeque<>(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/CodecField.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/CodecField.java new file mode 100644 index 0000000..f78cc14 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/CodecField.java @@ -0,0 +1,12 @@ +package com.reiasu.reiparticlesapi.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface CodecField { + int index() default 0; +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/ReiAutoRegister.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/ReiAutoRegister.java similarity index 56% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/ReiAutoRegister.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/ReiAutoRegister.java index 44943b2..46e4685 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/ReiAutoRegister.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/ReiAutoRegister.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.annotations; import java.lang.annotation.ElementType; @@ -7,10 +5,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -/** - * Marks a class for automatic registration by the ReiParticles API scanner. - * Classes annotated with this will be discovered and registered at mod init time. - */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ReiAutoRegister { diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/BufferCodec.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/BufferCodec.java new file mode 100644 index 0000000..e91e7ce --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/BufferCodec.java @@ -0,0 +1,34 @@ +package com.reiasu.reiparticlesapi.annotations.codec; + +import net.minecraft.network.FriendlyByteBuf; + +public interface BufferCodec { + + static BufferCodec of(Encoder encoder, Decoder decoder) { + return new BufferCodec() { + @Override + public void encode(FriendlyByteBuf buf, T value) { + encoder.encode(buf, value); + } + + @Override + public T decode(FriendlyByteBuf buf) { + return decoder.decode(buf); + } + }; + } + + void encode(FriendlyByteBuf buf, T value); + + T decode(FriendlyByteBuf buf); + + @FunctionalInterface + interface Encoder { + void encode(FriendlyByteBuf buf, T value); + } + + @FunctionalInterface + interface Decoder { + T decode(FriendlyByteBuf buf); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/CodecHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/CodecHelper.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/CodecHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/CodecHelper.java index b5eb31e..05bde94 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/CodecHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/codec/CodecHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.annotations.codec; import com.reiasu.reiparticlesapi.annotations.CodecField; @@ -26,13 +24,6 @@ import java.util.HashMap; import java.util.Map; -/** - * Singleton codec registry for serializing annotated {@link CodecField} fields - * to/from {@link FriendlyByteBuf}. - *

- * Replaces the original Fabric implementation that used {@code StreamCodec} - * (which does not exist in Forge 1.20.1). Instead uses {@link BufferCodec}. - */ public final class CodecHelper { public static final CodecHelper INSTANCE = new CodecHelper(); @@ -47,18 +38,10 @@ public Map> getSupposedTypes() { return supposedTypes; } - /** - * Registers a codec for the given type. - */ public void register(Class type, BufferCodec codec) { supposedTypes.put(type.getName(), codec); } - /** - * Copies all {@link CodecField}-annotated, non-final fields from {@code other} - * to {@code current} via reflection. Both objects must be the same class. - * Fields are processed in stable {@link CodecField#index()} order. - */ public void updateFields(Object current, Object other) { if (current == null || other == null) return; if (!current.getClass().equals(other.getClass())) return; @@ -73,12 +56,6 @@ public void updateFields(Object current, Object other) { } } - /** - * Encodes all {@link CodecField}-annotated fields of {@code obj} into {@code buf}, - * in stable {@link CodecField#index()} order. - * - * @throws IllegalStateException if a field's type has no registered codec - */ @SuppressWarnings("unchecked") public void encodeAnnotatedFields(FriendlyByteBuf buf, Object obj) { for (Field field : getCodecFields(obj.getClass())) { @@ -95,12 +72,6 @@ public void encodeAnnotatedFields(FriendlyByteBuf buf, Object obj) { } } - /** - * Decodes all {@link CodecField}-annotated fields of {@code obj} from {@code buf}, - * in stable {@link CodecField#index()} order. - * - * @throws IllegalStateException if a field's type has no registered codec - */ @SuppressWarnings("unchecked") public void decodeAnnotatedFields(FriendlyByteBuf buf, Object obj) { for (Field field : getCodecFields(obj.getClass())) { @@ -117,10 +88,7 @@ public void decodeAnnotatedFields(FriendlyByteBuf buf, Object obj) { } } - /** - * Returns {@link CodecField}-annotated non-final fields sorted by - * {@link CodecField#index()} then by field name for deterministic ordering. - */ + // TODO: cache this per class, reflection every call is slow private static List getCodecFields(Class clazz) { List result = new ArrayList<>(); for (Field f : clazz.getDeclaredFields()) { @@ -133,8 +101,6 @@ private static List getCodecFields(Class clazz) { return result; } - // ────────────────── Static registration of built-in types ────────────────── - static { registerPrimitives(); registerArrays(); @@ -143,11 +109,6 @@ private static List getCodecFields(Class clazz) { registerMinecraftTypes(); registerProjectTypes(); registerRangeTypes(); - // NOTE: ControllableParticleData, SimpleRandomParticleData, ItemStack, - // and all InterpolatorXxx types should register themselves via - // CodecHelper.INSTANCE.register(MyClass.class, myCodec) - // in their own static initializers or during mod init, since their - // codecs are not yet available as static fields in Forge 1.20.1. } private static void registerPrimitives() { @@ -194,7 +155,7 @@ private static void registerPrimitives() { private static void registerArrays() { INSTANCE.register(byte[].class, BufferCodec.of( - FriendlyByteBuf::writeByteArray, FriendlyByteBuf::readByteArray)); + (FriendlyByteBuf buf, byte[] v) -> buf.writeByteArray(v), buf -> buf.readByteArray())); INSTANCE.register(long[].class, BufferCodec.of( FriendlyByteBuf::writeLongArray, FriendlyByteBuf::readLongArray)); INSTANCE.register(int[].class, BufferCodec.of( @@ -212,12 +173,12 @@ private static void registerArrays() { private static void registerJavaTypes() { INSTANCE.register(String.class, BufferCodec.of( - FriendlyByteBuf::writeUtf, - FriendlyByteBuf::readUtf + (FriendlyByteBuf buf, String v) -> buf.writeUtf(v), + (FriendlyByteBuf buf) -> buf.readUtf() )); INSTANCE.register(UUID.class, BufferCodec.of( - FriendlyByteBuf::writeUUID, - FriendlyByteBuf::readUUID + (FriendlyByteBuf buf, UUID v) -> buf.writeUUID(v), + buf -> buf.readUUID() )); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/composition/handler/ParticleCompositionHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/composition/handler/ParticleCompositionHelper.java similarity index 69% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/composition/handler/ParticleCompositionHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/composition/handler/ParticleCompositionHelper.java index af0a266..098ddf6 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/composition/handler/ParticleCompositionHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/composition/handler/ParticleCompositionHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.annotations.composition.handler; import com.reiasu.reiparticlesapi.annotations.CodecField; @@ -18,16 +16,6 @@ import java.util.Comparator; import java.util.List; -/** - * Singleton helper that auto-generates {@link BufferCodec} instances for - * {@link ParticleComposition} subclasses by scanning {@link CodecField} - * annotated fields via reflection. - *

- * Fields are sorted by name for deterministic encode/decode order. - * The codec also handles the base composition fields via - * {@link ParticleComposition#encodeBase}/{@link ParticleComposition#decodeBase} - * (and the sequenced variant for {@link SequencedParticleComposition} subclasses). - */ public final class ParticleCompositionHelper { public static final ParticleCompositionHelper INSTANCE = new ParticleCompositionHelper(); @@ -35,17 +23,7 @@ public final class ParticleCompositionHelper { private ParticleCompositionHelper() { } - /** - * Generates a {@link BufferCodec} for the concrete composition type. - *

- * The composition class must have a constructor {@code (Vec3, Level)} for - * reflective instantiation during decode. - * - * @param randomInstance any instance of the target composition class - * (used only to determine the concrete type) - * @return a codec that encodes/decodes the full composition state - */ - public BufferCodec generateCodec(ParticleComposition randomInstance) { + public BufferCodec generateCodec(ParticleComposition randomInstance) { Class type = randomInstance.getClass(); // Resolve constructor (Vec3, Level) for reflective instantiation @@ -64,7 +42,7 @@ public BufferCodec generateCodec(ParticleComposition random ); } - // ─── Encode ────────────────────────────────────────────────────────── + // --”€--”€--”€ Encode --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private static void encodeComposition(Class type, FriendlyByteBuf buf, ParticleComposition composition) { @@ -89,7 +67,7 @@ private static void encodeComposition(Class type, FriendlyByteBuf buf, } } - // ─── Decode ────────────────────────────────────────────────────────── + // --”€--”€--”€ Decode --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private static ParticleComposition decodeComposition(Constructor constructor, Class type, @@ -126,12 +104,9 @@ private static ParticleComposition decodeComposition(Constructor constructor, return instance; } - // ─── Utilities ─────────────────────────────────────────────────────── + // --”€--”€--”€ Utilities --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Collects all non-final fields annotated with {@link CodecField}, sorted by name. - */ - private static List getCodecFields(Class type) { + private static List getCodecFields(Class type) { Field[] allFields = type.getDeclaredFields(); List result = new ArrayList<>(); for (Field f : allFields) { @@ -143,16 +118,13 @@ private static List getCodecFields(Class type) { return result; } - /** - * Looks up the registered codec for the given type, throwing if not found. - */ - @SuppressWarnings("unchecked") + @SuppressWarnings("unchecked") private static BufferCodec getCodecOrThrow(Class fieldType) { BufferCodec codec = CodecHelper.INSTANCE.getSupposedTypes().get(fieldType.getName()); if (codec == null) { throw new IllegalArgumentException( "Unsupported type: " + fieldType.getName() + - " — register it via CodecHelper.INSTANCE.register()"); + " --” register it via CodecHelper.INSTANCE.register()"); } return (BufferCodec) codec; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/display/handle/DisplayEntityHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/display/handle/DisplayEntityHelper.java similarity index 71% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/display/handle/DisplayEntityHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/display/handle/DisplayEntityHelper.java index edec563..a99ec28 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/display/handle/DisplayEntityHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/display/handle/DisplayEntityHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.annotations.display.handle; import com.reiasu.reiparticlesapi.annotations.CodecField; @@ -16,14 +14,6 @@ import java.util.Comparator; import java.util.List; -/** - * Singleton helper that auto-generates {@link BufferCodec} instances for - * {@link DisplayEntity} subclasses by scanning {@link CodecField} - * annotated fields via reflection. - *

- * Structurally identical to {@link com.reiasu.reiparticlesapi.annotations.composition.handler.ParticleCompositionHelper}, - * but targets DisplayEntity instead of ParticleComposition. - */ public final class DisplayEntityHelper { public static final DisplayEntityHelper INSTANCE = new DisplayEntityHelper(); @@ -31,18 +21,7 @@ public final class DisplayEntityHelper { private DisplayEntityHelper() { } - /** - * Generates a {@link BufferCodec} for the concrete display entity type. - *

- * The display entity class must have a constructor {@code (Vec3, Level)} - * for reflective instantiation during decode. In practice the original - * Fabric code uses {@code (Vec3, World)} which maps to {@code (Vec3, Level)} - * in Forge MCP mappings. - * - * @param randomInstance any instance of the target display entity class - * @return a codec that encodes/decodes the full display entity state - */ - public BufferCodec generateCodec(DisplayEntity randomInstance) { + public BufferCodec generateCodec(DisplayEntity randomInstance) { Class type = randomInstance.getClass(); Constructor constructor; @@ -66,7 +45,7 @@ public BufferCodec generateCodec(DisplayEntity randomInstance) { ); } - // ─── Encode ────────────────────────────────────────────────────────── + // --”€--”€--”€ Encode --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private static void encodeEntity(Class type, FriendlyByteBuf buf, DisplayEntity entity) { @@ -85,7 +64,7 @@ private static void encodeEntity(Class type, FriendlyByteBuf buf, } } - // ─── Decode ────────────────────────────────────────────────────────── + // --”€--”€--”€ Decode --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private static DisplayEntity decodeEntity(Constructor constructor, Class type, @@ -119,7 +98,7 @@ private static DisplayEntity decodeEntity(Constructor constructor, return instance; } - // ─── Utilities ─────────────────────────────────────────────────────── + // --”€--”€--”€ Utilities --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private static List getCodecFields(Class type) { Field[] allFields = type.getDeclaredFields(); @@ -139,7 +118,7 @@ private static BufferCodec getCodecOrThrow(Class fieldType) { if (codec == null) { throw new IllegalArgumentException( "Unsupported type: " + fieldType.getName() + - " — register it via CodecHelper.INSTANCE.register()"); + " --” register it via CodecHelper.INSTANCE.register()"); } return (BufferCodec) codec; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/emitter/handle/ParticleEmittersHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/emitter/handle/ParticleEmittersHelper.java similarity index 76% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/emitter/handle/ParticleEmittersHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/emitter/handle/ParticleEmittersHelper.java index e4d23e7..ce64f4d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/emitter/handle/ParticleEmittersHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/emitter/handle/ParticleEmittersHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.annotations.emitter.handle; import com.reiasu.reiparticlesapi.annotations.CodecField; @@ -17,37 +15,18 @@ import java.util.Comparator; import java.util.List; -/** - * Helper for {@link ClassParticleEmitters} that provides: - *
    - *
  • Reflection-based field copy via {@link #updateEmitter}
  • - *
  • Auto-generated codec (encode/decode) based on {@link CodecField} annotations
  • - *
- */ public final class ParticleEmittersHelper { public static final ParticleEmittersHelper INSTANCE = new ParticleEmittersHelper(); private ParticleEmittersHelper() {} - /** - * Copies all {@link CodecField}-annotated fields from {@code other} to {@code current}, - * provided they share the same emitter ID. - */ - public void updateEmitter(ClassParticleEmitters current, ClassParticleEmitters other) { + public void updateEmitter(ClassParticleEmitters current, ClassParticleEmitters other) { if (current == null || other == null) return; if (!current.getEmittersID().equals(other.getEmittersID())) return; CodecHelper.INSTANCE.updateFields(current, other); } - /** - * Generates a {@link BufferCodec} for the given {@link ClassParticleEmitters} subclass - * by reflecting over its {@link CodecField}-annotated fields. - *

- * The encoder writes the base emitter data followed by each annotated field - * (sorted by field name). The decoder constructs a new instance via the - * {@code (Vec3, Level)} constructor, reads base data, then reads each field. - */ - public BufferCodec generateCodec(ClassParticleEmitters randomInstance) { + public BufferCodec generateCodec(ClassParticleEmitters randomInstance) { Class type = randomInstance.getClass(); Constructor constructor; @@ -114,11 +93,7 @@ private ParticleEmitters decodeEmitter(Constructor constructor, Class type return instance; } - /** - * Returns all {@link CodecField}-annotated, non-final fields of the given class, - * sorted by field name for deterministic serialization order. - */ - private List getCodecFields(Class type) { + private List getCodecFields(Class type) { Field[] allFields = type.getDeclaredFields(); List result = new ArrayList<>(); for (Field f : allFields) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventHandler.java similarity index 86% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventHandler.java index 7874725..8b41b93 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.annotations.events; import com.reiasu.reiparticlesapi.event.api.EventPriority; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventListener.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventListener.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventListener.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventListener.java index f94c702..3c115cd 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventListener.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/annotations/events/EventListener.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.annotations.events; import java.lang.annotation.ElementType; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/AbstractBarrage.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/AbstractBarrage.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/AbstractBarrage.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/AbstractBarrage.java index 385f239..cc9dee9 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/AbstractBarrage.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/AbstractBarrage.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.barrages; import com.reiasu.reiparticlesapi.network.particle.ServerController; @@ -16,20 +14,6 @@ import java.util.function.Predicate; import java.util.stream.Collectors; - -/** - * Base implementation of {@link Barrage} providing standard projectile - * movement, collision detection against blocks/entities/barrages, and - * lifetime/pass-through management. - *

- * Subclasses must implement: - *

    - *
  • {@link #filterHitEntity(LivingEntity)} —which entities this barrage can hit
  • - *
  • {@link #onHit(BarrageHitResult)} —what happens on impact
  • - *
- *

- * Forge port: barrage-barrage collision is now fully implemented via {@link BarrageManager}. - */ public abstract class AbstractBarrage implements Barrage { private Vec3 loc; @@ -60,9 +44,6 @@ protected AbstractBarrage(Vec3 loc, ServerLevel world, HitBox hitBox, this.isValid = true; this.uuid = UUID.randomUUID(); } - - // ---- Barrage interface implementation ---- - @Override public Vec3 getLoc() { return loc; } @@ -108,33 +89,16 @@ protected AbstractBarrage(Vec3 loc, ServerLevel world, HitBox hitBox, @Override public UUID getUuid() { return uuid; } + public abstract boolean filterHitEntity(LivingEntity entity); - // ---- Abstract/overridable ---- - - /** - * Return true if this barrage can hit the given entity. - */ - public abstract boolean filterHitEntity(LivingEntity entity); - - /** - * Return true if this barrage can collide with another barrage. - * Default: collides with barrages from a different shooter. - */ - public boolean filterHitBarrage(Barrage barrage) { + public boolean filterHitBarrage(Barrage barrage) { return !Objects.equals(barrage.getShooter(), this.getShooter()) && barrage != this; } - /** - * Returns the position used for the bound controller's teleport. - * Override to offset from {@link #getLoc()} if needed. - */ - public Vec3 getControllerLocation() { + public Vec3 getControllerLocation() { return getLoc(); } - - // ---- Tick ---- - @Override public void tick() { if (!getLaunch() || !getValid()) { @@ -289,11 +253,7 @@ private void hitInternal(BarrageHitResult result) { remove(); } - - /** - * Removes this barrage: invalidates and removes the bound controller. - */ - public void remove() { + public void remove() { // Note: ServerController.remove() not in current interface; call cancel() bindControl.cancel(); isValid = false; @@ -304,19 +264,13 @@ public boolean noclip() { return spawnTick < options.getNoneHitBoxTick(); } - /** - * Collects all living entities overlapping this barrage's hit box. - */ - public Set hitBoxEntities() { + public Set hitBoxEntities() { AABB aabb = hitBox.ofBox(loc); List found = world.getEntitiesOfClass(LivingEntity.class, aabb, e -> true); return new HashSet<>(found); } - /** - * Collects entities overlapping the hit box that pass the given filter. - */ - public Set hitBoxEntities(Predicate filter) { + public Set hitBoxEntities(Predicate filter) { AABB aabb = hitBox.ofBox(loc); List found = world.getEntitiesOfClass(LivingEntity.class, aabb, filter); return new HashSet<>(found); diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/Barrage.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/Barrage.java new file mode 100644 index 0000000..ede7010 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/Barrage.java @@ -0,0 +1,51 @@ +package com.reiasu.reiparticlesapi.barrages; + +import com.reiasu.reiparticlesapi.network.particle.ServerController; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.Vec3; +import net.minecraft.server.level.ServerLevel; + +import javax.annotation.Nullable; +import java.util.UUID; + +public interface Barrage { + + Vec3 getLoc(); + + void setLoc(Vec3 loc); + + ServerLevel getWorld(); + + HitBox getHitBox(); + + void setHitBox(HitBox hitBox); + + @Nullable + LivingEntity getShooter(); + + void setShooter(@Nullable LivingEntity shooter); + + Vec3 getDirection(); + + void setDirection(Vec3 direction); + + boolean getLaunch(); + + void setLaunch(boolean launch); + + boolean getValid(); + + BarrageOption getOptions(); + + UUID getUuid(); + + ServerController getBindControl(); + + void hit(BarrageHitResult result); + + void onHit(BarrageHitResult result); + + boolean noclip(); + + void tick(); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageHitResult.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageHitResult.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageHitResult.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageHitResult.java index a262ed8..ea9cb65 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageHitResult.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageHitResult.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.barrages; import net.minecraft.core.BlockPos; @@ -9,10 +7,6 @@ import javax.annotation.Nullable; import java.util.ArrayList; -/** - * Holds the result of a barrage collision check, collecting all hit blocks, - * entities, and other barrages in a single tick. - */ public final class BarrageHitResult { @Nullable diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageManager.java similarity index 88% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageManager.java index 8acc6d4..91e77a1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.barrages; import net.minecraft.server.level.ServerLevel; @@ -10,10 +8,6 @@ import java.util.List; import java.util.concurrent.ConcurrentLinkedDeque; -/** - * Manages all active {@link Barrage} instances on the server, - * handling spawning, ticking, and collision queries. - */ public final class BarrageManager { public static final BarrageManager INSTANCE = new BarrageManager(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageOption.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageOption.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageOption.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageOption.java index 127e4e4..3a54237 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageOption.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/BarrageOption.java @@ -1,11 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.barrages; -/** - * Configuration options for a barrage (projectile) entity. - * Controls collision behavior, speed, acceleration, and lifetime. - */ public final class BarrageOption { /** Gravity constant used by barrages. */ @@ -24,9 +18,6 @@ public final class BarrageOption { private double acceleration = 0.0; private boolean accelerationMaxSpeedEnabled = false; private double accelerationMaxSpeed = 1.0; - - // ---- Getters / Setters ---- - public boolean isAcrossBlock() { return acrossBlock; } public void setAcrossBlock(boolean v) { this.acrossBlock = v; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/HitBox.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/HitBox.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/HitBox.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/HitBox.java index 3199d72..61ea2d9 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/barrages/HitBox.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/barrages/HitBox.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.barrages; import com.reiasu.reiparticlesapi.utils.Math3DUtil; @@ -10,10 +8,6 @@ import java.util.Arrays; import java.util.List; -/** - * Axis-aligned hit box defined by two corner points. - * Corners are automatically sorted so (x1,y1,z1) ≤ (x2,y2,z2). - */ public final class HitBox { private double x1, y1, z1; @@ -29,15 +23,9 @@ public HitBox(double x1, double y1, double z1, double x2, double y2, double z2) replacePoint(); } - /** - * Creates a centered HitBox with dimensions {@code dx * dy * dz}. - */ - public static HitBox of(double dx, double dy, double dz) { + public static HitBox of(double dx, double dy, double dz) { return new HitBox(-dx / 2.0, -dy / 2.0, -dz / 2.0, dx / 2.0, dy / 2.0, dz / 2.0); } - - // ---- Getters / Setters ---- - public double getX1() { return x1; } public void setX1(double v) { this.x1 = v; } public double getY1() { return y1; } @@ -51,21 +39,14 @@ public static HitBox of(double dx, double dy, double dz) { public double getZ2() { return z2; } public void setZ2(double v) { this.z2 = v; } - /** - * Returns a Minecraft {@link AABB} offset by the given center position. - */ - public AABB ofBox(Vec3 center) { + public AABB ofBox(Vec3 center) { return new AABB( x1 + center.x, y1 + center.y, z1 + center.z, x2 + center.x, y2 + center.y, z2 + center.z ); } - /** - * Rotates the two corner points from {@code axis} direction to {@code to} direction, - * then re-normalizes so corners stay sorted. - */ - public void rotateTo(RelativeLocation axis, RelativeLocation to) { + public void rotateTo(RelativeLocation axis, RelativeLocation to) { RelativeLocation p1 = new RelativeLocation(x1, y1, z1); RelativeLocation p2 = new RelativeLocation(x2, y2, z2); List points = Arrays.asList(p1, p2); @@ -75,15 +56,9 @@ public void rotateTo(RelativeLocation axis, RelativeLocation to) { replacePoint(); } - /** - * Returns a copy of this HitBox with the same dimensions. - */ - public HitBox copy() { + public HitBox copy() { return new HitBox(x1, y1, z1, x2, y2, z2); } - - // ---- Internal ---- - private void replacePoint() { double tx = x1; x1 = Math.min(x1, x2); x2 = Math.max(tx, x2); double ty = y1; y1 = Math.min(y1, y2); y2 = Math.max(ty, y2); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/client/CameraShakeClientState.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/client/CameraShakeClientState.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/client/CameraShakeClientState.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/client/CameraShakeClientState.java index 74bc7ba..c1c9e19 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/client/CameraShakeClientState.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/client/CameraShakeClientState.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.client; import com.reiasu.reiparticlesapi.ReiParticlesAPIForge; @@ -8,12 +6,12 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.util.RandomSource; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; -@Mod.EventBusSubscriber(modid = ReiParticlesAPIForge.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) +@EventBusSubscriber(modid = ReiParticlesAPIForge.MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) public final class CameraShakeClientState { private static final RandomSource RANDOM = RandomSource.create(); @@ -33,8 +31,8 @@ public static void start(CameraShakeS2CPacket packet) { } @SubscribeEvent - public static void onClientTick(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.END || remainingTicks <= 0) { + public static void onClientTick(ClientTickEvent.Post event) { + if (remainingTicks <= 0) { return; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/client/ClientTickEventForwarder.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/client/ClientTickEventForwarder.java similarity index 71% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/client/ClientTickEventForwarder.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/client/ClientTickEventForwarder.java index c56cd04..b02f0c6 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/client/ClientTickEventForwarder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/client/ClientTickEventForwarder.java @@ -1,7 +1,6 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.client; +import net.neoforged.neoforge.common.NeoForge; import com.reiasu.reiparticlesapi.event.ReiEventBus; import com.reiasu.reiparticlesapi.event.events.client.ClientPostTickEvent; import com.reiasu.reiparticlesapi.event.events.client.ClientPreTickEvent; @@ -15,18 +14,18 @@ private ClientTickEventForwarder() { public static void onClientStartTick() { Minecraft minecraft = Minecraft.getInstance(); - ReiEventBus.call(new ClientPreTickEvent(minecraft)); + NeoForge.EVENT_BUS.post(new ClientPreTickEvent(minecraft)); if (minecraft.level != null) { - ReiEventBus.call(new ClientWorldPreTickEvent(minecraft.level)); + NeoForge.EVENT_BUS.post(new ClientWorldPreTickEvent(minecraft.level)); } } public static void onClientEndTick() { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.level != null) { - ReiEventBus.call(new ClientWorldPostTickEvent(minecraft.level)); + NeoForge.EVENT_BUS.post(new ClientWorldPostTickEvent(minecraft.level)); } - ReiEventBus.call(new ClientPostTickEvent(minecraft)); + NeoForge.EVENT_BUS.post(new ClientPostTickEvent(minecraft)); } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/commands/APICommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/commands/APICommand.java similarity index 61% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/commands/APICommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/commands/APICommand.java index a0734d5..9dbac50 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/commands/APICommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/commands/APICommand.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.commands; import com.reiasu.reiparticlesapi.display.DisplayEntityManager; @@ -7,26 +5,13 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.commands.CommandSourceStack; -/** - * Registers the {@code /cleanapi} command tree for ReiParticlesAPI. - *

- * Currently provides: - *

    - *
  • {@code /cleanapi display} – clears all client-side display entities
  • - *
- */ public final class APICommand { public static final APICommand INSTANCE = new APICommand(); private APICommand() { } - /** - * Register the {@code /cleanapi} command with the given dispatcher. - * - * @param dispatcher the server command dispatcher - */ - public void register(CommandDispatcher dispatcher) { + public void register(CommandDispatcher dispatcher) { dispatcher.register( LiteralArgumentBuilder.literal("cleanapi") .then(LiteralArgumentBuilder.literal("display") diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/config/APIConfig.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/config/APIConfig.java similarity index 70% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/config/APIConfig.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/config/APIConfig.java index c14b218..5ca9ed4 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/config/APIConfig.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/config/APIConfig.java @@ -1,36 +1,28 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.config; -import net.minecraftforge.common.ForgeConfigSpec; +import net.neoforged.neoforge.common.ModConfigSpec; import org.apache.commons.lang3.tuple.Pair; -/** - * API-level configuration for particle rendering behavior. - *

- * Backed by Forge's config system — values are persisted to - * {@code reiparticlesapi-common.toml} and hot-reloadable. - */ public final class APIConfig { - public static final ForgeConfigSpec SPEC; + public static final ModConfigSpec SPEC; public static final APIConfig INSTANCE; static { - Pair pair = - new ForgeConfigSpec.Builder().configure(APIConfig::new); + Pair pair = + new ModConfigSpec.Builder().configure(APIConfig::new); INSTANCE = pair.getLeft(); SPEC = pair.getRight(); } - private final ForgeConfigSpec.BooleanValue enabledParticleCountInject; - private final ForgeConfigSpec.BooleanValue enabledParticleAsync; - private final ForgeConfigSpec.IntValue particleCountLimit; - private final ForgeConfigSpec.IntValue calculateThreadCount; - private final ForgeConfigSpec.IntValue packetsPerTickLimit; - private final ForgeConfigSpec.IntValue maxEmitterVisibleRange; + private final ModConfigSpec.BooleanValue enabledParticleCountInject; + private final ModConfigSpec.BooleanValue enabledParticleAsync; + private final ModConfigSpec.IntValue particleCountLimit; + private final ModConfigSpec.IntValue calculateThreadCount; + private final ModConfigSpec.IntValue packetsPerTickLimit; + private final ModConfigSpec.IntValue maxEmitterVisibleRange; - private APIConfig(ForgeConfigSpec.Builder builder) { + private APIConfig(ModConfigSpec.Builder builder) { builder.push("particles"); enabledParticleCountInject = builder @@ -75,7 +67,7 @@ private APIConfig(ForgeConfigSpec.Builder builder) { public int getPacketsPerTickLimit() { return safeGet(packetsPerTickLimit, 512); } public int getMaxEmitterVisibleRange() { return safeGet(maxEmitterVisibleRange, 256); } - private static T safeGet(ForgeConfigSpec.ConfigValue value, T fallback) { + private static T safeGet(ModConfigSpec.ConfigValue value, T fallback) { try { return value.get(); } catch (IllegalStateException e) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DebugDisplayEntity.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DebugDisplayEntity.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DebugDisplayEntity.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DebugDisplayEntity.java index 04d31a7..66b384b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DebugDisplayEntity.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DebugDisplayEntity.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.display; import net.minecraft.core.particles.DustParticleOptions; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntity.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntity.java similarity index 57% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntity.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntity.java index 81ce450..be37aed 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntity.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntity.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.display; import com.reiasu.reiparticlesapi.network.particle.ServerController; @@ -9,17 +7,9 @@ import java.util.UUID; -/** - * Base class for display entities (non-particle visual elements managed - * by the ReiParticles system). - *

- * Carries position, rotation (yaw/pitch/roll), scale, and validity state. - * Provides static {@link #encodeBase}/{@link #decodeBase} for network - * serialization of the base fields. - */ public abstract class DisplayEntity implements ServerController { - // ─── Static encode/decode ──────────────────────────────────────────── + // --”€--”€--”€ Static encode/decode --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public static void encodeBase(DisplayEntity data, FriendlyByteBuf buf) { buf.writeDouble(data.pos.x()); @@ -43,7 +33,7 @@ public static void decodeBase(DisplayEntity instance, FriendlyByteBuf buf) { instance.controlUUID = buf.readUUID(); } - // ─── Fields ────────────────────────────────────────────────────────── + // --”€--”€--”€ Fields --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private UUID controlUUID = UUID.randomUUID(); private boolean valid = true; @@ -59,7 +49,7 @@ public void spawnInWorld(ServerLevel world, Vec3 pos) { DisplayEntityManager.INSTANCE.spawn(this); } - // ─── Accessors ─────────────────────────────────────────────────────── + // --”€--”€--”€ Accessors --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public UUID getControlUUID() { return controlUUID; @@ -117,7 +107,7 @@ public void setScale(float scale) { this.scale = scale; } - // ─── Level binding ─────────────────────────────────────────────────── + // --”€--”€--”€ Level binding --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public DisplayEntity bindLevel(ServerLevel level) { this.level = level; @@ -128,7 +118,7 @@ protected ServerLevel level() { return level; } - // ─── Lifecycle ─────────────────────────────────────────────────────── + // --”€--”€--”€ Lifecycle --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public void update(DisplayEntity other) { this.valid = other.valid; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntityManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntityManager.java similarity index 98% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntityManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntityManager.java index b2225dd..7f22580 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntityManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/DisplayEntityManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.display; import net.minecraft.network.FriendlyByteBuf; diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/ReiRenderTypesProvider.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/ReiRenderTypesProvider.java new file mode 100644 index 0000000..a04211a --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/display/ReiRenderTypesProvider.java @@ -0,0 +1,7 @@ +package com.reiasu.reiparticlesapi.display; + +import net.minecraft.client.renderer.RenderType; + +public interface ReiRenderTypesProvider { + RenderType glow(); +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/enums/DistType.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/enums/DistType.java new file mode 100644 index 0000000..a6dc459 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/enums/DistType.java @@ -0,0 +1,6 @@ +package com.reiasu.reiparticlesapi.enums; + +public enum DistType { + CLIENT, + SERVER +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/ForgeEventForwarder.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/ForgeEventForwarder.java similarity index 51% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/ForgeEventForwarder.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/ForgeEventForwarder.java index f3cff37..257dea7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/ForgeEventForwarder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/ForgeEventForwarder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event; import com.reiasu.reiparticlesapi.event.events.entity.EntityMoveEvent; @@ -17,15 +15,15 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.MinecraftForge; +import net.neoforged.neoforge.common.NeoForge; import net.minecraft.client.Minecraft; -import net.minecraftforge.client.event.ClientPlayerNetworkEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.level.BlockEvent; +import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; +import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; +import net.neoforged.neoforge.event.entity.living.LivingEvent; +import net.neoforged.neoforge.event.entity.player.PlayerDestroyItemEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; public final class ForgeEventForwarder { private static boolean initialized; @@ -39,34 +37,34 @@ public static void init() { } initialized = true; - MinecraftForge.EVENT_BUS.addListener((PlayerEvent.PlayerLoggedInEvent event) -> - ReiEventBus.call(new PlayerLoggedInEvent(event.getEntity()))); + NeoForge.EVENT_BUS.addListener((PlayerEvent.PlayerLoggedInEvent event) -> + NeoForge.EVENT_BUS.post(new PlayerLoggedInEvent(event.getEntity()))); - MinecraftForge.EVENT_BUS.addListener((PlayerEvent.PlayerLoggedOutEvent event) -> - ReiEventBus.call(new PlayerDisconnectEvent(event.getEntity()))); + NeoForge.EVENT_BUS.addListener((PlayerEvent.PlayerLoggedOutEvent event) -> + NeoForge.EVENT_BUS.post(new PlayerDisconnectEvent(event.getEntity()))); - MinecraftForge.EVENT_BUS.addListener((PlayerDestroyItemEvent event) -> - ReiEventBus.call(new PlayerItemDestroyEvent(event.getEntity(), event.getOriginal()))); + NeoForge.EVENT_BUS.addListener((PlayerDestroyItemEvent event) -> + NeoForge.EVENT_BUS.post(new PlayerItemDestroyEvent(event.getEntity(), event.getOriginal()))); - MinecraftForge.EVENT_BUS.addListener((PlayerEvent.PlayerRespawnEvent event) -> - ReiEventBus.call(new ServerPlayerRespawnEvent(event.getEntity(), event.getEntity().level()))); + NeoForge.EVENT_BUS.addListener((PlayerEvent.PlayerRespawnEvent event) -> + NeoForge.EVENT_BUS.post(new ServerPlayerRespawnEvent(event.getEntity(), event.getEntity().level()))); - MinecraftForge.EVENT_BUS.addListener((LivingDeathEvent event) -> { + NeoForge.EVENT_BUS.addListener((LivingDeathEvent event) -> { if (!(event.getEntity() instanceof Player player)) { return; } - ServerPlayerDeathEvent deathEvent = ReiEventBus.call(new ServerPlayerDeathEvent(player, player.level(), event.getSource())); - if (deathEvent.isCancelled() && event.isCancelable()) { + ServerPlayerDeathEvent deathEvent = NeoForge.EVENT_BUS.post(new ServerPlayerDeathEvent(player, player.level(), event.getSource())); + if (deathEvent.isCancelled()) { event.setCanceled(true); } }); - MinecraftForge.EVENT_BUS.addListener((BlockEvent.BreakEvent event) -> { + NeoForge.EVENT_BUS.addListener((BlockEvent.BreakEvent event) -> { Player player = event.getPlayer(); if (player == null) { return; } - PlayerBlockBreakEvent breakEvent = ReiEventBus.call( + PlayerBlockBreakEvent breakEvent = NeoForge.EVENT_BUS.post( new PlayerBlockBreakEvent(player, player.level(), event.getPos(), event.getState()) ); if (breakEvent.isCancelled()) { @@ -74,50 +72,46 @@ public static void init() { } }); - MinecraftForge.EVENT_BUS.addListener((TickEvent.PlayerTickEvent event) -> { - if (event.phase == TickEvent.Phase.START) { - EntityPreTickEvent preTickEvent = ReiEventBus.call(new EntityPreTickEvent(event.player)); - if (preTickEvent.isCancelled() && event.isCancelable()) { - event.setCanceled(true); - } - return; - } - ReiEventBus.call(new EntityPostTickEvent(event.player)); + NeoForge.EVENT_BUS.addListener((PlayerTickEvent.Pre event) -> { + NeoForge.EVENT_BUS.post(new EntityPreTickEvent(event.getEntity())); + }); + NeoForge.EVENT_BUS.addListener((PlayerTickEvent.Post event) -> { + NeoForge.EVENT_BUS.post(new EntityPostTickEvent(event.getEntity())); }); // Client/Server/World tick events are forwarded by ClientTickEventForwarder // and ReiParticlesAPIForge lifecycle hooks to avoid duplication. // Client world change (dimension switch / join) - MinecraftForge.EVENT_BUS.addListener((ClientPlayerNetworkEvent.LoggingIn event) -> { + NeoForge.EVENT_BUS.addListener((ClientPlayerNetworkEvent.LoggingIn event) -> { Minecraft mc = Minecraft.getInstance(); if (mc.level != null) { - ReiEventBus.call(new ClientWorldChangeEvent(mc.level)); + NeoForge.EVENT_BUS.post(new ClientWorldChangeEvent(mc.level)); } }); // Entity place block - MinecraftForge.EVENT_BUS.addListener((BlockEvent.EntityPlaceEvent event) -> { + NeoForge.EVENT_BUS.addListener((BlockEvent.EntityPlaceEvent event) -> { Entity entity = event.getEntity(); if (entity == null) return; - EntityPrePlaceBlockEvent placeEvent = ReiEventBus.call( + EntityPrePlaceBlockEvent placeEvent = NeoForge.EVENT_BUS.post( new EntityPrePlaceBlockEvent(entity, entity.level(), event.getPos(), null) ); - if (placeEvent.isCancelled() && event.isCancelable()) { + if (placeEvent.isCancelled()) { event.setCanceled(true); } }); // Entity movement approximation (via LivingTickEvent) - MinecraftForge.EVENT_BUS.addListener((LivingEvent.LivingTickEvent event) -> { + NeoForge.EVENT_BUS.addListener((net.neoforged.neoforge.event.tick.EntityTickEvent.Post event) -> { Entity entity = event.getEntity(); Vec3 pos = entity.position(); Vec3 delta = entity.getDeltaMovement(); if (delta.lengthSqr() < 1e-10) return; Vec3 target = pos.add(delta); - EntityPreMoveEvent preMoveEvent = ReiEventBus.call(new EntityPreMoveEvent(entity, delta)); + EntityPreMoveEvent preMoveEvent = NeoForge.EVENT_BUS.post(new EntityPreMoveEvent(entity, delta)); if (preMoveEvent.isCancelled()) return; - ReiEventBus.call(new EntityMoveEvent(entity, delta, target)); + NeoForge.EVENT_BUS.post(new EntityMoveEvent(entity, delta, target)); }); } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/ReiEventBus.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/ReiEventBus.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/ReiEventBus.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/ReiEventBus.java index fd97db8..c49ad73 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/ReiEventBus.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/ReiEventBus.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event; import com.reiasu.reiparticlesapi.annotations.events.EventHandler; @@ -12,9 +10,7 @@ import com.mojang.logging.LogUtils; import org.slf4j.Logger; -import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.util.EnumMap; import java.util.Map; import java.util.Objects; @@ -43,21 +39,13 @@ public void appendListenerTarget(String modId, String packageName) { ReiAPIScanner.registerPackage(packageName); } - /** - * Initializes all registered event listeners. Idempotent — only runs once. - *

- * If packages have been registered via {@link ReiAPIScanner#registerPackage(String)}, - * performs a ClassGraph scan to discover {@link EventListener @EventListener} classes. - * Otherwise, logs an info message suggesting explicit registration. - */ - public void initListeners() { + public void initListeners() { if (!initialized.compareAndSet(false, true)) { return; } ReiAPIScanner scanner = ReiAPIScanner.INSTANCE; if (scanner.getScannedPackageCount() == 0) { - LOGGER.info("initListeners(): no packages registered for scanning. " - + "Use registerAnnotatedClass() or registerListenerInstance() for explicit registration."); + return; } scanner.scan(); @@ -70,7 +58,7 @@ public void initListeners() { LOGGER.error("initListeners(): failed to register {}", clazz.getName(), t); } } - LOGGER.info("initListeners(): discovered and registered {} @EventListener classes", count); + LOGGER.info("registered {} listeners", count); } public void registerAnnotatedClass(Class listenerClass) { @@ -177,21 +165,6 @@ private void registerHandler( } private static Object createListenerInstance(Class listenerClass) { - try { - Field instanceField = listenerClass.getDeclaredField("INSTANCE"); - if (Modifier.isStatic(instanceField.getModifiers())) { - instanceField.setAccessible(true); - Object existing = instanceField.get(null); - if (existing != null) { - return existing; - } - } - } catch (NoSuchFieldException ignored) { - // not a Kotlin object or no singleton instance field - } catch (Throwable t) { - throw new IllegalStateException("Failed to resolve INSTANCE for " + listenerClass.getName(), t); - } - try { var ctor = listenerClass.getDeclaredConstructor(); ctor.setAccessible(true); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventCancelable.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventCancelable.java similarity index 68% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventCancelable.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventCancelable.java index dec516b..a3504af 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventCancelable.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventCancelable.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.api; public interface EventCancelable { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventExecutor.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventExecutor.java similarity index 88% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventExecutor.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventExecutor.java index a6a68e0..bf4efc1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventExecutor.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventExecutor.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.api; import java.util.Objects; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventInterruptible.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventInterruptible.java similarity index 69% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventInterruptible.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventInterruptible.java index b1edd0b..018d864 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventInterruptible.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventInterruptible.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.api; public interface EventInterruptible { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventPriority.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventPriority.java similarity index 65% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventPriority.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventPriority.java index 645ff59..394706e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/api/EventPriority.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/EventPriority.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.api; public enum EventPriority { diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/ReiEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/ReiEvent.java new file mode 100644 index 0000000..72eb08e --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/api/ReiEvent.java @@ -0,0 +1,7 @@ +package com.reiasu.reiparticlesapi.event.api; + +import net.neoforged.bus.api.Event; + +public abstract class ReiEvent extends Event { +} + diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientEvent.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientEvent.java index 28c5bf9..b6a4994 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.client; import com.reiasu.reiparticlesapi.event.api.ReiEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPostTickEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPostTickEvent.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPostTickEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPostTickEvent.java index 23d41c3..541eff9 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPostTickEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPostTickEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.client; import net.minecraft.client.Minecraft; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPreTickEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPreTickEvent.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPreTickEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPreTickEvent.java index 53ad6e4..e94c46f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPreTickEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/client/ClientPreTickEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.client; import net.minecraft.client.Minecraft; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityEvent.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityEvent.java index 5bb1a5e..b30a549 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity; import com.reiasu.reiparticlesapi.event.api.ReiEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityMoveEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityMoveEvent.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityMoveEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityMoveEvent.java index cd815a0..be3e6a7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityMoveEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityMoveEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity; import com.reiasu.reiparticlesapi.event.api.EventCancelable; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPostTickEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPostTickEvent.java similarity index 88% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPostTickEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPostTickEvent.java index 2ce7f42..55e4fa5 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPostTickEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPostTickEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity; import com.reiasu.reiparticlesapi.event.api.EventInterruptible; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreMoveEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreMoveEvent.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreMoveEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreMoveEvent.java index 4c0df89..cd870d5 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreMoveEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreMoveEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity; import com.reiasu.reiparticlesapi.event.api.EventCancelable; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPrePlaceBlockEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPrePlaceBlockEvent.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPrePlaceBlockEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPrePlaceBlockEvent.java index a573234..931a5c5 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPrePlaceBlockEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPrePlaceBlockEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity; import com.reiasu.reiparticlesapi.event.api.EventCancelable; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreTickEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreTickEvent.java similarity index 92% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreTickEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreTickEvent.java index d0f4e3c..6630004 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreTickEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/EntityPreTickEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity; import com.reiasu.reiparticlesapi.event.api.EventCancelable; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/LivingEntityEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/LivingEntityEvent.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/LivingEntityEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/LivingEntityEvent.java index a752dc0..760daa7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/LivingEntityEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/LivingEntityEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity; import net.minecraft.world.entity.LivingEntity; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerBlockBreakEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerBlockBreakEvent.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerBlockBreakEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerBlockBreakEvent.java index 24bada9..fe8a472 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerBlockBreakEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerBlockBreakEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity.player; import com.reiasu.reiparticlesapi.event.api.EventCancelable; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerDisconnectEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerDisconnectEvent.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerDisconnectEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerDisconnectEvent.java index d0962f8..7987cf2 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerDisconnectEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerDisconnectEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity.player; import net.minecraft.world.entity.player.Player; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerEvent.java similarity index 86% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerEvent.java index 7441af8..279c58f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity.player; import com.reiasu.reiparticlesapi.event.events.entity.EntityEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerItemDestroyEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerItemDestroyEvent.java similarity index 86% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerItemDestroyEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerItemDestroyEvent.java index 731ffb4..89946e9 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerItemDestroyEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerItemDestroyEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity.player; import net.minecraft.world.entity.player.Player; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerLoggedInEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerLoggedInEvent.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerLoggedInEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerLoggedInEvent.java index 2b5dd64..8bc76b1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerLoggedInEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/PlayerLoggedInEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity.player; import net.minecraft.world.entity.player.Player; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerDeathEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerDeathEvent.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerDeathEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerDeathEvent.java index c5b4d04..4737ddc 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerDeathEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerDeathEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity.player; import com.reiasu.reiparticlesapi.event.api.EventCancelable; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerRespawnEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerRespawnEvent.java similarity index 86% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerRespawnEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerRespawnEvent.java index b04b2f0..51155fa 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerRespawnEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/player/ServerPlayerRespawnEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity.player; import net.minecraft.world.entity.player.Player; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/projectile/ProjectileEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/projectile/ProjectileEvent.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/projectile/ProjectileEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/projectile/ProjectileEvent.java index e216b7c..098a7c7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/projectile/ProjectileEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/entity/projectile/ProjectileEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.entity.projectile; import com.reiasu.reiparticlesapi.event.events.entity.EntityEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionEvent.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionEvent.java index 97f2968..adecdaa 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.key; import com.reiasu.reiparticlesapi.event.events.entity.player.PlayerEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionType.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionType.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionType.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionType.java index 1bc7c13..2972e93 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionType.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/key/KeyActionType.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.key; public enum KeyActionType { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterRemoveEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterRemoveEvent.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterRemoveEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterRemoveEvent.java index 9d94b10..ca694de 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterRemoveEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterRemoveEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.particle.emitter; import com.reiasu.reiparticlesapi.event.api.ReiEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterSpawnEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterSpawnEvent.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterSpawnEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterSpawnEvent.java index 236e963..f034e93 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterSpawnEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/particle/emitter/EmitterSpawnEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.particle.emitter; import com.reiasu.reiparticlesapi.event.api.ReiEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerEvent.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerEvent.java index aa9c858..35b81e9 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.server; import com.reiasu.reiparticlesapi.event.api.ReiEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPostTickEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPostTickEvent.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPostTickEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPostTickEvent.java index ccb3f59..981ecc0 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPostTickEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPostTickEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.server; import net.minecraft.server.MinecraftServer; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPreTickEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPreTickEvent.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPreTickEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPreTickEvent.java index cabdb6d..1dfeedb 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPreTickEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/server/ServerPreTickEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.server; import net.minecraft.server.MinecraftServer; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/WorldEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/WorldEvent.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/WorldEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/WorldEvent.java index 989c115..a849d91 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/WorldEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/WorldEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.world; import com.reiasu.reiparticlesapi.event.api.ReiEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldChangeEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldChangeEvent.java similarity index 81% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldChangeEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldChangeEvent.java index 944355d..556dd41 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldChangeEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldChangeEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.world.client; import com.reiasu.reiparticlesapi.event.events.world.WorldEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPostTickEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPostTickEvent.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPostTickEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPostTickEvent.java index 0881fcf..bec8a2d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPostTickEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPostTickEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.world.client; import com.reiasu.reiparticlesapi.event.events.world.WorldEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPreTickEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPreTickEvent.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPreTickEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPreTickEvent.java index 5cb0ac9..2198844 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPreTickEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldPreTickEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.world.client; import com.reiasu.reiparticlesapi.event.events.world.WorldEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldRenderEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldRenderEvent.java similarity index 97% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldRenderEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldRenderEvent.java index 2cd9b8d..796640d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldRenderEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/event/events/world/client/ClientWorldRenderEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.event.events.world.client; import com.reiasu.reiparticlesapi.event.events.world.WorldEvent; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeInputException.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeInputException.java similarity index 65% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeInputException.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeInputException.java index 754e3fb..e6bce7e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeInputException.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeInputException.java @@ -1,10 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.exceptions; -/** - * Thrown when a render pipeline FBO color channel already has an input bound. - */ public final class RenderPipeInputException extends Exception { public RenderPipeInputException(int inputFBO, int inputChannel) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeLinkerNotSetException.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeLinkerNotSetException.java similarity index 79% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeLinkerNotSetException.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeLinkerNotSetException.java index 34d413e..e448387 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeLinkerNotSetException.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeLinkerNotSetException.java @@ -1,12 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.exceptions; import net.minecraft.resources.ResourceLocation; -/** - * Thrown when a render pipeline's pipe linker function has not been set. - */ public final class RenderPipeLinkerNotSetException extends Exception { private ResourceLocation renderID; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeNotFoundException.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeNotFoundException.java similarity index 81% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeNotFoundException.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeNotFoundException.java index d2914f1..a335fe1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeNotFoundException.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeNotFoundException.java @@ -1,12 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.exceptions; import net.minecraft.resources.ResourceLocation; -/** - * Thrown when a render entity's bound pipe manager cannot be found. - */ public final class RenderPipeNotFoundException extends Exception { private ResourceLocation renderID; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeOutputNotSetException.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeOutputNotSetException.java similarity index 67% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeOutputNotSetException.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeOutputNotSetException.java index 5daa2a7..fd3aa2e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeOutputNotSetException.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/exceptions/RenderPipeOutputNotSetException.java @@ -1,12 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.exceptions; import net.minecraft.resources.ResourceLocation; -/** - * Thrown when a render pipeline output has not been configured. - */ public final class RenderPipeOutputNotSetException extends Exception { public RenderPipeOutputNotSetException(ResourceLocation pipeID) { diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/BlockPosExtendsKt.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/BlockPosExtendsKt.java new file mode 100644 index 0000000..92e6b3f --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/BlockPosExtendsKt.java @@ -0,0 +1,14 @@ +package com.reiasu.reiparticlesapi.extend; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; + +public final class BlockPosExtendsKt { + + private BlockPosExtendsKt() { + } + + public static BlockPos ofFloored(Vec3 vec) { + return BlockPos.containing(vec.x, vec.y, vec.z); + } +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/ItemStackExtendKt.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/ItemStackExtendKt.java new file mode 100644 index 0000000..3d67fdc --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/ItemStackExtendKt.java @@ -0,0 +1,14 @@ +package com.reiasu.reiparticlesapi.extend; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +public final class ItemStackExtendKt { + + private ItemStackExtendKt() { + } + + public static boolean isOf(ItemStack stack, Item item) { + return stack.is(item); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/MathExtendsKt.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/MathExtendsKt.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/MathExtendsKt.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/MathExtendsKt.java index 5f7e778..a9988a7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/MathExtendsKt.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/MathExtendsKt.java @@ -1,11 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.extend; -/** - * Math extension utilities providing degree-to-radian conversion and a float PI constant. - * Originally Kotlin extension functions, ported as static utility methods. - */ public final class MathExtendsKt { /** Float-precision PI constant. */ diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3ExtendsKt.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3ExtendsKt.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3ExtendsKt.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3ExtendsKt.java index 558c06f..a7acc2b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3ExtendsKt.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3ExtendsKt.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.extend; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3iExtendsKt.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3iExtendsKt.java new file mode 100644 index 0000000..713755b --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/extend/Vec3iExtendsKt.java @@ -0,0 +1,14 @@ +package com.reiasu.reiparticlesapi.extend; + +import net.minecraft.core.Vec3i; +import net.minecraft.world.phys.Vec3; + +public final class Vec3iExtendsKt { + + private Vec3iExtendsKt() { + } + + public static Vec3 asVec3(Vec3i v) { + return new Vec3(v.getX(), v.getY(), v.getZ()); + } +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/ReiParticlesNetwork.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/ReiParticlesNetwork.java new file mode 100644 index 0000000..090ac1e --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/ReiParticlesNetwork.java @@ -0,0 +1,52 @@ +package com.reiasu.reiparticlesapi.network; + +import com.reiasu.reiparticlesapi.network.packet.CameraShakeS2CPacket; +import com.reiasu.reiparticlesapi.network.packet.PacketCameraShakeS2C; +import com.reiasu.reiparticlesapi.network.packet.PacketDisplayEntityS2C; +import com.reiasu.reiparticlesapi.network.packet.PacketKeyActionC2S; +import com.reiasu.reiparticlesapi.network.packet.PacketParticleCompositionS2C; +import com.reiasu.reiparticlesapi.network.packet.PacketParticleEmittersS2C; +import com.reiasu.reiparticlesapi.network.packet.PacketParticleGroupS2C; +import com.reiasu.reiparticlesapi.network.packet.PacketParticleS2C; +import com.reiasu.reiparticlesapi.network.packet.PacketParticleStyleS2C; +import com.reiasu.reiparticlesapi.network.packet.PacketRenderEntityS2C; +import com.mojang.logging.LogUtils; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; +import org.slf4j.Logger; + +public final class ReiParticlesNetwork { + private static final Logger LOGGER = LogUtils.getLogger(); + + private ReiParticlesNetwork() { + } + + public static void registerPayloads(RegisterPayloadHandlersEvent event) { + PayloadRegistrar registrar = event.registrar("1").optional(); + registrar.playToClient(CameraShakeS2CPacket.TYPE, CameraShakeS2CPacket.STREAM_CODEC, CameraShakeS2CPacket::handle); + registrar.playToClient(PacketCameraShakeS2C.TYPE, PacketCameraShakeS2C.STREAM_CODEC, PacketCameraShakeS2C::handle); + registrar.playToClient(PacketParticleS2C.TYPE, PacketParticleS2C.STREAM_CODEC, PacketParticleS2C::handle); + registrar.playToClient(PacketParticleEmittersS2C.TYPE, PacketParticleEmittersS2C.STREAM_CODEC, PacketParticleEmittersS2C::handle); + registrar.playToClient(PacketParticleCompositionS2C.TYPE, PacketParticleCompositionS2C.STREAM_CODEC, PacketParticleCompositionS2C::handle); + registrar.playToClient(PacketDisplayEntityS2C.TYPE, PacketDisplayEntityS2C.STREAM_CODEC, PacketDisplayEntityS2C::handle); + registrar.playToClient(PacketParticleStyleS2C.TYPE, PacketParticleStyleS2C.STREAM_CODEC, PacketParticleStyleS2C::handle); + registrar.playToClient(PacketParticleGroupS2C.TYPE, PacketParticleGroupS2C.STREAM_CODEC, PacketParticleGroupS2C::handle); + registrar.playToClient(PacketRenderEntityS2C.TYPE, PacketRenderEntityS2C.STREAM_CODEC, PacketRenderEntityS2C::handle); + registrar.playToServer(PacketKeyActionC2S.TYPE, PacketKeyActionC2S.STREAM_CODEC, PacketKeyActionC2S::handle); + } + + public static void sendTo(ServerPlayer player, CustomPacketPayload packet) { + try { + PacketDistributor.sendToPlayer(player, packet); + } catch (IllegalArgumentException e) { + LOGGER.debug("Player {} lacks channel --” packet {} dropped", + player.getName().getString(), packet.type().id()); + } catch (RuntimeException e) { + LOGGER.debug("Failed to send packet {} to {}: {}", packet.type().id(), + player.getName().getString(), e.getMessage()); + } + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/EmittersPathMotion.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/EmittersPathMotion.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/EmittersPathMotion.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/EmittersPathMotion.java index 6362474..8e88cf6 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/EmittersPathMotion.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/EmittersPathMotion.java @@ -1,15 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.animation; import com.reiasu.reiparticlesapi.network.animation.api.AbstractPathMotion; import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmitters; import net.minecraft.world.phys.Vec3; -/** - * Path motion targeting a {@link ParticleEmitters}. Teleports the emitter - * along the computed path. Subclasses implement {@link #pathFunction()}. - */ public abstract class EmittersPathMotion extends AbstractPathMotion { private final ParticleEmitters targetEmitters; diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/LambdaParticlePathMotion.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/LambdaParticlePathMotion.java new file mode 100644 index 0000000..e89094e --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/LambdaParticlePathMotion.java @@ -0,0 +1,24 @@ +package com.reiasu.reiparticlesapi.network.animation; + +import com.reiasu.reiparticlesapi.particles.ControllableParticle; +import net.minecraft.world.phys.Vec3; + +import java.util.function.IntFunction; + +public final class LambdaParticlePathMotion extends ParticlePathMotion { + private final IntFunction path; + + public LambdaParticlePathMotion(Vec3 origin, ControllableParticle particle, IntFunction path) { + super(origin, particle); + this.path = path; + } + + public IntFunction getPath() { + return path; + } + + @Override + public Vec3 pathFunction() { + return path.apply(getCurrentTick()); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/ParticlePathMotion.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/ParticlePathMotion.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/ParticlePathMotion.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/ParticlePathMotion.java index 5274d15..76a1cb0 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/ParticlePathMotion.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/ParticlePathMotion.java @@ -1,16 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.animation; import com.reiasu.reiparticlesapi.network.animation.api.AbstractPathMotion; import com.reiasu.reiparticlesapi.particles.ControllableParticle; import net.minecraft.world.phys.Vec3; -/** - * Path motion targeting an individual particle (ControllableParticle). - *

- * Delegates teleport and validity checks through {@link ControllableParticle}. - */ public abstract class ParticlePathMotion extends AbstractPathMotion { private final ControllableParticle particle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/PathMotionManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/PathMotionManager.java similarity index 65% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/PathMotionManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/PathMotionManager.java index d4a46fa..ee82160 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/PathMotionManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/PathMotionManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.animation; import com.reiasu.reiparticlesapi.network.animation.api.PathMotion; @@ -9,11 +7,6 @@ import java.util.Iterator; import java.util.Set; -/** - * Singleton manager that ticks all registered {@link PathMotion} instances. - * Each tick: removes invalid motions, computes the next path offset for valid ones, - * adds it to the origin, and applies the result. - */ public final class PathMotionManager { public static final PathMotionManager INSTANCE = new PathMotionManager(); private static final Set motions = new HashSet<>(); @@ -25,17 +18,11 @@ public Set getMotions() { return motions; } - /** - * Register a path motion for ticking. - */ - public void applyMotion(PathMotion motion) { + public void applyMotion(PathMotion motion) { motions.add(motion); } - /** - * Tick all registered motions. Called once per server/client tick. - */ - public void tick() { + public void tick() { Iterator iterator = motions.iterator(); while (iterator.hasNext()) { PathMotion motion = iterator.next(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/StylePathMotion.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/StylePathMotion.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/StylePathMotion.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/StylePathMotion.java index 7237a54..824ed6a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/StylePathMotion.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/StylePathMotion.java @@ -1,15 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.animation; import com.reiasu.reiparticlesapi.network.animation.api.AbstractPathMotion; import com.reiasu.reiparticlesapi.network.particle.style.ParticleGroupStyle; import net.minecraft.world.phys.Vec3; -/** - * Path motion targeting a {@link ParticleGroupStyle}. Teleports the style - * along the computed path. Subclasses implement {@link #pathFunction()}. - */ public abstract class StylePathMotion extends AbstractPathMotion { private final ParticleGroupStyle targetStyle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/AbstractPathMotion.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/AbstractPathMotion.java similarity index 62% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/AbstractPathMotion.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/AbstractPathMotion.java index 700671f..e7f28fb 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/AbstractPathMotion.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/AbstractPathMotion.java @@ -1,14 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.animation.api; import net.minecraft.world.phys.Vec3; -/** - * Abstract base for path motions. Implements the tick-incrementing {@link #next()} - * method; subclasses need only provide {@link #pathFunction()}, {@link #apply(Vec3)}, - * and {@link #checkValid()}. - */ public abstract class AbstractPathMotion implements PathMotion { private Vec3 origin; private int currentTick; @@ -44,9 +37,5 @@ public Vec3 next() { return value; } - /** - * Compute the path offset for the current tick. - * Called by {@link #next()} before the tick counter is incremented. - */ - public abstract Vec3 pathFunction(); + public abstract Vec3 pathFunction(); } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/PathMotion.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/PathMotion.java new file mode 100644 index 0000000..3429b61 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/animation/api/PathMotion.java @@ -0,0 +1,19 @@ +package com.reiasu.reiparticlesapi.network.animation.api; + +import net.minecraft.world.phys.Vec3; + +public interface PathMotion { + int getCurrentTick(); + + void setCurrentTick(int tick); + + Vec3 getOrigin(); + + void setOrigin(Vec3 origin); + + void apply(Vec3 actualPos); + + Vec3 next(); + + boolean checkValid(); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/AbstractControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/AbstractControllerBuffer.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/AbstractControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/AbstractControllerBuffer.java index a81a544..ca60114 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/AbstractControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/AbstractControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; public abstract class AbstractControllerBuffer implements ParticleControllerDataBuffer { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/BooleanControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/BooleanControllerBuffer.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/BooleanControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/BooleanControllerBuffer.java index d71db1f..1b29e3e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/BooleanControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/BooleanControllerBuffer.java @@ -1,12 +1,10 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; public final class BooleanControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "boolean")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "boolean")); @Override public byte[] encode(Boolean value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/CharControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/CharControllerBuffer.java similarity index 76% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/CharControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/CharControllerBuffer.java index f8bc3e5..0a3166b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/CharControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/CharControllerBuffer.java @@ -1,17 +1,12 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; import java.nio.ByteBuffer; -/** - * Buffer for single char (2-byte) values. - */ public final class CharControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "char")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "char")); @Override public byte[] encode(Character value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/DoubleControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/DoubleControllerBuffer.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/DoubleControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/DoubleControllerBuffer.java index 2e5e425..e636b9f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/DoubleControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/DoubleControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -8,7 +6,7 @@ public final class DoubleControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "double")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "double")); @Override public byte[] encode(Double value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/EmptyControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/EmptyControllerBuffer.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/EmptyControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/EmptyControllerBuffer.java index 1747b68..124cee7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/EmptyControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/EmptyControllerBuffer.java @@ -1,12 +1,10 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; public final class EmptyControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "empty")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "empty")); @Override public byte[] encode(Void value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/FloatControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/FloatControllerBuffer.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/FloatControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/FloatControllerBuffer.java index 03d817d..a9fd65a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/FloatControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/FloatControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -8,7 +6,7 @@ public final class FloatControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "float")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "float")); @Override public byte[] encode(Float value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntArrayControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntArrayControllerBuffer.java similarity index 86% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntArrayControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntArrayControllerBuffer.java index 29444d8..62e9bad 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntArrayControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntArrayControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -8,7 +6,7 @@ public final class IntArrayControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "int_array")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "int_array")); @Override public byte[] encode(int[] value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntControllerBuffer.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntControllerBuffer.java index ba5fa2e..376bceb 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/IntControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -8,7 +6,7 @@ public final class IntControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "int")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "int")); @Override public byte[] encode(Integer value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongArrayControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongArrayControllerBuffer.java similarity index 86% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongArrayControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongArrayControllerBuffer.java index 1447085..1f0785f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongArrayControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongArrayControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -8,7 +6,7 @@ public final class LongArrayControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "long_array")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "long_array")); @Override public byte[] encode(long[] value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongControllerBuffer.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongControllerBuffer.java index 0ad2cb4..e4c2284 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/LongControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -8,7 +6,7 @@ public final class LongControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "long")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "long")); @Override public byte[] encode(Long value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/NestedBuffersControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/NestedBuffersControllerBuffer.java similarity index 85% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/NestedBuffersControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/NestedBuffersControllerBuffer.java index 83b9730..8e9c89e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/NestedBuffersControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/NestedBuffersControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -12,13 +10,9 @@ import java.util.ArrayList; import java.util.List; -/** - * Buffer that contains a list of nested ParticleControllerDataBuffer entries. - * Encodes as: [count:int] then for each entry: [idLen:int][idString][dataLen:int][data]. - */ public final class NestedBuffersControllerBuffer extends AbstractControllerBuffer>> { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "nested_buffers")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "nested_buffers")); @Override public byte[] encode(List> value) { @@ -59,7 +53,7 @@ public List> decode(byte[] buf) { byte[] data = new byte[dataLen]; dis.readFully(data); ParticleControllerDataBuffer.Id id = - new ParticleControllerDataBuffer.Id(new ResourceLocation(idStr)); + new ParticleControllerDataBuffer.Id(ResourceLocation.parse(idStr)); ParticleControllerDataBuffer decoded = ParticleControllerDataBuffers.INSTANCE.withIdDecode(id, data); if (decoded != null) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffer.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffer.java index 6c1a001..9afba5b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -36,7 +34,7 @@ public static Id toID(String string) { if (split.length != 2 || split[0].isBlank() || split[1].isBlank()) { throw new IllegalArgumentException("Invalid ID format: " + string); } - return new Id(new ResourceLocation(split[0], split[1])); + return new Id(ResourceLocation.fromNamespaceAndPath(split[0], split[1])); } } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffers.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffers.java similarity index 99% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffers.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffers.java index 4f14e5a..50414e8 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffers.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ParticleControllerDataBuffers.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/RelativeLocationControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/RelativeLocationControllerBuffer.java similarity index 85% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/RelativeLocationControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/RelativeLocationControllerBuffer.java index e460131..3b4c0de 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/RelativeLocationControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/RelativeLocationControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import com.reiasu.reiparticlesapi.utils.RelativeLocation; @@ -9,7 +7,7 @@ public final class RelativeLocationControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "relative_location")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "relative_location")); @Override public byte[] encode(RelativeLocation value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ShortControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ShortControllerBuffer.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ShortControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ShortControllerBuffer.java index 4c1d393..e2aa742 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ShortControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/ShortControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -8,7 +6,7 @@ public final class ShortControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "short")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "short")); @Override public byte[] encode(Short value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/StringControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/StringControllerBuffer.java similarity index 79% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/StringControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/StringControllerBuffer.java index 2e13fac..fef27bc 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/StringControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/StringControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -8,7 +6,7 @@ public final class StringControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "string")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "string")); @Override public byte[] encode(String value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/UUIDControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/UUIDControllerBuffer.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/UUIDControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/UUIDControllerBuffer.java index 3b28c5c..b7ab8e5 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/UUIDControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/UUIDControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -9,7 +7,7 @@ public final class UUIDControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "uuid")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "uuid")); @Override public byte[] encode(UUID value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/Vec3dControllerBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/Vec3dControllerBuffer.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/Vec3dControllerBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/Vec3dControllerBuffer.java index d0412bc..2008793 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/buffer/Vec3dControllerBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/buffer/Vec3dControllerBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.buffer; import net.minecraft.resources.ResourceLocation; @@ -9,7 +7,7 @@ public final class Vec3dControllerBuffer extends AbstractControllerBuffer { public static final ParticleControllerDataBuffer.Id ID = - new ParticleControllerDataBuffer.Id(new ResourceLocation("reiparticlesapi", "vec3d")); + new ParticleControllerDataBuffer.Id(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "vec3d")); @Override public byte[] encode(Vec3 value) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacket.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacket.java similarity index 50% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacket.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacket.java index 60ed30b..0bfc540 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacket.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/CameraShakeS2CPacket.java @@ -1,17 +1,19 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet; import com.reiasu.reiparticlesapi.client.CameraShakeClientState; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; -import java.util.function.Supplier; -public record CameraShakeS2CPacket(double range, Vec3 origin, double amplitude, int tick) { +public record CameraShakeS2CPacket(double range, Vec3 origin, double amplitude, int tick) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "camera_shake_s2_c_packet")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), CameraShakeS2CPacket::decode); + public static void encode(CameraShakeS2CPacket packet, FriendlyByteBuf buf) { buf.writeDouble(packet.range); buf.writeDouble(packet.origin.x); @@ -29,11 +31,10 @@ public static CameraShakeS2CPacket decode(FriendlyByteBuf buf) { return new CameraShakeS2CPacket(range, origin, amplitude, tick); } - public static void handle(CameraShakeS2CPacket packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CameraShakeClientState.start(packet)) - ); - context.setPacketHandled(true); + public static void handle(CameraShakeS2CPacket packet, IPayloadContext context) { + context.enqueueWork(() -> CameraShakeClientState.start(packet)); } + + @Override + public Type type() { return TYPE; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketCameraShakeS2C.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketCameraShakeS2C.java similarity index 51% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketCameraShakeS2C.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketCameraShakeS2C.java index 9851938..fd74f2c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketCameraShakeS2C.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketCameraShakeS2C.java @@ -1,17 +1,19 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet; import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientCameraShakeHandler; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; -import java.util.function.Supplier; -public record PacketCameraShakeS2C(double range, Vec3 origin, double amplitude, int tick) { +public record PacketCameraShakeS2C(double range, Vec3 origin, double amplitude, int tick) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_camera_shake_s2_c")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketCameraShakeS2C::decode); + public static void encode(PacketCameraShakeS2C packet, FriendlyByteBuf buf) { buf.writeDouble(packet.range); buf.writeDouble(packet.origin.x); @@ -29,13 +31,10 @@ public static PacketCameraShakeS2C decode(FriendlyByteBuf buf) { return new PacketCameraShakeS2C(range, origin, amplitude, tick); } - public static void handle(PacketCameraShakeS2C packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - ClientCameraShakeHandler.receive(packet); - }) - ); - context.setPacketHandled(true); + public static void handle(PacketCameraShakeS2C packet, IPayloadContext context) { + context.enqueueWork(() -> ClientCameraShakeHandler.receive(packet)); } + + @Override + public Type type() { return TYPE; } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketDisplayEntityS2C.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketDisplayEntityS2C.java new file mode 100644 index 0000000..828f826 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketDisplayEntityS2C.java @@ -0,0 +1,39 @@ +package com.reiasu.reiparticlesapi.network.packet; + +import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientDisplayEntityPacketHandler; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import java.util.UUID; + +public record PacketDisplayEntityS2C(UUID uuid, String entityType, byte[] data) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_display_entity_s2_c")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketDisplayEntityS2C::decode); + + public static void encode(PacketDisplayEntityS2C packet, FriendlyByteBuf buf) { + buf.writeUtf(packet.entityType); + buf.writeUUID(packet.uuid); + buf.writeInt(packet.data.length); + buf.writeBytes(packet.data); + } + + public static PacketDisplayEntityS2C decode(FriendlyByteBuf buf) { + String type = buf.readUtf(); + UUID uuid = buf.readUUID(); + int size = buf.readInt(); + byte[] data = new byte[size]; + buf.readBytes(data); + return new PacketDisplayEntityS2C(uuid, type, data); + } + + public static void handle(PacketDisplayEntityS2C packet, IPayloadContext context) { + context.enqueueWork(() -> ClientDisplayEntityPacketHandler.receive(packet)); + } + + @Override + public Type type() { return TYPE; } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketKeyActionC2S.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketKeyActionC2S.java similarity index 56% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketKeyActionC2S.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketKeyActionC2S.java index 235afdc..91b71b8 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketKeyActionC2S.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketKeyActionC2S.java @@ -1,17 +1,20 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet; import com.reiasu.reiparticlesapi.event.events.key.KeyActionType; import com.reiasu.reiparticlesapi.network.packet.server.listener.ServerKeyActionHandler; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; -import java.util.function.Supplier; -public record PacketKeyActionC2S(ResourceLocation keyId, KeyActionType action, int pressTick, boolean isRelease) { +public record PacketKeyActionC2S(ResourceLocation keyId, KeyActionType action, int pressTick, boolean isRelease) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_key_action_c2_s")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketKeyActionC2S::decode); + public static void encode(PacketKeyActionC2S packet, FriendlyByteBuf buf) { buf.writeResourceLocation(packet.keyId); buf.writeInt(packet.action.getId()); @@ -27,13 +30,12 @@ public static PacketKeyActionC2S decode(FriendlyByteBuf buf) { return new PacketKeyActionC2S(keyId, action, pressTick, isRelease); } - public static void handle(PacketKeyActionC2S packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - ServerPlayer sender = context.getSender(); - if (sender != null) { + public static void handle(PacketKeyActionC2S packet, IPayloadContext context) { + if (context.player() instanceof ServerPlayer sender) { context.enqueueWork(() -> ServerKeyActionHandler.receive(packet, sender)); } - context.setPacketHandled(true); } -} + @Override + public Type type() { return TYPE; } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleCompositionS2C.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleCompositionS2C.java similarity index 64% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleCompositionS2C.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleCompositionS2C.java index d4cc02c..52a8055 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleCompositionS2C.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleCompositionS2C.java @@ -1,17 +1,19 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet; import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientParticleCompositionHandler; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; import java.util.UUID; -import java.util.function.Supplier; -public final class PacketParticleCompositionS2C { +public final class PacketParticleCompositionS2C implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_particle_composition_s2c")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketParticleCompositionS2C::decode); + private final UUID uuid; private final String type; private final byte[] data; @@ -63,9 +65,10 @@ public static PacketParticleCompositionS2C decode(FriendlyByteBuf buf) { return packet; } - public static void handle(PacketParticleCompositionS2C packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientParticleCompositionHandler.receive(packet))); - context.setPacketHandled(true); + public static void handle(PacketParticleCompositionS2C packet, IPayloadContext context) { + context.enqueueWork(() -> ClientParticleCompositionHandler.receive(packet)); } + + @Override + public Type type() { return TYPE; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleEmittersS2C.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleEmittersS2C.java similarity index 61% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleEmittersS2C.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleEmittersS2C.java index 1c7e478..c19af5a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleEmittersS2C.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleEmittersS2C.java @@ -1,17 +1,18 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet; import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientParticleEmittersPacketHandler; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; +import net.neoforged.neoforge.network.handling.IPayloadContext; -import java.util.function.Supplier; -public record PacketParticleEmittersS2C(ResourceLocation emitterKey, byte[] emitterData, PacketType type) { +public record PacketParticleEmittersS2C(ResourceLocation emitterKey, byte[] emitterData, PacketType packetType) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_particle_emitters_s2_c")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketParticleEmittersS2C::decode); + public enum PacketType { CHANGE_OR_CREATE(0), REMOVE(1); @@ -36,7 +37,7 @@ public static PacketType fromID(int id) { } public static void encode(PacketParticleEmittersS2C packet, FriendlyByteBuf buf) { - buf.writeVarInt(packet.type.getId()); + buf.writeVarInt(packet.packetType.getId()); buf.writeResourceLocation(packet.emitterKey); buf.writeVarInt(packet.emitterData.length); buf.writeBytes(packet.emitterData); @@ -51,9 +52,10 @@ public static PacketParticleEmittersS2C decode(FriendlyByteBuf buf) { return new PacketParticleEmittersS2C(key, data, packetType); } - public static void handle(PacketParticleEmittersS2C packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientParticleEmittersPacketHandler.receive(packet))); - context.setPacketHandled(true); + public static void handle(PacketParticleEmittersS2C packet, IPayloadContext context) { + context.enqueueWork(() -> ClientParticleEmittersPacketHandler.receive(packet)); } + + @Override + public Type type() { return TYPE; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleGroupS2C.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleGroupS2C.java similarity index 71% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleGroupS2C.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleGroupS2C.java index 33d512f..52f3145 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleGroupS2C.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleGroupS2C.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; @@ -7,20 +5,24 @@ import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientParticleGroupPacketHandler; import com.reiasu.reiparticlesapi.particles.control.ControlType; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import java.util.function.Supplier; public record PacketParticleGroupS2C( UUID uuid, - ControlType type, + ControlType controlType, Map> args -) { +) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_particle_group_s2_c")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketParticleGroupS2C::decode); + public enum PacketArgsType { POS("pos"), CURRENT_TICK("current_tick"), @@ -58,7 +60,7 @@ public static PacketArgsType fromArgsName(String value) { public static void encode(PacketParticleGroupS2C packet, FriendlyByteBuf buf) { buf.writeUUID(packet.uuid); - buf.writeInt(packet.type.getId()); + buf.writeInt(packet.controlType.getId()); for (Map.Entry> entry : packet.args.entrySet()) { byte[] encoded = ParticleControllerDataBuffers.INSTANCE.encode(entry.getValue()); buf.writeInt(encoded.length); @@ -81,9 +83,10 @@ public static PacketParticleGroupS2C decode(FriendlyByteBuf buf) { return new PacketParticleGroupS2C(uuid, type, args); } - public static void handle(PacketParticleGroupS2C packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientParticleGroupPacketHandler.receive(packet))); - context.setPacketHandled(true); + public static void handle(PacketParticleGroupS2C packet, IPayloadContext context) { + context.enqueueWork(() -> ClientParticleGroupPacketHandler.receive(packet)); } + + @Override + public Type type() { return TYPE; } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleS2C.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleS2C.java new file mode 100644 index 0000000..49e9e23 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleS2C.java @@ -0,0 +1,56 @@ +package com.reiasu.reiparticlesapi.network.packet; + +import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientParticlePacketHandler; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import net.minecraft.world.phys.Vec3; + + +public record PacketParticleS2C(ParticleOptions particleOptions, Vec3 pos, Vec3 velocity) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_particle_s2_c")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketParticleS2C::decode); + + @SuppressWarnings({"rawtypes", "unchecked"}) + public static void encode(PacketParticleS2C packet, RegistryFriendlyByteBuf buf) { + ResourceLocation id = BuiltInRegistries.PARTICLE_TYPE.getKey(packet.particleOptions.getType()); + buf.writeResourceLocation(id); + ParticleType type = packet.particleOptions.getType(); + ((StreamCodec) type.streamCodec()).encode(buf, packet.particleOptions); + buf.writeDouble(packet.pos.x); + buf.writeDouble(packet.pos.y); + buf.writeDouble(packet.pos.z); + buf.writeDouble(packet.velocity.x); + buf.writeDouble(packet.velocity.y); + buf.writeDouble(packet.velocity.z); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + public static PacketParticleS2C decode(RegistryFriendlyByteBuf buf) { + ResourceLocation id = buf.readResourceLocation(); + ParticleType type = BuiltInRegistries.PARTICLE_TYPE.getOptional(id).orElse(null); + ParticleOptions options; + if (type != null) { + options = (ParticleOptions) type.streamCodec().decode(buf); + } else { + options = ParticleTypes.END_ROD; + } + Vec3 pos = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); + Vec3 velocity = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); + return new PacketParticleS2C(options, pos, velocity); + } + + public static void handle(PacketParticleS2C packet, IPayloadContext context) { + context.enqueueWork(() -> ClientParticlePacketHandler.receive(packet)); + } + + @Override + public Type type() { return TYPE; } + +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleStyleS2C.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleStyleS2C.java similarity index 64% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleStyleS2C.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleStyleS2C.java index dbb27c6..dd7ff66 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleStyleS2C.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketParticleStyleS2C.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; @@ -7,27 +5,31 @@ import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientParticleStylePacketHandler; import com.reiasu.reiparticlesapi.particles.control.ControlType; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import java.util.function.Supplier; public record PacketParticleStyleS2C( UUID uuid, - ControlType type, + ControlType controlType, Map> args -) { +) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_particle_style_s2_c")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketParticleStyleS2C::decode); + public PacketParticleStyleS2C { args = Map.copyOf(args); } public static void encode(PacketParticleStyleS2C packet, FriendlyByteBuf buf) { buf.writeUUID(packet.uuid); - buf.writeInt(packet.type.getId()); + buf.writeInt(packet.controlType.getId()); buf.writeInt(packet.args.size()); for (Map.Entry> entry : packet.args.entrySet()) { byte[] encoded = ParticleControllerDataBuffers.INSTANCE.encode(entry.getValue()); @@ -52,9 +54,10 @@ public static PacketParticleStyleS2C decode(FriendlyByteBuf buf) { return new PacketParticleStyleS2C(uuid, type, args); } - public static void handle(PacketParticleStyleS2C packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientParticleStylePacketHandler.receive(packet))); - context.setPacketHandled(true); + public static void handle(PacketParticleStyleS2C packet, IPayloadContext context) { + context.enqueueWork(() -> ClientParticleStylePacketHandler.receive(packet)); } + + @Override + public Type type() { return TYPE; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketRenderEntityS2C.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketRenderEntityS2C.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketRenderEntityS2C.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketRenderEntityS2C.java index cf30142..84f498a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketRenderEntityS2C.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/PacketRenderEntityS2C.java @@ -1,18 +1,19 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet; import com.reiasu.reiparticlesapi.network.packet.client.listener.ClientRenderEntityPacketHandler; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkEvent; +import net.neoforged.neoforge.network.handling.IPayloadContext; import java.util.UUID; -import java.util.function.Supplier; -public final class PacketRenderEntityS2C { +public final class PacketRenderEntityS2C implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "packet_render_entity_s2c")); + public static final StreamCodec STREAM_CODEC = StreamCodec.of((buf, pkt) -> encode(pkt, buf), PacketRenderEntityS2C::decode); + public enum Method { CREATE(0), TOGGLE(1), @@ -115,9 +116,10 @@ public static PacketRenderEntityS2C decode(FriendlyByteBuf buf) { return new PacketRenderEntityS2C(uuid, entity, id, method); } - public static void handle(PacketRenderEntityS2C packet, Supplier contextSupplier) { - NetworkEvent.Context context = contextSupplier.get(); - context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientRenderEntityPacketHandler.receive(packet))); - context.setPacketHandled(true); + public static void handle(PacketRenderEntityS2C packet, IPayloadContext context) { + context.enqueueWork(() -> ClientRenderEntityPacketHandler.receive(packet)); } + + @Override + public Type type() { return TYPE; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientCameraShakeHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientCameraShakeHandler.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientCameraShakeHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientCameraShakeHandler.java index 179b13c..2493f0a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientCameraShakeHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientCameraShakeHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.client.listener; import com.reiasu.reiparticlesapi.client.CameraShakeClientState; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientDisplayEntityPacketHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientDisplayEntityPacketHandler.java similarity index 92% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientDisplayEntityPacketHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientDisplayEntityPacketHandler.java index 2a95735..16f9bc2 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientDisplayEntityPacketHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientDisplayEntityPacketHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.client.listener; import com.reiasu.reiparticlesapi.display.DisplayEntity; @@ -16,7 +14,7 @@ private ClientDisplayEntityPacketHandler() { public static void receive(PacketDisplayEntityS2C packet) { Function decoder = - DisplayEntityManager.INSTANCE.getRegisteredTypes().get(packet.type()); + DisplayEntityManager.INSTANCE.getRegisteredTypes().get(packet.entityType()); if (decoder == null) { return; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleCompositionHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleCompositionHandler.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleCompositionHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleCompositionHandler.java index 31c27fc..7353923 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleCompositionHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleCompositionHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.client.listener; import com.reiasu.reiparticlesapi.network.packet.PacketParticleCompositionS2C; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleEmittersPacketHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleEmittersPacketHandler.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleEmittersPacketHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleEmittersPacketHandler.java index d812800..37a3713 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleEmittersPacketHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleEmittersPacketHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.client.listener; import com.reiasu.reiparticlesapi.network.packet.PacketParticleEmittersS2C; @@ -26,7 +24,7 @@ public static void receive(PacketParticleEmittersS2C packet) { return; } Minecraft minecraft = Minecraft.getInstance(); - switch (packet.type()) { + switch (packet.packetType()) { case CHANGE_OR_CREATE -> { if (minecraft.level != null) { ParticleEmittersManager.createOrChangeClient(emitters, minecraft.level); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleGroupPacketHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleGroupPacketHandler.java similarity index 98% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleGroupPacketHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleGroupPacketHandler.java index 2714431..b951583 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleGroupPacketHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleGroupPacketHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.client.listener; import com.mojang.logging.LogUtils; @@ -30,7 +28,7 @@ private ClientParticleGroupPacketHandler() { public static void receive(PacketParticleGroupS2C packet) { UUID uuid = packet.uuid(); - ControlType type = packet.type(); + ControlType type = packet.controlType(); switch (type) { case CREATE -> handleCreate(uuid, packet.args()); case CHANGE -> handleChange(uuid, packet.args()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticlePacketHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticlePacketHandler.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticlePacketHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticlePacketHandler.java index f2edcd7..064212a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticlePacketHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticlePacketHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.client.listener; import com.reiasu.reiparticlesapi.network.packet.PacketParticleS2C; @@ -15,7 +13,7 @@ public static void receive(PacketParticleS2C packet) { return; } minecraft.level.addParticle( - packet.type(), + packet.particleOptions(), true, packet.pos().x, packet.pos().y, diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleStylePacketHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleStylePacketHandler.java similarity index 98% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleStylePacketHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleStylePacketHandler.java index e9c91fe..455d109 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleStylePacketHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientParticleStylePacketHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.client.listener; import com.mojang.logging.LogUtils; @@ -26,7 +24,7 @@ private ClientParticleStylePacketHandler() { public static void receive(PacketParticleStyleS2C packet) { UUID uuid = packet.uuid(); - ControlType type = packet.type(); + ControlType type = packet.controlType(); if (type == ControlType.CREATE) { handleCreate(uuid, packet.args()); return; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientRenderEntityPacketHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientRenderEntityPacketHandler.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientRenderEntityPacketHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientRenderEntityPacketHandler.java index 1f188b4..4c1173d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientRenderEntityPacketHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/client/listener/ClientRenderEntityPacketHandler.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.client.listener; import com.reiasu.reiparticlesapi.network.packet.PacketRenderEntityS2C; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/server/listener/ServerKeyActionHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/server/listener/ServerKeyActionHandler.java similarity index 85% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/server/listener/ServerKeyActionHandler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/server/listener/ServerKeyActionHandler.java index e0b3bc8..67726ae 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/packet/server/listener/ServerKeyActionHandler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/packet/server/listener/ServerKeyActionHandler.java @@ -1,7 +1,6 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.packet.server.listener; +import net.neoforged.neoforge.common.NeoForge; import com.reiasu.reiparticlesapi.event.ReiEventBus; import com.reiasu.reiparticlesapi.event.events.key.KeyActionEvent; import com.reiasu.reiparticlesapi.network.packet.PacketKeyActionC2S; @@ -12,7 +11,7 @@ private ServerKeyActionHandler() { } public static void receive(PacketKeyActionC2S packet, ServerPlayer player) { - ReiEventBus.call(new KeyActionEvent( + NeoForge.EVENT_BUS.post(new KeyActionEvent( player, packet.keyId(), packet.action(), diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/SequencedServerParticleGroup.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/SequencedServerParticleGroup.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/SequencedServerParticleGroup.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/SequencedServerParticleGroup.java index 469a8bd..05d4901 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/SequencedServerParticleGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/SequencedServerParticleGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; @@ -9,10 +7,6 @@ import java.util.HashMap; import java.util.Map; -/** - * A {@link ServerParticleGroup} that manages sequenced (indexed) particles, - * allowing individual particles to be toggled on/off by index. - */ public abstract class SequencedServerParticleGroup extends ServerParticleGroup { private final long[] clientIndexStatus; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerController.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerController.java similarity index 57% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerController.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerController.java index 71cb13c..194f994 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerController.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerController.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle; import net.minecraft.server.level.ServerLevel; @@ -9,11 +7,7 @@ public interface ServerController { default void tick() { } - /** - * Spawn this controller's visual representation in the world. - * Override in each implementation to dispatch to the appropriate manager. - */ - default void spawnInWorld(ServerLevel world, Vec3 pos) { + default void spawnInWorld(ServerLevel world, Vec3 pos) { } default boolean getCanceled() { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerParticleGroup.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerParticleGroup.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerParticleGroup.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerParticleGroup.java index b25de74..a329420 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerParticleGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/ServerParticleGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle; import com.reiasu.reiparticlesapi.network.ReiParticlesNetwork; @@ -22,13 +20,6 @@ import java.util.UUID; import java.util.function.Consumer; -/** - * Server-side particle group that manages a set of particles with shared - * lifecycle, transform, and network synchronization. - *

- * Subclasses define the particle shape via {@link #getClientType()} and - * {@link #otherPacketArgs()}, and respond to lifecycle callbacks. - */ public abstract class ServerParticleGroup implements ServerController { private double visibleRange; @@ -63,9 +54,6 @@ public ServerParticleGroup() { public void spawnInWorld(ServerLevel world, Vec3 pos) { ServerParticleGroupManager.INSTANCE.addParticleGroup(this, pos, world); } - - // ---- Getters / Setters ---- - public double getVisibleRange() { return visibleRange; } public void setVisibleRange(double visibleRange) { this.visibleRange = visibleRange; } public UUID getUuid() { return uuid; } @@ -89,9 +77,6 @@ public void spawnInWorld(ServerLevel world, Vec3 pos) { public void setMaxTick(int maxTick) { this.maxTick = maxTick; } public RelativeLocation getAxis() { return axis; } public void setAxis(RelativeLocation axis) { this.axis = axis; } - - // ---- Abstract methods ---- - public abstract Map> otherPacketArgs(); public abstract Class getClientType(); public abstract void onGroupDisplay(Vec3 pos, ServerLevel world); @@ -99,9 +84,6 @@ public void spawnInWorld(ServerLevel world, Vec3 pos) { public abstract void onClientViewDeath(); public abstract void doTickClient(); public abstract void doTickAlive(); - - // ---- Lifecycle ---- - @Override public void tick() { if (canceled) return; @@ -130,15 +112,12 @@ public void remove() { for (UUID playerId : visible) { if (world.getPlayerByUUID(playerId) instanceof ServerPlayer sp) { PacketParticleGroupS2C packet = new PacketParticleGroupS2C( - uuid, ControlType.REMOVE, new HashMap<>()); + uuid, ControlType.REMOVE, Map.of()); ReiParticlesNetwork.sendTo(sp, packet); } } ServerParticleGroupManager.INSTANCE.removeParticleGroup(this); } - - // ---- Player / Entity binding ---- - public void withPlayerStats(Player player) { if (player == null) return; this.pos = player.position(); @@ -148,9 +127,6 @@ public void withEntityStats(LivingEntity entity) { if (entity == null) return; this.pos = entity.position(); } - - // ---- Transform operations ---- - public void setAxis(Vec3 axisVec) { this.axis = RelativeLocation.Companion.of(axisVec); Map> args = new HashMap<>(); @@ -226,16 +202,10 @@ public void changeMaxTick(int newMaxTick) { ParticleControllerDataBuffers.INSTANCE.intValue(newMaxTick)); change(g -> g.maxTick = newMaxTick, args); } - - // ---- Spawn ---- - public void spawn(Level world, Vec3 pos) { if (!(world instanceof ServerLevel serverLevel)) return; ServerParticleGroupManager.INSTANCE.addParticleGroup(this, pos, serverLevel); } - - // ---- Change broadcast ---- - public void change(Consumer toggleMethod, Map> args) { if (world == null) return; Set visible = ServerParticleGroupManager.INSTANCE.filterVisiblePlayer(this); @@ -247,9 +217,6 @@ public void change(Consumer toggleMethod, Map groups = new ConcurrentHashMap<>(); private final ConcurrentHashMap> visible = new ConcurrentHashMap<>(); + private final ConcurrentHashMap> groupToPlayers = new ConcurrentHashMap<>(); private ServerParticleGroupManager() {} @@ -41,36 +36,32 @@ public void addParticleGroup(ServerParticleGroup group, Vec3 pos, ServerLevel wo public void removeParticleGroup(ServerParticleGroup group) { groups.remove(group.getUuid()); - // Clean up visibility entries - for (Map.Entry> entry : visible.entrySet()) { - entry.getValue().remove(group); + Set players = groupToPlayers.remove(group.getUuid()); + if (players != null) { + for (UUID playerId : players) { + Set visibleSet = visible.get(playerId); + if (visibleSet != null) { + visibleSet.remove(group); + } + } } } - /** - * Returns the set of player UUIDs that can currently see the given group. - */ - public Set filterVisiblePlayer(ServerParticleGroup group) { - Set result = new HashSet<>(); - for (Map.Entry> entry : visible.entrySet()) { - if (entry.getValue().contains(group)) { - result.add(entry.getKey()); - } - } - return result; + public Set filterVisiblePlayer(ServerParticleGroup group) { + Set players = groupToPlayers.get(group.getUuid()); + return players != null ? new HashSet<>(players) : new HashSet<>(); } - /** - * Called each server tick to update all groups and manage visibility. - */ - public void upgrade(MinecraftServer server) { + public void upgrade(MinecraftServer server) { if (server == null) return; clearOfflineVisible(server); - List groupList = new ArrayList<>(groups.values()); - for (ServerParticleGroup group : groupList) { + Iterator groupIterator = groups.values().iterator(); + while (groupIterator.hasNext()) { + ServerParticleGroup group = groupIterator.next(); if (group.getCanceled() || !group.getValid()) { - groups.remove(group.getUuid()); + groupIterator.remove(); + groupToPlayers.remove(group.getUuid()); continue; } @@ -87,6 +78,7 @@ public void upgrade(MinecraftServer server) { if (visibleSet.contains(group)) { removeGroupPlayerView(player, group); visibleSet.remove(group); + unlinkPlayerGroup(player.getUUID(), group.getUuid()); } continue; } @@ -96,6 +88,7 @@ public void upgrade(MinecraftServer server) { if (visibleSet.contains(group)) { removeGroupPlayerView(player, group); visibleSet.remove(group); + unlinkPlayerGroup(player.getUUID(), group.getUuid()); } continue; } @@ -111,6 +104,7 @@ public void upgrade(MinecraftServer server) { removeGroupPlayerView(player, group); } visibleSet.remove(group); + unlinkPlayerGroup(player.getUUID(), group.getUuid()); } } @@ -124,11 +118,22 @@ private void clearOfflineVisible(MinecraftServer server) { Map.Entry> entry = it.next(); ServerPlayer player = server.getPlayerList().getPlayer(entry.getKey()); if (player == null || player.hasDisconnected()) { + UUID playerId = entry.getKey(); + for (ServerParticleGroup g : entry.getValue()) { + unlinkPlayerGroup(playerId, g.getUuid()); + } it.remove(); } } } + private void unlinkPlayerGroup(UUID playerId, UUID groupId) { + Set players = groupToPlayers.get(groupId); + if (players != null) { + players.remove(playerId); + } + } + private void togglePacketView(ServerPlayer target, ServerParticleGroup group) { Map> args = new HashMap<>(); args.put(PacketParticleGroupS2C.PacketArgsType.POS.getOfArgs(), @@ -147,7 +152,7 @@ private void togglePacketView(ServerPlayer target, ServerParticleGroup group) { private void removeGroupPlayerView(ServerPlayer target, ServerParticleGroup targetGroup) { PacketParticleGroupS2C packet = new PacketParticleGroupS2C( - targetGroup.getUuid(), ControlType.REMOVE, new HashMap<>()); + targetGroup.getUuid(), ControlType.REMOVE, Map.of()); ReiParticlesNetwork.sendTo(target, packet); } @@ -155,6 +160,8 @@ private void addGroupPlayerView(ServerPlayer target, ServerParticleGroup targetG Set visibleSet = visible.computeIfAbsent( target.getUUID(), k -> ConcurrentHashMap.newKeySet()); visibleSet.add(targetGroup); + groupToPlayers.computeIfAbsent(targetGroup.getUuid(), k -> ConcurrentHashMap.newKeySet()) + .add(target.getUUID()); Map> args = new HashMap<>(); args.put(PacketParticleGroupS2C.PacketArgsType.POS.getOfArgs(), diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoParticleComposition.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoParticleComposition.java similarity index 70% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoParticleComposition.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoParticleComposition.java index 0e43984..b4a5dae 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoParticleComposition.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoParticleComposition.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.composition; import com.reiasu.reiparticlesapi.utils.RelativeLocation; @@ -7,10 +5,6 @@ import java.util.Collections; import java.util.Map; -/** - * Placeholder composition that auto-manages itself. - * Will be expanded as more of the original API is ported. - */ public class AutoParticleComposition extends ParticleComposition { @Override diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoSequencedParticleComposition.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoSequencedParticleComposition.java new file mode 100644 index 0000000..efd67e4 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/AutoSequencedParticleComposition.java @@ -0,0 +1,21 @@ +package com.reiasu.reiparticlesapi.network.particle.composition; + +import com.reiasu.reiparticlesapi.annotations.codec.BufferCodec; +import com.reiasu.reiparticlesapi.annotations.composition.handler.ParticleCompositionHelper; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public abstract class AutoSequencedParticleComposition extends SequencedParticleComposition { + + protected AutoSequencedParticleComposition(Vec3 position, Level world) { + super(position, world); + } + + protected AutoSequencedParticleComposition(Vec3 position) { + super(position); + } + + public BufferCodec getCodec() { + return ParticleCompositionHelper.INSTANCE.generateCodec(this); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/CompositionData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/CompositionData.java similarity index 72% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/CompositionData.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/CompositionData.java index 7ad27ec..1073b83 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/CompositionData.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/CompositionData.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.composition; import com.reiasu.reiparticlesapi.particles.Controllable; @@ -13,22 +11,6 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** - * Data attached to each particle entry in a {@link ParticleComposition}. - *

- * Each instance carries a unique {@link UUID} that identifies it within - * the composition, and an {@code order} value used for sequenced display. - *

- * Client-side fields: - *

    - *
  • {@link #displayerBuilder} — factory that creates the {@link ParticleDisplayer} - * for this entry (e.g. single-particle, group, style).
  • - *
  • {@link #particleInit} — callback run once when the particle controller - * is first loaded (optional).
  • - *
  • {@link #controllable} — the {@link Controllable} handle returned by the - * displayer after spawning. Used for teleport/remove/rotate operations.
  • - *
- */ public class CompositionData implements Comparable { private final UUID uuid = UUID.randomUUID(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleComposition.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleComposition.java similarity index 71% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleComposition.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleComposition.java index 1dcb824..08e2f9c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleComposition.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleComposition.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.composition; import com.reiasu.reiparticlesapi.annotations.codec.CodecHelper; @@ -22,18 +20,10 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; -/** - * Base class for particle compositions — groups of particles managed as a unit. - *

- * Manages both server-side state (serialization, rotation, scaling, pre-tick - * action queue) and client-side particle display via {@link ParticleDisplayer}. - * Each particle entry is represented by a {@link CompositionData} which can - * carry a displayer builder, init callback, and a {@link Controllable} handle. - */ public abstract class ParticleComposition implements ServerController, Controllable { - // ─── Companion-style static encode/decode ──────────────────────────── + // --”€--”€--”€ Companion-style static encode/decode --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public static void encodeBase(ParticleComposition data, FriendlyByteBuf buf) { buf.writeUUID(data.controlUUID); @@ -65,7 +55,7 @@ public static void decodeBase(ParticleComposition instance, FriendlyByteBuf buf) instance.status.updateCurrent(buf.readInt()); } - // ─── Fields ────────────────────────────────────────────────────────── + // --”€--”€--”€ Fields --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private Vec3 position; private Level world; @@ -86,7 +76,7 @@ public static void decodeBase(ParticleComposition instance, FriendlyByteBuf buf) private int maxTick = -1; private boolean flushed; - // ─── Constructors ──────────────────────────────────────────────────── + // --”€--”€--”€ Constructors --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ protected ParticleComposition() { this(Vec3.ZERO, null); @@ -97,19 +87,13 @@ protected ParticleComposition(Vec3 position, Level world) { this.world = world; } - // ─── Abstract methods ──────────────────────────────────────────────── + // --”€--”€--”€ Abstract methods --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Returns the particle-data-to-location mapping that defines this composition's shape. - */ - public abstract Map getParticles(); + public abstract Map getParticles(); - /** - * Called once after display is first invoked. - */ - public abstract void onDisplay(); + public abstract void onDisplay(); - // ─── Property accessors ────────────────────────────────────────────── + // --”€--”€--”€ Property accessors --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public Vec3 getPosition() { return position; @@ -212,27 +196,19 @@ public void setMaxTick(int maxTick) { this.maxTick = maxTick; } - // ─── Pre-tick actions ──────────────────────────────────────────────── + // --”€--”€--”€ Pre-tick actions --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Adds a pre-tick action that runs every tick before the main tick logic. - * This is the Forge Java adaptation of the original Kotlin - * {@code Function1} callbacks. - */ - public ParticleComposition addPreTickAction(Consumer action) { + public ParticleComposition addPreTickAction(Consumer action) { invokeQueue.add(action); return this; } - /** - * Overload accepting a simple {@link Runnable} for convenience. - */ - public ParticleComposition addPreTickAction(Runnable action) { + public ParticleComposition addPreTickAction(Runnable action) { invokeQueue.add(pc -> action.run()); return this; } - // ─── Lifecycle ─────────────────────────────────────────────────────── + // --”€--”€--”€ Lifecycle --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ @Override public void tick() { @@ -272,11 +248,7 @@ public void flush() { displayParticles(); } - /** - * Clears all particles. If {@code cancel} is true, the composition - * is marked as canceled. - */ - public void clear(boolean cancel) { + public void clear(boolean cancel) { if (client) { for (CompositionData data : displayedEntries) { Controllable ctrl = data.getControllable(); @@ -315,16 +287,13 @@ public void update(ParticleComposition other) { CodecHelper.INSTANCE.updateFields(this, other); } - // ─── Display / particles ───────────────────────────────────────────── + // --”€--”€--”€ Display / particles --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public void beforeDisplay(Map map) { // Override in subclass to modify locations before display } - /** - * Called by {@link #flush()} to actually create particles. - */ - protected void displayParticles() { + protected void displayParticles() { if (!client) return; Map locations = getParticles(); beforeDisplay(locations); @@ -337,11 +306,7 @@ protected void displayParticles() { } } - /** - * Displays a single particle entry using its {@link ParticleDisplayer}. - * If no displayer builder is set on the data, only the rotated location is tracked. - */ - protected void displayEntry(CompositionData data, RelativeLocation pos) { + protected void displayEntry(CompositionData data, RelativeLocation pos) { particleRotatedLocations.add(pos); displayedEntries.add(data); if (!client) return; @@ -360,10 +325,7 @@ protected void displayEntry(CompositionData data, RelativeLocation pos) { } } - /** - * Applies scale to particle locations based on their default lengths. - */ - public void toggleScale(Map locations) { + public void toggleScale(Map locations) { if (canceled) return; if (particleDefaultLength.isEmpty()) { for (Map.Entry entry : locations.entrySet()) { @@ -383,11 +345,7 @@ public void toggleScale(Map locations) { } } - /** - * Teleports all particles to their rotated positions relative to the - * composition origin. - */ - public void toggleRelative() { + public void toggleRelative() { if (!client) return; int size = Math.min(displayedEntries.size(), particleRotatedLocations.size()); for (int i = 0; i < size; i++) { @@ -404,7 +362,7 @@ public ParticleComposition setDisabledInterval(int interval) { return this; } - // ─── Rotation ──────────────────────────────────────────────────────── + // --”€--”€--”€ Rotation --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public void rotateToPoint(RelativeLocation to) { if (!client) { @@ -445,7 +403,7 @@ public void rotateAsAxis(double radian) { toggleRelative(); } - // ─── Pre-rotation helpers (used before display) ────────────────────── + // --”€--”€--”€ Pre-rotation helpers (used before display) --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public void preRotateTo(Map map, RelativeLocation to) { Math3DUtil.rotatePointsToPoint(new ArrayList<>(map.values()), to, axis); @@ -461,7 +419,7 @@ public void preRotateAsAxis(Map map, double a Math3DUtil.rotateAsAxis(new ArrayList<>(map.values()), axis, angle); } - // ─── Controllable interface support ─────────────────────────────────── + // --”€--”€--”€ Controllable interface support --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ @Override public UUID controlUUID() { @@ -484,11 +442,7 @@ public ParticleComposition getControlObject() { return this; } - /** - * Provides compatibility with code that expects a {@code Controllable}-style API. - * Used internally by CompositionStatusHelper via loadController(Controllable). - */ - public void loadController(Object controller) { + public void loadController(Object controller) { // Handled by CompositionStatusHelper via loadController(Controllable) } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleShapeComposition.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleShapeComposition.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleShapeComposition.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleShapeComposition.java index 6df31db..d62038e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleShapeComposition.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/ParticleShapeComposition.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.composition; import com.reiasu.reiparticlesapi.utils.RelativeLocation; @@ -98,6 +96,6 @@ public Map getParticles() { @Override public void onDisplay() { - // No-op — this class uses its own tick-based rendering + // No-op --” this class uses its own tick-based rendering } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleComposition.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleComposition.java similarity index 71% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleComposition.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleComposition.java index 7c8ba13..15cd65f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleComposition.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleComposition.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.composition; import com.reiasu.reiparticlesapi.utils.Math3DUtil; @@ -18,19 +16,9 @@ import java.util.SortedMap; import java.util.UUID; -/** - * Abstract composition that manages particles in a sequenced (indexed) manner. - *

- * Each particle slot is tracked by a bit in a {@code long[]} bit-set. Particles - * can be added/removed one at a time via {@link #addSingle()}/{@link #removeSingle()}, - * or in batches via {@link #addMultiple(int)}/{@link #removeMultiple(int)}. - *

- * The {@link #getAnimate() animate} helper allows defining predicate-gated - * animation steps that automatically add/remove particles over time. - */ public abstract class SequencedParticleComposition extends ParticleComposition { - // ─── Static encode/decode ──────────────────────────────────────────── + // --”€--”€--”€ Static encode/decode --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public static void encodeBase(SequencedParticleComposition data, FriendlyByteBuf buf) { ParticleComposition.encodeBase(data, buf); @@ -48,7 +36,7 @@ public static void decodeBase(SequencedParticleComposition instance, FriendlyByt instance.index.setMemoValue(buf.readLongArray()); } - // ─── Fields ────────────────────────────────────────────────────────── + // --”€--”€--”€ Fields --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private final SequencedCompositionAnimationHelper animate; private int count; @@ -58,7 +46,7 @@ public static void decodeBase(SequencedParticleComposition instance, FriendlyByt private final ArrayList> sequencedParticlesData = new ArrayList<>(); private UUID[] indexToUuid = new UUID[0]; - // ─── Constructors ──────────────────────────────────────────────────── + // --”€--”€--”€ Constructors --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ protected SequencedParticleComposition(Vec3 position, Level world) { super(position, world); @@ -74,7 +62,7 @@ protected SequencedParticleComposition(Vec3 position) { this(position, null); } - // ─── Property accessors ────────────────────────────────────────────── + // --”€--”€--”€ Property accessors --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public SequencedCompositionAnimationHelper getAnimate() { return animate; @@ -116,14 +104,11 @@ protected ArrayList> getSequencedPa return sequencedParticlesData; } - // ─── Abstract method ───────────────────────────────────────────────── + // --”€--”€--”€ Abstract method --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Returns the sequenced particle map (ordered by CompositionData). - */ - public abstract SortedMap getParticleSequenced(); + public abstract SortedMap getParticleSequenced(); - // ─── Overrides from ParticleComposition ────────────────────────────── + // --”€--”€--”€ Overrides from ParticleComposition --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ @Override public Map getParticles() { @@ -162,11 +147,7 @@ public void display() { onDisplay(); } - /** - * Called before the sequenced particles are displayed. Subclasses - * can override to modify the map before display. - */ - public void beforeDisplaySequenced(SortedMap map) { + public void beforeDisplaySequenced(SortedMap map) { // Override point } @@ -212,7 +193,7 @@ public void update(ParticleComposition other) { applyIndexDiff(oldIndex, index.get()); } - // ─── Rotation overrides ────────────────────────────────────────────── + // --”€--”€--”€ Rotation overrides --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ @Override public void rotateToPoint(RelativeLocation to) { @@ -256,12 +237,9 @@ public void rotateAsAxis(double radian) { toggleRelative(); } - // ─── Sequenced add/remove API ──────────────────────────────────────── + // --”€--”€--”€ Sequenced add/remove API --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Displays the particle at the current index and advances. - */ - public void addSingle() { + public void addSingle() { if (count <= 0) return; if (serverCurrentIndex < 0 || serverCurrentIndex >= count) return; @@ -282,10 +260,7 @@ public void addMultiple(int amount) { } } - /** - * Hides the particle at the current index and retreats. - */ - public void removeSingle() { + public void removeSingle() { if (count <= 0) return; int idx = Math.min(serverCurrentIndex, count - 1); if (idx < 0 || idx >= count) return; @@ -306,10 +281,7 @@ public void removeMultiple(int amount) { } } - /** - * Resets all particles to hidden and resets counters. - */ - public void resetAll() { + public void resetAll() { if (getClient() && count > 0) { int pages = pagesFor(count); long[] bits = index.get(); @@ -334,7 +306,7 @@ public void resetAll() { serverCurrentIndex = 0; } - // ─── Bit-set status management ─────────────────────────────────────── + // --”€--”€--”€ Bit-set status management --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public void setParticleStatus(int index, boolean generated) { if (index < 0 || index >= count) return; @@ -346,7 +318,7 @@ public boolean isParticleDisplayed(int index) { return getBit(this.index.get(), index); } - // ─── Index-based create/remove (client-side) ───────────────────────── + // --”€--”€--”€ Index-based create/remove (client-side) --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private void createWithIndex(int i) { if (!getClient()) return; @@ -381,7 +353,7 @@ private void removeWithIndex(int i) { indexToUuid[i] = null; } - // ─── Index diff application ────────────────────────────────────────── + // --”€--”€--”€ Index diff application --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private void applyIndexDiff(long[] oldBits, long[] newBits) { if (!getClient()) return; @@ -411,7 +383,7 @@ private void applyIndexDiff(long[] oldBits, long[] newBits) { } } - // ─── Internal helpers ──────────────────────────────────────────────── + // --”€--”€--”€ Internal helpers --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ private void ensureIndexCapacity(int newCount) { int pages = pagesFor(newCount); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleShapeComposition.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleShapeComposition.java similarity index 65% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleShapeComposition.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleShapeComposition.java index 4ed3e71..c4cd8fc 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleShapeComposition.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/SequencedParticleShapeComposition.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.composition; import com.reiasu.reiparticlesapi.utils.RelativeLocation; @@ -22,14 +20,6 @@ import java.util.function.Function; import java.util.concurrent.atomic.AtomicInteger; -/** - * Concrete sequenced composition that builds its particle map from a list of - * {@link PointsBuilder} instances, each paired with a data-supplier function. - *

- * Provides fluent API for adding points/builders, configuring scale helpers, - * and registering display/pre-display actions. Intended for client-side - * embedded use within other compositions. - */ public final class SequencedParticleShapeComposition extends SequencedParticleComposition { private final List>> points = new ArrayList<>(); @@ -46,7 +36,7 @@ public SequencedParticleShapeComposition(UUID uuid) { setControlUUID(uuid); } - // ─── Property accessors ────────────────────────────────────────────── + // --”€--”€--”€ Property accessors --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ public int getSpawnAge() { return spawnAge; @@ -64,12 +54,9 @@ public boolean getScaleReversed() { return scaleReversed; } - // ─── Scale helper configuration ────────────────────────────────────── + // --”€--”€--”€ Scale helper configuration --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Configures a linear scale helper. - */ - public SequencedParticleShapeComposition loadScaleHelper(double min, double max, int scalingTick) { + public SequencedParticleShapeComposition loadScaleHelper(double min, double max, int scalingTick) { CompositionScaleHelper helper = new CompositionScaleHelper(min, max, scalingTick); helper.loadComposition(this); this.scaleHelper = helper; @@ -77,10 +64,7 @@ public SequencedParticleShapeComposition loadScaleHelper(double min, double max, return this; } - /** - * Configures a bezier-curved scale helper. - */ - public SequencedParticleShapeComposition loadScaleHelperBezierValue( + public SequencedParticleShapeComposition loadScaleHelperBezierValue( double minScale, double maxScale, int scaleTick, RelativeLocation c1, RelativeLocation c2) { CompositionBezierScaleHelper helper = new CompositionBezierScaleHelper(scaleTick, minScale, maxScale, c1, c2); @@ -90,31 +74,22 @@ public SequencedParticleShapeComposition loadScaleHelperBezierValue( return this; } - // ─── Display action registration ───────────────────────────────────── + // --”€--”€--”€ Display action registration --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Registers an action to run after display is invoked. - */ - public SequencedParticleShapeComposition applyDisplayAction(Consumer action) { + public SequencedParticleShapeComposition applyDisplayAction(Consumer action) { invokes.add(action); return this; } - /** - * Registers an action to run before particles are displayed (receives the sorted map). - */ - public SequencedParticleShapeComposition applyBeforeDisplayAction( + public SequencedParticleShapeComposition applyBeforeDisplayAction( BiFunction, Void> action) { beforeInvokes.add(action); return this; } - // ─── Point registration ────────────────────────────────────────────── + // --”€--”€--”€ Point registration --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Adds a single point with a data supplier that receives both the point and an order index. - */ - public SequencedParticleShapeComposition applyPoint( + public SequencedParticleShapeComposition applyPoint( RelativeLocation point, BiFunction dataSupplier) { points.add(new AbstractMap.SimpleEntry<>( @@ -124,10 +99,7 @@ public SequencedParticleShapeComposition applyPoint( return this; } - /** - * Adds a single point with a data supplier that only receives the RelativeLocation. - */ - public SequencedParticleShapeComposition applyPointRel( + public SequencedParticleShapeComposition applyPointRel( RelativeLocation point, Function dataSupplier) { points.add(new AbstractMap.SimpleEntry<>( @@ -137,10 +109,7 @@ public SequencedParticleShapeComposition applyPointRel( return this; } - /** - * Adds a single point with a data supplier that only receives the order index. - */ - public SequencedParticleShapeComposition applyPointI( + public SequencedParticleShapeComposition applyPointI( RelativeLocation point, Function dataSupplier) { points.add(new AbstractMap.SimpleEntry<>( @@ -150,20 +119,14 @@ public SequencedParticleShapeComposition applyPointI( return this; } - /** - * Adds all points from a builder, with a data supplier that receives both point and order. - */ - public SequencedParticleShapeComposition applyBuilder( + public SequencedParticleShapeComposition applyBuilder( PointsBuilder builder, BiFunction dataSupplier) { points.add(new AbstractMap.SimpleEntry<>(builder, dataSupplier)); return this; } - /** - * Adds all points from a builder, with a data supplier that only receives the order index. - */ - public SequencedParticleShapeComposition applyBuilderI( + public SequencedParticleShapeComposition applyBuilderI( PointsBuilder builder, Function dataSupplier) { points.add(new AbstractMap.SimpleEntry<>( @@ -173,10 +136,7 @@ public SequencedParticleShapeComposition applyBuilderI( return this; } - /** - * Adds all points from a builder, with a data supplier that only receives the RelativeLocation. - */ - public SequencedParticleShapeComposition applyBuilderRel( + public SequencedParticleShapeComposition applyBuilderRel( PointsBuilder builder, Function dataSupplier) { points.add(new AbstractMap.SimpleEntry<>( @@ -186,12 +146,9 @@ public SequencedParticleShapeComposition applyBuilderRel( return this; } - // ─── Scale-reversal on status change ───────────────────────────────── + // --”€--”€--”€ Scale-reversal on status change --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ - /** - * Enables reversed scaling when the given status helper enters DISABLE state. - */ - public SequencedParticleShapeComposition setReversedScaleOnDisableStatus(StatusHelper status) { + public SequencedParticleShapeComposition setReversedScaleOnDisableStatus(StatusHelper status) { addPreTickAction(pc -> { if (status.getDisplayStatus() == StatusHelper.Status.DISABLE.id()) { scaleReversed = true; @@ -200,10 +157,7 @@ public SequencedParticleShapeComposition setReversedScaleOnDisableStatus(StatusH return this; } - /** - * Enables reversed scaling when the given composition's status enters DISABLE. - */ - public SequencedParticleShapeComposition setReversedScaleOnCompositionStatus(ParticleComposition composition) { + public SequencedParticleShapeComposition setReversedScaleOnCompositionStatus(ParticleComposition composition) { addPreTickAction(pc -> { if (composition.getStatus().getCurrentStatus() == StatusHelper.Status.DISABLE) { scaleReversed = true; @@ -212,7 +166,7 @@ public SequencedParticleShapeComposition setReversedScaleOnCompositionStatus(Par return this; } - // ─── Abstract/override implementations ─────────────────────────────── + // --”€--”€--”€ Abstract/override implementations --”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€--”€ @Override public SortedMap getParticleSequenced() { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/manager/ParticleCompositionManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/manager/ParticleCompositionManager.java similarity index 97% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/manager/ParticleCompositionManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/manager/ParticleCompositionManager.java index acceb59..851336d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/manager/ParticleCompositionManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/composition/manager/ParticleCompositionManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.composition.manager; import com.reiasu.reiparticlesapi.network.particle.composition.ParticleComposition; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeData.java similarity index 62% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeData.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeData.java index 075aef9..a289f29 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeData.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeData.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.data; public record DoubleRangeData(double min, double max) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeDataKt.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeDataKt.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeDataKt.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeDataKt.java index b64b385..ccd1358 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeDataKt.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/DoubleRangeDataKt.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.data; public final class DoubleRangeDataKt { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeData.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeData.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeData.java index 3fe5539..d0a3ef1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeData.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeData.java @@ -1,12 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.data; import java.util.concurrent.ThreadLocalRandom; -/** - * A range of float values with random sampling support. - */ public final class FloatRangeData { private final float min; private final float max; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeDataKt.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeDataKt.java similarity index 73% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeDataKt.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeDataKt.java index fcfba16..de83c5e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeDataKt.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/FloatRangeDataKt.java @@ -1,11 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.data; -/** - * Kotlin-style extension utilities for FloatRangeData. - * In pure Java, these serve as static helper methods. - */ public final class FloatRangeDataKt { private FloatRangeDataKt() { } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeData.java new file mode 100644 index 0000000..4f15840 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeData.java @@ -0,0 +1,14 @@ +package com.reiasu.reiparticlesapi.network.particle.data; + +import java.util.concurrent.ThreadLocalRandom; + +public final class IntRangeData extends RangeData { + + public IntRangeData(int min, int max) { + super(min, max); + } + + public int random() { + return ThreadLocalRandom.current().nextInt(getMin(), getMax()); + } +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeDataKt.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeDataKt.java new file mode 100644 index 0000000..bf8f093 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/IntRangeDataKt.java @@ -0,0 +1,19 @@ +package com.reiasu.reiparticlesapi.network.particle.data; + +public final class IntRangeDataKt { + + private IntRangeDataKt() { + } + + public static boolean isIn(int value, IntRangeData range) { + return value >= range.getMin() && value <= range.getMax(); + } + + public static IntRangeData minRangeTo(int min, int max) { + return new IntRangeData(min, max); + } + + public static IntRangeData maxRangeTo(int max, int min) { + return new IntRangeData(min, max); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/RangeData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/RangeData.java similarity index 69% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/RangeData.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/RangeData.java index fa2eb7d..e747792 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/RangeData.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/RangeData.java @@ -1,13 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.data; -/** - * Abstract base class for a min-max range of comparable values. - * Enforces the invariant that {@code min <= max} at construction time. - * - * @param the value type, must be self-comparable - */ public abstract class RangeData> { private T min; diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/SerializableData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/SerializableData.java new file mode 100644 index 0000000..cee5d37 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/data/SerializableData.java @@ -0,0 +1,10 @@ +package com.reiasu.reiparticlesapi.network.particle.data; + +import com.reiasu.reiparticlesapi.particles.ParticleDisplayer; + +public interface SerializableData { + + SerializableData clone(); + + ParticleDisplayer createDisplayer(); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/AutoParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/AutoParticleEmitters.java similarity index 68% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/AutoParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/AutoParticleEmitters.java index 45dc077..71d60e7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/AutoParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/AutoParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import net.minecraft.resources.ResourceLocation; @@ -7,15 +5,6 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; -/** - * Base class for emitters registered via {@code @ReiAutoRegister}. - *

- * Convention: subclasses declare - * {@code public static final ResourceLocation CODEC_ID = ...;} - * This constructor auto-reads that field and calls - * {@link #setEmittersID(ResourceLocation)} so every instance is - * immediately sync-ready without manual wiring. - */ public class AutoParticleEmitters extends ParticleEmitters { protected AutoParticleEmitters() { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassEmitters.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassEmitters.java index 0ba9675..3902d65 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import com.mojang.logging.LogUtils; @@ -30,11 +28,6 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -/** - * Abstract emitter class that adds physics simulation, wind, event handlers, - * interpolation, and particle spawning on top of ParticleEmitters. - * Server-side port of the Fabric ClassEmitters. - */ public abstract class ClassEmitters extends ParticleEmitters { private static final Logger LOGGER = LogUtils.getLogger(); @@ -58,9 +51,6 @@ public ClassEmitters(Vec3 pos, Level world) { bind(world, pos.x, pos.y, pos.z); } } - - // ---- Event handlers ---- - public void addEventHandler(ParticleEventHandler handler, boolean innerClass) { if (handler == null) return; String id = handler.getHandlerID(); @@ -86,9 +76,6 @@ public List collectEventHandles() { public ConcurrentHashMap> getHandlerList() { return handlerList; } - - // ---- Physics properties ---- - public double getAirDensity() { return airDensity; } @@ -112,9 +99,6 @@ public double getMass() { public void setMass(double mass) { this.mass = mass; } - - // ---- Wind ---- - public WindDirection getWind() { return wind; } @@ -124,9 +108,6 @@ public void setWind(WindDirection wind) { this.wind = wind; } } - - // ---- Interpolator ---- - public boolean getEnableInterpolator() { return enableInterpolator; } @@ -144,9 +125,6 @@ public void setEmittersInterpolator(Interpolator interpolator) { this.emittersInterpolator = interpolator; } } - - // ---- Delay / Playing ---- - public int getDelay() { return delay; } @@ -162,9 +140,6 @@ public boolean getPlaying() { public void setPlaying(boolean playing) { this.playing = playing; } - - // ---- Lifecycle ---- - public void start() { playing = true; } @@ -177,35 +152,17 @@ public void spawn(Level world, Vec3 pos) { if (world == null || pos == null) return; bind(world, pos.x, pos.y, pos.z); } + public abstract void doTick(); - // ---- Abstract methods ---- - - /** - * Called each tick when the emitter is playing and past its delay. - */ - public abstract void doTick(); - - /** - * Per-particle action called during spawning. - */ - public abstract void singleParticleAction( + public abstract void singleParticleAction( Controllable controller, SerializableData data, RelativeLocation spawnPos, Level spawnWorld, float particleLerpProgress, float posLerpProgress); - /** - * Generate particle data list for the current tick. - */ - public List> genParticles(float lerpProgress) { + public List> genParticles(float lerpProgress) { return Collections.emptyList(); } - - // ---- Physics ---- - - /** - * Update physics for a single particle: apply gravity, wind, and drag. - */ - public void updatePhysics(Vec3 pos, ControllableParticleData data, ControllableParticle particle) { + public void updatePhysics(Vec3 pos, ControllableParticleData data, ControllableParticle particle) { if (data == null || particle == null) return; Vec3 velocity = data.getVelocity(); @@ -226,9 +183,6 @@ public void updatePhysics(Vec3 pos, ControllableParticleData data, ControllableP data.setVelocity(velocity); } - - // ---- Tick override ---- - @Override protected void emitTick() { if (!playing) return; @@ -237,15 +191,9 @@ protected void emitTick() { doTick(); } - /** - * Spawn a particle at the given position with lerp progress. - */ - public void spawnParticle(Vec3 spawnPos, float lerpProgress) { + public void spawnParticle(Vec3 spawnPos, float lerpProgress) { // Server-side: override in subclasses for actual spawning } - - // ---- Encode/Decode ---- - public static final class Companion { private Companion() { } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassParticleEmitters.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassParticleEmitters.java index d93654b..a264b67 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ClassParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import com.reiasu.reiparticlesapi.network.particle.emitters.command.ParticleCommandQueue; @@ -13,11 +11,6 @@ import java.util.SortedMap; -/** - * Extended emitter class that adds shoot types, command queues, - * collision detection, and per-particle physics on top of ClassEmitters. - * Server-side port of the Fabric ClassParticleEmitters. - */ public abstract class ClassParticleEmitters extends ClassEmitters { public static final Companion Companion = new Companion(); @@ -30,9 +23,6 @@ public abstract class ClassParticleEmitters extends ClassEmitters { public ClassParticleEmitters(Vec3 pos, Level world) { super(pos, world); } - - // ---- Shoot type ---- - public EmittersShootType getShootType() { return shootType; } @@ -42,15 +32,9 @@ public void setShootType(EmittersShootType shootType) { this.shootType = shootType; } } - - // ---- Command queue ---- - public ParticleCommandQueue getCommandQueue() { return commandQueue; } - - // ---- Collision ---- - public boolean getEnableCollision() { return enableCollision; } @@ -67,10 +51,7 @@ public void setCollisionRadius(double collisionRadius) { this.collisionRadius = collisionRadius; } - /** - * Fire an event to all registered handlers matching the target event ID. - */ - public void fireEvent(ParticleEvent event) { + public void fireEvent(ParticleEvent event) { if (event == null) return; String eventId = event.getEventID(); for (SortedMap map : getHandlerList().values()) { @@ -82,9 +63,6 @@ public void fireEvent(ParticleEvent event) { } } } - - // ---- Encode/Decode ---- - public static final class Companion { private Companion() { } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ControllableParticleData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ControllableParticleData.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ControllableParticleData.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ControllableParticleData.java index 28be688..dbe1e86 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ControllableParticleData.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ControllableParticleData.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import com.reiasu.reiparticlesapi.network.particle.data.SerializableData; @@ -10,16 +8,7 @@ import java.util.UUID; -/** - * Mutable particle data that commands operate on. - *

- * Fields are aligned with the original Fabric {@code ControllableParticleData}: - * velocity, uuid, age/maxAge, size, alpha, color, speed, speedLimit, rotation, - * plus the existing emitter-range fields (minCount/maxCount/minAge/maxAge/minSize/maxSize/minSpeed/maxSpeed). - */ public class ControllableParticleData implements SerializableData { - - // ---- Emitter-range fields (existing) ---- private int color; private int minCount; private int maxCount; @@ -29,8 +18,6 @@ public class ControllableParticleData implements SerializableData { private double maxSize; private double minSpeed; private double maxSpeed; - - // ---- Per-particle runtime fields (aligned with Fabric original) ---- private UUID uuid = UUID.randomUUID(); private Vec3 velocity = Vec3.ZERO; private Vec3 position = Vec3.ZERO; @@ -47,9 +34,6 @@ public class ControllableParticleData implements SerializableData { private boolean faceToCamera = true; private int light = 15; private float visibleRange = 128.0f; - - // ---- Emitter-range getters/setters ---- - public int getColor() { return color; } public void setColor(int color) { this.color = color; } public int getMinCount() { return minCount; } @@ -68,9 +52,6 @@ public class ControllableParticleData implements SerializableData { public void setMinSpeed(double minSpeed) { this.minSpeed = minSpeed; } public double getMaxSpeed() { return maxSpeed; } public void setMaxSpeed(double maxSpeed) { this.maxSpeed = maxSpeed; } - - // ---- Per-particle runtime getters/setters ---- - public UUID getUuid() { return uuid; } public void setUuid(UUID uuid) { this.uuid = uuid; } @@ -118,9 +99,6 @@ public class ControllableParticleData implements SerializableData { public float getVisibleRange() { return visibleRange; } public void setVisibleRange(float visibleRange) { this.visibleRange = visibleRange; } - - // ---- Clone ---- - @Override public ParticleDisplayer createDisplayer() { return null; // Client-side only; server port returns null @@ -156,9 +134,6 @@ public ControllableParticleData clone() { copy.visibleRange = this.visibleRange; return copy; } - - // ---- Serialization ---- - public void writeToBuf(FriendlyByteBuf buf) { buf.writeInt(color); buf.writeInt(minCount); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugParticleEmitters.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugParticleEmitters.java index 2f833e0..d13006c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import net.minecraft.core.particles.DustParticleOptions; @@ -13,7 +11,7 @@ import java.util.UUID; public class DebugParticleEmitters extends ParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticlesapi", "debug_particle"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "debug_particle"); private final double x; private final double y; private final double z; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugRailgunEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugRailgunEmitters.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugRailgunEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugRailgunEmitters.java index d9076f3..1e4e109 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugRailgunEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DebugRailgunEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import net.minecraft.core.particles.DustParticleOptions; @@ -14,7 +12,7 @@ import java.util.UUID; public final class DebugRailgunEmitters extends ParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticlesapi", "debug_railgun"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "debug_railgun"); private static final DustParticleOptions BEAM_COLOR = new DustParticleOptions(new Vector3f(1.0f, 0.55f, 0.62f), 1.2f); private final Vec3 from; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DisplayableEmitterData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DisplayableEmitterData.java similarity index 62% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DisplayableEmitterData.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DisplayableEmitterData.java index 0f6b32b..e2099eb 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DisplayableEmitterData.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/DisplayableEmitterData.java @@ -1,17 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import com.reiasu.reiparticlesapi.network.particle.data.SerializableData; import com.reiasu.reiparticlesapi.particles.ParticleDisplayer; -/** - * A {@link SerializableData} implementation for emitter display data. - *

- * All methods currently throw {@link UnsupportedOperationException} matching - * the original Fabric source which also had "Not yet implemented" stubs. - * This class exists as a placeholder type for emitter data factories. - */ public final class DisplayableEmitterData implements SerializableData { @Override diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/EmitterRegistry.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/EmitterRegistry.java similarity index 71% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/EmitterRegistry.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/EmitterRegistry.java index dacfa14..19cf7be 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/EmitterRegistry.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/EmitterRegistry.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import net.minecraft.network.FriendlyByteBuf; @@ -12,13 +10,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; -/** - * Registry mapping {@link ResourceLocation} keys to integer IDs and decoders - * for {@link ParticleEmitters}. Both client and server must register in the - * same order so that the auto-assigned integer IDs match. - *

- * Network packets transmit VarInt IDs instead of full class-name strings. - */ public final class EmitterRegistry { public static final EmitterRegistry INSTANCE = new EmitterRegistry(); @@ -29,14 +20,7 @@ public final class EmitterRegistry { private EmitterRegistry() { } - /** - * Register an emitter type. Must be called in identical order on client and server. - * - * @param key unique {@link ResourceLocation} for this emitter type - * @param decoder function that reads a {@link ParticleEmitters} from a buffer - * @return the assigned integer ID - */ - public synchronized int register(ResourceLocation key, Function decoder) { + public synchronized int register(ResourceLocation key, Function decoder) { if (key == null || decoder == null) { throw new IllegalArgumentException("key and decoder must not be null"); } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleDataFactory.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleDataFactory.java new file mode 100644 index 0000000..3cd5ed0 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleDataFactory.java @@ -0,0 +1,7 @@ +package com.reiasu.reiparticlesapi.network.particle.emitters; + +@FunctionalInterface +public interface ParticleDataFactory { + + ControllableParticleData create(); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmitters.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmitters.java index 42c0dd8..9fa8571 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import com.reiasu.reiparticlesapi.network.particle.ServerController; @@ -16,29 +14,6 @@ import java.util.List; import java.util.UUID; -/** - * Base class for all particle emitters in the ReiParticles system. - *

- * Subclasses define custom particle effects by overriding {@link #emitTick()} - * (called each server/client tick while alive) and optionally - * {@link #writePayload(FriendlyByteBuf)} / {@link #readPayload(FriendlyByteBuf)} - * for network synchronization of custom parameters. - *

- * Every emitter subclass registered via {@code @ReiAutoRegister} must declare: - *

{@code
- * public static final ResourceLocation CODEC_ID =
- *         new ResourceLocation("mymod", "my_emitter");
- *
- * public static MyEmitter decode(FriendlyByteBuf buf) {
- *     MyEmitter e = new MyEmitter();
- *     e.decodeFromBuffer(buf);
- *     return e;
- * }
- * }
- * - * @see ParticleEmittersManager#spawnEmitters(Object, ServerLevel, double, double, double) - * @see AutoParticleEmitters - */ public abstract class ParticleEmitters implements ServerController { private ResourceLocation emittersID; private UUID uuid = UUID.randomUUID(); @@ -88,11 +63,7 @@ public void setTick(int tick) { this.tick = Math.max(0, tick); } - /** - * Binds this emitter to a world and position. Called automatically by - * {@link ParticleEmittersManager#spawnEmitters}. - */ - public ParticleEmitters bind(Level level, double x, double y, double z) { + public ParticleEmitters bind(Level level, double x, double y, double z) { this.level = level; this.position = new Vec3(x, y, z); return this; @@ -175,11 +146,7 @@ public int getThrottleInterval() { return throttleInterval; } - /** - * Set the tick interval for emission when players are beyond half of visibleRange. - * 1 = every tick (default), 2 = every other tick, etc. - */ - public void setThrottleInterval(int interval) { + public void setThrottleInterval(int interval) { this.throttleInterval = Math.max(1, interval); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManager.java similarity index 79% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManager.java index 12b19cb..b99ed78 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/ParticleEmittersManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; import com.reiasu.reiparticlesapi.event.ReiEventBus; @@ -26,29 +24,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; -/** - * Central manager for server-side and client-side particle emitters. - *

- * Threading model: All server-side mutation ({@link #spawnEmitters}, - * {@link #tickAll()}, {@link #removeEmitters}) happens on the main server thread. - * {@code EMITTERS} is guarded by {@code synchronized} for safety, but concurrent - * containers ({@code VISIBLE}, {@code CLIENT_EMITTERS}) are used only because they - * may be read from packet-handler threads. Do not call mutation methods off the - * server thread. - *

- * Server side: emitters are added via {@link #spawnEmitters}, ticked each server tick - * by {@link #tickAll()}, and automatically synchronized to nearby players with - * distance-based LOD throttling and player-sharding. - *

- * Client side: emitters received from the server are stored and ticked via - * {@link #tickClient()}. - *

- * Example — spawning an emitter on the server: - *

{@code
- * MyEmitter emitter = new MyEmitter(params);
- * ParticleEmittersManager.spawnEmitters(emitter, serverLevel, x, y, z);
- * }
- */ public final class ParticleEmittersManager { private static final List EMITTERS = new ArrayList<>(); private static final Map> VISIBLE = new ConcurrentHashMap<>(); @@ -59,7 +34,6 @@ public final class ParticleEmittersManager { private static long visibilityTick = 0; private static final int PLAYER_SHARD_COUNT = 4; - // ---- Per-tick statistics (reset each tick, snapshot for debug) ---- private static int statSynced; private static int statSkippedLod; private static int statSkippedShard; @@ -78,13 +52,6 @@ public static void registerBuiltinCodecs() { registerCodec(DebugRailgunEmitters.CODEC_ID, DebugRailgunEmitters::decode); } - /** - * Registers a codec (decoder) for a particle emitter type. - * - * @param id the {@link ResourceLocation} identifying the emitter type - * @param decoder factory that creates an emitter instance from a network buffer - * @return the assigned integer registry ID, or {@code -1} on failure - */ public static int registerCodec(ResourceLocation id, Function decoder) { if (id == null || decoder == null) { return -1; @@ -103,21 +70,11 @@ public static void spawnEmitters(Object emitter) { spawnEmitters(emitter, null, 0.0, 0.0, 0.0); } - /** - * Spawns a particle emitter on the server. The emitter will be bound to the - * given level and position, ticked automatically, and synced to nearby players. - * - * @param emitter the emitter instance (must extend {@link ParticleEmitters}) - * @param level the server level to bind to - * @param x spawn X coordinate - * @param y spawn Y coordinate - * @param z spawn Z coordinate - */ public static void spawnEmitters(Object emitter, ServerLevel level, double x, double y, double z) { if (!(emitter instanceof ParticleEmitters particleEmitters)) { return; } - // Global emitter budget from APIConfig + // TODO: log a warning when hitting the limit? int limit = APIConfig.INSTANCE.getParticleCountLimit(); synchronized (EMITTERS) { if (EMITTERS.size() >= limit) { @@ -153,17 +110,10 @@ public static void createOrChangeClient(ParticleEmitters emitters, Level viewWor } } - /** - * Returns the last tick's statistics: [synced, skippedLod, skippedShard, throttled]. - */ public static int[] getLastTickStats() { return lastTickStats.clone(); } - /** - * Returns a human-readable debug summary of the emitter system state. - * Includes active emitter count, viewer counts, and last tick statistics. - */ public static String getDebugInfo() { int serverCount; synchronized (EMITTERS) { @@ -212,7 +162,7 @@ private static void updateClientVisible(ParticleEmitters emitters, long tick) { List players = level.players(); for (int i = 0; i < players.size(); i++) { - // Shard players across ticks to reduce per-tick cost from E*P to E*(P/N) + // shard players across ticks if (i % PLAYER_SHARD_COUNT != (int)(tick % PLAYER_SHARD_COUNT)) { statSkippedShard++; continue; @@ -233,7 +183,7 @@ private static void updateClientVisible(ParticleEmitters emitters, long tick) { } if (shouldView) { - // Distance-based LOD: closer players get more frequent updates + // LOD: skip updates for far players double dist = player.position().distanceTo(emitters.position()); double range = emitters.getVisibleRange(); int lodInterval = computeLodInterval(dist, range); @@ -246,15 +196,13 @@ private static void updateClientVisible(ParticleEmitters emitters, long tick) { } } - /** - * Distance-based LOD: near=every tick, mid=every 3, far=every 6, very far=every 12. - */ - private static int computeLodInterval(double distance, double visibleRange) { - double ratio = distance / Math.max(1.0, visibleRange); - if (ratio < 0.25) return 1; // near: every tick - if (ratio < 0.50) return 3; // mid: every 3 ticks - if (ratio < 0.75) return 6; // far: every 6 ticks - return 12; // very far: every 12 ticks + // FIXME: these thresholds are hardcoded, should be configurable + private static int computeLodInterval(double dist, double range) { + double r = dist / Math.max(1.0, range); + if (r < 0.25) return 1; + if (r < 0.50) return 3; + if (r < 0.75) return 6; + return 12; } private static boolean canViewEmitter(ParticleEmitters emitters, ServerPlayer player) { @@ -344,7 +292,6 @@ private static void pruneDisconnectedPlayers() { VISIBLE.clear(); return; } - // Collect the server instance once — O(1) per prune instead of O(E×P). net.minecraft.server.MinecraftServer server = null; synchronized (EMITTERS) { for (ParticleEmitters emitter : EMITTERS) { @@ -362,7 +309,6 @@ private static void pruneDisconnectedPlayers() { srv.getPlayerList().getPlayer(entry.getKey()) == null); } - /** Ticks all client-side emitters. Call once per client tick. */ public static void tickClient() { CLIENT_EMITTERS.entrySet().removeIf(entry -> { ParticleEmitters emitters = entry.getValue(); @@ -381,7 +327,6 @@ public static int activeCount() { } } - /** Cancels and removes all emitters (both server and client). */ public static void clear() { synchronized (EMITTERS) { for (ParticleEmitters emitters : EMITTERS) { @@ -396,14 +341,12 @@ public static void clear() { CLIENT_EMITTERS.clear(); } - /** Returns a snapshot of all active server-side emitters (unmodifiable). */ public static List getEmitters() { synchronized (EMITTERS) { return Collections.unmodifiableList(new ArrayList<>(EMITTERS)); } } - /** Returns an unmodifiable view of all active client-side emitters keyed by UUID. */ public static Map getClientEmitters() { return Collections.unmodifiableMap(CLIENT_EMITTERS); } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/PhysicConstant.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/PhysicConstant.java new file mode 100644 index 0000000..1bff4c9 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/PhysicConstant.java @@ -0,0 +1,15 @@ +package com.reiasu.reiparticlesapi.network.particle.emitters; + +public final class PhysicConstant { + + public static final double EARTH_GRAVITY = 0.05; + + + public static final double SEA_AIR_DENSITY = 1.225; + + + public static final double DRAG_COEFFICIENT = 0.01; + + + public static final double CROSS_SECTIONAL_AREA = 0.01; +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/SimpleRandomParticleData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/SimpleRandomParticleData.java similarity index 65% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/SimpleRandomParticleData.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/SimpleRandomParticleData.java index af6dcad..c4bcadf 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/SimpleRandomParticleData.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/SimpleRandomParticleData.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters; public class SimpleRandomParticleData extends ControllableParticleData { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/OrbitMode.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/OrbitMode.java similarity index 68% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/OrbitMode.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/OrbitMode.java index 8e8ec99..fe14ef1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/OrbitMode.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/OrbitMode.java @@ -1,10 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; -/** - * Defines the orbit calculation mode for {@code ParticleOrbitCommand}. - */ public enum OrbitMode { /** Full Newtonian force-based orbit (gravitational pull + velocity) */ PHYSICAL, diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleAttractionCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleAttractionCommand.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleAttractionCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleAttractionCommand.java index 2f46bce..a1ce699 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleAttractionCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleAttractionCommand.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; @@ -9,10 +7,6 @@ import java.util.function.Supplier; -/** - * Applies an attraction force toward a target position. Particles accelerate - * toward the target with configurable strength, range, and inverse-power falloff. - */ public final class ParticleAttractionCommand implements ParticleCommand { private Supplier target = () -> Vec3.ZERO; diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommand.java new file mode 100644 index 0000000..ca46d55 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommand.java @@ -0,0 +1,10 @@ +package com.reiasu.reiparticlesapi.network.particle.emitters.command; + +import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; +import com.reiasu.reiparticlesapi.particles.ControllableParticle; + +@FunctionalInterface +public interface ParticleCommand { + + void execute(ControllableParticleData data, ControllableParticle particle); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommandQueue.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommandQueue.java similarity index 60% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommandQueue.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommandQueue.java index c1e1505..b71d13e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommandQueue.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleCommandQueue.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.mojang.logging.LogUtils; @@ -11,19 +9,10 @@ import java.util.Deque; import java.util.function.Consumer; -/** - * An ordered queue of {@link ParticleCommand}s with optional execution predicates. - *

- * Each entry pairs a command with a predicate that decides whether it should fire - * for a given particle on each tick. - */ public final class ParticleCommandQueue { private static final Logger LOGGER = LogUtils.getLogger(); - /** - * Predicate that receives (command, data, particle) and returns true if the command should execute. - */ - @FunctionalInterface + @FunctionalInterface public interface CommandPredicate { boolean test(ParticleCommand command, ControllableParticleData data, ControllableParticle particle); } @@ -36,10 +25,7 @@ public Deque getCommands() { return commands; } - /** - * Iterate all commands, executing those whose predicate passes. - */ - public void applyVelocity(ControllableParticleData data, ControllableParticle particle) { + public void applyVelocity(ControllableParticleData data, ControllableParticle particle) { for (Entry entry : commands) { if (entry.predicate.test(entry.command, data, particle)) { entry.command.execute(data, particle); @@ -47,11 +33,7 @@ public void applyVelocity(ControllableParticleData data, ControllableParticle pa } } - /** - * Apply a mutator to the command at the given index (0-based). - * Out-of-bounds indices are silently ignored. - */ - public ParticleCommandQueue updateWith(int index, Consumer applier) { + public ParticleCommandQueue updateWith(int index, Consumer applier) { int i = 0; for (Entry entry : commands) { if (i == index) { @@ -69,10 +51,7 @@ public ParticleCommandQueue updateWith(int index, Co return this; } - /** - * Apply a mutator to every command that is an instance of the given type. - */ - public ParticleCommandQueue updateWithTypes(Class type, Consumer applier) { + public ParticleCommandQueue updateWithTypes(Class type, Consumer applier) { for (Entry entry : commands) { if (type.isInstance(entry.command)) { applier.accept(type.cast(entry.command)); @@ -81,26 +60,17 @@ public ParticleCommandQueue updateWithTypes(Class return this; } - /** - * Add a command that always executes. - */ - public ParticleCommandQueue add(ParticleCommand command) { + public ParticleCommandQueue add(ParticleCommand command) { commands.add(new Entry(command, ALWAYS_TRUE)); return this; } - /** - * Add a command with a custom execution predicate. - */ - public ParticleCommandQueue add(ParticleCommand command, CommandPredicate predicate) { + public ParticleCommandQueue add(ParticleCommand command, CommandPredicate predicate) { commands.add(new Entry(command, predicate)); return this; } - /** - * Internal storage for a command + its predicate. - */ - public static final class Entry { + public static final class Entry { public final ParticleCommand command; public final CommandPredicate predicate; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDistortionCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDistortionCommand.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDistortionCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDistortionCommand.java index bb878cd..b3fc352 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDistortionCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDistortionCommand.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; @@ -8,11 +6,6 @@ import java.util.function.Supplier; -/** - * Applies spatial distortion/deformation effects to particles around a center - * position. Uses procedural noise to push particles along radial, axial, and - * tangential directions with configurable intensity and life-curve attenuation. - */ public final class ParticleDistortionCommand implements ParticleCommand { private Supplier center = () -> Vec3.ZERO; @@ -156,9 +149,6 @@ public void execute(ControllableParticleData data, ControllableParticle particle data.setVelocity(data.getVelocity().add(dv)); } - - // ---- Helper methods ---- - private static Vec3 safeNormalize(Vec3 v) { double len = v.length(); if (len < 1.0E-9) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDragCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDragCommand.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDragCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDragCommand.java index 26030ab..1678b07 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDragCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleDragCommand.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; @@ -7,10 +5,6 @@ import com.reiasu.reiparticlesapi.utils.GraphMathHelper; import net.minecraft.world.phys.Vec3; -/** - * Applies velocity damping (drag) to particles. Combines exponential damping - * with optional linear drag and a minimum speed cutoff. - */ public final class ParticleDragCommand implements ParticleCommand { private double damping = 0.15; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleFlowFieldCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleFlowFieldCommand.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleFlowFieldCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleFlowFieldCommand.java index d685a80..ee35f52 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleFlowFieldCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleFlowFieldCommand.java @@ -1,16 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; import com.reiasu.reiparticlesapi.particles.ControllableParticle; import net.minecraft.world.phys.Vec3; -/** - * Drives particles along a procedural 3D flow/vector field. - * The field is computed from sine/cosine functions of position and time, - * creating an organic turbulent motion pattern. - */ public final class ParticleFlowFieldCommand implements ParticleCommand { private double amplitude = 0.15; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleGravityCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleGravityCommand.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleGravityCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleGravityCommand.java index 0b4cba7..724bfe8 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleGravityCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleGravityCommand.java @@ -1,14 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; import com.reiasu.reiparticlesapi.particles.ControllableParticle; import net.minecraft.world.phys.Vec3; -/** - * Applies downward gravity to a particle's velocity. - */ public final class ParticleGravityCommand implements ParticleCommand { private final double gravity; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleNoiseCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleNoiseCommand.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleNoiseCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleNoiseCommand.java index 909dc87..833e95f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleNoiseCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleNoiseCommand.java @@ -1,16 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; import com.reiasu.reiparticlesapi.particles.ControllableParticle; import net.minecraft.world.phys.Vec3; -/** - * Adds procedural noise-based displacement to particle movement. - * Uses a built-in value noise function (no external library) to create - * organic, non-repeating motion patterns. - */ public final class ParticleNoiseCommand implements ParticleCommand { private double strength = 0.03; @@ -87,9 +80,6 @@ public void execute(ControllableParticleData data, ControllableParticle particle data.setVelocity(v); } - - // ---- Value noise implementation (matches original Fabric code) ---- - private static double fade(double t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleOrbitCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleOrbitCommand.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleOrbitCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleOrbitCommand.java index f24b15b..99e923e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleOrbitCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleOrbitCommand.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; @@ -8,10 +6,6 @@ import java.util.function.Supplier; -/** - * Makes particles orbit around a center position with configurable radius, - * angular speed, radial correction, and orbit mode (PHYSICAL / SPRING / SNAP). - */ public final class ParticleOrbitCommand implements ParticleCommand { private Supplier center = () -> Vec3.ZERO; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleRotationForceCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleRotationForceCommand.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleRotationForceCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleRotationForceCommand.java index 4459244..778e1a2 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleRotationForceCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleRotationForceCommand.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; @@ -9,11 +7,6 @@ import java.util.function.Supplier; -/** - * Applies a rotational (tangential) force to particles around a center axis. - * The force direction is the cross product of the axis and the radial vector, - * attenuated by inverse-power distance falloff. - */ public final class ParticleRotationForceCommand implements ParticleCommand { private Supplier center = () -> Vec3.ZERO; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleVortexCommand.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleVortexCommand.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleVortexCommand.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleVortexCommand.java index 466e234..71510e8 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleVortexCommand.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/command/ParticleVortexCommand.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.command; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; @@ -9,10 +7,6 @@ import java.util.function.Supplier; -/** - * Creates a vortex/spiral force effect. Combines tangential swirl, radial pull - * inward, and axial lift, all attenuated by inverse-power distance falloff. - */ public final class ParticleVortexCommand implements ParticleCommand { private Supplier center = () -> Vec3.ZERO; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BallWindDirection.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BallWindDirection.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BallWindDirection.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BallWindDirection.java index 4ec3888..9807d01 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BallWindDirection.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BallWindDirection.java @@ -1,15 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.environment.wind; import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmitters; import com.reiasu.reiparticlesapi.utils.RelativeLocation; import net.minecraft.world.phys.Vec3; -/** - * A wind direction with a spherical area of effect. - * Particles outside the {@code radius} from the emitter + offset are unaffected. - */ public final class BallWindDirection implements WindDirection { public static final String ID = "ball"; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BoxWindDirection.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BoxWindDirection.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BoxWindDirection.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BoxWindDirection.java index 8919b16..bcecb0a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BoxWindDirection.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/BoxWindDirection.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.environment.wind; import com.reiasu.reiparticlesapi.barrages.HitBox; @@ -8,19 +6,6 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -/** - * A wind direction with a box-shaped area of effect. - * Particles outside the {@link HitBox} (offset from the emitter position) - * are unaffected. - *

- * When {@code relative} is {@code true}, the wind direction at each particle - * position is the vector from the emitter to the particle, scaled by the - * wind speed expression value. When {@code false}, the fixed direction - * vector is used. - *

- * Forge port note: the wind speed expression is evaluated as a constant double - * (parsed as constant). - */ public final class BoxWindDirection implements WindDirection { public static final String ID = "box"; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/GlobalWindDirection.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/GlobalWindDirection.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/GlobalWindDirection.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/GlobalWindDirection.java index 3aa6730..7d88fde 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/GlobalWindDirection.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/GlobalWindDirection.java @@ -1,17 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.environment.wind; import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmitters; import net.minecraft.world.phys.Vec3; -/** - * A wind direction that applies uniformly across all space (infinite range). - *

- * When {@code relative} is true, the wind vector is computed as the direction - * from the emitter to the particle, scaled by {@code windSpeedExpress}. - * When false, the fixed {@code direction} vector is returned directly. - */ public final class GlobalWindDirection implements WindDirection { public static final String ID = "global"; @@ -89,7 +80,7 @@ public Vec3 getWind(Vec3 particlePos) { @Override public boolean inRange(Vec3 pos) { - return true; // global — always in range + return true; // global --” always in range } private static double parseSpeed(String express, double length) { diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirection.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirection.java new file mode 100644 index 0000000..c0f1c0b --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirection.java @@ -0,0 +1,29 @@ +package com.reiasu.reiparticlesapi.network.particle.emitters.environment.wind; + +import com.reiasu.reiparticlesapi.network.particle.emitters.ParticleEmitters; +import net.minecraft.world.phys.Vec3; + +public interface WindDirection { + + Vec3 getDirection(); + + void setDirection(Vec3 direction); + + boolean getRelative(); + + void setRelative(boolean relative); + + String getWindSpeedExpress(); + + void setWindSpeedExpress(String express); + + WindDirection loadEmitters(ParticleEmitters emitters); + + boolean hasLoadedEmitters(); + + String getID(); + + Vec3 getWind(Vec3 particlePos); + + boolean inRange(Vec3 pos); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirections.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirections.java similarity index 52% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirections.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirections.java index e8bd5de..f6c8e63 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirections.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/environment/wind/WindDirections.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.environment.wind; import com.reiasu.reiparticlesapi.network.particle.emitters.PhysicConstant; @@ -9,13 +7,6 @@ import java.util.Map; import java.util.function.Supplier; -/** - * Registry and physics helper for {@link WindDirection} implementations. - *

- * Forge port note: The Fabric version registered StreamCodec per wind type. In the - * Forge port we register factory suppliers instead; actual serialization happens at - * a higher level using FriendlyByteBuf when needed. - */ public final class WindDirections { public static final WindDirections INSTANCE = new WindDirections(); @@ -25,17 +16,11 @@ public final class WindDirections { private WindDirections() { } - /** - * Register a wind direction factory by ID. - */ - public void register(String id, Supplier factory) { + public void register(String id, Supplier factory) { factories.put(id, factory); } - /** - * Look up a factory by ID. Throws if not found. - */ - public Supplier getFactoryFromID(String id) { + public Supplier getFactoryFromID(String id) { Supplier factory = factories.get(id); if (factory == null) { throw new IllegalArgumentException("Unknown WindDirection ID: " + id); @@ -43,21 +28,7 @@ public Supplier getFactoryFromID(String id) { return factory; } - /** - * Compute the acceleration vector caused by wind drag on a particle. - *

- * Uses simplified aerodynamic drag: F = 0.5 * rho * Cd * A * |V_rel|^2 * dir(V_rel) - * scaled by 0.05 for per-tick integration. - * - * @param wind the wind source - * @param pos the particle's world position - * @param airDensity air density (kg/m^3), typically {@link PhysicConstant#SEA_AIR_DENSITY} - * @param dragCoefficient drag coefficient, typically {@link PhysicConstant#DRAG_COEFFICIENT} - * @param crossSectionalArea cross-section area, typically {@link PhysicConstant#CROSS_SECTIONAL_AREA} - * @param v the particle's current velocity - * @return the acceleration vector to add to particle velocity - */ - public Vec3 handleWindForce(WindDirection wind, Vec3 pos, double airDensity, + public Vec3 handleWindForce(WindDirection wind, Vec3 pos, double airDensity, double dragCoefficient, double crossSectionalArea, Vec3 v) { if (!wind.inRange(pos)) { return Vec3.ZERO; @@ -73,18 +44,12 @@ public Vec3 handleWindForce(WindDirection wind, Vec3 pos, double airDensity, return Vec3.ZERO; } - /** - * Overload that defaults velocity to zero. - */ - public Vec3 handleWindForce(WindDirection wind, Vec3 pos, double airDensity, + public Vec3 handleWindForce(WindDirection wind, Vec3 pos, double airDensity, double dragCoefficient, double crossSectionalArea) { return handleWindForce(wind, pos, airDensity, dragCoefficient, crossSectionalArea, Vec3.ZERO); } - /** - * Called during mod init to register built-in wind types. - */ - public void init() { + public void init() { register(GlobalWindDirection.ID, () -> new GlobalWindDirection(Vec3.ZERO)); register(BallWindDirection.ID, () -> new BallWindDirection(Vec3.ZERO, 10.0, new com.reiasu.reiparticlesapi.utils.RelativeLocation())); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleCollideEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleCollideEvent.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleCollideEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleCollideEvent.java index 19d3881..480e955 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleCollideEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleCollideEvent.java @@ -1,14 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.event; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; import com.reiasu.reiparticlesapi.particles.ControllableParticle; import net.minecraft.world.phys.HitResult; -/** - * Fired when a particle collides with any block or entity (general ray-cast hit). - */ public final class ParticleCollideEvent implements ParticleEvent { public static final String EVENT_ID = "ParticleColliderEvent"; diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEvent.java new file mode 100644 index 0000000..783d9c1 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEvent.java @@ -0,0 +1,21 @@ +package com.reiasu.reiparticlesapi.network.particle.emitters.event; + +import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; +import com.reiasu.reiparticlesapi.particles.ControllableParticle; + +public interface ParticleEvent { + + String getEventID(); + + ControllableParticle getParticle(); + + void setParticle(ControllableParticle particle); + + ControllableParticleData getParticleData(); + + void setParticleData(ControllableParticleData data); + + boolean getCanceled(); + + void setCanceled(boolean canceled); +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandler.java new file mode 100644 index 0000000..a26fef7 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandler.java @@ -0,0 +1,17 @@ +package com.reiasu.reiparticlesapi.network.particle.emitters.event; + +public interface ParticleEventHandler extends Comparable { + + void handle(ParticleEvent event); + + String getTargetEventID(); + + String getHandlerID(); + + int getPriority(); + + @Override + default int compareTo(ParticleEventHandler other) { + return this.getPriority() - other.getPriority(); + } +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandlerManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandlerManager.java new file mode 100644 index 0000000..75b4fc0 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleEventHandlerManager.java @@ -0,0 +1,31 @@ +package com.reiasu.reiparticlesapi.network.particle.emitters.event; + +import java.util.HashMap; +import java.util.Map; + +public final class ParticleEventHandlerManager { + + public static final ParticleEventHandlerManager INSTANCE = new ParticleEventHandlerManager(); + + private final Map registerHandlers = new HashMap<>(); + + private ParticleEventHandlerManager() { + } + + public ParticleEventHandler getHandlerById(String id) { + return registerHandlers.get(id); + } + + public void register(ParticleEventHandler handler) { + registerHandlers.put(handler.getHandlerID(), handler); + } + + public boolean hasRegister(String id) { + return registerHandlers.containsKey(id); + } + + public void init() { + // Fabric version used ReiAPIScanner for auto-registration. + // Forge port: register handlers explicitly or use Forge event bus. + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleHitEntityEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleHitEntityEvent.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleHitEntityEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleHitEntityEvent.java index c7b03d9..12e0839 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleHitEntityEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleHitEntityEvent.java @@ -1,14 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.event; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; import com.reiasu.reiparticlesapi.particles.ControllableParticle; import net.minecraft.world.entity.Entity; -/** - * Fired when a particle's trajectory intersects with a living entity. - */ public final class ParticleHitEntityEvent implements ParticleEvent { public static final String EVENT_ID = "ParticleHitEntityEvent"; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnGroundEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnGroundEvent.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnGroundEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnGroundEvent.java index 113518e..fef75b1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnGroundEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnGroundEvent.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.event; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; @@ -8,9 +6,6 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; -/** - * Fired when a particle hits the ground (block collision from above/below). - */ public final class ParticleOnGroundEvent implements ParticleEvent { public static final String EVENT_ID = "ParticleOnGroundEvent"; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnLiquidEvent.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnLiquidEvent.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnLiquidEvent.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnLiquidEvent.java index 1f3e2de..2688f0e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnLiquidEvent.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/event/ParticleOnLiquidEvent.java @@ -1,14 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.event; import com.reiasu.reiparticlesapi.network.particle.emitters.ControllableParticleData; import com.reiasu.reiparticlesapi.particles.ControllableParticle; import net.minecraft.core.BlockPos; -/** - * Fired when a particle enters a liquid block (water, lava, etc.). - */ public final class ParticleOnLiquidEvent implements ParticleEvent { public static final String EVENT_ID = "ParticleOnLiquidEvent"; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/DefendClassParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/DefendClassParticleEmitters.java similarity index 92% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/DefendClassParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/DefendClassParticleEmitters.java index 59783f5..d4e1921 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/DefendClassParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/DefendClassParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -21,13 +19,9 @@ import java.util.Random; import java.util.UUID; -/** - * Shield/defend emitter that spawns particles in a spherical shell - * with inward velocity, creating a contracting shield effect. - */ public final class DefendClassParticleEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "defend_class"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "defend_class"); private ControllableParticleData templateData = new ControllableParticleData(); private final Random random = new Random(System.currentTimeMillis()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExampleClassParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExampleClassParticleEmitters.java similarity index 92% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExampleClassParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExampleClassParticleEmitters.java index f69bd19..c104812 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExampleClassParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExampleClassParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -19,12 +17,9 @@ import java.util.List; import java.util.Map; -/** - * Example emitter that spawns particles on a ball surface with inward velocity. - */ public final class ExampleClassParticleEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "example_class"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "example_class"); private ControllableParticleData templateData = new ControllableParticleData(); private Vec3 moveDirection = Vec3.ZERO; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExplodeClassParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExplodeClassParticleEmitters.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExplodeClassParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExplodeClassParticleEmitters.java index 98bdeee..52267a0 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExplodeClassParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/ExplodeClassParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -21,13 +19,9 @@ import java.util.Map; import java.util.Random; -/** - * Explosion emitter that spawns particles on a ball surface with random outward velocity - * and applies velocity drag each tick via physics. - */ public final class ExplodeClassParticleEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "explode_class"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "explode_class"); private ControllableParticleData templateData = new ControllableParticleData(); private final Random random = new Random(System.currentTimeMillis()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/FireClassParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/FireClassParticleEmitters.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/FireClassParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/FireClassParticleEmitters.java index 7fe0cc3..912ee71 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/FireClassParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/FireClassParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -21,13 +19,9 @@ import java.util.Map; import java.util.Random; -/** - * Fire emitter that spawns flame-colored particles with upward velocity - * and slight outward spread, simulating a fire column effect. - */ public final class FireClassParticleEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "fire_class"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "fire_class"); private ControllableParticleData templateData = new ControllableParticleData(); private final Random random = new Random(System.currentTimeMillis()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/LightningClassParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/LightningClassParticleEmitters.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/LightningClassParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/LightningClassParticleEmitters.java index 4bb7608..2ccd731 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/LightningClassParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/LightningClassParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -20,13 +18,9 @@ import java.util.Map; import java.util.Random; -/** - * Lightning-bolt particle emitter. Uses {@link Math3DUtil#getLightningEffectPoints} - * to generate branching bolt geometry each tick. - */ public final class LightningClassParticleEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "lightning_class"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "lightning_class"); private ControllableParticleData templateData = new ControllableParticleData(); private final Random random = new Random(System.currentTimeMillis()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PhysicsParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PhysicsParticleEmitters.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PhysicsParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PhysicsParticleEmitters.java index 60d5652..d3327fd 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PhysicsParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PhysicsParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -20,16 +18,9 @@ import java.util.Map; import java.util.Random; -/** - * Physics-enabled emitter that spawns particles with full gravity, wind, - * air drag, and collision simulation. The most feature-rich emitter in the API. - *

- * Supports configurable spawn count, spawn shape (ball/box/point), - * initial velocity distribution, and per-particle physics updates. - */ public final class PhysicsParticleEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "physics_particle"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "physics_particle"); private ControllableParticleData templateData = new ControllableParticleData(); private final Random random = new Random(System.currentTimeMillis()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetLaserEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetLaserEmitters.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetLaserEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetLaserEmitters.java index 3bdd3e4..2ba054a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetLaserEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetLaserEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -20,13 +18,9 @@ import java.util.Map; import java.util.Random; -/** - * Laser beam emitter that spawns particles along a line from origin to target, - * with optional ring cross-sections for visual depth. - */ public final class PresetLaserEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "preset_laser"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "preset_laser"); private ControllableParticleData templateData = new ControllableParticleData(); private final Random random = new Random(System.currentTimeMillis()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetTestEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetTestEmitters.java similarity index 92% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetTestEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetTestEmitters.java index 047e714..4936f9c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetTestEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/PresetTestEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -21,13 +19,9 @@ import java.util.Map; import java.util.Random; -/** - * Preset test emitter for development/debug purposes. - * Spawns particles in a simple ring pattern. - */ public final class PresetTestEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "preset_test"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "preset_test"); private ControllableParticleData templateData = new ControllableParticleData(); private final Random random = new Random(System.currentTimeMillis()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/SimpleParticleEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/SimpleParticleEmitters.java similarity index 92% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/SimpleParticleEmitters.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/SimpleParticleEmitters.java index 6b06d78..1286940 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/SimpleParticleEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/impl/SimpleParticleEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.impl; import com.reiasu.reiparticlesapi.network.particle.emitters.ClassParticleEmitters; @@ -21,17 +19,9 @@ import java.util.Map; import java.util.Random; -/** - * General-purpose particle emitter with configurable count, offset, - * shoot type, and expression-evaluated position offsets per tick. - *

- * In the original Fabric version, math expressions (evalEmittersXWithT, etc.) - * were used to compute dynamic positions. In this Forge port, these are stored - * as strings for serialization compatibility but evaluated as constants. - */ public final class SimpleParticleEmitters extends ClassParticleEmitters { - public static final ResourceLocation ID = new ResourceLocation("reiparticlesapi", "simple_particle"); + public static final ResourceLocation ID = ResourceLocation.fromNamespaceAndPath("reiparticlesapi", "simple_particle"); private ControllableParticleData templateData; private final Random random = new Random(System.currentTimeMillis()); @@ -236,10 +226,7 @@ public void update(ParticleEmitters emitters) { } } - /** - * Evaluate a math expression string with variable {@code t} (tick). - */ - private static double evalExpression(String expr, int tick) { + private static double evalExpression(String expr, int tick) { if (expr == null || expr.isEmpty()) return 0.0; try { return new com.reiasu.reiparticlesapi.utils.math.ExpressionEvaluator(expr) diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/BoxEmittersShootType.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/BoxEmittersShootType.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/BoxEmittersShootType.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/BoxEmittersShootType.java index fa9db60..0cdbb9c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/BoxEmittersShootType.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/BoxEmittersShootType.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.type; import com.reiasu.reiparticlesapi.barrages.HitBox; @@ -9,15 +7,6 @@ import java.util.List; import java.util.concurrent.ThreadLocalRandom; -/** - * Emitter shoot type that distributes particles randomly within an - * axis-aligned {@link HitBox} volume. - *

- * Each particle's spawn position is a random point inside the box, - * offset from the emitter origin. If the emitter's base direction - * vector is (near-)zero the default direction is randomised; otherwise - * the base direction is passed through unchanged. - */ public final class BoxEmittersShootType implements EmittersShootType { public static final String ID = "box"; diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootType.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootType.java new file mode 100644 index 0000000..159ed7c --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootType.java @@ -0,0 +1,14 @@ +package com.reiasu.reiparticlesapi.network.particle.emitters.type; + +import net.minecraft.world.phys.Vec3; + +import java.util.List; + +public interface EmittersShootType { + + String getID(); + + List getPositions(Vec3 origin, int tick, int count); + + Vec3 getDefaultDirection(Vec3 enter, int tick, Vec3 pos, Vec3 origin); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootTypes.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootTypes.java similarity index 57% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootTypes.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootTypes.java index a6d9df0..c1132a1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootTypes.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/EmittersShootTypes.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.type; import net.minecraft.world.phys.Vec3; @@ -8,13 +6,6 @@ import java.util.Map; import java.util.function.Supplier; -/** - * Registry and factory for {@link EmittersShootType} implementations. - *

- * Forge port note: The Fabric version registered StreamCodec per type for network serialization. - * In Forge we register factory suppliers instead; actual serialization happens at a higher level - * using FriendlyByteBuf when needed. - */ public final class EmittersShootTypes { public static final EmittersShootTypes INSTANCE = new EmittersShootTypes(); @@ -24,22 +15,13 @@ public final class EmittersShootTypes { private EmittersShootTypes() { } - /** - * Register a shoot type factory by ID. - */ - public void register(String id, Supplier factory) { + public void register(String id, Supplier factory) { factories.put(id, factory); } - /** - * Look up a factory by ID; returns null if not registered. - */ - public Supplier fromID(String id) { + public Supplier fromID(String id) { return factories.get(id); } - - // ---- convenience factory methods ---- - public static EmittersShootType point() { return new PointEmittersShootType(); } @@ -48,10 +30,7 @@ public static EmittersShootType line(Vec3 dir, double step) { return new LineEmittersShootType(dir, step); } - /** - * Creates a box shoot type from a centered HitBox. - */ - public static EmittersShootType box(com.reiasu.reiparticlesapi.barrages.HitBox hitBox) { + public static EmittersShootType box(com.reiasu.reiparticlesapi.barrages.HitBox hitBox) { return new BoxEmittersShootType(hitBox); } @@ -59,10 +38,7 @@ public static EmittersShootType math() { return new MathEmittersShootType(); } - /** - * Called during mod init to wire up built-in factories. - */ - public void init() { + public void init() { register(PointEmittersShootType.ID, PointEmittersShootType::new); register(LineEmittersShootType.ID, () -> new LineEmittersShootType(Vec3.ZERO, 1.0)); register(BoxEmittersShootType.ID, () -> new BoxEmittersShootType( diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/LineEmittersShootType.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/LineEmittersShootType.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/LineEmittersShootType.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/LineEmittersShootType.java index e240a68..a0371d3 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/LineEmittersShootType.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/LineEmittersShootType.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.type; import net.minecraft.world.phys.Vec3; @@ -7,10 +5,6 @@ import java.util.ArrayList; import java.util.List; -/** - * Shoot type that distributes particles along a line defined by a direction vector. - * Each successive particle is offset by {@code step} blocks along the normalized direction. - */ public final class LineEmittersShootType implements EmittersShootType { public static final String ID = "line"; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/MathEmittersShootType.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/MathEmittersShootType.java similarity index 81% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/MathEmittersShootType.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/MathEmittersShootType.java index e0e1e3d..345c594 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/MathEmittersShootType.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/MathEmittersShootType.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.type; import com.reiasu.reiparticlesapi.annotations.codec.BufferCodec; @@ -10,16 +8,6 @@ import java.util.ArrayList; import java.util.List; -/** - * Emitter shoot type that evaluates mathematical expressions to - * compute particle spawn positions and directions. - *

- * Position expressions may reference variables: {@code i} (particle index), - * {@code c} (particle count), {@code t} (tick). - *

- * Direction expressions may reference: {@code t} (tick), {@code x/y/z} (particle pos), - * {@code ox/oy/oz} (emitter origin). - */ public final class MathEmittersShootType implements EmittersShootType { public static final String ID = "math"; @@ -56,9 +44,6 @@ public final class MathEmittersShootType implements EmittersShootType { public MathEmittersShootType() { } - - // ---- Getters / Setters ---- - public String getX() { return x; } public void setX(String x) { this.x = x; } @@ -76,13 +61,7 @@ public MathEmittersShootType() { public String getDz() { return dz; } public void setDz(String dz) { this.dz = dz; } - - // ---- Core logic ---- - - /** - * @deprecated No longer needed — evaluators are now created fresh per call. - */ - @Deprecated + @Deprecated public void setup() { // No-op: kept for binary compatibility with existing callers (e.g. CODEC). } @@ -111,9 +90,6 @@ public Vec3 getDefaultDirection(Vec3 enter, int tick, Vec3 pos, Vec3 origin) { double ddz = evalDirection(dz, tick, pos, origin); return enter.add(ddx, ddy, ddz); } - - // ---- Helpers ---- - private static double evalPosition(String expr, int tick, int count, int index) { try { return new ExpressionEvaluator(expr) @@ -136,17 +112,11 @@ private static double evalDirection(String expr, int tick, Vec3 pos, Vec3 origin } } - /** - * Encode this shoot type to a buffer. - */ - public void encode(FriendlyByteBuf buf) { + public void encode(FriendlyByteBuf buf) { CODEC.encode(buf, this); } - /** - * Decode a new instance from a buffer. - */ - public static MathEmittersShootType decode(FriendlyByteBuf buf) { + public static MathEmittersShootType decode(FriendlyByteBuf buf) { return (MathEmittersShootType) CODEC.decode(buf); } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/PointEmittersShootType.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/PointEmittersShootType.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/PointEmittersShootType.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/PointEmittersShootType.java index 0d5da3b..e0bdfa3 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/PointEmittersShootType.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/emitters/type/PointEmittersShootType.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.emitters.type; import net.minecraft.world.phys.Vec3; @@ -8,10 +6,6 @@ import java.util.List; import java.util.Random; -/** - * Shoot type that places all particles at the emitter origin. - * If the base direction is (near-)zero, a random direction is assigned instead. - */ public final class PointEmittersShootType implements EmittersShootType { public static final String ID = "point"; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleGroupStyle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleGroupStyle.java similarity index 81% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleGroupStyle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleGroupStyle.java index 884a4a9..b52875c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleGroupStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleGroupStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.style; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; @@ -27,15 +25,7 @@ import java.util.function.Consumer; import java.util.function.Function; -/** - * Base class for particle style groups. - *

- * Manages a collection of controllable particles arranged at relative locations, - * with support for display, scaling, rotation, teleportation, and server↔client sync. - */ public abstract class ParticleGroupStyle implements ServerController, Controllable { - - // ---- Core identity ---- private UUID uuid; private ResourceLocation registryKey; private boolean canceled; @@ -50,17 +40,10 @@ public abstract class ParticleGroupStyle implements ServerController> particles = new ConcurrentHashMap<>(); private final ConcurrentHashMap, RelativeLocation> particleLocations = new ConcurrentHashMap<>(); private final ConcurrentHashMap particleDefaultLength = new ConcurrentHashMap<>(); - - // ---- Tick actions ---- private final List> preTickActions = new ArrayList<>(); - - // ---- Constructors ---- - public ParticleGroupStyle() { this(96.0, UUID.randomUUID()); } @@ -74,9 +57,6 @@ public ParticleGroupStyle(double visibleRange, UUID uuid) { public void spawnInWorld(ServerLevel world, Vec3 pos) { ParticleStyleManager.spawnStyle(world, pos, this); } - - // ---- Getters/Setters ---- - public UUID getUuid() { return uuid; } @@ -192,33 +172,14 @@ public ConcurrentHashMap, RelativeLocation> getParticleLocations public ConcurrentHashMap getParticleDefaultLength() { return particleDefaultLength; } + public abstract Map getCurrentFrames(); - // ---- Abstract methods that subclasses must implement ---- - - /** - * Return the current frame of particles: mapping from StyleData to relative location. - * Non-sequenced styles use this; sequenced styles return empty and use their own method. - */ - public abstract Map getCurrentFrames(); - - /** - * Called when the style is first displayed (after particles are spawned). - */ - public abstract void onDisplay(); - - // ---- Display lifecycle ---- - - /** - * Called before particles are spawned. Subclasses can modify the locations map. - */ - public void beforeDisplay(Map styles) { + public abstract void onDisplay(); + public void beforeDisplay(Map styles) { // Default no-op } - /** - * Display the style at the given position in the given world. - */ - public void display(Vec3 pos, Level world) { + public void display(Vec3 pos, Level world) { if (displayed) { return; } @@ -234,20 +195,14 @@ public void display(Vec3 pos, Level world) { onDisplay(); } - /** - * Refresh the display: clear existing particles and re-display. - */ - public void flush() { + public void flush() { if (!particles.isEmpty()) { clear(true); } displayParticles(); } - /** - * Spawn particles from getCurrentFrames(). - */ - protected void displayParticles() { + protected void displayParticles() { Map locations = getCurrentFrames(); beforeDisplay(locations); toggleScale(locations); @@ -279,10 +234,7 @@ protected void displayParticles() { } } - /** - * Clear all particles. If valid is true, keep the style alive; otherwise mark invalid. - */ - public void clear(boolean valid) { + public void clear(boolean valid) { for (Controllable c : particles.values()) { c.remove(); } @@ -291,10 +243,7 @@ public void clear(boolean valid) { particleDefaultLength.clear(); } - /** - * Record default scale lengths and apply current scale factor. - */ - protected void toggleScale(Map locations) { + protected void toggleScale(Map locations) { if (particleDefaultLength.isEmpty()) { for (Map.Entry entry : locations.entrySet()) { particleDefaultLength.put(entry.getKey().getUuid(), entry.getValue().length()); @@ -315,10 +264,7 @@ protected void toggleScale(Map locations) } } - /** - * Update displayed particles' scale. - */ - protected void toggleScaleDisplayed() { + protected void toggleScaleDisplayed() { if (scale == 1.0) { return; } @@ -334,19 +280,13 @@ protected void toggleScaleDisplayed() { } } - /** - * Teleport all particles to their current relative positions based on origin. - */ - protected void toggleRelative() { + protected void toggleRelative() { for (Map.Entry, RelativeLocation> entry : particleLocations.entrySet()) { Controllable c = entry.getKey(); RelativeLocation rl = entry.getValue(); c.teleportTo(rl.getX() + pos.x, rl.getY() + pos.y, rl.getZ() + pos.z); } } - - // ---- Transform operations ---- - public void remove() { canceled = true; clear(false); @@ -399,18 +339,12 @@ public void addPreTickAction(Consumer action) { preTickActions.add(action); } } - - // ---- Packet args ---- - public Map> writePacketArgs() { return new HashMap<>(); } public void readPacketArgs(Map> args) { } - - // ---- Change with callback ---- - public void change(Consumer invoker, Map> args) { if (invoker != null) { invoker.accept(this); @@ -418,9 +352,6 @@ public void change(Consumer invoker, Map> args) { readPacketArgs(args); @@ -468,14 +399,7 @@ public void tick() { } displayedTime++; } - - // ---- Inner class: StyleData ---- - - /** - * Holds the data needed to create a single particle in a style: - * the displayer builder, particle handler, and controller handler. - */ - public static class StyleData { + public static class StyleData { private final UUID uuid; private final Function displayerBuilder; private Consumer particleHandler; @@ -504,18 +428,12 @@ public Consumer getParticleControllerHandler() { return particleControllerHandler; } - /** - * Set a handler that configures the particle after creation. - */ - public StyleData withParticleHandler(Consumer handler) { + public StyleData withParticleHandler(Consumer handler) { this.particleHandler = handler; return this; } - /** - * Set a handler that configures the particle controller after creation. - */ - public StyleData withParticleControllerHandler(Consumer handler) { + public StyleData withParticleControllerHandler(Consumer handler) { this.particleControllerHandler = handler; return this; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleShapeStyle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleShapeStyle.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleShapeStyle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleShapeStyle.java index 31568fd..4273606 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleShapeStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleShapeStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.style; import com.reiasu.reiparticlesapi.particles.ControllableParticle; @@ -17,10 +15,6 @@ import java.util.function.Consumer; import java.util.function.Function; -/** - * A style that builds its particle layout from {@link PointsBuilder} shapes. - * Supports scale helpers and display/before-display callbacks. - */ public class ParticleShapeStyle extends ParticleGroupStyle { private ScaleHelper scaleHelper; @@ -38,18 +32,12 @@ public ParticleShapeStyle(UUID uuid) { public ParticleShapeStyle() { this(UUID.randomUUID()); } - - // ---- Getters / Setters ---- - public ScaleHelper getScaleHelper() { return scaleHelper; } public void setScaleHelper(ScaleHelper scaleHelper) { this.scaleHelper = scaleHelper; } public int getSpawnAge() { return spawnAge; } public void setSpawnAge(int spawnAge) { this.spawnAge = spawnAge; } public boolean getScalePreTick() { return scalePreTick; } public boolean getScaleReversed() { return scaleReversed; } - - // ---- Builder methods ---- - public ParticleShapeStyle appendBuilder(PointsBuilder pointsBuilder, Function dataBuilder) { this.pointBuilders.put(pointsBuilder, dataBuilder); @@ -99,9 +87,6 @@ public ParticleShapeStyle toggleBeforeDisplay( this.beforeDisplayInvokes.add(toggleMethod); return this; } - - // ---- Overrides ---- - @Override public void beforeDisplay(Map styles) { for (BiConsumer> invoke : beforeDisplayInvokes) { @@ -139,9 +124,6 @@ public void onDisplay() { } }); } - - // ---- Fast style data factory methods ---- - public StyleData fastStyleData(Vec3 color, Function displayer) { return new StyleData(displayer).withParticleHandler(p -> { p.colorOfRGB((int) color.x, (int) color.y, (int) color.z); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleManager.java similarity index 92% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleManager.java index a0f9249..5152551 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.style; import com.reiasu.reiparticlesapi.network.ReiParticlesNetwork; @@ -24,6 +22,7 @@ public final class ParticleStyleManager { private static final Map SERVER_VIEW_STYLES = new ConcurrentHashMap<>(); private static final Map> VISIBLE = new ConcurrentHashMap<>(); + private static final Map> STYLE_TO_PLAYERS = new ConcurrentHashMap<>(); private static final Map CLIENT_VIEW_STYLES = new ConcurrentHashMap<>(); private ParticleStyleManager() { @@ -127,13 +126,8 @@ public static void doTickServer() { } private static Set filterVisiblePlayer(UUID styleId) { - Set result = new HashSet<>(); - for (Map.Entry> entry : VISIBLE.entrySet()) { - if (entry.getValue().contains(styleId)) { - result.add(entry.getKey()); - } - } - return result; + Set players = STYLE_TO_PLAYERS.get(styleId); + return players != null ? new HashSet<>(players) : new HashSet<>(); } private static void upgradeVisible(ParticleGroupStyle style, ServerLevel level) { @@ -170,6 +164,10 @@ private static boolean canViewStyle(ParticleGroupStyle style, ServerPlayer playe private static void removeStylePlayerView(ServerPlayer player, ParticleGroupStyle style) { Set visibleSet = VISIBLE.computeIfAbsent(player.getUUID(), ignored -> ConcurrentHashMap.newKeySet()); visibleSet.remove(style.getUuid()); + Set stylePlayers = STYLE_TO_PLAYERS.get(style.getUuid()); + if (stylePlayers != null) { + stylePlayers.remove(player.getUUID()); + } PacketParticleStyleS2C packet = new PacketParticleStyleS2C(style.getUuid(), ControlType.REMOVE, Map.of()); ReiParticlesNetwork.sendTo(player, packet); } @@ -179,6 +177,8 @@ private static void addStylePlayerView(ServerPlayer player, ParticleGroupStyle s if (!visibleSet.add(style.getUuid())) { return; } + STYLE_TO_PLAYERS.computeIfAbsent(style.getUuid(), ignored -> ConcurrentHashMap.newKeySet()) + .add(player.getUUID()); PacketParticleStyleS2C packet = buildCreatePacket(style, style.getPos()); ReiParticlesNetwork.sendTo(player, packet); } @@ -216,6 +216,7 @@ private static PacketParticleStyleS2C buildCreatePacket(ParticleGroupStyle style private static void removeAllPlayerView(ParticleGroupStyle style, ServerLevel level) { UUID styleId = style.getUuid(); + STYLE_TO_PLAYERS.remove(styleId); for (Map.Entry> entry : VISIBLE.entrySet()) { UUID playerId = entry.getKey(); Set visibleSet = entry.getValue(); @@ -236,6 +237,7 @@ private static void removeAllPlayerView(ParticleGroupStyle style, ServerLevel le private static void pruneDisconnectedPlayers() { if (SERVER_VIEW_STYLES.isEmpty()) { VISIBLE.clear(); + STYLE_TO_PLAYERS.clear(); return; } VISIBLE.entrySet().removeIf(entry -> { @@ -247,6 +249,12 @@ private static void pruneDisconnectedPlayers() { } } } + for (UUID styleId : entry.getValue()) { + Set stylePlayers = STYLE_TO_PLAYERS.get(styleId); + if (stylePlayers != null) { + stylePlayers.remove(playerId); + } + } return true; }); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleProvider.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleProvider.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleProvider.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleProvider.java index f77b9ff..9e85dee 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleProvider.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/ParticleStyleProvider.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.style; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleShapeStyle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleShapeStyle.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleShapeStyle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleShapeStyle.java index a831866..9991d1a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleShapeStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleShapeStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.style; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; @@ -19,11 +17,6 @@ import java.util.function.Function; import java.util.function.Predicate; -/** - * A sequenced style that builds its particle layout from {@link PointsBuilder} shapes. - * Combines the shape-building approach of {@link ParticleShapeStyle} with the - * sequential display approach of {@link SequencedParticleStyle}. - */ public final class SequencedParticleShapeStyle extends SequencedParticleStyle { private ScaleHelper scaleHelper; @@ -44,9 +37,6 @@ public SequencedParticleShapeStyle(UUID uuid) { public SequencedParticleShapeStyle() { this(UUID.randomUUID()); } - - // ---- Getters / Setters ---- - public ScaleHelper getScaleHelper() { return scaleHelper; } public void setScaleHelper(ScaleHelper scaleHelper) { this.scaleHelper = scaleHelper; } public int getAnimationIndex() { return animationIndex; } @@ -54,9 +44,6 @@ public SequencedParticleShapeStyle() { public void setSpawnAge(int spawnAge) { this.spawnAge = spawnAge; } public boolean getScalePreTick() { return scalePreTick; } public boolean getScaleReversed() { return scaleReversed; } - - // ---- Builder methods ---- - public SequencedParticleShapeStyle appendBuilder(PointsBuilder pointsBuilder, Function dataBuilder) { this.pointBuilders.put(pointsBuilder, dataBuilder); @@ -111,9 +98,6 @@ public SequencedParticleShapeStyle toggleBeforeDisplay( this.beforeDisplayInvokes.add(toggleMethod); return this; } - - // ---- Overrides ---- - public void beforeDisplay(SortedMap styles) { for (BiConsumer> invoke : beforeDisplayInvokes) { invoke.accept(this, styles); @@ -185,9 +169,6 @@ public Map> writePacketArgsSequenced() { public void readPacketArgsSequenced(Map> args) { // No additional args by default } - - // ---- Fast style data factory methods ---- - public SortedStyleData fastStyleData(int order, Vec3 color, Function displayer) { SortedStyleData data = new SortedStyleData(displayer, order); data.withParticleHandler(p -> { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleStyle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleStyle.java similarity index 94% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleStyle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleStyle.java index a12eeb8..2eb4348 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/SequencedParticleStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.style; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; @@ -20,10 +18,6 @@ import java.util.function.Consumer; import java.util.function.Function; -/** - * A particle style where particles are displayed sequentially (one-by-one) - * and can be toggled on/off by index. Supports ordered particle display. - */ public abstract class SequencedParticleStyle extends ParticleGroupStyle { public static final int CREATE_PARTICLE = 1; @@ -41,16 +35,10 @@ public SequencedParticleStyle(double visibleRange, UUID uuid) { public SequencedParticleStyle() { this(32.0, UUID.randomUUID()); } - - // ---- Abstract methods ---- - public abstract int getParticlesCount(); public abstract SortedMap getCurrentFramesSequenced(); public abstract Map> writePacketArgsSequenced(); public abstract void readPacketArgsSequenced(Map> args); - - // ---- Getters / Setters ---- - public long[] getDisplayedStatus() { if (displayedStatus == null) { displayedStatus = new long[(getParticlesCount() + 63) / 64]; @@ -69,9 +57,6 @@ public void setDisplayedParticleCount(int count) { } public int getParticleLinkageDisplayCurrentIndex() { return particleLinkageDisplayCurrentIndex; } - - // ---- Status management ---- - public boolean getStatus(int index) { if (index < 0 || index >= getParticlesCount()) return false; int word = index / 64; @@ -95,9 +80,6 @@ public void clearStatus() { displayedParticleCount = 0; particleLinkageDisplayCurrentIndex = 0; } - - // ---- Sequenced add/remove ---- - public void addSingle() { if (getClient()) { if (particleLinkageDisplayCurrentIndex >= getParticlesCount()) return; @@ -170,9 +152,6 @@ public void removeMultiple(int count) { Map> args = buildChangeMultipleStatusArgs(indices, false); change(g -> {}, args); } - - // ---- Toggle from status ---- - protected void toggleFromStatus(int index, boolean status) { if (index < 0 || index >= sequencedParticles.size()) return; Map.Entry entry = sequencedParticles.get(index); @@ -219,9 +198,6 @@ private void createWithIndex(SortedStyleData data, RelativeLocation rl) { getParticles().put(particleUUID, controllable); getParticleLocations().put(controllable, rl); } - - // ---- Packet args helpers ---- - private Map> buildChangeSingleStatusArgs(int index, boolean status) { Map> args = new HashMap<>(); args.put("seq_index", ParticleControllerDataBuffers.INSTANCE.intValue(index)); @@ -237,9 +213,6 @@ private Map> buildChangeMultipleStatusAr args.put("seq_count", ParticleControllerDataBuffers.INSTANCE.intValue(displayedParticleCount)); return args; } - - // ---- Overrides ---- - @Override public Map getCurrentFrames() { return Collections.emptyMap(); @@ -297,13 +270,7 @@ public void readPacketArgs(Map } readPacketArgsSequenced(args); } - - // ---- Inner classes ---- - - /** - * Style data with an order index for sequenced display. - */ - public static class SortedStyleData extends StyleData implements Comparable { + public static class SortedStyleData extends StyleData implements Comparable { private final int order; public SortedStyleData(Function displayerBuilder, int order) { @@ -319,10 +286,7 @@ public int compareTo(SortedStyleData other) { } } - /** - * Builder for creating {@link SortedStyleData} instances with chained configuration. - */ - public static final class SortedStyleDataBuilder { + public static final class SortedStyleDataBuilder { private Function displayerBuilder = uuid -> ParticleDisplayer.Companion.withSingle(new ControllableEndRodEffect(uuid, false)); private final List> particleHandlers = new ArrayList<>(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/StyleRegistry.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/StyleRegistry.java similarity index 69% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/StyleRegistry.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/StyleRegistry.java index 149d632..ce81441 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/StyleRegistry.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/style/StyleRegistry.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.style; import net.minecraft.resources.ResourceLocation; @@ -10,14 +8,6 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -/** - * Registry mapping {@link ResourceLocation} keys to integer IDs and - * {@link ParticleStyleProvider} instances for {@link ParticleGroupStyle}. - * Both client and server must register in the same order so that the - * auto-assigned integer IDs match. - *

- * Network packets transmit VarInt IDs instead of full class-name strings. - */ public final class StyleRegistry { public static final StyleRegistry INSTANCE = new StyleRegistry(); @@ -28,14 +18,7 @@ public final class StyleRegistry { private StyleRegistry() { } - /** - * Register a style type. Must be called in identical order on client and server. - * - * @param key unique {@link ResourceLocation} for this style type - * @param provider the provider that creates / changes style instances - * @return the assigned integer ID - */ - public synchronized int register(ResourceLocation key, ParticleStyleProvider provider) { + public synchronized int register(ResourceLocation key, ParticleStyleProvider provider) { if (key == null || provider == null) { throw new IllegalArgumentException("key and provider must not be null"); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/util/ServerParticleUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/util/ServerParticleUtil.java similarity index 73% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/util/ServerParticleUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/util/ServerParticleUtil.java index 6972e04..2c00d97 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/network/particle/util/ServerParticleUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/network/particle/util/ServerParticleUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.network.particle.util; import com.reiasu.reiparticlesapi.network.ReiParticlesNetwork; @@ -10,16 +8,8 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.Vec3; -/** - * Utility for spawning vanilla and custom particles on the server side, - * sending them to all players (optionally filtered by range). - */ public final class ServerParticleUtil { - public static final ServerParticleUtil INSTANCE = new ServerParticleUtil(); - - private ServerParticleUtil() {} - - public void spawnSingle(ParticleOptions type, ServerLevel world, Vec3 pos, + public static void spawnSingle(ParticleOptions type, ServerLevel world, Vec3 pos, Vec3 delta, boolean force, double speed, int count) { for (ServerPlayer player : world.players()) { world.sendParticles(player, type, force, pos.x, pos.y, pos.z, @@ -27,7 +17,7 @@ public void spawnSingle(ParticleOptions type, ServerLevel world, Vec3 pos, } } - public void spawnSingle(ParticleOptions type, ServerLevel world, Vec3 pos, + public static void spawnSingle(ParticleOptions type, ServerLevel world, Vec3 pos, Vec3 delta, boolean force, double speed, int count, double range) { for (ServerPlayer player : world.players()) { if (player.position().distanceTo(pos) > range) continue; @@ -36,17 +26,17 @@ public void spawnSingle(ParticleOptions type, ServerLevel world, Vec3 pos, } } - public void spawnSingle(ParticleOptions type, ServerLevel world, + public static void spawnSingle(ParticleOptions type, ServerLevel world, RelativeLocation pos, RelativeLocation velocity, double range) { spawnSingle(type, world, pos.toVector(), velocity.toVector(), range); } - public void spawnSingle(ParticleOptions type, ServerLevel world, + public static void spawnSingle(ParticleOptions type, ServerLevel world, RelativeLocation pos, RelativeLocation velocity) { spawnSingle(type, world, pos.toVector(), velocity.toVector()); } - public void spawnSingle(ParticleOptions type, ServerLevel world, + public static void spawnSingle(ParticleOptions type, ServerLevel world, Vec3 pos, Vec3 velocity, double range) { PacketParticleS2C packet = new PacketParticleS2C(type, pos, velocity); for (ServerPlayer player : world.players()) { @@ -55,7 +45,7 @@ public void spawnSingle(ParticleOptions type, ServerLevel world, } } - public void spawnSingle(ParticleOptions type, ServerLevel world, + public static void spawnSingle(ParticleOptions type, ServerLevel world, Vec3 pos, Vec3 velocity) { PacketParticleS2C packet = new PacketParticleS2C(type, pos, velocity); for (ServerPlayer player : world.players()) { diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/Controllable.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/Controllable.java new file mode 100644 index 0000000..d67d933 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/Controllable.java @@ -0,0 +1,51 @@ +package com.reiasu.reiparticlesapi.particles; + +import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; +import com.reiasu.reiparticlesapi.utils.RelativeLocation; +import net.minecraft.world.phys.Vec3; + +import java.util.Map; +import java.util.UUID; + +public interface Controllable { + + UUID controlUUID(); + + void rotateToPoint(RelativeLocation to); + + void rotateToWithAngle(RelativeLocation to, double radian); + + void rotateAsAxis(double radian); + + void teleportTo(Vec3 pos); + + void teleportTo(double x, double y, double z); + + void remove(); + + T getControlObject(); + + @SuppressWarnings("unchecked") + default S getControlCasted() { + return (S) getControlObject(); + } + + @SuppressWarnings("unchecked") + default S getControlCastedOrNull() { + try { + return (S) getControlObject(); + } catch (Exception e) { + return null; + } + } + default void load(Map> args) { + } + + default Map> toArgs() { + return Map.of(); + } + + default void change(Map> args) { + load(args); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticle.java similarity index 88% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticle.java index 22ec511..fefba89 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles; import com.reiasu.reiparticlesapi.particles.control.ControlParticleManager; @@ -28,25 +26,9 @@ import java.util.UUID; -/** - * Core client-side particle class that can be remotely controlled via a {@link ParticleController}. - *

- * Extends {@link TextureSheetParticle} (Forge 1.20.1) and provides: - *

    - *
  • UUID-based control via {@link ControlParticleManager}
  • - *
  • Custom rotation (pitch/yaw/roll) with interpolation
  • - *
  • Teleportation and physics-aware movement
  • - *
  • Color, alpha, light, size control
  • - *
  • Camera-facing or fixed-orientation rendering
  • - *
  • Double-sided quad rendering (front and back faces)
  • - *
- */ public abstract class ControllableParticle extends TextureSheetParticle { - /** - * Default linear interpolator using {@link GraphMathHelper#lerp(float, Vec3, Vec3)}. - */ - public static final ParticleLerpInterpolator LINEAR_INTERPOLATOR = + public static final ParticleLerpInterpolator LINEAR_INTERPOLATOR = (prev, current, delta) -> GraphMathHelper.lerp(delta, prev, current); private final UUID controlUUID; @@ -92,9 +74,6 @@ public ControllableParticle(ClientLevel world, Vec3 pos, Vec3 velocity, UUID con public ControllableParticle(ClientLevel world, Vec3 pos, Vec3 velocity, UUID controlUUID) { this(world, pos, velocity, controlUUID, true); } - - // ---- Getters / Setters ---- - public UUID getControlUUID() { return controlUUID; } @@ -352,9 +331,6 @@ public boolean getUpdateRotate() { public void setUpdateRotate(boolean updateRotate) { this.updateRotate = updateRotate; } - - // ---- Teleport ---- - public void teleportTo(Vec3 pos) { this.lastPreview = pos; this.update = true; @@ -364,9 +340,6 @@ public void teleportTo(double x, double y, double z) { this.lastPreview = new Vec3(x, y, z); this.update = true; } - - // ---- Rotation ---- - public void rotateParticleTo(RelativeLocation target) { rotateParticleTo(new Vector3f((float) target.getX(), (float) target.getY(), (float) target.getZ())); } @@ -380,9 +353,6 @@ public void rotateParticleTo(Vector3f target) { this.updateRotate = true; this.lastRotate = new Vector3f(angles[0], angles[1], angles[2]); } - - // ---- Color helpers ---- - public void colorOfRGB(int r, int g, int b) { setColor(Math3DUtil.colorOf( Mth.clamp(r, 0, 255), @@ -405,9 +375,6 @@ public void colorOfRGBA(int r, int g, int b, float alpha) { Mth.clamp(b, 0, 255))); this.alpha = Mth.clamp(alpha, 0.0f, 1.0f); } - - // ---- Physics-aware movement ---- - public void moveToWithPhysics(Vec3 pos) { Vec3 rel = pos.subtract(getLoc()); BlockHitResult res = PhysicsUtil.collide(getLoc(), rel, (Level) getClientWorld()); @@ -429,16 +396,10 @@ public void moveToWithPhysics(double x, double y, double z, BlockHitResult colli public void moveToWithPhysics(double x, double y, double z) { moveToWithPhysics(new Vec3(x, y, z)); } - - // ---- Interpolator ---- - public ControllableParticle setInterpolator(ParticleLerpInterpolator newInterpolator) { this.interpolator = newInterpolator; return this; } - - // ---- Tick ---- - @Override public void tick() { if (this.age > this.lifetime) { @@ -480,17 +441,11 @@ public void tick() { this.updateRotate = false; } } - - // ---- Remove ---- - @Override public void remove() { super.remove(); ControlParticleManager.INSTANCE.removeControl(this.controlUUID); } - - // ---- Render ---- - @Override public void render(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { Quaternionf q = new Quaternionf(); @@ -527,10 +482,7 @@ public void render(VertexConsumer vertexConsumer, Camera camera, float tickDelta } } - /** - * Renders a single quad facing the given orientation. - */ - private void renderQuad(VertexConsumer consumer, Quaternionf q, float x, float y, float z, float tickDelta, int light) { + private void renderQuad(VertexConsumer consumer, Quaternionf q, float x, float y, float z, float tickDelta, int light) { float size = getQuadSize(tickDelta); float u0 = getU0(); float u1 = getU1(); @@ -543,10 +495,7 @@ private void renderQuad(VertexConsumer consumer, Quaternionf q, float x, float y addVertex(consumer, q, x, y, z, -1.0f, -1.0f, u0, v1, size, light); } - /** - * Renders a double-sided quad (front + back face) for non-camera-facing particles. - */ - private void renderDoubleSidedQuad(VertexConsumer consumer, Quaternionf q, float x, float y, float z, float tickDelta, int light) { + private void renderDoubleSidedQuad(VertexConsumer consumer, Quaternionf q, float x, float y, float z, float tickDelta, int light) { float size = getQuadSize(tickDelta); float u0 = getU0(); float u1 = getU1(); @@ -566,32 +515,21 @@ private void renderDoubleSidedQuad(VertexConsumer consumer, Quaternionf q, float addVertex(consumer, q, x, y, z, 1.0f, -1.0f, u1, v1, size, light); } - /** - * Emit a single vertex for the particle quad. - * Uses Forge 1.20.1 VertexConsumer API with endVertex(). - */ - private void addVertex(VertexConsumer consumer, Quaternionf q, + private void addVertex(VertexConsumer consumer, Quaternionf q, float dx, float dy, float dz, float vx, float vy, float tu, float tv, float size, int light) { Vector3f pos = new Vector3f(vx, vy, 0.0f).rotate(q).mul(size).add(dx, dy, dz); - consumer.vertex(pos.x, pos.y, pos.z) - .uv(tu, tv) - .color(this.rCol, this.gCol, this.bCol, this.alpha) - .uv2(light) - .endVertex(); + consumer.addVertex(pos.x, pos.y, pos.z) + .setUv(tu, tv) + .setColor(this.rCol, this.gCol, this.bCol, this.alpha) + .setLight(light); } - - // ---- Render type ---- - @Override public ParticleRenderType getRenderType() { return this.textureSheet; } - - // ---- Light color ---- - @Override protected int getLightColor(float partialTick) { if (this.light == -1) { diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffect.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffect.java new file mode 100644 index 0000000..f15bbcf --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffect.java @@ -0,0 +1,12 @@ +package com.reiasu.reiparticlesapi.particles; + +import net.minecraft.core.particles.ParticleOptions; + +import java.util.UUID; + +public interface ControllableParticleEffect extends ParticleOptions { + UUID getControlUUID(); + void setControlUUID(UUID uuid); + boolean getFaceToPlayer(); + ControllableParticleEffect clone(); +} \ No newline at end of file diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffectManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffectManager.java similarity index 89% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffectManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffectManager.java index 28d1b15..3dcf7e7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffectManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ControllableParticleEffectManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles; import com.reiasu.reiparticlesapi.particles.impl.*; @@ -9,10 +7,6 @@ import java.util.Map; import java.util.UUID; -/** - * Registry and factory for {@link ControllableParticleEffect} instances. - * Each effect type is registered with a prototype that is cloned on demand. - */ public final class ControllableParticleEffectManager { public static final ControllableParticleEffectManager INSTANCE = new ControllableParticleEffectManager(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleDisplayer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleDisplayer.java similarity index 79% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleDisplayer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleDisplayer.java index 6a91e82..ae54af5 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleDisplayer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleDisplayer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles; import com.reiasu.reiparticlesapi.display.DisplayEntity; @@ -14,24 +12,10 @@ import javax.annotation.Nullable; -/** - * Interface for displaying particles/groups/styles/compositions at a world position. - *

- * Each implementation wraps a specific display mechanism and returns - * a {@link Controllable} handle that can be used for subsequent control operations. - */ public interface ParticleDisplayer { - /** - * Display this displayer at the given location in the given client world. - * - * @return a {@link Controllable} handle, or null if spawning failed - */ - @Nullable + @Nullable Controllable display(Vec3 loc, ClientLevel world); - - // ---- Factory methods ---- - static ParticleDisplayer withSingle(ControllableParticleEffect effect) { return new SingleParticleDisplayer(effect); } @@ -51,9 +35,6 @@ static ParticleDisplayer withDisplayEntity(DisplayEntity entity) { static ParticleDisplayer withComposition(ParticleComposition composition) { return new ParticleCompositionDisplayer(composition); } - - // ---- Companion for backward compat ---- - Companion Companion = new Companion(); class Companion { @@ -77,13 +58,7 @@ public ParticleDisplayer withComposition(ParticleComposition composition) { return ParticleDisplayer.withComposition(composition); } } - - // ---- Inner implementations ---- - - /** - * Displays a single ControllableParticle via its ControllableParticleEffect. - */ - class SingleParticleDisplayer implements ParticleDisplayer { + class SingleParticleDisplayer implements ParticleDisplayer { private final ControllableParticleEffect effect; public SingleParticleDisplayer(ControllableParticleEffect effect) { @@ -104,10 +79,7 @@ public Controllable display(Vec3 loc, ClientLevel world) { } } - /** - * Displays a ControllableParticleGroup. - */ - class ParticleGroupDisplayer implements ParticleDisplayer { + class ParticleGroupDisplayer implements ParticleDisplayer { private final ControllableParticleGroup group; public ParticleGroupDisplayer(ControllableParticleGroup group) { @@ -126,10 +98,7 @@ public Controllable display(Vec3 loc, ClientLevel world) { } } - /** - * Displays a ParticleGroupStyle. - */ - class ParticleStyleDisplayer implements ParticleDisplayer { + class ParticleStyleDisplayer implements ParticleDisplayer { private final ParticleGroupStyle style; public ParticleStyleDisplayer(ParticleGroupStyle style) { @@ -148,10 +117,7 @@ public Controllable display(Vec3 loc, ClientLevel world) { } } - /** - * Displays a DisplayEntity. - */ - class DisplayEntityDisplayer implements ParticleDisplayer { + class DisplayEntityDisplayer implements ParticleDisplayer { private final DisplayEntity entity; public DisplayEntityDisplayer(DisplayEntity entity) { @@ -172,10 +138,7 @@ public Controllable display(Vec3 loc, ClientLevel world) { } } - /** - * Displays a ParticleComposition. - */ - class ParticleCompositionDisplayer implements ParticleDisplayer { + class ParticleCompositionDisplayer implements ParticleDisplayer { private final ParticleComposition composition; public ParticleCompositionDisplayer(ParticleComposition composition) { diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleLerpInterpolator.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleLerpInterpolator.java new file mode 100644 index 0000000..b178b00 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ParticleLerpInterpolator.java @@ -0,0 +1,7 @@ +package com.reiasu.reiparticlesapi.particles; + +import net.minecraft.world.phys.Vec3; + +public interface ParticleLerpInterpolator { + Vec3 consume(Vec3 prev, Vec3 current, float delta); +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ReiModParticles.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ReiModParticles.java new file mode 100644 index 0000000..3ad5c94 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ReiModParticles.java @@ -0,0 +1,89 @@ +package com.reiasu.reiparticlesapi.particles; + +import com.reiasu.reiparticlesapi.particles.impl.*; +import com.mojang.serialization.MapCodec; +import io.netty.buffer.ByteBuf; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.UUID; +import java.util.function.BiFunction; + +public final class ReiModParticles { + public static final ReiModParticles INSTANCE = new ReiModParticles(); + + private static final DeferredRegister> PARTICLES = + DeferredRegister.create(Registries.PARTICLE_TYPE, "reiparticlesapi"); + + public static final DeferredHolder, ParticleType> CONTROLLABLE_END_ROD = + PARTICLES.register("controllable_end_rod", + () -> createType(ControllableEndRodEffect::new)); + + public static final DeferredHolder, ParticleType> CONTROLLABLE_ENCHANTMENT = + PARTICLES.register("controllable_enchantment", + () -> createType(ControllableEnchantmentEffect::new)); + + public static final DeferredHolder, ParticleType> CONTROLLABLE_CLOUD = + PARTICLES.register("controllable_cloud", + () -> createType(ControllableCloudEffect::new)); + + public static final DeferredHolder, ParticleType> CONTROLLABLE_FLASH = + PARTICLES.register("controllable_flash", + () -> createType(ControllableFlashEffect::new)); + + public static final DeferredHolder, ParticleType> CONTROLLABLE_FIREWORK = + PARTICLES.register("controllable_firework", + () -> createType(ControllableFireworkEffect::new)); + + public static final DeferredHolder, ParticleType> CONTROLLABLE_FALLING_DUST = + PARTICLES.register("controllable_falling_dust", + () -> createType((uuid, face) -> new ControllableFallingDustEffect( + uuid, net.minecraft.world.level.block.Blocks.SAND.defaultBlockState(), face))); + + public static final DeferredHolder, ParticleType> CONTROLLABLE_SPLASH = + PARTICLES.register("controllable_splash", + () -> createType(ControllableSplashEffect::new)); + + private ReiModParticles() {} + + private static ParticleType createType( + BiFunction factory) { + MapCodec mapCodec = MapCodec.unit(() -> factory.apply(UUID.randomUUID(), false)); + StreamCodec streamCodec = new StreamCodec<>() { + @Override + public T decode(RegistryFriendlyByteBuf buf) { + return factory.apply(buf.readUUID(), buf.readBoolean()); + } + + @Override + public void encode(RegistryFriendlyByteBuf buf, T value) { + buf.writeUUID(value.getControlUUID()); + buf.writeBoolean(value.getFaceToPlayer()); + } + }; + return new ParticleType(true) { + @Override + public MapCodec codec() { + return mapCodec; + } + + @Override + public StreamCodec streamCodec() { + return streamCodec; + } + }; + } + + public static void register(IEventBus modBus) { + PARTICLES.register(modBus); + } + + public void reg() { + // No-op, registration is handled by DeferredRegister + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ReiParticleTextureSheet.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ReiParticleTextureSheet.java similarity index 59% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ReiParticleTextureSheet.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ReiParticleTextureSheet.java index da3c8b5..ed4b694 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/ReiParticleTextureSheet.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/ReiParticleTextureSheet.java @@ -1,11 +1,10 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.MeshData; import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.particle.ParticleRenderType; @@ -13,13 +12,9 @@ import net.minecraft.client.renderer.texture.TextureManager; public final class ReiParticleTextureSheet { - /** - * Additive-blend particle render type that produces a glow effect. - * Uses SRC_ALPHA + ONE blending (additive) with depth-write disabled. - */ - public static final ParticleRenderType ADDITION_BLEND_TRANSLUCENT = new ParticleRenderType() { + public static final ParticleRenderType ADDITION_BLEND_TRANSLUCENT = new ParticleRenderType() { @Override - public void begin(BufferBuilder builder, TextureManager textureManager) { + public BufferBuilder begin(Tesselator tesselator, TextureManager textureManager) { RenderSystem.depthMask(false); RenderSystem.setShaderTexture(0, TextureAtlas.LOCATION_PARTICLES); RenderSystem.enableBlend(); @@ -27,17 +22,7 @@ public void begin(BufferBuilder builder, TextureManager textureManager) { GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE ); - builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); - } - - @Override - public void end(Tesselator tesselator) { - tesselator.end(); - RenderSystem.blendFunc( - GlStateManager.SourceFactor.SRC_ALPHA, - GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA - ); - RenderSystem.depthMask(true); + return tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); } @Override diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlParticleManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlParticleManager.java new file mode 100644 index 0000000..5958306 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlParticleManager.java @@ -0,0 +1,28 @@ +package com.reiasu.reiparticlesapi.particles.control; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public final class ControlParticleManager { + + public static final ControlParticleManager INSTANCE = new ControlParticleManager(); + + private final ConcurrentHashMap controls = new ConcurrentHashMap<>(); + + private ControlParticleManager() { + } + + public ParticleController getControl(UUID uuid) { + return controls.get(uuid); + } + + public void removeControl(UUID uuid) { + controls.remove(uuid); + } + + public ParticleController createControl(UUID uuid) { + ParticleController controller = new ParticleController(uuid); + controls.put(uuid, controller); + return controller; + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlType.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlType.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlType.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlType.java index 481fe48..b9eeb7a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlType.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ControlType.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.control; public enum ControlType { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ParticleController.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ParticleController.java similarity index 77% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ParticleController.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ParticleController.java index 47c8731..9822ae1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/ParticleController.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/ParticleController.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.control; import com.reiasu.reiparticlesapi.particles.Controllable; @@ -14,12 +12,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; -/** - * Controller associated with a single {@link ControllableParticle}. - *

- * Implements {@link Controllable} so it can participate in composition/helper - * systems. Pre-tick actions are stored and replayed every tick. - */ public final class ParticleController implements Controllable { private final UUID uuid; @@ -52,26 +44,17 @@ public void setInitInvoker(Consumer initInvoker) { this.initInvoker = initInvoker; } - /** - * Add an action to run every tick before the particle ticks. - */ - public ParticleController addPreTickAction(Consumer action) { + public ParticleController addPreTickAction(Consumer action) { invokeQueue.add(action); return this; } - /** - * Immediately invoke an action on the particle. - */ - public ParticleController controlAction(Consumer action) { + public ParticleController controlAction(Consumer action) { action.accept(getParticle()); return this; } - /** - * Load the particle reference. Only the first call has effect. - */ - public void loadParticle(ControllableParticle particle) { + public void loadParticle(ControllableParticle particle) { if (this.particle != null) { return; } @@ -81,10 +64,7 @@ public void loadParticle(ControllableParticle particle) { this.particle = particle; } - /** - * Run the init invoker if not already done. - */ - public void particleInit() { + public void particleInit() { if (init) { return; } @@ -95,10 +75,7 @@ public void particleInit() { init = true; } - /** - * Run all pre-tick actions and check for death. - */ - public void doTick() { + public void doTick() { for (Consumer action : invokeQueue) { action.accept(getParticle()); } @@ -118,9 +95,6 @@ public void rotateParticleTo(Vec3 target) { public void rotateParticleTo(Vector3f target) { getParticle().rotateParticleTo(target); } - - // ---- Controllable interface ---- - @Override public UUID controlUUID() { return uuid; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ClientParticleGroupManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ClientParticleGroupManager.java similarity index 81% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ClientParticleGroupManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ClientParticleGroupManager.java index c7b7da7..894b9e9 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ClientParticleGroupManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ClientParticleGroupManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.control.group; import net.minecraft.client.Minecraft; @@ -10,14 +8,6 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -/** - * Client-side manager for {@link ControllableParticleGroup} instances. - *

- * Tracks visible groups, ticks them, and provides factory registration - * for creating groups from server-side packets. - * - * @deprecated Use ParticleGroupStyle instead. - */ @Deprecated public final class ClientParticleGroupManager { public static final ClientParticleGroupManager INSTANCE = new ClientParticleGroupManager(); @@ -58,10 +48,7 @@ public void clearAllVisible() { visibleControls.clear(); } - /** - * Called every client tick. Ticks all visible groups and clears if player is removed. - */ - public void doClientTick() { + public void doClientTick() { LocalPlayer player = Minecraft.getInstance().player; if (player == null) { return; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroup.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroup.java similarity index 86% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroup.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroup.java index 7995981..ea00265 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.control.group; import com.reiasu.reiparticlesapi.network.particle.style.ParticleGroupStyle; @@ -21,14 +19,6 @@ import java.util.function.Consumer; import java.util.function.Function; -/** - * Base class for client-side controllable particle groups. - *

- * A group manages a collection of {@link Controllable} objects arranged at relative - * locations around an origin point. Supports scaling, rotation, and tick-based lifecycle. - * - * @deprecated Use {@link ParticleGroupStyle} instead. - */ @Deprecated public abstract class ControllableParticleGroup implements Controllable { @@ -52,9 +42,6 @@ public abstract class ControllableParticleGroup implements Controllable> getParticles() { return particles; } @@ -92,40 +79,19 @@ public ControllableParticleGroup(UUID uuid) { public boolean getDisplayed() { return displayed; } public void setDisplayed(boolean v) { this.displayed = v; } + public abstract Map loadParticleLocations(); - // ---- Abstract methods ---- - - /** - * Define the particle layout: mapping from particle data to relative location. - */ - public abstract Map loadParticleLocations(); + public abstract void onGroupDisplay(); - /** - * Called after display is complete. - */ - public abstract void onGroupDisplay(); - - /** - * Called before particles are spawned. Can modify the locations map. - */ - public void beforeDisplay(Map locations) { + public void beforeDisplay(Map locations) { // Default no-op } - - // ---- Factory helper ---- - - /** - * Create a {@link ParticleRelativeData} for use in {@link #loadParticleLocations()}. - */ - public ParticleRelativeData withEffect( + public ParticleRelativeData withEffect( Function effect, Consumer invoker ) { return new ParticleRelativeData(effect, invoker); } - - // ---- Particle lifecycle ---- - public void clearParticles() { for (Controllable c : particles.values()) { c.remove(); @@ -154,10 +120,7 @@ public void flushRelativeLocations() { } } - /** - * Called every client tick by {@link ClientParticleGroupManager}. - */ - public void tick() { + public void tick() { if (!valid || canceled) { clearParticles(); return; @@ -202,9 +165,6 @@ public void scale(double d) { toggleScaleDisplayed(); } } - - // ---- Rotation ---- - @Override public void rotateToPoint(RelativeLocation to) { if (!displayed) return; @@ -232,9 +192,6 @@ public void rotateAsAxis(double angle) { Math3DUtil.rotateAsAxis(locs, axis, angle); teleportAllToRelative(); } - - // ---- Teleport ---- - @Deprecated public void teleportGroupTo(Vec3 pos) { this.origin = pos; @@ -265,16 +222,10 @@ public ControllableParticleGroup getControlObject() { public UUID controlUUID() { return uuid; } - - // ---- Pre-tick actions ---- - protected ControllableParticleGroup addPreTickAction(Consumer action) { invokeQueue.add(action); return this; } - - // ---- Pre-rotate helpers ---- - public void preRotateTo(Map map, RelativeLocation to) { Math3DUtil.rotatePointsToPoint(new ArrayList<>(map.values()), to, axis); axis = to; @@ -288,9 +239,6 @@ public void preRotateAsAxis(Map map, Rel public void preRotateAsAxis(Map map, double angle) { Math3DUtil.rotateAsAxis(new ArrayList<>(map.values()), axis, angle); } - - // ---- Internal ---- - protected void toggleScaleDisplayed() { if (scale == 1.0) return; for (Map.Entry, RelativeLocation> entry : particlesLocations.entrySet()) { @@ -359,14 +307,7 @@ private void toggleScale(Map locations) } } } - - // ---- Inner class: ParticleRelativeData ---- - - /** - * Data holder for a single particle in the group layout: - * contains the effect factory, particle initializer, and optional controller action. - */ - public static class ParticleRelativeData { + public static class ParticleRelativeData { private final Function effect; private final Consumer invoker; private final UUID uuid; @@ -384,10 +325,7 @@ public ParticleRelativeData(Function effect, Consumer getControllerAction() { return controllerAction; } - /** - * Set an action to be run on the ParticleController after creation. - */ - public ParticleRelativeData withController(Consumer controller) { + public ParticleRelativeData withController(Consumer controller) { this.controllerAction = controller; return this; } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroupProvider.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroupProvider.java new file mode 100644 index 0000000..ea96583 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/ControllableParticleGroupProvider.java @@ -0,0 +1,14 @@ +package com.reiasu.reiparticlesapi.particles.control.group; + +import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; + +import java.util.Map; +import java.util.UUID; + +@Deprecated +public interface ControllableParticleGroupProvider { + + ControllableParticleGroup createGroup(UUID uuid, Map> args); + + void changeGroup(ControllableParticleGroup group, Map> args); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/SequencedParticleGroup.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/SequencedParticleGroup.java similarity index 92% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/SequencedParticleGroup.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/SequencedParticleGroup.java index 1041c2f..65cbba1 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/SequencedParticleGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/control/group/SequencedParticleGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.control.group; import com.mojang.logging.LogUtils; @@ -24,14 +22,6 @@ import java.util.function.Consumer; import java.util.function.Function; -/** - * A particle group that supports sequenced (ordered) display of particles. - *

- * Particles can be added/removed one by one or in batches, with bit-packed - * status arrays tracking which particles are currently displayed. - * - * @deprecated Use ParticleGroupStyle instead. - */ @Deprecated public abstract class SequencedParticleGroup extends ControllableParticleGroup { @@ -44,9 +34,6 @@ public abstract class SequencedParticleGroup extends ControllableParticleGroup { public SequencedParticleGroup(UUID uuid) { super(uuid); } - - // ---- Lazy init for displayedStatus ---- - public long[] getDisplayedStatus() { if (displayedStatus == null) { displayedStatus = new long[Math.max(1, sequencedParticles.size())]; @@ -61,9 +48,6 @@ public long[] getDisplayedStatus() { protected ArrayList> getSequencedParticles() { return sequencedParticles; } - - // ---- Override parent methods to delegate to sequenced versions ---- - @Override public final Map loadParticleLocations() { return Map.of(); @@ -78,13 +62,7 @@ public void beforeDisplay(SortedMap loadParticleLocationsWithIndex(); - - // ---- Display lifecycle ---- - + public abstract SortedMap loadParticleLocationsWithIndex(); @Override public void flush() { if (getCanceled() || !getValid() || !getDisplayed()) { @@ -115,9 +93,6 @@ private void displayParticles() { beforeDisplay(locations); toggleScale(locations); } - - // ---- Factory helper ---- - public SequencedParticleRelativeData withEffect( Function effect, Consumer invoker, @@ -125,9 +100,6 @@ public SequencedParticleRelativeData withEffect( ) { return new SequencedParticleRelativeData(effect, invoker, order); } - - // ---- Status management ---- - public void setSingleStatus(int index, boolean status) { int page = MathDataUtil.getStoragePageLong(index); int bit = MathDataUtil.getStorageWithBitLong(index); @@ -252,9 +224,6 @@ protected final void toggleScaleDisplayed() { } } } - - // ---- Rotation overrides (operate on sequencedParticles) ---- - @Override public void rotateToPoint(RelativeLocation to) { if (!getDisplayed()) return; @@ -282,9 +251,6 @@ public void rotateToWithAngle(RelativeLocation to, double angle) { teleportParticlesToRelative(); setAxis(to.normalize()); } - - // ---- Internal helpers ---- - private List extractLocations() { List result = new ArrayList<>(sequencedParticles.size()); for (Pair pair : sequencedParticles) { @@ -367,13 +333,7 @@ private void toggleScale(SortedMap { @@ -406,10 +366,7 @@ public int hashCode() { } } - /** - * Simple generic pair utility (replaces Kotlin's Pair). - */ - public static class Pair { + public static class Pair { public final A first; public final B second; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableCloudEffect.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableCloudEffect.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableCloudEffect.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableCloudEffect.java index df05918..1b70c10 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableCloudEffect.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableCloudEffect.java @@ -1,12 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl; import com.reiasu.reiparticlesapi.particles.ControllableParticleEffect; import com.reiasu.reiparticlesapi.particles.ReiModParticles; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; - import java.util.UUID; public class ControllableCloudEffect implements ControllableParticleEffect { @@ -32,8 +28,4 @@ public ControllableCloudEffect clone() { } @Override public ParticleType getType() { return ReiModParticles.CONTROLLABLE_CLOUD.get(); } - @Override public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeUUID(uuid); buf.writeBoolean(faceToPlayer); - } - @Override public String writeToString() { return "coo:cloud"; } } \ No newline at end of file diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEnchantmentEffect.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEnchantmentEffect.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEnchantmentEffect.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEnchantmentEffect.java index a950a50..b4e9a5f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEnchantmentEffect.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEnchantmentEffect.java @@ -1,12 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl; import com.reiasu.reiparticlesapi.particles.ControllableParticleEffect; import com.reiasu.reiparticlesapi.particles.ReiModParticles; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; - import java.util.UUID; public class ControllableEnchantmentEffect implements ControllableParticleEffect { @@ -36,8 +32,4 @@ public ControllableEnchantmentEffect clone() { @Override public boolean getFaceToPlayer() { return faceToPlayer; } @Override public ParticleType getType() { return ReiModParticles.CONTROLLABLE_ENCHANTMENT.get(); } - @Override public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeUUID(uuid); buf.writeBoolean(faceToPlayer); - } - @Override public String writeToString() { return "coo:enchantment"; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEndRodEffect.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEndRodEffect.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEndRodEffect.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEndRodEffect.java index 6dab47c..784bc97 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEndRodEffect.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableEndRodEffect.java @@ -1,12 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl; import com.reiasu.reiparticlesapi.particles.ControllableParticleEffect; import com.reiasu.reiparticlesapi.particles.ReiModParticles; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; - import java.util.UUID; public class ControllableEndRodEffect implements ControllableParticleEffect { @@ -36,8 +32,4 @@ public ControllableEndRodEffect clone() { @Override public boolean getFaceToPlayer() { return faceToPlayer; } @Override public ParticleType getType() { return ReiModParticles.CONTROLLABLE_END_ROD.get(); } - @Override public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeUUID(uuid); buf.writeBoolean(faceToPlayer); - } - @Override public String writeToString() { return "coo:end_rod"; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFallingDustEffect.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFallingDustEffect.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFallingDustEffect.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFallingDustEffect.java index bdf60a5..e0d0099 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFallingDustEffect.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFallingDustEffect.java @@ -1,11 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl; import com.reiasu.reiparticlesapi.particles.ControllableParticleEffect; import com.reiasu.reiparticlesapi.particles.ReiModParticles; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -41,8 +38,4 @@ public ControllableFallingDustEffect clone() { @Override public boolean getFaceToPlayer() { return faceToPlayer; } @Override public ParticleType getType() { return ReiModParticles.CONTROLLABLE_FALLING_DUST.get(); } - @Override public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeUUID(uuid); buf.writeBoolean(faceToPlayer); - } - @Override public String writeToString() { return "coo:falling_dust"; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFireworkEffect.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFireworkEffect.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFireworkEffect.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFireworkEffect.java index 6d0ca8c..1e084ca 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFireworkEffect.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFireworkEffect.java @@ -1,12 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl; import com.reiasu.reiparticlesapi.particles.ControllableParticleEffect; import com.reiasu.reiparticlesapi.particles.ReiModParticles; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; - import java.util.UUID; public class ControllableFireworkEffect implements ControllableParticleEffect { @@ -36,8 +32,4 @@ public ControllableFireworkEffect clone() { @Override public boolean getFaceToPlayer() { return faceToPlayer; } @Override public ParticleType getType() { return ReiModParticles.CONTROLLABLE_FIREWORK.get(); } - @Override public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeUUID(uuid); buf.writeBoolean(faceToPlayer); - } - @Override public String writeToString() { return "coo:firework"; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFlashEffect.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFlashEffect.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFlashEffect.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFlashEffect.java index e5f4675..f3044c2 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFlashEffect.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableFlashEffect.java @@ -1,12 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl; import com.reiasu.reiparticlesapi.particles.ControllableParticleEffect; import com.reiasu.reiparticlesapi.particles.ReiModParticles; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; - import java.util.UUID; public class ControllableFlashEffect implements ControllableParticleEffect { @@ -36,8 +32,4 @@ public ControllableFlashEffect clone() { @Override public boolean getFaceToPlayer() { return faceToPlayer; } @Override public ParticleType getType() { return ReiModParticles.CONTROLLABLE_FLASH.get(); } - @Override public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeUUID(uuid); buf.writeBoolean(faceToPlayer); - } - @Override public String writeToString() { return "coo:flash"; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableSplashEffect.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableSplashEffect.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableSplashEffect.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableSplashEffect.java index caa0305..7a2e621 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableSplashEffect.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/ControllableSplashEffect.java @@ -1,12 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl; import com.reiasu.reiparticlesapi.particles.ControllableParticleEffect; import com.reiasu.reiparticlesapi.particles.ReiModParticles; import net.minecraft.core.particles.ParticleType; -import net.minecraft.network.FriendlyByteBuf; - import java.util.UUID; public class ControllableSplashEffect implements ControllableParticleEffect { @@ -36,8 +32,4 @@ public ControllableSplashEffect clone() { @Override public boolean getFaceToPlayer() { return faceToPlayer; } @Override public ParticleType getType() { return ReiModParticles.CONTROLLABLE_SPLASH.get(); } - @Override public void writeToNetwork(FriendlyByteBuf buf) { - buf.writeUUID(uuid); buf.writeBoolean(faceToPlayer); - } - @Override public String writeToString() { return "coo:splash"; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableCloudParticle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableCloudParticle.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableCloudParticle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableCloudParticle.java index a396c89..dbf6939 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableCloudParticle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableCloudParticle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl.particles; import com.reiasu.reiparticlesapi.particles.ControllableParticle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEnchantmentParticle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEnchantmentParticle.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEnchantmentParticle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEnchantmentParticle.java index 796768e..00cc1cd 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEnchantmentParticle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEnchantmentParticle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl.particles; import com.reiasu.reiparticlesapi.particles.ControllableParticle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEndRodParticle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEndRodParticle.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEndRodParticle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEndRodParticle.java index b30b257..c7acd5b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEndRodParticle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableEndRodParticle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl.particles; import com.reiasu.reiparticlesapi.particles.ControllableParticle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFallingDustParticle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFallingDustParticle.java similarity index 98% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFallingDustParticle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFallingDustParticle.java index de9841f..cef5942 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFallingDustParticle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFallingDustParticle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl.particles; import com.reiasu.reiparticlesapi.particles.ControllableParticle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFireworkParticle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFireworkParticle.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFireworkParticle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFireworkParticle.java index bca6ba0..44392de 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFireworkParticle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFireworkParticle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl.particles; import com.reiasu.reiparticlesapi.particles.ControllableParticle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFlashParticle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFlashParticle.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFlashParticle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFlashParticle.java index 5ee0964..f26abd4 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFlashParticle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableFlashParticle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl.particles; import com.reiasu.reiparticlesapi.particles.ControllableParticle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableSplashParticle.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableSplashParticle.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableSplashParticle.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableSplashParticle.java index 4f893c7..e8777de 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableSplashParticle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/particles/impl/particles/ControllableSplashParticle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.particles.impl.particles; import com.reiasu.reiparticlesapi.particles.ControllableParticle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/reflect/ReiAPIScanner.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/reflect/ReiAPIScanner.java similarity index 70% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/reflect/ReiAPIScanner.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/reflect/ReiAPIScanner.java index 10d8194..a9e3a74 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/reflect/ReiAPIScanner.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/reflect/ReiAPIScanner.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.reflect; import com.mojang.logging.LogUtils; @@ -15,12 +13,6 @@ import java.util.List; import java.util.stream.Collectors; -/** - * Classpath scanner using ClassGraph that discovers annotated classes at runtime. - *

- * Packages to scan must be registered via {@link #registerPackage(Class)} or - * {@link #registerPackage(String)} before calling {@link #scan()}. - */ public final class ReiAPIScanner { public static final ReiAPIScanner INSTANCE = new ReiAPIScanner(); @@ -33,9 +25,6 @@ public final class ReiAPIScanner { private ReiAPIScanner() { } - /** - * Perform the classpath scan. Only runs once; subsequent calls are no-ops. - */ public void scan() { if (loaded) { return; @@ -44,9 +33,7 @@ public void scan() { try { long start = System.currentTimeMillis(); - LOGGER.info("Starting ClassGraph scan..."); - - String[] packages = scanPackages.toArray(new String[0]); + String[] packages = scanPackages.toArray(new String[0]); try (ScanResult scanResult = new ClassGraph() .enableClassInfo() .enableAnnotationInfo() @@ -66,16 +53,13 @@ public void scan() { } long end = System.currentTimeMillis(); - LOGGER.info("ClassGraph scan completed in {}ms", (end - start)); + LOGGER.info("scan took {}ms", (end - start)); } catch (NoClassDefFoundError e) { - LOGGER.warn("ClassGraph not available — falling back to explicit listener registration only. " + LOGGER.warn("ClassGraph not available --” falling back to explicit listener registration only. " + "Use registerListenerInstance() or registerAnnotatedClass() instead.", e); } } - /** - * Return all scanned classes that carry the given annotation. - */ public Collection getWithAnnotation(Class anno) { List out = new ArrayList<>(); for (SimpleClassInfo info : classes) { @@ -86,9 +70,6 @@ public Collection getWithAnnotation(Class return out; } - /** - * Return loaded {@link Class} objects for all scanned classes that carry the given annotation. - */ public Collection> getClassesWithAnnotation(Class anno) { List> out = new ArrayList<>(); for (SimpleClassInfo info : classes) { @@ -103,24 +84,14 @@ public Collection> getClassesWithAnnotation(Class return out; } - /** - * Manually add a scan result (used internally during scan, or for testing). - */ public void inputScanResult(SimpleClassInfo scanResult) { classes.add(scanResult); } - /** - * Mark the scanner as loaded without performing a scan. - * Used by NeoForge/Forge mod-scan bootstrapping that provides class info externally. - */ public void neoLoaded() { loaded = true; } - /** - * Register a package to scan, derived from the given class's package. - */ public int getScannedPackageCount() { return scanPackages.size(); } @@ -130,12 +101,9 @@ public static void registerPackage(Class main) { registerPackage(packageName); } - /** - * Register a package name to include in the ClassGraph scan. - */ public static void registerPackage(String packageName) { INSTANCE.scanPackages.add(packageName); - LOGGER.info("Registered scan package: {}", packageName); + } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/reflect/SimpleClassInfo.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/reflect/SimpleClassInfo.java new file mode 100644 index 0000000..ee27c89 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/reflect/SimpleClassInfo.java @@ -0,0 +1,31 @@ +package com.reiasu.reiparticlesapi.reflect; + +import java.lang.annotation.Annotation; +import java.util.HashSet; + +public final class SimpleClassInfo { + + private final String type; + private final HashSet annotations; + + public SimpleClassInfo(String type, HashSet annotations) { + this.type = type; + this.annotations = annotations; + } + + public String getType() { + return type; + } + + public HashSet getAnnotations() { + return annotations; + } + + public boolean isAnnotationPresent(Class anno) { + return annotations.contains(anno.getName()); + } + + public Class toClass() throws ClassNotFoundException { + return Class.forName(type); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/RenderEntity.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/RenderEntity.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/RenderEntity.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/RenderEntity.java index 1ad4002..d995a8f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/RenderEntity.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/RenderEntity.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.renderer; import com.reiasu.reiparticlesapi.network.particle.ServerController; @@ -12,10 +10,6 @@ import java.util.UUID; -/** - * Base class for custom render entities that are managed server-side - * and rendered client-side with custom shaders/models. - */ public abstract class RenderEntity implements ServerController { private Level world; @@ -46,15 +40,9 @@ public RenderEntity() { public void spawnInWorld(ServerLevel world, Vec3 pos) { ServerRenderEntityManager.INSTANCE.spawn(this); } - - // ---- Abstract methods ---- - public abstract void clientTick(); public abstract void serverTick(); public abstract ResourceLocation getRenderID(); - - // ---- Lifecycle ---- - @Override public void tick() { age++; @@ -135,9 +123,6 @@ public void loadProfileFromEntity(RenderEntity another) { public RenderEntity getValue() { return this; } - - // ---- Getters / Setters ---- - public Level getWorld() { return world; } public void setWorld(Level world) { this.world = world; } public Vec3 getPos() { return pos; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/client/ClientRenderEntityManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/client/ClientRenderEntityManager.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/client/ClientRenderEntityManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/client/ClientRenderEntityManager.java index 851a9b1..cbcd80f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/client/ClientRenderEntityManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/client/ClientRenderEntityManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.renderer.client; import com.reiasu.reiparticlesapi.renderer.RenderEntity; @@ -10,12 +8,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; -/** - * Client-side manager for {@link RenderEntity} instances received via packets. - *

- * Tracks visible entities, ticks them, and provides codec registration - * for decoding entities from server-side packets. - */ public final class ClientRenderEntityManager { public static final ClientRenderEntityManager INSTANCE = new ClientRenderEntityManager(); @@ -59,10 +51,7 @@ public void clear() { entities.clear(); } - /** - * Called every client tick. Ticks all visible render entities and removes canceled ones. - */ - public void doClientTick() { + public void doClientTick() { entities.entrySet().removeIf(entry -> { RenderEntity entity = entry.getValue(); if (entity.getCanceled()) return true; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/server/ServerRenderEntityManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/server/ServerRenderEntityManager.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/server/ServerRenderEntityManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/server/ServerRenderEntityManager.java index 13bb6b8..0599938 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/renderer/server/ServerRenderEntityManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/renderer/server/ServerRenderEntityManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.renderer.server; import com.reiasu.reiparticlesapi.network.ReiParticlesNetwork; @@ -13,10 +11,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; -/** - * Manages all server-side {@link RenderEntity} instances, - * handling visibility, tick updates, and network sync. - */ public final class ServerRenderEntityManager { public static final ServerRenderEntityManager INSTANCE = new ServerRenderEntityManager(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/scheduler/ReiScheduler.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/scheduler/ReiScheduler.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/scheduler/ReiScheduler.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/scheduler/ReiScheduler.java index aba332f..928b3a6 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/scheduler/ReiScheduler.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/scheduler/ReiScheduler.java @@ -1,14 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.scheduler; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.Predicate; -/** - * Tick-based task scheduler. Supports one-shot, repeating (with interval), - * and repeating-with-max-tick tasks. Thread-safe task queue. - */ public final class ReiScheduler { public static final ReiScheduler INSTANCE = new ReiScheduler(); @@ -62,11 +56,7 @@ public TickRunnable runTaskTimerMaxTick(int preDelay, int maxLoopTick, Runnable return tr; } - /** - * A scheduled tick-driven task with support for one-shot, repeating, - * and repeating-with-limit modes. - */ - public static final class TickRunnable { + public static final class TickRunnable { private final int delay; private final Runnable action; private final boolean repeating; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroup.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroup.java similarity index 97% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroup.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroup.java index 787cedd..791c964 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.test; import com.reiasu.reiparticlesapi.test.api.TestGroup; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroupBuilder.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroupBuilder.java similarity index 89% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroupBuilder.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroupBuilder.java index ac169b5..d34ad0b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroupBuilder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestGroupBuilder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.test; import com.reiasu.reiparticlesapi.test.api.TestGroup; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestOption.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestOption.java similarity index 93% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestOption.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestOption.java index 8c6272c..f4ff589 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestOption.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/SimpleTestOption.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.test; import com.reiasu.reiparticlesapi.test.api.TestOption; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/TestManager.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/TestManager.java similarity index 97% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/TestManager.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/test/TestManager.java index f7520d9..09f65a8 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/TestManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/TestManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.test; import com.reiasu.reiparticlesapi.test.api.TestGroup; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroup.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroup.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroup.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroup.java index fd7ab5b..16dd94c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.test.api; import net.minecraft.server.level.ServerPlayer; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroupBuilder.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroupBuilder.java similarity index 64% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroupBuilder.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroupBuilder.java index b3e819b..3fc449b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroupBuilder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestGroupBuilder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.test.api; public interface TestGroupBuilder { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestOption.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestOption.java similarity index 76% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestOption.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestOption.java index cd85574..6fc5fda 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/test/api/TestOption.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/test/api/TestOption.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.test.api; public interface TestOption { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/CircularQueue.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/CircularQueue.java similarity index 89% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/CircularQueue.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/CircularQueue.java index 0334aaa..bbcff25 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/CircularQueue.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/CircularQueue.java @@ -1,14 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import java.util.Iterator; import java.util.NoSuchElementException; -/** - * A fixed-capacity circular queue (ring buffer). - * When full, new elements overwrite the oldest entries. - */ public final class CircularQueue implements Iterable { private final int capacity; private final Object[] data; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ClientCameraUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ClientCameraUtil.java similarity index 69% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ClientCameraUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ClientCameraUtil.java index 66780af..478630b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ClientCameraUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ClientCameraUtil.java @@ -1,19 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import net.minecraft.world.phys.Vec3; import java.util.concurrent.ThreadLocalRandom; -/** - * Utility singleton for managing client camera shake effects. - *

- * Stores per-tick shake offsets (position + angle) that a client-side camera - * mixin or event handler can apply. Call {@link #startShakeCamera(int, double)} - * to begin a shake, and {@link #tick()} each client tick to update the offsets. - * The shake amplitude linearly decreases to zero over the specified duration. - */ public final class ClientCameraUtil { public static final ClientCameraUtil INSTANCE = new ClientCameraUtil(); @@ -39,9 +29,6 @@ public final class ClientCameraUtil { private ClientCameraUtil() { } - - // ---- Shake offsets (read by camera mixin) ---- - public float getShakeYawOffset() { return shakeYawOffset; } public void setShakeYawOffset(float v) { shakeYawOffset = v; } @@ -56,9 +43,6 @@ private ClientCameraUtil() { public double getShakeZOffset() { return shakeZOffset; } public void setShakeZOffset(double v) { shakeZOffset = v; } - - // ---- Manual persistent offsets ---- - public float getCurrentYawOffset() { return currentYawOffset; } public void setCurrentYawOffset(float v) { currentYawOffset = v; } @@ -73,9 +57,6 @@ private ClientCameraUtil() { public double getCurrentZOffset() { return currentZOffset; } public void setCurrentZOffset(double v) { currentZOffset = v; } - - // ---- Shake control state ---- - public int getTick() { return tick; } public void setTick(int v) { tick = v; } @@ -84,60 +65,35 @@ private ClientCameraUtil() { public double getAmp() { return amp; } public void setAmp(double v) { amp = v; } - - // ---- Operations ---- - - /** - * Sets the manual position offset from a Vec3. - */ - public void setOffsetPosition(Vec3 offset) { + public void setOffsetPosition(Vec3 offset) { currentXOffset = offset.x; currentYOffset = offset.y; currentZOffset = offset.z; } - /** - * Resets manual position offsets to zero. - */ - public void resetPosOffset() { + public void resetPosOffset() { currentXOffset = 0.0; currentYOffset = 0.0; currentZOffset = 0.0; } - /** - * Resets manual angle offsets to zero. - */ - public void resetAngleOffset() { + public void resetAngleOffset() { currentYawOffset = 0.0f; currentPitchOffset = 0.0f; } - /** - * Resets all manual offsets (position + angle) to zero. - */ - public void resetOffset() { + public void resetOffset() { resetAngleOffset(); resetPosOffset(); } - /** - * Starts a camera shake effect that decays linearly over the given ticks. - * - * @param tick number of ticks the shake should last - * @param amplitude initial shake amplitude - */ - public void startShakeCamera(int tick, double amplitude) { + public void startShakeCamera(int tick, double amplitude) { this.amp = amplitude; this.ampStep = amp / (double) tick; this.tick = tick; } - /** - * Call each client tick. While a shake is active, randomises per-tick - * offsets and decays amplitude. - */ - public void tick() { + public void tick() { if (tick > 0) { ThreadLocalRandom rng = ThreadLocalRandom.current(); shakeXOffset = amp * rng.nextDouble(-0.5, 0.5); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/FourierPhotoUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/FourierPhotoUtil.java similarity index 87% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/FourierPhotoUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/FourierPhotoUtil.java index 55e90a4..d2dac6d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/FourierPhotoUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/FourierPhotoUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import com.reiasu.reiparticlesapi.utils.builder.FourierSeriesBuilder; @@ -10,33 +8,13 @@ import java.util.*; import java.util.stream.Collectors; -/** - * Converts raster images into Fourier series representations for particle rendering. - *

- * The pipeline: - *

    - *
  1. Build a binary solid/transparent mask from the image
  2. - *
  3. Find connected components via flood-fill BFS
  4. - *
  5. Extract ordered contours via Moore boundary tracing
  6. - *
  7. Resample the contour to a fixed sample count
  8. - *
  9. Compute DFT coefficients
  10. - *
  11. Convert to {@link FourierSeriesBuilder.Fourier} entries
  12. - *
- */ public final class FourierPhotoUtil { public static final FourierPhotoUtil INSTANCE = new FourierPhotoUtil(); private FourierPhotoUtil() { } - - // ---- Public API ---- - - /** - * Converts an image into a single {@link FourierSeriesBuilder}. - * If the image has multiple connected components, only the first (largest) is used. - */ - public FourierSeriesBuilder toFourierBuilder(BufferedImage image, + public FourierSeriesBuilder toFourierBuilder(BufferedImage image, int alphaThreshold, int sampleCount, int harmonics, @@ -52,18 +30,11 @@ public FourierSeriesBuilder toFourierBuilder(BufferedImage image, return builders.get(0); } - /** - * Default-parameter overload. - */ - public FourierSeriesBuilder toFourierBuilder(BufferedImage image) { + public FourierSeriesBuilder toFourierBuilder(BufferedImage image) { return toFourierBuilder(image, 1, 1024, 150, 1.0, true, true); } - /** - * Converts an image into multiple {@link FourierSeriesBuilder}s, one per connected component. - * Components are sorted by size (largest first) and limited to {@code maxComponents}. - */ - public List toFourierBuilders(BufferedImage image, + public List toFourierBuilders(BufferedImage image, int alphaThreshold, int sampleCount, int harmonics, @@ -100,18 +71,11 @@ public List toFourierBuilders(BufferedImage image, return builders; } - /** - * Default-parameter overload. - */ - public List toFourierBuilders(BufferedImage image) { + public List toFourierBuilders(BufferedImage image) { return toFourierBuilders(image, 1, 1024, 150, 1.0, true, true, 16, 20); } - /** - * Like {@link #toFourierBuilders} but returns a map of offset -> builder, - * where each component's offset is relative to the image center. - */ - public Map toFourierBuildersWithOffset( + public Map toFourierBuildersWithOffset( BufferedImage image, int alphaThreshold, int sampleCount, @@ -163,18 +127,11 @@ public Map toFourierBuildersWithOffset( return result; } - /** - * Default-parameter overload. - */ - public Map toFourierBuildersWithOffset(BufferedImage image) { + public Map toFourierBuildersWithOffset(BufferedImage image) { return toFourierBuildersWithOffset(image, 1, 1024, 150, 1.0, true, 16, 20); } - /** - * Converts each connected component into a list of {@link RelativeLocation} points - * by building then evaluating a Fourier series. - */ - public List> toFourierPointsMulti(BufferedImage image, + public List> toFourierPointsMulti(BufferedImage image, int alphaThreshold, int sampleCount, int harmonics, @@ -190,15 +147,9 @@ public List> toFourierPointsMulti(BufferedImage image, .collect(Collectors.toList()); } - /** - * Default-parameter overload. - */ - public List> toFourierPointsMulti(BufferedImage image) { + public List> toFourierPointsMulti(BufferedImage image) { return toFourierPointsMulti(image, 1, 1024, 150, 1.0, true, true, 16, 20); } - - // ---- Internal: mask & components ---- - private boolean[] buildSolidMask(BufferedImage image, int alphaThreshold) { int w = image.getWidth(); int h = image.getHeight(); @@ -273,9 +224,6 @@ private double[] computeComponentCenterPx(int[] compPixels, int w) { int count = Math.max(compPixels.length, 1); return new double[]{sx / count, sy / count}; } - - // ---- Internal: contour extraction ---- - private List extractOrderedContourFromComponent(int width, int height, int[] componentPixels) { boolean[] compMask = new boolean[width * height]; for (int p : componentPixels) { @@ -317,10 +265,7 @@ private boolean isSolid(int x, int y, int w, int h, boolean[] mask) { return mask[y * w + x]; } - /** - * Moore neighborhood boundary tracing. - */ - private List traceMoore(Vector2i start, int w, int h, boolean[] mask) { + private List traceMoore(Vector2i start, int w, int h, boolean[] mask) { Vector2i[] dir = { new Vector2i(1, 0), new Vector2i(1, 1), new Vector2i(0, 1), new Vector2i(-1, 1), new Vector2i(-1, 0), new Vector2i(-1, -1), new Vector2i(0, -1), new Vector2i(1, -1) @@ -360,9 +305,6 @@ private List traceMoore(Vector2i start, int w, int h, boolean[] mask) return contour; } - - // ---- Internal: resampling & coordinate mapping ---- - private List resampleClosedPath(List path, int targetCount) { List pts = new ArrayList<>(path.size()); for (Vector2i v : path) { @@ -422,9 +364,6 @@ private List mapToXZ(List pts, int width, int height, double } return result; } - - // ---- Internal: DFT ---- - private Vector2d[] dft(List samples) { int n = samples.size(); Vector2d[] out = new Vector2d[n]; @@ -447,9 +386,6 @@ private Vector2d[] dft(List samples) { } return out; } - - // ---- Internal: coefficients to Fourier list ---- - private List coeffsToFouriers(Vector2d[] coeffs, int harmonics, boolean sortByAmplitude) { int n = coeffs.length; List all = new ArrayList<>(n); diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/GraphMathHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/GraphMathHelper.java new file mode 100644 index 0000000..7577958 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/GraphMathHelper.java @@ -0,0 +1,42 @@ +package com.reiasu.reiparticlesapi.utils; + +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; + +public final class GraphMathHelper { + private GraphMathHelper() { + } + + public static Vec3 lerp(float alpha, Vec3 from, Vec3 to) { + return new Vec3( + Mth.lerp((double) alpha, from.x, to.x), + Mth.lerp((double) alpha, from.y, to.y), + Mth.lerp((double) alpha, from.z, to.z) + ); + } + + public static double inverseLerp(double value, double min, double max) { + if (max == min) { + return 0.0; + } + return (value - min) / (max - min); + } + + public static double smoothstep(double edge0, double edge1, double x) { + double t = Math.clamp(inverseLerp(x, edge0, edge1), 0.0, 1.0); + return t * t * (3.0 - 2.0 * t); + } + + public static double inversePowerFalloff(double dist, double range, double power) { + if (range <= 0.0) { + return 0.0; + } + double ratio = dist / range; + return 1.0 / (1.0 + Math.pow(ratio, power)); + } + + public static double expDampFactor(double damping, double dt) { + double factor = Math.exp(-damping * dt); + return Math.max(0.0, Math.min(1.0, factor)); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ImageUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ImageUtil.java similarity index 63% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ImageUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ImageUtil.java index 767e94c..9c31c57 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ImageUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ImageUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import com.reiasu.reiparticlesapi.utils.RelativeLocation; @@ -15,13 +13,6 @@ import java.util.List; import java.util.Map; -/** - * Utility singleton for loading images from mod resources and converting - * them to particle point clouds. - *

- * Points are generated in the XZ plane (Y=0) with configurable step spacing. - * Only non-transparent pixels are included. - */ public final class ImageUtil { public static final ImageUtil INSTANCE = new ImageUtil(); @@ -29,13 +20,7 @@ public final class ImageUtil { private ImageUtil() { } - /** - * Loads a {@link BufferedImage} from the mod's resource path. - * - * @param id the resource location (namespace:path) - * @return the loaded image, or null if not found - */ - @Nullable + @Nullable public BufferedImage loadFromIdentifier(ResourceLocation id) { String path = "assets/" + id.getNamespace() + "/" + id.getPath(); try (InputStream stream = getClass().getClassLoader().getResourceAsStream(path)) { @@ -46,10 +31,7 @@ public BufferedImage loadFromIdentifier(ResourceLocation id) { } } - /** - * Scales an image by the given percentage (e.g. 0.5 = 50%). - */ - public BufferedImage scale(double scalePercent, BufferedImage image) { + public BufferedImage scale(double scalePercent, BufferedImage image) { int newWidth = (int) Math.round(image.getWidth() * scalePercent); int newHeight = (int) Math.round(image.getHeight() * scalePercent); BufferedImage result = new BufferedImage(newWidth, newHeight, image.getType()); @@ -62,15 +44,7 @@ public BufferedImage scale(double scalePercent, BufferedImage image) { return result; } - /** - * Converts non-transparent pixels to a list of {@link RelativeLocation} points - * in the XZ plane. - * - * @param image the source image - * @param step the spacing between pixel positions in world units - * @return list of points corresponding to non-transparent pixels - */ - public List toPoints(BufferedImage image, double step) { + public List toPoints(BufferedImage image, double step) { List result = new ArrayList<>(); for (int x = 0; x < image.getWidth(); x++) { for (int y = 0; y < image.getHeight(); y++) { @@ -82,14 +56,7 @@ public List toPoints(BufferedImage image, double step) { return result; } - /** - * Converts non-transparent pixels to a map of point -> alpha value. - * - * @param image the source image - * @param step the spacing in world units - * @return map from point to alpha (0-255) - */ - public Map toPointsWithAlpha(BufferedImage image, double step) { + public Map toPointsWithAlpha(BufferedImage image, double step) { Map result = new HashMap<>(); for (int x = 0; x < image.getWidth(); x++) { for (int y = 0; y < image.getHeight(); y++) { @@ -102,14 +69,7 @@ public Map toPointsWithAlpha(BufferedImage image, dou return result; } - /** - * Converts non-transparent pixels to a map of point -> full RGBA color int. - * - * @param image the source image - * @param step the spacing in world units - * @return map from point to ARGB color value - */ - public Map toPointsWithRGBA(BufferedImage image, double step) { + public Map toPointsWithRGBA(BufferedImage image, double step) { Map result = new HashMap<>(); for (int x = 0; x < image.getWidth(); x++) { for (int y = 0; y < image.getHeight(); y++) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/LinearLevelLerp.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/LinearLevelLerp.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/LinearLevelLerp.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/LinearLevelLerp.java index 37af237..745e0e8 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/LinearLevelLerp.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/LinearLevelLerp.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import net.minecraft.world.phys.Vec3; @@ -8,10 +6,6 @@ import java.util.ArrayList; import java.util.List; -/** - * Multi-level linear interpolation utility. - * Supports chained interpolation levels for smooth multi-stage transitions. - */ public final class LinearLevelLerp { private List levels = new ArrayList<>(); private List prevLevels = new ArrayList<>(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/Math3DUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/Math3DUtil.java similarity index 74% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/Math3DUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/Math3DUtil.java index e6773e2..517be8e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/Math3DUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/Math3DUtil.java @@ -1,9 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ThreadLocalRandom; import org.joml.Vector3f; @@ -15,28 +14,14 @@ public static double length(double x, double y, double z) { return Math.sqrt(x * x + y * y + z * z); } - public static double clamp(double value, double min, double max) { - return Math.max(min, Math.min(max, value)); - } - - public static double lerp(double from, double to, double alpha) { - return from + (to - from) * alpha; - } - public static Vector3f colorOf(int r, int g, int b) { - int rr = (int) clamp(r, 0, 255); - int gg = (int) clamp(g, 0, 255); - int bb = (int) clamp(b, 0, 255); - return new Vector3f((float) rr / 255f, (float) gg / 255f, (float) bb / 255f); + return new Vector3f( + Math.clamp(r, 0, 255) / 255f, + Math.clamp(g, 0, 255) / 255f, + Math.clamp(b, 0, 255) / 255f); } - /** - * Compute Euler angles (pitch, yaw, roll) to orient towards the given target direction. - * - * @param target the target direction vector - * @return float array [pitch, yaw, roll] in radians - */ - public static float[] calculateEulerAnglesToPointArray(Vector3f target) { + public static float[] calculateEulerAnglesToPointArray(Vector3f target) { if (target.x == 0.0f && target.y == 0.0f && target.z == 0.0f) { return new float[]{0.0f, 0.0f, 0.0f}; } @@ -57,10 +42,7 @@ public static double getPitchFromLocation(RelativeLocation location) { return Math.atan2(-y, Math.sqrt(x * x + z * z)); } - /** - * Generate points along a line from start to end with the given step distance. - */ - public static List fillLine(RelativeLocation start, RelativeLocation end, double step) { + public static List fillLine(RelativeLocation start, RelativeLocation end, double step) { List result = new ArrayList<>(); double dist = start.distance(end); if (dist <= 0.0 || step <= 0.0) { @@ -82,19 +64,11 @@ public static List fillLine(RelativeLocation start, RelativeLo return result; } - /** - * Generate branching lightning bolt points from origin to target. - * - * @param target end point relative to origin - * @param segments number of line segments - * @param branches number of side branches - * @return list of points along the bolt path - */ - public static List getLightningEffectPoints(RelativeLocation target, int segments, int branches) { + public static List getLightningEffectPoints(RelativeLocation target, int segments, int branches) { List result = new ArrayList<>(); if (target == null || segments <= 0) return result; - java.util.Random rand = new java.util.Random(); + ThreadLocalRandom rand = ThreadLocalRandom.current(); double dx = target.getX() / segments; double dy = target.getY() / segments; double dz = target.getZ() / segments; @@ -136,11 +110,7 @@ public static List getPolygonInCircleVertices(int sides, doubl return vertices; } - /** - * Rotates all points in-place around the given axis by the specified angle - * using Rodrigues' rotation formula. - */ - public static void rotateAsAxis(List points, RelativeLocation axis, double radians) { + public static void rotateAsAxis(List points, RelativeLocation axis, double radians) { if (points == null || points.isEmpty() || axis == null) return; double len = axis.length(); if (len < 1.0E-10) return; @@ -163,11 +133,7 @@ public static void rotateAsAxis(List points, RelativeLocation } } - /** - * Rotates all points in-place so that the current {@code fromAxis} direction - * is aligned to the {@code toAxis} direction. - */ - public static void rotatePointsToPoint(List points, RelativeLocation toAxis, RelativeLocation fromAxis) { + public static void rotatePointsToPoint(List points, RelativeLocation toAxis, RelativeLocation fromAxis) { if (points == null || points.isEmpty() || toAxis == null || fromAxis == null) return; double fromLen = fromAxis.length(); double toLen = toAxis.length(); @@ -199,15 +165,12 @@ public static void rotatePointsToPoint(List points, RelativeLo } double dot = fx * tx + fy * ty + fz * tz; - double angle = Math.acos(clamp(dot, -1.0, 1.0)); + double angle = Math.acos(Math.clamp(dot, -1.0, 1.0)); RelativeLocation rotAxis = new RelativeLocation(cx / crossLen, cy / crossLen, cz / crossLen); rotateAsAxis(points, rotAxis, angle); } - /** - * Returns a unit vector perpendicular to (x, y, z). - */ - private static RelativeLocation perpendicular(double x, double y, double z) { + private static RelativeLocation perpendicular(double x, double y, double z) { if (Math.abs(x) < 0.9) { // cross with (1, 0, 0) double cy = z; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/MathDataUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/MathDataUtil.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/MathDataUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/MathDataUtil.java index 89a4de9..22eb84b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/MathDataUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/MathDataUtil.java @@ -1,10 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; -/** - * Bit manipulation utility for compact status storage in int/long containers. - */ public final class MathDataUtil { private MathDataUtil() { } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/MathPresets.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/MathPresets.java similarity index 85% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/MathPresets.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/MathPresets.java index c6bac79..3539f2b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/MathPresets.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/MathPresets.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import com.reiasu.reiparticlesapi.utils.builder.PointsBuilder; @@ -7,11 +5,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.function.Function; -/** - * Preset particle shapes for Roman numeral display (I through XII). - * Each method returns a list of RelativeLocations forming the numeral shape. - */ public final class MathPresets { private MathPresets() { } @@ -177,25 +172,27 @@ public static double getRomaOffsetY(double scale) { return 0.25 * scale * 2.0; } + @SuppressWarnings("unchecked") + private static final Function>[] ROMA_GENERATORS = new Function[] { + (Function>) MathPresets::romaI, + (Function>) MathPresets::romaII, + (Function>) MathPresets::romaIII, + (Function>) MathPresets::romaIV, + (Function>) MathPresets::romaV, + (Function>) MathPresets::romaVI, + (Function>) MathPresets::romaVII, + (Function>) MathPresets::romaVIII, + (Function>) MathPresets::romaIX, + (Function>) MathPresets::romaX, + (Function>) MathPresets::romaXI, + (Function>) MathPresets::romaXII, + }; + public static List withRomaNumber(int i, double scale) { - if (i < 1 || i > 12) { - throw new IllegalArgumentException("Only supports Roman numerals 1-12"); - } - switch (i) { - case 1: return romaI(scale); - case 2: return romaII(scale); - case 3: return romaIII(scale); - case 4: return romaIV(scale); - case 5: return romaV(scale); - case 6: return romaVI(scale); - case 7: return romaVII(scale); - case 8: return romaVIII(scale); - case 9: return romaIX(scale); - case 10: return romaX(scale); - case 11: return romaXI(scale); - case 12: return romaXII(scale); - default: return new ArrayList<>(); + if (i < 1 || i > ROMA_GENERATORS.length) { + throw new IllegalArgumentException("Only supports Roman numerals 1-" + ROMA_GENERATORS.length); } + return ROMA_GENERATORS[i - 1].apply(scale); } private static void requireMinScale(double scale) { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/NoiseMode.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/NoiseMode.java similarity index 58% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/NoiseMode.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/NoiseMode.java index 5b34ff9..8c73a2a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/NoiseMode.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/NoiseMode.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; public enum NoiseMode { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/PhysicsUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/PhysicsUtil.java similarity index 51% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/PhysicsUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/PhysicsUtil.java index c3d9fbf..4bd8ff8 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/PhysicsUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/PhysicsUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import net.minecraft.core.Direction; @@ -7,61 +5,38 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; +import net.minecraft.util.Mth; -/** - * Utility class for physics-related calculations including collision detection - * and movement resolution. - */ public final class PhysicsUtil { private PhysicsUtil() { } - - // ---- Collision / Raycast ---- - - /** - * Perform a block raycast from {@code currentPos} in the direction of {@code velocity}. - * - * @param currentPos the starting position - * @param velocity the movement delta - * @param world the world to raycast in - * @return the block hit result - */ - public static BlockHitResult collide(Vec3 currentPos, Vec3 velocity, Level world) { + public static BlockHitResult collide(Vec3 currentPos, Vec3 velocity, Level world) { ClipContext context = new ClipContext( currentPos, currentPos.add(velocity), ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, - null + (net.minecraft.world.entity.Entity) null ); return world.clip(context); } - /** - * Compute a position slightly before the collision point, offset along the surface normal. - * - * @param res the block hit result - * @return a position slightly offset from the hit point along the block normal - */ - public static Vec3 fixBeforeCollidePosition(BlockHitResult res) { + public static Vec3 fixBeforeCollidePosition(BlockHitResult res) { Direction dir = res.getDirection(); Vec3 normal = new Vec3(dir.getStepX(), dir.getStepY(), dir.getStepZ()); Vec3 location = res.getLocation(); Vec3 normalizedOffset = normal.normalize(); return location.add(normalizedOffset.scale(0.07)); } - - // ---- Drag / Steering (existing methods) ---- - public static RelativeLocation applyDrag(RelativeLocation velocity, double dragFactor) { return velocity.scale(dragFactor); } public static RelativeLocation steer(RelativeLocation velocity, RelativeLocation desired, double blend) { - double clampedBlend = Math3DUtil.clamp(blend, 0.0, 1.0); - velocity.setX(Math3DUtil.lerp(velocity.getX(), desired.getX(), clampedBlend)); - velocity.setY(Math3DUtil.lerp(velocity.getY(), desired.getY(), clampedBlend)); - velocity.setZ(Math3DUtil.lerp(velocity.getZ(), desired.getZ(), clampedBlend)); + double clampedBlend = Math.clamp(blend, 0.0, 1.0); + velocity.setX(Mth.lerp(clampedBlend, velocity.getX(), desired.getX())); + velocity.setY(Mth.lerp(clampedBlend, velocity.getY(), desired.getY())); + velocity.setZ(Mth.lerp(clampedBlend, velocity.getZ(), desired.getZ())); return velocity; } diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ReflectUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ReflectUtil.java new file mode 100644 index 0000000..d370640 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ReflectUtil.java @@ -0,0 +1,37 @@ +package com.reiasu.reiparticlesapi.utils; + +import com.mojang.logging.LogUtils; +import org.slf4j.Logger; + +import java.util.function.Supplier; + +public final class ReflectUtil { + + private static final Logger LOGGER = LogUtils.getLogger(); + + private ReflectUtil() { + } + + public static void infoTimeWith(String name, Runnable invoker) { + long start = System.currentTimeMillis(); + invoker.run(); + long end = System.currentTimeMillis(); + LOGGER.debug(name + " " + (end - start) + "ms"); + } + + public static void infoTimeWith(Runnable invoker) { + infoTimeWith("", invoker); + } + + public static T infoTimeCallable(String name, Supplier invoker) { + long start = System.currentTimeMillis(); + T result = invoker.get(); + long end = System.currentTimeMillis(); + LOGGER.debug(name + " " + (end - start) + "ms"); + return result; + } + + public static T infoTimeCallable(Supplier invoker) { + return infoTimeCallable("", invoker); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/RelativeLocation.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/RelativeLocation.java similarity index 97% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/RelativeLocation.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/RelativeLocation.java index 8cf6086..c7cc2da 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/RelativeLocation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/RelativeLocation.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import net.minecraft.world.phys.Vec3; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/RotationMatrix.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/RotationMatrix.java similarity index 59% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/RotationMatrix.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/RotationMatrix.java index cd05844..a2a7e44 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/RotationMatrix.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/RotationMatrix.java @@ -1,11 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; -/** - * 3D rotation matrix constructed from an axis-angle representation. - * Uses Rodrigues' rotation formula. - */ public final class RotationMatrix { private final double[][] matrix; @@ -13,17 +7,11 @@ private RotationMatrix(double[][] matrix) { this.matrix = matrix; } - /** - * Apply the rotation to a clone of the given point (does not modify the original). - */ - public RelativeLocation applyToClone(RelativeLocation point) { + public RelativeLocation applyToClone(RelativeLocation point) { return applyTo(point.copy()); } - /** - * Apply the rotation in-place and return the modified point. - */ - public RelativeLocation applyTo(RelativeLocation point) { + public RelativeLocation applyTo(RelativeLocation point) { double x = point.getX(); double y = point.getY(); double z = point.getZ(); @@ -33,13 +21,7 @@ public RelativeLocation applyTo(RelativeLocation point) { return point; } - /** - * Create a rotation matrix from an axis and angle (radians). - * - * @param axis the rotation axis (will be normalized internally) - * @param angle the rotation angle in radians - */ - public static RotationMatrix fromAxisAngle(RelativeLocation axis, double angle) { + public static RotationMatrix fromAxisAngle(RelativeLocation axis, double angle) { RelativeLocation u = axis.copy().normalize(); double cos = Math.cos(angle); double sin = Math.sin(angle); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ServerCameraUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ServerCameraUtil.java similarity index 76% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ServerCameraUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ServerCameraUtil.java index 05fa30c..a98939d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/ServerCameraUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/ServerCameraUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils; import com.reiasu.reiparticlesapi.network.ReiParticlesNetwork; @@ -14,16 +12,6 @@ public final class ServerCameraUtil { private ServerCameraUtil() { } - public static void sendShake(Object world, Object target, double range, double power, int durationTicks) { - if (!(world instanceof ServerLevel serverLevel)) { - throw new IllegalArgumentException("world must be ServerLevel"); - } - if (!(target instanceof Vec3 origin)) { - throw new IllegalArgumentException("target must be Vec3"); - } - sendShake(serverLevel, origin, range, power, durationTicks); - } - public static void sendShake(ServerLevel world, double power, int durationTicks) { Objects.requireNonNull(world, "world"); if (power <= 0) throw new IllegalArgumentException("power must be > 0"); diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/api/ModelPartPointCollector.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/api/ModelPartPointCollector.java new file mode 100644 index 0000000..6a81efc --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/api/ModelPartPointCollector.java @@ -0,0 +1,15 @@ +package com.reiasu.reiparticlesapi.utils.api; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.world.phys.Vec3; + +import java.util.List; + +public interface ModelPartPointCollector { + List collectSamplePoints(ModelPart root, PoseStack poseStack, int density, boolean pixelToUnit); + + default List collectSamplePoints(ModelPart root, PoseStack poseStack, int density) { + return collectSamplePoints(root, poseStack, density, true); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/FourierSeriesBuilder.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/FourierSeriesBuilder.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/FourierSeriesBuilder.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/FourierSeriesBuilder.java index 0b94df5..1746349 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/FourierSeriesBuilder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/FourierSeriesBuilder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.builder; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/ImagePointBuilder.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/ImagePointBuilder.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/ImagePointBuilder.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/ImagePointBuilder.java index c4028a7..1cd6f82 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/ImagePointBuilder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/ImagePointBuilder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.builder; import com.reiasu.reiparticlesapi.utils.ImageUtil; @@ -10,12 +8,6 @@ import java.util.ArrayList; import java.util.List; -/** - * Fluent builder that converts an image resource into a list of - * {@link RelativeLocation} points in the XZ plane. - *

- * Non-transparent pixels are mapped to points, centred around the origin. - */ public final class ImagePointBuilder { private final ResourceLocation image; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/PointsBuilder.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/PointsBuilder.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/PointsBuilder.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/PointsBuilder.java index a038d12..5445ee5 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/PointsBuilder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/PointsBuilder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.builder; import com.reiasu.reiparticlesapi.network.particle.composition.CompositionData; @@ -118,18 +116,6 @@ public PointsBuilder pointsOnEach(Consumer consumer) { return this; } - /** - * @deprecated Math3DUtil is now all-static. Use {@code addAll(generator.apply(null))} or call Math3DUtil methods directly. - */ - @Deprecated - public PointsBuilder addWith(Function> generator) { - Collection generated = generator.apply(null); - if (generated != null) { - points.addAll(generated); - } - return this; - } - public PointsBuilder rotateAsAxis(double radians) { return rotateAsAxis(radians, axis); } @@ -189,11 +175,7 @@ public Map createWithStyleData(Function createWithCompositionData( + public Map createWithCompositionData( Function dataFactory) { return createWithStyleData(dataFactory); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/RGBImagePointBuilder.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/RGBImagePointBuilder.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/RGBImagePointBuilder.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/RGBImagePointBuilder.java index 7cb9b17..d7f2c43 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/builder/RGBImagePointBuilder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/builder/RGBImagePointBuilder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.builder; import com.reiasu.reiparticlesapi.utils.ImageUtil; @@ -10,13 +8,6 @@ import java.util.HashMap; import java.util.Map; -/** - * Fluent builder that converts an image resource into a map of - * {@link RelativeLocation} to ARGB colour int values. - *

- * Non-transparent pixels are mapped to points in the XZ plane, - * centred around the origin. - */ public final class RGBImagePointBuilder { private final ResourceLocation image; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/AlphaHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/AlphaHelper.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/AlphaHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/AlphaHelper.java index 256a468..8b7b5df 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/AlphaHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/AlphaHelper.java @@ -1,14 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.utils.GraphMathHelper; +import net.minecraft.util.Mth; -/** - * Abstract helper that drives alpha (opacity) transitions over a tick-based timeline. - * Mirrors the pattern of {@link ScaleHelper} but for alpha values. - */ public abstract class AlphaHelper implements ParticleHelper { private double minAlpha; private double maxAlpha; @@ -66,10 +61,7 @@ protected final void setStep(double step) { this.step = step; } - /** - * Recalculate step size after changing min/max/tick parameters. - */ - public AlphaHelper recalculateStep() { + public AlphaHelper recalculateStep() { double temp = Math.min(minAlpha, maxAlpha); maxAlpha = Math.max(minAlpha, maxAlpha); minAlpha = temp; @@ -77,10 +69,7 @@ public AlphaHelper recalculateStep() { return this; } - /** - * Jump to the alpha value closest to the given value. - */ - public void toggleAlpha(double alpha) { + public void toggleAlpha(double alpha) { if (alpha <= minAlpha) { resetAlphaMin(); } else if (alpha >= maxAlpha) { @@ -121,7 +110,7 @@ public void doAlphaTo(int current) { resetAlphaMin(); } else { double progress = (double) current / (double) alphaTick; - double alpha = GraphMathHelper.lerp(progress, minAlpha, maxAlpha); + double alpha = Mth.lerp(progress, minAlpha, maxAlpha); setAlpha(alpha); } } @@ -132,7 +121,7 @@ public void increaseAlpha() { } current++; double progress = (double) current / (double) alphaTick; - double alpha = GraphMathHelper.lerp(progress, minAlpha, maxAlpha); + double alpha = Mth.lerp(progress, minAlpha, maxAlpha); setAlpha(alpha); } @@ -142,7 +131,7 @@ public void decreaseAlpha() { } current--; double progress = (double) current / (double) alphaTick; - double alpha = GraphMathHelper.lerp(progress, minAlpha, maxAlpha); + double alpha = Mth.lerp(progress, minAlpha, maxAlpha); setAlpha(alpha); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/BezierValueScaleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/BezierValueScaleHelper.java similarity index 98% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/BezierValueScaleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/BezierValueScaleHelper.java index 78b3269..fa54dd7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/BezierValueScaleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/BezierValueScaleHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/HelperUtil.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/HelperUtil.java similarity index 97% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/HelperUtil.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/HelperUtil.java index 3662601..70c1d1e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/HelperUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/HelperUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementDirectionHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementDirectionHelper.java similarity index 76% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementDirectionHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementDirectionHelper.java index 443d580..0856af7 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementDirectionHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementDirectionHelper.java @@ -1,13 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.utils.RelativeLocation; -/** - * Moves a {@link RelativeLocation} reference by a direction vector each tick, - * up to a maximum number of ticks. - */ public final class MovementDirectionHelper { private final RelativeLocation reference; private RelativeLocation direction; @@ -50,20 +44,14 @@ public RelativeLocation getDefaultPos() { return defaultPos; } - /** - * Advance one tick: move the reference by the direction vector. - */ - public void next() { + public void next() { if (tick++ > maxTick) { return; } reference.add(direction); } - /** - * Reset the reference to its original position and tick counter to 0. - */ - public void reset() { + public void reset() { reference.setX(defaultPos.getX()); reference.setY(defaultPos.getY()); reference.setZ(defaultPos.getZ()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementTargetHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementTargetHelper.java similarity index 73% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementTargetHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementTargetHelper.java index 7dfd2a6..923a5db 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementTargetHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/MovementTargetHelper.java @@ -1,13 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.utils.RelativeLocation; -/** - * Moves a {@link RelativeLocation} reference toward a target over a fixed number of ticks. - * Each call to {@link #next()} advances the reference by (target - default) / maxTick. - */ public final class MovementTargetHelper { private final RelativeLocation reference; private RelativeLocation target; @@ -41,18 +35,12 @@ public RelativeLocation getDefaultPos() { return defaultPos; } - /** - * Advance one tick toward the target. - */ - public void next() { + public void next() { RelativeLocation direction = target.minus(defaultPos).scale(1.0 / (double) maxTick); reference.add(direction); } - /** - * Reset the reference to its original position. - */ - public void reset() { + public void reset() { reference.setX(defaultPos.getX()); reference.setY(defaultPos.getY()); reference.setZ(defaultPos.getZ()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ParticleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ParticleHelper.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ParticleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ParticleHelper.java index f4af8eb..9a30c99 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ParticleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ParticleHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.particles.Controllable; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ProgressSequencedHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ProgressSequencedHelper.java similarity index 81% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ProgressSequencedHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ProgressSequencedHelper.java index 737c7ff..b3b0495 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ProgressSequencedHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ProgressSequencedHelper.java @@ -1,13 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.particles.Controllable; -/** - * Abstract helper that drives sequenced progress (show/hide particles in sequence) - * over a tick-based timeline. - */ public abstract class ProgressSequencedHelper implements ParticleHelper { private int maxCount; private int progressMaxTick; @@ -60,28 +54,19 @@ protected final void setStep(double step) { this.step = step; } - /** - * Recalculate step size after changing maxCount or progressMaxTick. - */ - public ProgressSequencedHelper recalculateStep() { + public ProgressSequencedHelper recalculateStep() { this.step = (double) maxCount / (double) progressMaxTick; this.remainder = 0.0; return this; } - /** - * Set progress by a normalized percentage [0.0, 1.0]. - */ - public void setProgress(double percent) { + public void setProgress(double percent) { double clamped = Math.max(0.0, Math.min(1.0, percent)); int targetTick = (int) Math.round(clamped * (double) progressMaxTick); doProgressTo(targetTick); } - /** - * Advance progress by one tick (add particles). - */ - public void increaseProgress() { + public void increaseProgress() { if (over() || getLoadedStyle() == null) { return; } @@ -92,10 +77,7 @@ public void increaseProgress() { } } - /** - * Reverse progress by one tick (remove particles). - */ - public void decreaseProgress() { + public void decreaseProgress() { if (isZero() || getLoadedStyle() == null) { return; } @@ -106,10 +88,7 @@ public void decreaseProgress() { } } - /** - * Jump to a specific tick, adding or removing particles as needed. - */ - public void doProgressTo(int targetTick) { + public void doProgressTo(int targetTick) { if (getLoadedStyle() == null) { return; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ScaleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ScaleHelper.java similarity index 90% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ScaleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ScaleHelper.java index b847039..59e2e14 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ScaleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/ScaleHelper.java @@ -1,9 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.utils.GraphMathHelper; +import net.minecraft.util.Mth; public abstract class ScaleHelper implements ParticleHelper { private double minScale; @@ -114,7 +113,7 @@ public void doScaleTo(int current) { resetScaleMin(); return; } - double lerp = GraphMathHelper.lerp((double) current / (double) scaleTick, minScale, maxScale); + double lerp = Mth.lerp((double) current / (double) scaleTick, minScale, maxScale); scale(lerp); } @@ -123,7 +122,7 @@ public void doScale() { return; } current++; - double lerp = GraphMathHelper.lerp((double) current / (double) scaleTick, minScale, maxScale); + double lerp = Mth.lerp((double) current / (double) scaleTick, minScale, maxScale); scale(lerp); } @@ -132,7 +131,7 @@ public void doScaleReversed() { return; } current--; - double lerp = GraphMathHelper.lerp((double) current / (double) scaleTick, minScale, maxScale); + double lerp = Mth.lerp((double) current / (double) scaleTick, minScale, maxScale); scale(lerp); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedAnimationHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedAnimationHelper.java similarity index 89% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedAnimationHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedAnimationHelper.java index 02d8ea8..e6c49ea 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedAnimationHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedAnimationHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.network.particle.style.ParticleGroupStyle; @@ -10,12 +8,6 @@ import java.util.Map; import java.util.function.Predicate; -/** - * Drives sequenced particle animations by evaluating predicate conditions - * each tick and adding/removing particles accordingly. - * - * @param the concrete {@link SequencedParticleStyle} type - */ public final class SequencedAnimationHelper { private final ArrayList, Integer>> animationConditions = new ArrayList<>(); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedCompositionAnimationHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedCompositionAnimationHelper.java similarity index 61% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedCompositionAnimationHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedCompositionAnimationHelper.java index fe14b42..d54f6cf 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedCompositionAnimationHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/SequencedCompositionAnimationHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.network.particle.composition.ParticleComposition; @@ -11,22 +9,9 @@ import java.util.Map; import java.util.function.Predicate; -/** - * Animation helper for {@link SequencedParticleComposition}. - *

- * Allows defining a series of animation steps, each gated by a predicate. - * When the predicate passes, the composition adds or removes the specified - * number of particles and advances to the next animation step. - * - * @param the concrete composition type - */ public final class SequencedCompositionAnimationHelper { - /** - * List of (predicate, count) pairs. When the predicate fires, - * the composition adds (positive) or removes (negative) the count. - */ - private final List, Integer>> animationConditions = new ArrayList<>(); + private final List, Integer>> animationConditions = new ArrayList<>(); private T composition; private int animationIndex; private boolean clientOnly; @@ -51,29 +36,17 @@ public void setClientOnly(boolean clientOnly) { this.clientOnly = clientOnly; } - /** - * Adds an animation step: when {@code displayAnimatePredicate} returns true, - * the composition will add or remove {@code nextCount} particles, then - * advance to the next step. - */ - public SequencedCompositionAnimationHelper addAnimate(int nextCount, Predicate displayAnimatePredicate) { + public SequencedCompositionAnimationHelper addAnimate(int nextCount, Predicate displayAnimatePredicate) { animationConditions.add(new AbstractMap.SimpleEntry<>(displayAnimatePredicate, nextCount)); return this; } - /** - * Marks this animation as client-only (server-side compositions will skip it). - */ - public SequencedCompositionAnimationHelper clientOnly() { + public SequencedCompositionAnimationHelper clientOnly() { this.clientOnly = true; return this; } - /** - * Attaches this helper to the given composition and installs a pre-tick - * action that drives the animation forward. - */ - @SuppressWarnings("unchecked") + @SuppressWarnings("unchecked") public SequencedCompositionAnimationHelper loadComposition(T comp) { this.composition = comp; comp.addPreTickAction(pc -> { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/StatusHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/StatusHelper.java similarity index 97% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/StatusHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/StatusHelper.java index 1ffa67c..1e3026a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/StatusHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/StatusHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBuffer.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBuffer.java similarity index 57% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBuffer.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBuffer.java index cb3d0d0..67373a3 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBuffer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBuffer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.buffer; import java.lang.annotation.ElementType; @@ -7,10 +5,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -/** - * Marks a field on a {@link com.reiasu.reiparticlesapi.particles.Controllable} for - * automatic buffer serialization. The {@link #name()} value is used as the buffer key. - */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ControllableBuffer { diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBufferHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBufferHelper.java similarity index 80% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBufferHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBufferHelper.java index 00cfbc9..9a019cc 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBufferHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/buffer/ControllableBufferHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.buffer; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; @@ -15,10 +13,6 @@ import java.util.List; import java.util.Map; -/** - * Reflection-based helper that reads/writes fields annotated with - * {@link ControllableBuffer} on a {@link Controllable} as buffer pairs. - */ public final class ControllableBufferHelper { public static final ControllableBufferHelper INSTANCE = new ControllableBufferHelper(); private static final Logger LOGGER = LoggerFactory.getLogger("ReiParticlesAPI"); @@ -26,11 +20,7 @@ public final class ControllableBufferHelper { private ControllableBufferHelper() { } - /** - * Collect all {@link ControllableBuffer}-annotated fields from the given - * {@link Controllable} and convert their values into buffer entries. - */ - public Map> getPairs(Controllable buf) { + public Map> getPairs(Controllable buf) { Map> res = new LinkedHashMap<>(); List annotatedFields = getAnnotatedFields(buf.getClass()); for (Field field : annotatedFields) { @@ -56,11 +46,7 @@ public Map> getPairs(Controllable buf return res; } - /** - * Write buffer values back into the {@link ControllableBuffer}-annotated fields - * of the given {@link Controllable}. - */ - public void setPairs(Controllable buf, Map> args) { + public void setPairs(Controllable buf, Map> args) { List annotatedFields = getAnnotatedFields(buf.getClass()); for (Field field : annotatedFields) { field.setAccessible(true); diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/emitters/LinearResistanceHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/emitters/LinearResistanceHelper.java new file mode 100644 index 0000000..8ea2f29 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/emitters/LinearResistanceHelper.java @@ -0,0 +1,9 @@ +package com.reiasu.reiparticlesapi.utils.helper.emitters; + +import net.minecraft.world.phys.Vec3; + +public final class LinearResistanceHelper { + public static Vec3 setPercentageVelocity(Vec3 enter, double percent) { + return enter.scale(percent); + } +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupBezierValueScaleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupBezierValueScaleHelper.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupBezierValueScaleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupBezierValueScaleHelper.java index 71754d4..9f1c614 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupBezierValueScaleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupBezierValueScaleHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.network.particle.ServerParticleGroup; @@ -8,13 +6,6 @@ import com.reiasu.reiparticlesapi.utils.RelativeLocation; import com.reiasu.reiparticlesapi.utils.helper.BezierValueScaleHelper; -/** - * {@link BezierValueScaleHelper} implementation for particle groups - * (ControllableParticleGroup) using bezier-curved scale transitions. - *

- * Delegates scale operations through {@link ServerParticleGroup} or - * {@link ParticleGroupStyle} depending on the loaded controller type. - */ public final class GroupBezierValueScaleHelper extends BezierValueScaleHelper { private Controllable group; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupProgressSequencedHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupProgressSequencedHelper.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupProgressSequencedHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupProgressSequencedHelper.java index d10c836..780305d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupProgressSequencedHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupProgressSequencedHelper.java @@ -1,17 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.network.particle.SequencedServerParticleGroup; import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.utils.helper.ProgressSequencedHelper; -/** - * {@link ProgressSequencedHelper} implementation for sequenced particle groups - * (SequencedParticleGroup). - *

- * Delegates add/remove operations through {@link SequencedServerParticleGroup}. - */ public final class GroupProgressSequencedHelper extends ProgressSequencedHelper { private Controllable linkedStyle; @@ -47,10 +39,7 @@ protected void changeStatusBatch(int[] indexes, boolean status) { } } - /** - * Sync progress from server-side current tick to client-side display. - */ - public void syncProgressFromServer(int current) { + public void syncProgressFromServer(int current) { setCurrent(Math.max(0, Math.min(getProgressMaxTick(), current))); int targetCount = (int) Math.round( (double) current / (double) getProgressMaxTick() * (double) getMaxCount() diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupScaleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupScaleHelper.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupScaleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupScaleHelper.java index 93c8785..5b4c413 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupScaleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/GroupScaleHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.network.particle.ServerParticleGroup; @@ -7,12 +5,6 @@ import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.utils.helper.ScaleHelper; -/** - * {@link ScaleHelper} implementation for particle groups (ControllableParticleGroup). - *

- * Delegates scale operations through {@link ServerParticleGroup} or - * {@link ParticleGroupStyle} depending on the loaded controller type. - */ public final class GroupScaleHelper extends ScaleHelper { private Controllable group; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/ParticleAlphaHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/ParticleAlphaHelper.java similarity index 84% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/ParticleAlphaHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/ParticleAlphaHelper.java index 938cf63..f24bfb2 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/ParticleAlphaHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/ParticleAlphaHelper.java @@ -1,17 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.particles.control.ParticleController; import com.reiasu.reiparticlesapi.utils.helper.AlphaHelper; -/** - * {@link AlphaHelper} implementation for a single particle controller. - *

- * Delegates alpha operations through {@link ParticleController} to the - * underlying {@link com.reiasu.reiparticlesapi.particles.ControllableParticle}. - */ public final class ParticleAlphaHelper extends AlphaHelper { private Controllable controller; private float currentAlpha = 1.0f; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleAlphaHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleAlphaHelper.java similarity index 83% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleAlphaHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleAlphaHelper.java index 3779dbd..054c74b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleAlphaHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleAlphaHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.network.particle.style.ParticleGroupStyle; @@ -7,13 +5,6 @@ import com.reiasu.reiparticlesapi.particles.control.ParticleController; import com.reiasu.reiparticlesapi.utils.helper.AlphaHelper; -/** - * {@link AlphaHelper} implementation for {@link ParticleGroupStyle}. - * Propagates alpha changes recursively to all particles in the style's hierarchy. - *

- * Propagates alpha changes to all particles in the style via - * {@link ParticleController} instances found in the style's particle map. - */ public final class StyleAlphaHelper extends AlphaHelper { private ParticleGroupStyle style; private float currentAlpha = 1.0f; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleBezierValueScaleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleBezierValueScaleHelper.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleBezierValueScaleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleBezierValueScaleHelper.java index b6666a1..ae6b499 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleBezierValueScaleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleBezierValueScaleHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.network.particle.style.ParticleGroupStyle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleProgressSequencedHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleProgressSequencedHelper.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleProgressSequencedHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleProgressSequencedHelper.java index da8291a..aa6365a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleProgressSequencedHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleProgressSequencedHelper.java @@ -1,16 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.network.particle.style.SequencedParticleStyle; import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.utils.helper.ProgressSequencedHelper; -/** - * {@link ProgressSequencedHelper} implementation for {@link com.reiasu.reiparticlesapi.network.particle.style.SequencedParticleStyle}. - *

- * Delegates add/remove operations through {@link SequencedParticleStyle}. - */ public final class StyleProgressSequencedHelper extends ProgressSequencedHelper { private Controllable linkedStyle; @@ -46,10 +39,7 @@ protected void changeStatusBatch(int[] indexes, boolean status) { } } - /** - * Sync progress from server-side current tick to client-side display. - */ - public void syncProgressFromServer(int current) { + public void syncProgressFromServer(int current) { setCurrent(Math.max(0, Math.min(getProgressMaxTick(), current))); int targetCount = (int) Math.round( (double) current / (double) getProgressMaxTick() * (double) getMaxCount() diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleScaleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleScaleHelper.java similarity index 95% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleScaleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleScaleHelper.java index 6f5a826..0aa8cfd 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleScaleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleScaleHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.network.particle.style.ParticleGroupStyle; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleStatusHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleStatusHelper.java similarity index 96% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleStatusHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleStatusHelper.java index 4f8a834..33f5f89 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleStatusHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/StyleStatusHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl; import com.reiasu.reiparticlesapi.network.buffer.ParticleControllerDataBuffer; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionAlphaHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionAlphaHelper.java similarity index 70% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionAlphaHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionAlphaHelper.java index 3a1c77d..c2a7170 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionAlphaHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionAlphaHelper.java @@ -1,18 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl.composition; import com.reiasu.reiparticlesapi.network.particle.composition.ParticleComposition; import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.utils.helper.AlphaHelper; -/** - * {@link AlphaHelper} implementation for {@link ParticleComposition}. - * Uses BFS traversal to propagate alpha to all nested particles/styles/groups. - *

- * Uses BFS traversal through composition children to propagate alpha - * to all leaf {@link ParticleController} instances. - */ public final class CompositionAlphaHelper extends AlphaHelper { private ParticleComposition composition; private double alpha = 1.0; @@ -44,10 +35,7 @@ public void loadController(Controllable controller) { // ParticleComposition is not a Controllable in the current forge-port } - /** - * Directly load a composition reference. - */ - public void loadComposition(ParticleComposition composition) { + public void loadComposition(ParticleComposition composition) { this.composition = composition; } } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionBezierScaleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionBezierScaleHelper.java similarity index 82% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionBezierScaleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionBezierScaleHelper.java index ccc5c95..688e24a 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionBezierScaleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionBezierScaleHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl.composition; import com.reiasu.reiparticlesapi.network.particle.composition.ParticleComposition; @@ -7,10 +5,6 @@ import com.reiasu.reiparticlesapi.utils.RelativeLocation; import com.reiasu.reiparticlesapi.utils.helper.BezierValueScaleHelper; -/** - * {@link BezierValueScaleHelper} implementation that delegates scale operations - * to a {@link ParticleComposition} using bezier-curved transitions. - */ public final class CompositionBezierScaleHelper extends BezierValueScaleHelper { private ParticleComposition composition; @@ -56,10 +50,7 @@ public void loadController(Controllable controller) { } } - /** - * Directly load a composition reference. - */ - public void loadComposition(ParticleComposition composition) { + public void loadComposition(ParticleComposition composition) { this.composition = composition; if (composition != null) { composition.scale(getMinScale()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionScaleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionScaleHelper.java similarity index 78% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionScaleHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionScaleHelper.java index 4ee8fd2..0759691 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionScaleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionScaleHelper.java @@ -1,15 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl.composition; import com.reiasu.reiparticlesapi.network.particle.composition.ParticleComposition; import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.utils.helper.ScaleHelper; -/** - * {@link ScaleHelper} implementation that delegates scale operations to a - * {@link ParticleComposition}. - */ public final class CompositionScaleHelper extends ScaleHelper { private ParticleComposition composition; @@ -49,11 +43,7 @@ public void loadController(Controllable controller) { } } - /** - * Directly load a composition reference (for use when ParticleComposition - * doesn't implement Controllable yet). - */ - public void loadComposition(ParticleComposition composition) { + public void loadComposition(ParticleComposition composition) { this.composition = composition; if (composition != null) { composition.scale(getMinScale()); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionStatusHelper.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionStatusHelper.java similarity index 79% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionStatusHelper.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionStatusHelper.java index eb11b50..1f5d463 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionStatusHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/helper/impl/composition/CompositionStatusHelper.java @@ -1,17 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.helper.impl.composition; import com.reiasu.reiparticlesapi.network.particle.composition.ParticleComposition; import com.reiasu.reiparticlesapi.particles.Controllable; import com.reiasu.reiparticlesapi.utils.helper.StatusHelper; -/** - * {@link StatusHelper} implementation for {@link ParticleComposition}. - * Attaches a pre-tick action that increments the current counter when the - * status is DISABLE, and removes the composition when the counter reaches - * the closed interval. - */ public final class CompositionStatusHelper extends StatusHelper { private ParticleComposition composition; private boolean init; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/Interpolator.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/Interpolator.java similarity index 75% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/Interpolator.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/Interpolator.java index fc19dc2..1da9b60 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/Interpolator.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/Interpolator.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator; import com.reiasu.reiparticlesapi.utils.RelativeLocation; @@ -8,9 +6,6 @@ import java.util.List; -/** - * Interpolator interface for generating refined point lists between inserted control points. - */ public interface Interpolator { double getRefinerCount(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorData.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorData.java new file mode 100644 index 0000000..7471e3a --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorData.java @@ -0,0 +1,9 @@ +package com.reiasu.reiparticlesapi.utils.interpolator.data; + +public interface InterpolatorData { + InterpolatorData update(T current); + + T getWithInterpolator(Number progress); + + T getCurrent(); +} diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorDouble.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorDouble.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorDouble.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorDouble.java index c7dec03..318318d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorDouble.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorDouble.java @@ -1,12 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator.data; import com.reiasu.reiparticlesapi.utils.GraphMathHelper; +import net.minecraft.util.Mth; -/** - * Interpolated double value with lerp support. - */ public final class InterpolatorDouble implements InterpolatorData { private double value; private double last; @@ -36,7 +32,7 @@ public InterpolatorDouble update(Double current) { @Override public Double getWithInterpolator(Number progress) { - return GraphMathHelper.lerp(progress.doubleValue(), last, value); + return Mth.lerp(progress.doubleValue(), last, value); } @Override diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorFloat.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorFloat.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorFloat.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorFloat.java index a917c32..5490295 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorFloat.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorFloat.java @@ -1,12 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator.data; import com.reiasu.reiparticlesapi.utils.GraphMathHelper; +import net.minecraft.util.Mth; -/** - * Interpolated float value with lerp support. - */ public final class InterpolatorFloat implements InterpolatorData { private float value; private float last; @@ -36,7 +32,7 @@ public InterpolatorFloat update(Float current) { @Override public Float getWithInterpolator(Number progress) { - return (float) GraphMathHelper.lerp(progress.doubleValue(), last, value); + return (float) Mth.lerp(progress.doubleValue(), last, value); } @Override diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorRelativeLocation.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorRelativeLocation.java similarity index 75% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorRelativeLocation.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorRelativeLocation.java index b5efc4c..10a562f 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorRelativeLocation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorRelativeLocation.java @@ -1,13 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator.data; import com.reiasu.reiparticlesapi.utils.GraphMathHelper; import com.reiasu.reiparticlesapi.utils.RelativeLocation; +import net.minecraft.util.Mth; -/** - * Interpolated RelativeLocation value with component-wise lerp. - */ public final class InterpolatorRelativeLocation implements InterpolatorData { private RelativeLocation value; private RelativeLocation last; @@ -36,9 +32,9 @@ public InterpolatorRelativeLocation update(RelativeLocation current) { public RelativeLocation getWithInterpolator(Number progress) { double p = progress.doubleValue(); return new RelativeLocation( - GraphMathHelper.lerp(p, last.getX(), value.getX()), - GraphMathHelper.lerp(p, last.getY(), value.getY()), - GraphMathHelper.lerp(p, last.getZ(), value.getZ()) + Mth.lerp(p, last.getX(), value.getX()), + Mth.lerp(p, last.getY(), value.getY()), + Mth.lerp(p, last.getZ(), value.getZ()) ); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVec3d.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVec3d.java similarity index 74% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVec3d.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVec3d.java index cd7ad93..dff967c 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVec3d.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVec3d.java @@ -1,13 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator.data; import com.reiasu.reiparticlesapi.utils.GraphMathHelper; import net.minecraft.world.phys.Vec3; +import net.minecraft.util.Mth; -/** - * Interpolated Vec3 value with component-wise lerp. - */ public final class InterpolatorVec3d implements InterpolatorData { private Vec3 value; private Vec3 last; @@ -36,9 +32,9 @@ public InterpolatorVec3d update(Vec3 current) { public Vec3 getWithInterpolator(Number progress) { double p = progress.doubleValue(); return new Vec3( - GraphMathHelper.lerp(p, last.x, value.x), - GraphMathHelper.lerp(p, last.y, value.y), - GraphMathHelper.lerp(p, last.z, value.z) + Mth.lerp(p, last.x, value.x), + Mth.lerp(p, last.y, value.y), + Mth.lerp(p, last.z, value.z) ); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVector3f.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVector3f.java similarity index 73% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVector3f.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVector3f.java index 5747fbe..2b7270d 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVector3f.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/data/InterpolatorVector3f.java @@ -1,13 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator.data; import com.reiasu.reiparticlesapi.utils.GraphMathHelper; import org.joml.Vector3f; +import net.minecraft.util.Mth; -/** - * Interpolated Vector3f value with component-wise lerp. - */ public final class InterpolatorVector3f implements InterpolatorData { private Vector3f value; private Vector3f last; @@ -36,9 +32,9 @@ public InterpolatorVector3f update(Vector3f current) { public Vector3f getWithInterpolator(Number progress) { double p = progress.doubleValue(); return new Vector3f( - (float) GraphMathHelper.lerp(p, last.x, value.x), - (float) GraphMathHelper.lerp(p, last.y, value.y), - (float) GraphMathHelper.lerp(p, last.z, value.z) + (float) Mth.lerp(p, last.x, value.x), + (float) Mth.lerp(p, last.y, value.y), + (float) Mth.lerp(p, last.z, value.z) ); } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/emitters/LineEmitterInterpolator.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/emitters/LineEmitterInterpolator.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/emitters/LineEmitterInterpolator.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/emitters/LineEmitterInterpolator.java index 227ccba..1b6ca4e 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/emitters/LineEmitterInterpolator.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/emitters/LineEmitterInterpolator.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator.emitters; import com.reiasu.reiparticlesapi.utils.CircularQueue; @@ -13,10 +11,6 @@ import java.util.Collections; import java.util.List; -/** - * Line-segment interpolator for emitter trails. - * Inserts two control points and fills the line between them. - */ public final class LineEmitterInterpolator implements Interpolator { private double limit = 256.0; private final CircularQueue queue = new CircularQueue<>(2); diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/CircleParticleInterpolator.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/CircleParticleInterpolator.java similarity index 89% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/CircleParticleInterpolator.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/CircleParticleInterpolator.java index 3ca2f07..cd901af 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/CircleParticleInterpolator.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/CircleParticleInterpolator.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator.particle; import com.reiasu.reiparticlesapi.utils.CircularQueue; @@ -8,17 +6,15 @@ import com.reiasu.reiparticlesapi.utils.interpolator.Interpolator; import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; +import net.minecraft.util.Mth; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Supplier; +import net.minecraft.util.Mth; -/** - * Arc-based particle interpolator. Generates intermediate points along a circular arc - * between two positions, relative to a moving origin. - */ public final class CircleParticleInterpolator implements Interpolator { private final Supplier originProvider; private double refinerCount; @@ -83,18 +79,12 @@ public CircleParticleInterpolator setRefiner(double refiner) { return this; } - /** - * Set the rotation transform applied before arc interpolation. - */ - public CircleParticleInterpolator setRotater(BiConsumer> rotater) { + public CircleParticleInterpolator setRotater(BiConsumer> rotater) { this.rotater = rotater; return this; } - /** - * Set the inverse rotation transform applied after arc interpolation. - */ - public CircleParticleInterpolator setRotaterBack(BiConsumer> rotaterBack) { + public CircleParticleInterpolator setRotaterBack(BiConsumer> rotaterBack) { this.rotaterBack = rotaterBack; return this; } @@ -135,7 +125,7 @@ public List getRefinedResult() { for (int i = 0; i <= count; i++) { double t = (double) i / (double) count; - double r = GraphMathHelper.lerp(t, dist0, dist1); + double r = Mth.lerp(t, dist0, dist1); double a = angle * t; // Slerp-like interpolation diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/DirectParticleInterpolator.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/DirectParticleInterpolator.java similarity index 91% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/DirectParticleInterpolator.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/DirectParticleInterpolator.java index 194eaa3..3c13e40 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/DirectParticleInterpolator.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/interpolator/particle/DirectParticleInterpolator.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.interpolator.particle; import com.reiasu.reiparticlesapi.utils.CircularQueue; @@ -12,10 +10,6 @@ import java.util.Collections; import java.util.List; -/** - * Simple direct (straight-line) particle interpolator between two points. - * Generates intermediate points along a line from the old position to the new position. - */ public final class DirectParticleInterpolator implements Interpolator { private double refinerCount = 2.0; private double limit = 256.0; diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/math/ExpressionEvaluator.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/math/ExpressionEvaluator.java similarity index 88% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/math/ExpressionEvaluator.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/math/ExpressionEvaluator.java index fe4b310..b204660 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/math/ExpressionEvaluator.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/math/ExpressionEvaluator.java @@ -1,33 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.math; import java.util.HashMap; import java.util.Map; -/** - * Lightweight mathematical expression evaluator. - *

- * Supports: - *

    - *
  • Arithmetic: {@code + - * / % ^}
  • - *
  • Unary minus
  • - *
  • Parentheses
  • - *
  • Variables (case-sensitive): set via {@link #with(String, double)}
  • - *
  • Constants: {@code PI}, {@code E}
  • - *
  • Functions: {@code sin cos tan asin acos atan sqrt abs floor ceil log exp pow min max}
  • - *
- *

- * Thread-safety: instances are not thread-safe. Create one per thread - * or synchronise externally. - *

- * Usage: - *

{@code
- * double result = new ExpressionEvaluator("sin(t * PI / 180)")
- *         .with("t", 90)
- *         .evaluate();
- * }
- */ public final class ExpressionEvaluator { private final String expression; @@ -103,10 +78,10 @@ private double parseTerm() { x *= parsePower(); } else if (consume('/')) { double d = parsePower(); - x = (d == 0) ? 0 : x / d; + x = x / d; } else if (consume('%')) { double d = parsePower(); - x = (d == 0) ? 0 : x % d; + x = x % d; } else { return x; } diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/presets/FourierPresets.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/presets/FourierPresets.java similarity index 74% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/presets/FourierPresets.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/presets/FourierPresets.java index ae57c28..f8ce54b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/presets/FourierPresets.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/presets/FourierPresets.java @@ -1,26 +1,16 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.presets; import com.reiasu.reiparticlesapi.utils.builder.FourierSeriesBuilder; -/** - * Pre-built Fourier series configurations for common geometric shapes. - */ public final class FourierPresets { - public static final FourierPresets INSTANCE = new FourierPresets(); - - private FourierPresets() { - } - - public FourierSeriesBuilder pentagon() { + public static FourierSeriesBuilder pentagon() { return new FourierSeriesBuilder() .addFourier(3.0, 2.0, 0.0) .addFourier(1.0, -8.0, 0.0) .addFourier(3.0, 2.0, 0.0); } - public FourierSeriesBuilder clover() { + public static FourierSeriesBuilder clover() { return new FourierSeriesBuilder() .addFourier(3.0, 2.0, 0.0) .addFourier(1.0, -8.0, 0.0) @@ -28,21 +18,21 @@ public FourierSeriesBuilder clover() { .addFourier(6.0, -2.0, 0.0); } - public FourierSeriesBuilder boomerang() { + public static FourierSeriesBuilder boomerang() { return new FourierSeriesBuilder() .addFourier(3.0, 1.0, 0.0) .addFourier(7.0, -2.0, 0.0) .addFourier(2.0, 4.0, 0.0); } - public FourierSeriesBuilder runesOnAllSides() { + public static FourierSeriesBuilder runesOnAllSides() { return new FourierSeriesBuilder() .addFourier(3.0, -1.0, 0.0) .addFourier(7.0, -5.0, 0.0) .addFourier(2.0, 11.0, 0.0); } - public FourierSeriesBuilder knot() { + public static FourierSeriesBuilder knot() { return new FourierSeriesBuilder() .addFourier(3.0, -1.0, 0.0) .addFourier(0.0, -5.0, 0.0) @@ -50,7 +40,7 @@ public FourierSeriesBuilder knot() { .addFourier(4.0, -4.0, 0.0); } - public FourierSeriesBuilder circlesAndTriangles() { + public static FourierSeriesBuilder circlesAndTriangles() { return new FourierSeriesBuilder() .addFourier(3.0, -1.0, 0.0) .addFourier(0.0, -5.0, 0.0) @@ -58,7 +48,7 @@ public FourierSeriesBuilder circlesAndTriangles() { .addFourier(5.0, 2.0, 0.0); } - public FourierSeriesBuilder bowsOnAllSides() { + public static FourierSeriesBuilder bowsOnAllSides() { return new FourierSeriesBuilder() .addFourier(3.0, -1.0, 0.0) .addFourier(-3.0, -5.0, 0.0) @@ -68,7 +58,7 @@ public FourierSeriesBuilder bowsOnAllSides() { .addFourier(1.0, 3.0, 0.0); } - public FourierSeriesBuilder rhombic() { + public static FourierSeriesBuilder rhombic() { return new FourierSeriesBuilder() .addFourier(-3.0, 1.0, 0.0) .addFourier(-9.0, -3.0, 0.0) diff --git a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/storage/Memo.java b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/storage/Memo.java similarity index 60% rename from forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/storage/Memo.java rename to forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/storage/Memo.java index e364159..cf5e47b 100644 --- a/forge-port-api/src/main/java/com/reiasu/reiparticlesapi/utils/storage/Memo.java +++ b/forge-port/src/main/java/com/reiasu/reiparticlesapi/utils/storage/Memo.java @@ -1,20 +1,11 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticlesapi.utils.storage; import java.util.function.Supplier; -/** - * Lazy-initialized memoization container. - * The value is computed on first access via the supplier and cached. - * Can be manually overridden or reset. - * - * @param the cached value type - */ public final class Memo { private final Supplier supplier; - private T memo; - private boolean initialized; + private volatile T memo; + private volatile boolean initialized; public Memo(Supplier supplier) { this.supplier = supplier; @@ -26,8 +17,12 @@ public Supplier getSupplier() { public T get() { if (!initialized) { - memo = supplier.get(); - initialized = true; + synchronized (this) { + if (!initialized) { + memo = supplier.get(); + initialized = true; + } + } } return memo; } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/ReiParticleSkillForge.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/ReiParticleSkillForge.java index cfd6954..966091e 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/ReiParticleSkillForge.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/ReiParticleSkillForge.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill; import com.reiasu.reiparticlesapi.ReiParticlesAPI; @@ -18,14 +16,14 @@ import com.reiasu.reiparticleskill.sounds.SkillSoundEvents; import com.reiasu.reiparticleskill.config.SkillClientConfig; import com.mojang.logging.LogUtils; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.neoforged.bus.api.IEventBus; +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.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.tick.ServerTickEvent; import org.slf4j.Logger; @Mod(ReiParticleSkillForge.MOD_ID) @@ -34,35 +32,33 @@ public final class ReiParticleSkillForge { private static final Logger LOGGER = LogUtils.getLogger(); private final EndRespawnStateBridge endRespawnBridge = new EndRespawnStateBridge(); - public ReiParticleSkillForge() { - var modBus = FMLJavaModLoadingContext.get().getModEventBus(); + public ReiParticleSkillForge(IEventBus modBus, ModContainer container) { SkillEntityTypes.register(modBus); SkillEnchantments.register(modBus); SkillSoundEvents.register(modBus); - ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, SkillClientConfig.SPEC); + container.registerConfig(ModConfig.Type.CLIENT, SkillClientConfig.SPEC); modBus.addListener((FMLClientSetupEvent event) -> onClientSetup()); - MinecraftForge.EVENT_BUS.addListener((RegisterCommandsEvent event) -> + NeoForge.EVENT_BUS.addListener((RegisterCommandsEvent event) -> onRegisterCommands(event.getDispatcher())); - MinecraftForge.EVENT_BUS.addListener((TickEvent.ServerTickEvent event) -> { - if (event.phase == TickEvent.Phase.END && event.getServer() != null) { - EndRespawnWatcher.tickServer(event.getServer(), endRespawnBridge, LOGGER); - ServerListener.onServerPostTick(event.getServer()); - } + NeoForge.EVENT_BUS.addListener((ServerTickEvent.Post event) -> { + EndRespawnWatcher.tickServer(event.getServer(), endRespawnBridge, LOGGER); + ServerListener.onServerPostTick(event.getServer()); }); + NeoForge.EVENT_BUS.addListener((net.neoforged.neoforge.event.server.ServerStoppedEvent event) -> + EndRespawnWatcher.clearTrackers()); ReiParticlesAPI.init(); ReiParticlesAPI.INSTANCE.loadScannerPackages(); - registerApiListeners(); registerRuntimePorts(); ReiParticlesAPI.INSTANCE.registerTest(); - LOGGER.info("ReiParticleSkill Forge runtime initialized"); + } private void onClientSetup() { - LOGGER.info("ReiParticleSkill client setup completed"); + } private void onRegisterCommands(com.mojang.brigadier.CommandDispatcher dispatcher) { @@ -71,16 +67,7 @@ private void onRegisterCommands(com.mojang.brigadier.CommandDispatcher pair = - new ForgeConfigSpec.Builder().configure(SkillClientConfig::new); + Pair pair = + new ModConfigSpec.Builder().configure(SkillClientConfig::new); INSTANCE = pair.getLeft(); SPEC = pair.getRight(); } - private final ForgeConfigSpec.BooleanValue suppressCrystalBeam; + private final ModConfigSpec.BooleanValue suppressCrystalBeam; - private SkillClientConfig(ForgeConfigSpec.Builder builder) { + private SkillClientConfig(ModConfigSpec.Builder builder) { builder.push("rendering"); suppressCrystalBeam = builder diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/datagen/ReiParticleSkillDataGenerators.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/datagen/ReiParticleSkillDataGenerators.java index 44f6279..d6c39ef 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/datagen/ReiParticleSkillDataGenerators.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/datagen/ReiParticleSkillDataGenerators.java @@ -1,14 +1,11 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.datagen; import com.reiasu.reiparticleskill.ReiParticleSkillForge; import net.minecraft.data.PackOutput; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.data.event.GatherDataEvent; -@Mod.EventBusSubscriber(modid = ReiParticleSkillForge.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) +@net.neoforged.fml.common.EventBusSubscriber(modid = ReiParticleSkillForge.MOD_ID, bus = net.neoforged.fml.common.EventBusSubscriber.Bus.MOD) public final class ReiParticleSkillDataGenerators { private ReiParticleSkillDataGenerators() { } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/datagen/SkillLanguageProvider.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/datagen/SkillLanguageProvider.java index 6919f21..b4e17b2 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/datagen/SkillLanguageProvider.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/datagen/SkillLanguageProvider.java @@ -1,10 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.datagen; import com.reiasu.reiparticleskill.ReiParticleSkillForge; import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.LanguageProvider; +import net.neoforged.neoforge.common.data.LanguageProvider; public final class SkillLanguageProvider extends LanguageProvider { private final String locale; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/BarrageItemDisplay.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/BarrageItemDisplay.java index 9bfdf2a..a10e940 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/BarrageItemDisplay.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/BarrageItemDisplay.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display; import com.reiasu.reiparticlesapi.display.DisplayEntity; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/LightFlashDisplay.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/LightFlashDisplay.java index 82e6b44..dc0dd4c 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/LightFlashDisplay.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/LightFlashDisplay.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display; import com.reiasu.reiparticlesapi.display.DisplayEntity; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/ServerMovableDisplay.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/ServerMovableDisplay.java index 3df5ba8..e318681 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/ServerMovableDisplay.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/ServerMovableDisplay.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display; import net.minecraft.world.phys.Vec3; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/SwordLightDisplay.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/SwordLightDisplay.java index b80ab13..a726a06 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/SwordLightDisplay.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/SwordLightDisplay.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display; import com.reiasu.reiparticlesapi.display.DisplayEntity; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerDisplayGroupManager.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerDisplayGroupManager.java index 0efd51b..17d2693 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerDisplayGroupManager.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerDisplayGroupManager.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group; import java.util.Collections; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerOnlyDisplayGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerOnlyDisplayGroup.java index 1bbd8fc..bc26e71 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerOnlyDisplayGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerOnlyDisplayGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group; import com.reiasu.reiparticlesapi.display.DisplayEntity; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerOnlyGrowingGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerOnlyGrowingGroup.java index efda75b..49b2f9a 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerOnlyGrowingGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/ServerOnlyGrowingGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/SimpleSwordFormationGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/SimpleSwordFormationGroup.java index 5a37a2e..8069f44 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/SimpleSwordFormationGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/SimpleSwordFormationGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl; import com.reiasu.reiparticlesapi.display.DisplayEntity; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/SimpleSwordFormationGroupGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/SimpleSwordFormationGroupGroup.java index b62c653..f4306ac 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/SimpleSwordFormationGroupGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/SimpleSwordFormationGroupGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2AroundFormation.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2AroundFormation.java index fe13718..4b48695 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2AroundFormation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2AroundFormation.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation; import com.reiasu.reiparticlesapi.animation.timeline.Eases; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2CenterFormation.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2CenterFormation.java index 4692a99..b97965a 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2CenterFormation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2CenterFormation.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2CoreFormation.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2CoreFormation.java index 45fffbc..fdbc19f 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2CoreFormation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSword2CoreFormation.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSwordFormation.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSwordFormation.java index a9a3104..f45855c 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSwordFormation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/HugeSwordFormation.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation; import com.reiasu.reiparticlesapi.utils.RelativeLocation; @@ -173,7 +171,7 @@ public void onDisplay() { private void playSwordSound() { Level level = getWorld(); - if (!(level instanceof ServerLevel serverLevel) || !SkillSoundEvents.SWORD_FORMATION.isPresent()) { + if (!(level instanceof ServerLevel serverLevel) || !SkillSoundEvents.SWORD_FORMATION.isBound()) { return; } Vec3 pos = getPos(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/SwordRingFormation.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/SwordRingFormation.java index 9b951ea..5060737 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/SwordRingFormation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/SwordRingFormation.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/FormationParticleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/FormationParticleHelper.java index 3660e96..63746a2 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/FormationParticleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/FormationParticleHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation.effects; import net.minecraft.core.particles.DustParticleOptions; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationExplosionEffectGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationExplosionEffectGroup.java index e38d8dc..6a1e74e 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationExplosionEffectGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationExplosionEffectGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation.effects; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationSigilEffectGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationSigilEffectGroup.java index bb0ca2e..1c3d89d 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationSigilEffectGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationSigilEffectGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation.effects; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationVortexEffectGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationVortexEffectGroup.java index fbfe14a..2916d25 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationVortexEffectGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationVortexEffectGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation.effects; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationWaveEffectGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationWaveEffectGroup.java index c62a57d..57fcac5 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationWaveEffectGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordFormationWaveEffectGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation.effects; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordRuneEffectGroup.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordRuneEffectGroup.java index 106690f..536c98d 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordRuneEffectGroup.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/impl/formation/effects/SwordRuneEffectGroup.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.impl.formation.effects; import com.reiasu.reiparticlesapi.utils.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/FormationLayerSpec.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/FormationLayerSpec.java index 9f4bb38..970f05d 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/FormationLayerSpec.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/FormationLayerSpec.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.layout; public record FormationLayerSpec(double radius, int count, double rotationSpeed) { diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/SimpleSwordFormationLayout.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/SimpleSwordFormationLayout.java index cf296e5..3a5c44c 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/SimpleSwordFormationLayout.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/SimpleSwordFormationLayout.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.layout; import com.reiasu.reiparticleskill.util.geom.PointsBuilder; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/SwordFormationLayerPresets.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/SwordFormationLayerPresets.java index 1b85c66..aa68c83 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/SwordFormationLayerPresets.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/display/group/layout/SwordFormationLayerPresets.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.display.group.layout; import com.reiasu.reiparticleskill.util.geom.RelativeLocation; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/enchantments/SkillEnchantments.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/enchantments/SkillEnchantments.java index 288f102..5577cb0 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/enchantments/SkillEnchantments.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/enchantments/SkillEnchantments.java @@ -1,34 +1,52 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.enchantments; import com.reiasu.reiparticleskill.ReiParticleSkillForge; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.bus.api.IEventBus; public final class SkillEnchantments { - public static final DeferredRegister ENCHANTMENTS = - DeferredRegister.create(ForgeRegistries.ENCHANTMENTS, ReiParticleSkillForge.MOD_ID); - public static final RegistryObject SWORD_LIGHT = - ENCHANTMENTS.register("sword_light", SwordLightEnchantment::new); + public static final ResourceKey SWORD_LIGHT = + ResourceKey.create(Registries.ENCHANTMENT, + ResourceLocation.fromNamespaceAndPath(ReiParticleSkillForge.MOD_ID, "sword_light")); + + private static Holder cachedSwordLight; private SkillEnchantments() { } public static void register(IEventBus bus) { - ENCHANTMENTS.register(bus); + // No-op: enchantments are data-driven in 1.21+ } public static int getSwordLightLevel(ItemStack stack) { - if (stack == null || stack.isEmpty() || !SWORD_LIGHT.isPresent()) { + if (stack == null || stack.isEmpty()) { + return 0; + } + Holder holder = getSwordLightHolder(stack); + if (holder == null) { return 0; } - return EnchantmentHelper.getItemEnchantmentLevel(SWORD_LIGHT.get(), stack); + return EnchantmentHelper.getItemEnchantmentLevel(holder, stack); + } + + private static Holder getSwordLightHolder(ItemStack stack) { + if (cachedSwordLight != null) { + return cachedSwordLight; + } + // Walk the item's enchantments to find our key + for (Holder h : EnchantmentHelper.getEnchantmentsForCrafting(stack).keySet()) { + if (h.is(SWORD_LIGHT)) { + cachedSwordLight = h; + return h; + } + } + return null; } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/enchantments/SwordLightEnchantment.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/enchantments/SwordLightEnchantment.java deleted file mode 100644 index 451de33..0000000 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/enchantments/SwordLightEnchantment.java +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu -package com.reiasu.reiparticleskill.enchantments; - -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.SwordItem; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public final class SwordLightEnchantment extends Enchantment { - public SwordLightEnchantment() { - super(Rarity.RARE, EnchantmentCategory.WEAPON, new EquipmentSlot[]{EquipmentSlot.MAINHAND}); - } - - @Override - public int getMinCost(int level) { - return 5 + (Math.max(1, level) - 1) * 6; - } - - @Override - public int getMaxCost(int level) { - return getMinCost(level) + 2; - } - - @Override - public int getMaxLevel() { - return 1; - } - - @Override - public boolean canEnchant(ItemStack stack) { - return stack.getItem() instanceof SwordItem; - } -} diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/ClientEmitterFactory.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/ClientEmitterFactory.java index 2c826eb..c9928b3 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/ClientEmitterFactory.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/ClientEmitterFactory.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import com.reiasu.reiparticleskill.end.respawn.runtime.emitter.client.ClientCenterEmitter; @@ -14,11 +12,6 @@ import java.util.ArrayList; import java.util.List; -/** - * Creates and manages client-rendered particle emitters for the - * dragon respawn animation phases. Emitter parameters are defined - * as named presets instead of inline magic numbers. - */ final class ClientEmitterFactory { // --- Rotation speed presets --- diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/DragonGravityTracker.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/DragonGravityTracker.java index f8055d3..91db701 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/DragonGravityTracker.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/DragonGravityTracker.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import net.minecraft.server.level.ServerLevel; @@ -13,10 +11,6 @@ import java.util.Map; import java.util.UUID; -/** - * Tracks ender dragons whose gravity has been temporarily disabled - * and restores it after a configured number of ticks. - */ final class DragonGravityTracker { private final Map restoreTicks = new HashMap<>(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/DragonRespawnAnimationDirector.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/DragonRespawnAnimationDirector.java index c897e06..42ed6ea 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/DragonRespawnAnimationDirector.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/DragonRespawnAnimationDirector.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import com.reiasu.reiparticleskill.end.respawn.runtime.emitter.CollectEnderPowerEmitter; @@ -19,36 +17,27 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.UUID; public final class DragonRespawnAnimationDirector { - private static final int PILLAR_EVENT_DELAY_TICKS = 39; private static final Vec3 ANCHOR_OFFSET = new Vec3(0.0, 130.5, 0.0); private static final double GRAVITY_RANGE = 32.0; private static final double CRYSTAL_SEARCH_RADIUS = 96.0; - private static final double PILLAR_RING_RADIUS = 56.0; - private static final double PILLAR_RING_Y_OFFSET = 80.0; private final ClientEmitterFactory clientEmitters = new ClientEmitterFactory(); private final DragonGravityTracker gravityTracker = new DragonGravityTracker(); + private final PillarPulseScheduler pulseScheduler = new PillarPulseScheduler(); private final List activeEmitters = new ArrayList<>(); private final Set pulseScopedEmitters = Collections.newSetFromMap(new IdentityHashMap<>()); private final List activePillarCrafters = new ArrayList<>(); private final RandomSource random = RandomSource.create(); - private final Map crystalBeamTargets = new HashMap<>(); - private final Map pendingPillarPulseTicks = new HashMap<>(); private EndRespawnPhase activePhase; private ServerLevel activeLevel; private boolean active; - private int pillarPulseIndex; - private long lastPillarPulseTick = Long.MIN_VALUE; public void setup(ServerLevel level, Vec3 center) { if (active) { @@ -70,9 +59,7 @@ public int next(ServerLevel level, Vec3 center, EndRespawnPhase phase, long phas } activePhase = phase; if (phase != EndRespawnPhase.SUMMON_PILLARS) { - crystalBeamTargets.clear(); - pendingPillarPulseTicks.clear(); - lastPillarPulseTick = Long.MIN_VALUE; + pulseScheduler.clear(); } if (phase == EndRespawnPhase.BEFORE_END_WAITING) { activeEmitters.removeIf(pulseScopedEmitters::contains); @@ -86,7 +73,9 @@ public int next(ServerLevel level, Vec3 center, EndRespawnPhase phase, long phas } if (phase == EndRespawnPhase.SUMMON_PILLARS) { - maybeTriggerPillarPulse(level, center, phaseTick); + for (PillarPulseScheduler.PulseResult pulse : pulseScheduler.tick(level, center, phaseTick)) { + handleOncePillars(level, center, pulse.pillarCenter(), pulse.preferredCrystalId()); + } } if (phase == EndRespawnPhase.END && phaseTick == 0) { handleEnd(level, center); @@ -118,11 +107,8 @@ private void resetState() { activeEmitters.clear(); pulseScopedEmitters.clear(); activePillarCrafters.clear(); - pillarPulseIndex = 0; - crystalBeamTargets.clear(); - pendingPillarPulseTicks.clear(); + pulseScheduler.clear(); gravityTracker.clear(); - lastPillarPulseTick = Long.MIN_VALUE; } public String debugState() { @@ -132,7 +118,7 @@ public String debugState() { + ", emitters=" + activeEmitters.size() + ", pulse_emitters=" + pulseScopedEmitters.size() + ", pillar_crafters=" + activePillarCrafters.size() - + ", pending_pulses=" + pendingPillarPulseTicks.size() + + ", pulse_scheduler=active" + ", no_gravity_dragons=" + gravityTracker.trackedCount(); } @@ -142,7 +128,7 @@ public void handleOncePillars(ServerLevel level, Vec3 center, Vec3 pillarCenter) private void handleOncePillars(ServerLevel level, Vec3 center, Vec3 pillarCenter, UUID preferredCrystalId) { Vec3 anchor = pillarCenter == null ? center : pillarCenter; - EndCrystal crystal = resolvePulseCrystal(level, center, anchor, preferredCrystalId); + EndCrystal crystal = EndDragonFightHelper.resolvePulseCrystal(level, center, anchor, preferredCrystalId, CRYSTAL_SEARCH_RADIUS); Vec3 start = anchor; Vec3 target = Vec3.ZERO; if (crystal != null) { @@ -178,7 +164,7 @@ private void handleOncePillars(ServerLevel level, Vec3 center, Vec3 pillarCenter .setSpeed(1.5); activeEmitters.add(burst); pulseScopedEmitters.add(burst); - pillarPulseIndex++; + pulseScheduler.nextPulseIndex(); } public void handleEnd(ServerLevel level, Vec3 center) { @@ -220,8 +206,7 @@ private void reconfigureEmittersForPhase(ServerLevel level, Vec3 center, EndResp activeEmitters.clear(); pulseScopedEmitters.clear(); activePillarCrafters.clear(); - crystalBeamTargets.clear(); - pendingPillarPulseTicks.clear(); + pulseScheduler.clear(); switch (phase) { case START -> { CollectEnderPowerEmitter emitter = new CollectEnderPowerEmitter(600) @@ -259,112 +244,6 @@ private void reconfigureEmittersForPhase(ServerLevel level, Vec3 center, EndResp } } - private void maybeTriggerPillarPulse(ServerLevel level, Vec3 center, long phaseTick) { - List crystals = level.getEntitiesOfClass( - EndCrystal.class, - new AABB(center, center).inflate(CRYSTAL_SEARCH_RADIUS), - EndCrystal::isAlive - ); - Set seen = new HashSet<>(); - for (EndCrystal crystal : crystals) { - UUID uuid = crystal.getUUID(); - seen.add(uuid); - BlockPos beam = crystal.getBeamTarget(); - if (beam == null) { - continue; - } - BlockPos prev = crystalBeamTargets.put(uuid, beam.immutable()); - if (prev == null || !prev.equals(beam)) { - pendingPillarPulseTicks.put(beam.immutable(), new PendingPillarPulse(phaseTick + PILLAR_EVENT_DELAY_TICKS, uuid)); - } - } - crystalBeamTargets.keySet().removeIf(uuid -> !seen.contains(uuid)); - - boolean fired = false; - Iterator> pendingIterator = pendingPillarPulseTicks.entrySet().iterator(); - while (pendingIterator.hasNext()) { - Map.Entry pending = pendingIterator.next(); - PendingPillarPulse pulse = pending.getValue(); - if (pulse.triggerTick() > phaseTick) { - continue; - } - handleOncePillars(level, center, Vec3.atCenterOf(pending.getKey()), pulse.crystalId()); - pendingIterator.remove(); - fired = true; - } - if (fired) { - lastPillarPulseTick = phaseTick; - return; - } - - // Prefer strict "beam-target changed" triggering. Fallback is only used once - // when no beam targets are visible yet to avoid missing the first pulse. - if (!pendingPillarPulseTicks.isEmpty()) { - return; - } - if (!crystalBeamTargets.isEmpty()) { - return; - } - if (lastPillarPulseTick != Long.MIN_VALUE) { - return; - } - Vec3 fallback = chooseFallbackPillarTarget(crystals, center); - handleOncePillars(level, center, fallback); - lastPillarPulseTick = phaseTick; - } - - private Vec3 chooseFallbackPillarTarget(List crystals, Vec3 center) { - if (!crystals.isEmpty()) { - EndCrystal crystal = crystals.get(Math.floorMod(pillarPulseIndex, crystals.size())); - BlockPos beam = crystal.getBeamTarget(); - if (beam != null) { - return Vec3.atCenterOf(beam); - } - return crystal.position(); - } - double angle = (Math.PI * 2.0 * (pillarPulseIndex % 10)) / 10.0; - return center.add(Math.cos(angle) * PILLAR_RING_RADIUS, PILLAR_RING_Y_OFFSET, Math.sin(angle) * PILLAR_RING_RADIUS); - } - - private EndCrystal resolvePulseCrystal(ServerLevel level, Vec3 center, Vec3 anchor, UUID preferredCrystalId) { - if (preferredCrystalId != null) { - net.minecraft.world.entity.Entity entity = level.getEntity(preferredCrystalId); - if (entity instanceof EndCrystal preferred && preferred.isAlive()) { - return preferred; - } - } - - List nearAnchor = level.getEntitiesOfClass( - EndCrystal.class, - new AABB(anchor, anchor).inflate(8.0), - EndCrystal::isAlive - ); - EndCrystal closestNearAnchor = nearestCrystalTo(anchor, nearAnchor); - if (closestNearAnchor != null) { - return closestNearAnchor; - } - - List aroundPortal = level.getEntitiesOfClass( - EndCrystal.class, - new AABB(center, center).inflate(CRYSTAL_SEARCH_RADIUS), - EndCrystal::isAlive - ); - return nearestCrystalTo(anchor, aroundPortal); - } - - private EndCrystal nearestCrystalTo(Vec3 pos, List crystals) { - EndCrystal best = null; - double bestDistance = Double.MAX_VALUE; - for (EndCrystal candidate : crystals) { - double d = candidate.position().distanceToSqr(pos); - if (d < bestDistance) { - bestDistance = d; - best = candidate; - } - } - return best; - } - private int tickEmitters(ServerLevel level, Vec3 center) { int emitted = 0; emitted += tickPillarCrafters(level); @@ -435,63 +314,4 @@ private double randomBetween(double min, double max) { return lo + random.nextDouble() * (hi - lo); } - private record PendingPillarPulse(long triggerTick, UUID crystalId) { - } - - private static final class PillarCrafter { - private static final int CRAFT_INTERVAL = 15; - private static final int MAX_TICKS = 500; - - private final Vec3 start; - private Vec3 target; - private final UUID crystalId; - private int tick; - - private PillarCrafter(Vec3 start, Vec3 target, UUID crystalId) { - this.start = start; - this.target = target; - this.crystalId = crystalId; - } - - private Vec3 start() { - return start; - } - - private boolean shouldCraftNow() { - return tick % CRAFT_INTERVAL == 0; - } - - private void advanceTick() { - tick++; - } - - private boolean expired() { - return tick > MAX_TICKS; - } - - private boolean shouldCancel(ServerLevel level, EndRespawnPhase phase) { - if (phase == EndRespawnPhase.BEFORE_END_WAITING || phase == EndRespawnPhase.END) { - return true; - } - if (crystalId == null) { - return true; - } - net.minecraft.world.entity.Entity entity = level.getEntity(crystalId); - if (!(entity instanceof EndCrystal crystal) || !crystal.isAlive()) { - return true; - } - return crystal.getBeamTarget() == null; - } - - private Vec3 resolveTarget(ServerLevel level) { - if (crystalId == null) { - return target; - } - net.minecraft.world.entity.Entity entity = level.getEntity(crystalId); - if (entity instanceof EndCrystal crystal && crystal.isAlive()) { - target = crystal.position().add(0.0, 1.7, 0.0); - } - return target; - } - } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndDragonFightHelper.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndDragonFightHelper.java index 16ec8e7..cbceacc 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndDragonFightHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndDragonFightHelper.java @@ -1,21 +1,20 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import net.minecraft.world.level.dimension.end.EndDragonFight; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Collection; +import java.util.List; import java.util.Optional; +import java.util.UUID; -/** - * Utility methods for reading dragon-respawn state from {@link EndDragonFight} - * via reflection (Forge 1.20.x mappings). - */ public final class EndDragonFightHelper { private EndDragonFightHelper() { @@ -160,4 +159,44 @@ private static Integer readIntField(Object target, String... names) { } return null; } + + // ---- Crystal resolution ---- + + static EndCrystal resolvePulseCrystal(ServerLevel level, Vec3 center, Vec3 anchor, + UUID preferredCrystalId, double searchRadius) { + if (preferredCrystalId != null) { + net.minecraft.world.entity.Entity entity = level.getEntity(preferredCrystalId); + if (entity instanceof EndCrystal preferred && preferred.isAlive()) { + return preferred; + } + } + java.util.List nearAnchor = level.getEntitiesOfClass( + EndCrystal.class, + new AABB(anchor, anchor).inflate(8.0), + EndCrystal::isAlive + ); + EndCrystal closest = nearestCrystalTo(anchor, nearAnchor); + if (closest != null) { + return closest; + } + java.util.List aroundPortal = level.getEntitiesOfClass( + EndCrystal.class, + new AABB(center, center).inflate(searchRadius), + EndCrystal::isAlive + ); + return nearestCrystalTo(anchor, aroundPortal); + } + + static EndCrystal nearestCrystalTo(Vec3 pos, java.util.List crystals) { + EndCrystal best = null; + double bestDistance = Double.MAX_VALUE; + for (EndCrystal candidate : crystals) { + double d = candidate.position().distanceToSqr(pos); + if (d < bestDistance) { + bestDistance = d; + best = candidate; + } + } + return best; + } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnEffectPreview.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnEffectPreview.java index 0c326e2..40ef8ad 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnEffectPreview.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnEffectPreview.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import net.minecraft.core.particles.DustParticleOptions; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnPhase.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnPhase.java index d2c50f1..fc3304e 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnPhase.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnPhase.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import java.util.Locale; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnSnapshot.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnSnapshot.java index dec3069..425c373 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnSnapshot.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnSnapshot.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import net.minecraft.world.phys.Vec3; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnStateBridge.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnStateBridge.java index 58302eb..e105183 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnStateBridge.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnStateBridge.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import net.minecraft.server.level.ServerLevel; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnWatcher.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnWatcher.java index b3c4f3f..762ff6a 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnWatcher.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/EndRespawnWatcher.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn; import net.minecraft.server.MinecraftServer; @@ -22,6 +20,10 @@ public final class EndRespawnWatcher { private EndRespawnWatcher() { } + public static void clearTrackers() { + SYNTHETIC_TRACKERS.clear(); + } + public static void tickServer(MinecraftServer server, EndRespawnStateBridge bridge, Logger logger) { boolean foundRespawning = false; @@ -107,7 +109,7 @@ private static int resolveCrystalCount(EndDragonFight fight, ServerLevel level, return Math.max(fromFight, fromPortalArea); } - // Synthetic phase tick thresholds — aligned with Fabric mixin timing. + // Synthetic phase tick thresholds --” aligned with Fabric mixin timing. // Extracted to constants so they can be tuned or tested independently. static final long PHASE_START_END = 150L; static final long PHASE_SUMMON_PILLARS_END = 650L; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/PillarCrafter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/PillarCrafter.java new file mode 100644 index 0000000..eb1bd97 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/PillarCrafter.java @@ -0,0 +1,64 @@ +package com.reiasu.reiparticleskill.end.respawn; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; +import net.minecraft.world.phys.Vec3; + +import java.util.UUID; + +final class PillarCrafter { + static final int CRAFT_INTERVAL = 15; + static final int MAX_TICKS = 500; + + private final Vec3 start; + private Vec3 target; + private final UUID crystalId; + private int tick; + + PillarCrafter(Vec3 start, Vec3 target, UUID crystalId) { + this.start = start; + this.target = target; + this.crystalId = crystalId; + } + + Vec3 start() { + return start; + } + + boolean shouldCraftNow() { + return tick % CRAFT_INTERVAL == 0; + } + + void advanceTick() { + tick++; + } + + boolean expired() { + return tick > MAX_TICKS; + } + + boolean shouldCancel(ServerLevel level, EndRespawnPhase phase) { + if (phase == EndRespawnPhase.BEFORE_END_WAITING || phase == EndRespawnPhase.END) { + return true; + } + if (crystalId == null) { + return true; + } + net.minecraft.world.entity.Entity entity = level.getEntity(crystalId); + if (!(entity instanceof EndCrystal crystal) || !crystal.isAlive()) { + return true; + } + return crystal.getBeamTarget() == null; + } + + Vec3 resolveTarget(ServerLevel level) { + if (crystalId == null) { + return target; + } + net.minecraft.world.entity.Entity entity = level.getEntity(crystalId); + if (entity instanceof EndCrystal crystal && crystal.isAlive()) { + target = crystal.position().add(0.0, 1.7, 0.0); + } + return target; + } +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/PillarPulseScheduler.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/PillarPulseScheduler.java new file mode 100644 index 0000000..71ee7b4 --- /dev/null +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/PillarPulseScheduler.java @@ -0,0 +1,107 @@ +package com.reiasu.reiparticleskill.end.respawn; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +final class PillarPulseScheduler { + private static final int PILLAR_EVENT_DELAY_TICKS = 39; + private static final double CRYSTAL_SEARCH_RADIUS = 96.0; + private static final double PILLAR_RING_RADIUS = 56.0; + private static final double PILLAR_RING_Y_OFFSET = 80.0; + + private final Map crystalBeamTargets = new HashMap<>(); + private final Map pendingPulses = new HashMap<>(); + private int pulseIndex; + private long lastPulseTick = Long.MIN_VALUE; + + record PulseResult(Vec3 pillarCenter, UUID preferredCrystalId) {} + + List tick(ServerLevel level, Vec3 center, long phaseTick) { + List crystals = level.getEntitiesOfClass( + EndCrystal.class, + new AABB(center, center).inflate(CRYSTAL_SEARCH_RADIUS), + EndCrystal::isAlive + ); + Set seen = new HashSet<>(); + for (EndCrystal crystal : crystals) { + UUID uuid = crystal.getUUID(); + seen.add(uuid); + BlockPos beam = crystal.getBeamTarget(); + if (beam == null) { + continue; + } + BlockPos prev = crystalBeamTargets.put(uuid, beam.immutable()); + if (prev == null || !prev.equals(beam)) { + pendingPulses.put(beam.immutable(), + new PendingPillarPulse(phaseTick + PILLAR_EVENT_DELAY_TICKS, uuid)); + } + } + crystalBeamTargets.keySet().removeIf(uuid -> !seen.contains(uuid)); + + List results = new java.util.ArrayList<>(); + boolean fired = false; + Iterator> it = pendingPulses.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + PendingPillarPulse pulse = entry.getValue(); + if (pulse.triggerTick() > phaseTick) { + continue; + } + results.add(new PulseResult(Vec3.atCenterOf(entry.getKey()), pulse.crystalId())); + it.remove(); + fired = true; + } + if (fired) { + lastPulseTick = phaseTick; + return results; + } + + // Fallback: fire once when no beam targets are visible yet + if (!pendingPulses.isEmpty() || !crystalBeamTargets.isEmpty() + || lastPulseTick != Long.MIN_VALUE) { + return results; + } + Vec3 fallback = chooseFallbackTarget(crystals, center); + results.add(new PulseResult(fallback, null)); + lastPulseTick = phaseTick; + return results; + } + + int nextPulseIndex() { + return pulseIndex++; + } + + void clear() { + crystalBeamTargets.clear(); + pendingPulses.clear(); + pulseIndex = 0; + lastPulseTick = Long.MIN_VALUE; + } + + private Vec3 chooseFallbackTarget(List crystals, Vec3 center) { + if (!crystals.isEmpty()) { + EndCrystal crystal = crystals.get(Math.floorMod(pulseIndex, crystals.size())); + BlockPos beam = crystal.getBeamTarget(); + if (beam != null) { + return Vec3.atCenterOf(beam); + } + return crystal.position(); + } + double angle = (Math.PI * 2.0 * (pulseIndex % 10)) / 10.0; + return center.add(Math.cos(angle) * PILLAR_RING_RADIUS, PILLAR_RING_Y_OFFSET, + Math.sin(angle) * PILLAR_RING_RADIUS); + } + + private record PendingPillarPulse(long triggerTick, UUID crystalId) {} +} diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/CollectEnderPowerEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/CollectEnderPowerEmitter.java index 3f13034..a6107d5 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/CollectEnderPowerEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/CollectEnderPowerEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import com.reiasu.reiparticleskill.util.ParticleHelper; @@ -70,15 +68,7 @@ public CollectEnderPowerEmitter setTargetOffset(Vec3 targetOffset) { return this; } - /** - * Logarithmic spiral inward trajectory with angular momentum conservation. - * Each particle orbits the target on a tightening spiral path: - * r(t) = r0 · e^(-λ·t) - * θ(t) = θ0 + ω0·r0/r(t) · t (angular momentum ∝ r·ω = const) - * - * @author Reiasu - */ - @Override + @Override protected int emit(ServerLevel level, Vec3 center, int tick) { Vec3 origin = center.add(originOffset); Vec3 target = center.add(targetOffset); @@ -109,7 +99,7 @@ private int tickSpiral(ServerLevel level, Vec3 target) { double decay = Math.exp(-p.lambda * p.age); double currentR = p.initialRadius * decay; - // Angular momentum conservation: ω ∝ 1/r² → angle accelerates as r shrinks + // Angular momentum conservation: ω --ˆ 1/r--² --†’ angle accelerates as r shrinks double angularProgress = p.omega0 * p.initialRadius * p.initialRadius * (1.0 / Math.max(0.5, currentR * currentR)); double theta = p.initialTheta + angularProgress * p.age * 0.05; @@ -197,7 +187,7 @@ private int spawnSpiral(Vec3 origin, Vec3 target) { double initR = Math.sqrt(dx * dx + dz * dz); double initTheta = Math.atan2(dz, dx); - // Spiral decay rate: λ controls how fast particles converge + // Spiral decay rate: λ controls how fast particles converge double lambda = randomBetween(0.04, 0.09); // Initial angular velocity: higher = more orbits double omega = randomBetween(1.5, 4.0) * (random.nextBoolean() ? 1.0 : -1.0); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/CollectPillarsEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/CollectPillarsEmitter.java index f1fd57d..877b9d0 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/CollectPillarsEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/CollectPillarsEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import com.reiasu.reiparticleskill.util.ParticleHelper; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndBeamExplosionEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndBeamExplosionEmitter.java index 46fa6bd..36c49bd 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndBeamExplosionEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndBeamExplosionEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import com.reiasu.reiparticleskill.util.ParticleHelper; @@ -91,15 +89,7 @@ public EndBeamExplosionEmitter setAnchorOffset(Vec3 anchorOffset) { return this; } - /** - * Fibonacci sphere (golden angle) burst distribution with gravity pull-back. - * Instead of a flat ring burst, particles are distributed on a sphere using - * the golden angle (π(3-√5)) for uniform coverage. After the initial burst, - * gravity pulls particles downward creating an arching firework effect. - * - * @author Reiasu - */ - @Override + @Override protected int emit(ServerLevel level, Vec3 center, int tick) { Vec3 origin = center.add(anchorOffset); int emitted = 0; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndCrystalEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndCrystalEmitter.java index 25ed37b..436f725 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndCrystalEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndCrystalEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import com.reiasu.reiparticleskill.util.ParticleHelper; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndCrystalStyleEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndCrystalStyleEmitter.java index 9fe7d4e..6ac6ca0 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndCrystalStyleEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/EndCrystalStyleEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import com.reiasu.reiparticleskill.util.ParticleHelper; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/PillarFourierBeamEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/PillarFourierBeamEmitter.java index 72f1e00..4a1a46b 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/PillarFourierBeamEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/PillarFourierBeamEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import com.reiasu.reiparticleskill.util.ParticleHelper; @@ -10,16 +8,6 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; -/** - * Fourier-curve light beam that erupts upward from an obsidian pillar - * during the dragon respawn finale. The beam cross-section traces a - * multi-frequency rose curve that rotates and expands as it rises. - *

- * Cross-section: r(θ) = A·cos(3θ) + B·cos(5θ) + C·sin(2θ) - * The beam sweeps upward over time, leaving a fading trail. - * - * @author Reiasu - */ public final class PillarFourierBeamEmitter extends TimedRespawnEmitter { private static final Vector3f BEAM_COLOR = new Vector3f(210f / 255f, 80f / 255f, 1.0f); private static final Vector3f BRIGHT_COLOR = new Vector3f(240f / 255f, 160f / 255f, 1.0f); @@ -100,7 +88,7 @@ private int emitBeamBody(ServerLevel level, int tick, double beamTop) { // Rotation accelerates with height double localRot = rotation + heightFraction * TAU * 0.5; - // Fourier cross-section: r(θ) = A·cos(3θ) + B·cos(5θ) + C·sin(2θ) + // Fourier cross-section: r(θ) = A--·cos(3θ) + B--·cos(5θ) + C--·sin(2θ) float size = Mth.clamp(3.5f * alpha, 1.0f, 4.0f); DustParticleOptions dust = new DustParticleOptions(BEAM_COLOR, size); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/RespawnEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/RespawnEmitter.java index f0d9442..f8166c8 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/RespawnEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/RespawnEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import net.minecraft.server.level.ServerLevel; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/ShockwaveWallEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/ShockwaveWallEmitter.java index f0f48b1..94eb51b 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/ShockwaveWallEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/ShockwaveWallEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import com.reiasu.reiparticleskill.util.ParticleHelper; @@ -10,19 +8,6 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; -/** - * Expanding shockwave wall that erupts outward from the center during - * the dragon respawn finale. The wall is a tall cylinder of particles - * that expands rapidly, creating a dramatic visual impact. - *

- * The wall has two layers: - *

    - *
  • Primary ring: dense dust particles forming the wall face
  • - *
  • Trailing wisps: enchant particles left behind as the wall passes
  • - *
- * - * @author Reiasu - */ public final class ShockwaveWallEmitter extends TimedRespawnEmitter { private static final Vector3f WALL_COLOR = new Vector3f(180f / 255f, 60f / 255f, 1.0f); private static final Vector3f BRIGHT_COLOR = new Vector3f(230f / 255f, 140f / 255f, 1.0f); @@ -47,8 +32,6 @@ protected int emit(ServerLevel level, Vec3 center, int tick) { // Wall intensity fades as it expands float intensity = Mth.clamp(1.0f - (float) (radius / MAX_RADIUS), 0.1f, 1.0f); double wallThickness = 1.5 + radius * 0.02; - - // ---- Primary wall ring at multiple heights ---- for (int h = 0; h < HEIGHT_SLICES; h++) { double y = (h / (double) HEIGHT_SLICES) * WALL_HEIGHT; // Sinusoidal height envelope: thicker in the middle @@ -70,8 +53,6 @@ protected int emit(ServerLevel level, Vec3 center, int tick) { emitted += 3; } } - - // ---- Ground-level leading edge: bright ring ---- DustParticleOptions edgeDust = new DustParticleOptions(BRIGHT_COLOR, 4.0f); for (int i = 0; i < RING_POINTS; i++) { double angle = TAU * i / (double) RING_POINTS; @@ -82,8 +63,6 @@ protected int emit(ServerLevel level, Vec3 center, int tick) { 3, 0.2, 0.12, 0.2, 0.01); emitted += 3; } - - // ---- Trailing enchant wisps (only first 60% of expansion) ---- if (radius < MAX_RADIUS * 0.6) { double trailRadius = radius * 0.85; int trailPoints = RING_POINTS / 2; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/TimedRespawnEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/TimedRespawnEmitter.java index 7c18842..efa173d 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/TimedRespawnEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/TimedRespawnEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter; import net.minecraft.server.level.ServerLevel; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientCenterEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientCenterEmitter.java index 03e2dc4..ee2ad38 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientCenterEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientCenterEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter.client; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -14,14 +12,9 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; -/** - * Client-rendered center geometric pattern emitter. - * Rhodonea curve + dual pentagram + Lissajous figures + pulsing ring. - * Server syncs params only; client generates particles locally. - */ @ReiAutoRegister public final class ClientCenterEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "client_center"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "client_center"); private static final Vector3f MAIN_COLOR = new Vector3f(210f / 255f, 80f / 255f, 1.0f); private static final double TAU = Math.PI * 2.0; private static final int SCALE_TICKS = 24; @@ -58,6 +51,10 @@ protected void emitTick() { } private void renderCenter(Level level, Vec3 center, int tick) { + double cx = center.x; + double cy = center.y + yOffset; + double cz = center.z; + double scale = easeScale(tick); double breath = 1.0 + 0.15 * Math.sin(tick * 0.08); double rotA = tick * 0.008; @@ -68,44 +65,65 @@ private void renderCenter(Level level, Vec3 center, int tick) { DustParticleOptions dustSm = new DustParticleOptions(MAIN_COLOR, 2.2f); DustParticleOptions dustLg = new DustParticleOptions(MAIN_COLOR, 4.0f); + // Precompute sines/cosines + double cosRotA = Math.cos(rotA); + double sinRotA = Math.sin(rotA); + // Layer 1: Rhodonea curve r = cos(5/3 * theta) for (int i = 0; i < LAYER1_ROSE_POINTS; i++) { double theta = 3.0 * TAU * i / (double) LAYER1_ROSE_POINTS; double r = Math.cos(5.0 / 3.0 * theta) * 42.0 * scale * breath; double rx = r * Math.cos(theta); double rz = r * Math.sin(theta); - Vec3 rel = rotateY(new Vec3(rx, 0.0, rz), rotA).add(0.0, yOffset, 0.0); - addDust(level, center, rel, dustMed); + + // rotateY + double relX = rx * cosRotA - rz * sinRotA; + double relZ = rx * sinRotA + rz * cosRotA; + + addDust(level, cx + relX, cy, cz + relZ, dustMed); } // Layer 1: Dual pentagram - emitStar(level, center, yOffset, 5, 48.0 * scale * breath, 0.0, LAYER1_STAR_POINTS, rotA, dustMed); - emitStar(level, center, yOffset, 5, 36.0 * scale * breath, Math.PI / 5.0, LAYER1_STAR_POINTS, rotA, dustMed); + emitStar(level, cx, cy, cz, 5, 48.0 * scale * breath, 0.0, LAYER1_STAR_POINTS, cosRotA, sinRotA, dustMed); + emitStar(level, cx, cy, cz, 5, 36.0 * scale * breath, Math.PI / 5.0, LAYER1_STAR_POINTS, cosRotA, sinRotA, dustMed); // Layer 1: Breathing inner ring double ringR = 28.0 * scale * breath; for (int i = 0; i < LAYER1_RING_POINTS; i++) { double a = rotA + TAU * i / (double) LAYER1_RING_POINTS; double wobble = 1.0 + 0.12 * Math.sin(a * 6.0 + tick * 0.1); - Vec3 rel = new Vec3(Math.cos(a) * ringR * wobble, yOffset, Math.sin(a) * ringR * wobble); - addDust(level, center, rel, dustMed); + double relX = Math.cos(a) * ringR * wobble; + double relZ = Math.sin(a) * ringR * wobble; + addDust(level, cx + relX, cy, cz + relZ, dustMed); if (i % 3 == 0) { - addEnchant(level, center, rel); + addEnchant(level, cx + relX, cy, cz + relZ); } } // Layer 2: Three Lissajous figures + double cosRotB = Math.cos(rotB); + double sinRotB = Math.sin(rotB); for (int ring = 0; ring < LAYER2_REPEAT; ring++) { double pitch = (TAU / 9.0) * ring; + double cosPitch = Math.cos(pitch); + double sinPitch = Math.sin(pitch); double phase = ring * Math.PI / 3.0; for (int i = 0; i < LAYER2_LISSAJOUS_POINTS; i++) { double t = TAU * i / (double) LAYER2_LISSAJOUS_POINTS; double lx = Math.sin(3.0 * t + Math.PI / 4.0 + phase) * 14.0 * scale; double lz = Math.sin(4.0 * t) * 14.0 * scale; - Vec3 rel = new Vec3(lx, 0.0, lz); - rel = rotateX(rel, pitch); - rel = rotateY(rel, rotB).add(0.0, yOffset, 0.0); - addDust(level, center, rel, dustSm); + + // rotateX + double px = lx; + double pz = lz * cosPitch; + double py = lz * sinPitch; + + // rotateY + double relX = px * cosRotB - pz * sinRotB; + double relZ = px * sinRotB + pz * cosRotB; + double relY = py; + + addDust(level, cx + relX, cy + relY, cz + relZ, dustSm); } } @@ -114,17 +132,18 @@ private void renderCenter(Level level, Vec3 center, int tick) { for (int i = 0; i < LAYER3_RING_POINTS; i++) { double a = rotC + TAU * i / (double) LAYER3_RING_POINTS; double wobble = 1.0 + 0.08 * Math.sin(a * 5.0 - tick * 0.06); - Vec3 rel = new Vec3(Math.cos(a) * outerR * wobble, yOffset, Math.sin(a) * outerR * wobble); - addDust(level, center, rel, dustLg); + double relX = Math.cos(a) * outerR * wobble; + double relZ = Math.sin(a) * outerR * wobble; + addDust(level, cx + relX, cy, cz + relZ, dustLg); if (i % 2 == 0) { - addEnchant(level, center, rel); + addEnchant(level, cx + relX, cy, cz + relZ); } } } - private void emitStar(Level level, Vec3 center, double yOff, + private void emitStar(Level level, double cx, double cy, double cz, int points, double radius, double angleOffset, - int samples, double rotY, DustParticleOptions dust) { + int samples, double cosRot, double sinRot, DustParticleOptions dust) { int skip = 2; for (int i = 0; i < samples; i++) { double u = (i / (double) samples) * points; @@ -134,38 +153,26 @@ private void emitStar(Level level, Vec3 center, double yOff, int v1 = ((seg + 1) * skip) % points; double a0 = angleOffset + TAU * v0 / (double) points; double a1 = angleOffset + TAU * v1 / (double) points; - double x = Math.cos(a0) * radius + (Math.cos(a1) - Math.cos(a0)) * radius * frac; - double z = Math.sin(a0) * radius + (Math.sin(a1) - Math.sin(a0)) * radius * frac; - Vec3 rel = rotateY(new Vec3(x, 0.0, z), rotY).add(0.0, yOff, 0.0); - addDust(level, center, rel, dust); + double rx = Math.cos(a0) * radius + (Math.cos(a1) - Math.cos(a0)) * radius * frac; + double rz = Math.sin(a0) * radius + (Math.sin(a1) - Math.sin(a0)) * radius * frac; + + double relX = rx * cosRot - rz * sinRot; + double relZ = rx * sinRot + rz * cosRot; + + addDust(level, cx + relX, cy, cz + relZ, dust); } } - private void addDust(Level level, Vec3 center, Vec3 rel, DustParticleOptions dust) { - ClientParticleHelper.addForce(level, dust, - center.x + rel.x, center.y + rel.y, center.z + rel.z, - 3, 0.2, 0.1, 0.2, 0.015); + private void addDust(Level level, double x, double y, double z, DustParticleOptions dust) { + ClientParticleHelper.addForce(level, dust, x, y, z, 3, 0.2, 0.1, 0.2, 0.015); } - private void addEnchant(Level level, Vec3 center, Vec3 rel) { - ClientParticleHelper.addForce(level, ParticleTypes.ENCHANT, - center.x + rel.x, center.y + rel.y, center.z + rel.z, + private void addEnchant(Level level, double x, double y, double z) { + ClientParticleHelper.addForce(level, ParticleTypes.ENCHANT, x, y, z, 0, random.nextGaussian() * 0.02, random.nextGaussian() * 0.02, random.nextGaussian() * 0.02, 1.0); } - private Vec3 rotateX(Vec3 p, double angle) { - double cos = Math.cos(angle); - double sin = Math.sin(angle); - return new Vec3(p.x, p.y * cos - p.z * sin, p.y * sin + p.z * cos); - } - - private Vec3 rotateY(Vec3 p, double angle) { - double cos = Math.cos(angle); - double sin = Math.sin(angle); - return new Vec3(p.x * cos - p.z * sin, p.y, p.x * sin + p.z * cos); - } - private double easeScale(int tick) { if (tick <= 0) return 0.01; if (tick >= SCALE_TICKS) return 1.0; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientCloudRingEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientCloudRingEmitter.java index d1ed8ca..cac71cb 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientCloudRingEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientCloudRingEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter.client; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -13,13 +11,9 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; -/** - * Client-rendered rotating cloud ring emitter. - * Server syncs params only; client generates particles locally. - */ @ReiAutoRegister public final class ClientCloudRingEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "client_cloud_ring"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "client_cloud_ring"); private static final Vector3f MAIN_COLOR = new Vector3f(210f / 255f, 80f / 255f, 1.0f); private static final double TAU = Math.PI * 2.0; private static final int SCALE_TICKS = 24; @@ -66,6 +60,10 @@ protected void emitTick() { } private void renderCloud(Level level, Vec3 center, int tick) { + double cx = center.x; + double cy = center.y; + double cz = center.z; + int cMin = Math.max(1, countMin); int cMax = Math.max(cMin + 1, countMax); int count = random.nextInt(cMin, cMax); @@ -81,7 +79,7 @@ private void renderCloud(Level level, Vec3 center, int tick) { double wavePhase = tick * 0.12; float dustSize = (float) Math.max(0.4, Math.min(4.0, - randomBetween(minSize, maxSize) * scale * 2.5)); + randRange(minSize, maxSize) * scale * 2.5)); DustParticleOptions dust = new DustParticleOptions(MAIN_COLOR, dustSize); DustParticleOptions dustLg = new DustParticleOptions(MAIN_COLOR, Math.min(4.0f, dustSize * 1.5f)); @@ -92,14 +90,19 @@ private void renderCloud(Level level, Vec3 center, int tick) { double localR = r * radialWobble; double waveY = waveAmplitude * Math.sin(waveLobes * angle - wavePhase); - double jR = disc > 0 ? random.nextDouble() * disc : 0.0; - double jA = random.nextDouble() * TAU; - double px = Math.cos(angle) * localR + Math.cos(jA) * jR; - double pz = Math.sin(angle) * localR + Math.sin(jA) * jR; + double px = Math.cos(angle) * localR; + double pz = Math.sin(angle) * localR; + + if (disc > 0) { + double jR = random.nextDouble() * disc; + double jA = random.nextDouble() * TAU; + px += Math.cos(jA) * jR; + pz += Math.sin(jA) * jR; + } - double wx = center.x + px; - double wy = center.y + yOff + waveY; - double wz = center.z + pz; + double wx = cx + px; + double wy = cy + yOff + waveY; + double wz = cz + pz; double tgx = -Math.sin(angle) * 0.03; double tgz = Math.cos(angle) * 0.03; @@ -114,10 +117,9 @@ private void renderCloud(Level level, Vec3 center, int tick) { } } - private double randomBetween(double min, double max) { - double lo = Math.min(min, max); - double hi = Math.max(min, max); - return (Math.abs(hi - lo) < 1.0E-6) ? lo : lo + random.nextDouble() * (hi - lo); + // FIXME: cloud and enchant share a lot of ring logic, could extract base class + private double randRange(double lo, double hi) { + return lo + random.nextDouble() * (hi - lo); } private double easeScale(int tick) { diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientDustEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientDustEmitter.java index b61bd9e..a363eaf 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientDustEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientDustEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter.client; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -14,14 +12,10 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; -/** - * Client-rendered ambient dust emitter. - * Server syncs params only; client generates particles locally via addParticle(). - * Replaces per-particle sendForce() calls — zero particle network packets. - */ +// torus-shaped dust cloud, rendered client-side @ReiAutoRegister public final class ClientDustEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "client_dust"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "client_dust"); private static final Vector3f MAIN_COLOR = new Vector3f(210f / 255f, 80f / 255f, 1.0f); private static final double TAU = Math.PI * 2.0; private static final int SCALE_TICKS = 24; @@ -64,6 +58,10 @@ protected void emitTick() { } private void renderDust(Level level, Vec3 center, int tick) { + double cx = center.x; + double cy = center.y + yOffset; + double cz = center.z; + double scale = easeScale(tick); double rotation = tick * rotateSpeed; double majorR = maxRadius * 0.6 * scale; @@ -76,39 +74,46 @@ private void renderDust(Level level, Vec3 center, int tick) { tubeDist = tubeDist * tubeDist * tubeDist; double tubeR = minorR * (0.3 + 0.7 * tubeDist); - double ringX = (majorR + tubeR * Math.cos(poloidalAngle)) * Math.cos(toroidalAngle); - double ringZ = (majorR + tubeR * Math.cos(poloidalAngle)) * Math.sin(toroidalAngle); - double ringY = tubeR * Math.sin(poloidalAngle); + double cosPoloidal = Math.cos(poloidalAngle); + double sinPoloidal = Math.sin(poloidalAngle); + double cosToroidal = Math.cos(toroidalAngle); + double sinToroidal = Math.sin(toroidalAngle); + + double ringX = (majorR + tubeR * cosPoloidal) * cosToroidal; + double ringZ = (majorR + tubeR * cosPoloidal) * sinToroidal; + double ringY = tubeR * sinPoloidal; double particlePhase = random.nextDouble() * 0.3 - 0.15; - double cos = Math.cos(rotation + particlePhase); - double sin = Math.sin(rotation + particlePhase); + double rotPhase = rotation + particlePhase; + double cos = Math.cos(rotPhase); + double sin = Math.sin(rotPhase); + double px = ringX * cos - ringZ * sin; double pz = ringX * sin + ringZ * cos; double tangentX = -Math.sin(toroidalAngle + rotation) * 0.02; double tangentZ = Math.cos(toroidalAngle + rotation) * 0.02; - float size = Mth.clamp((float) randomBetween(sizeMin, sizeMax) * 2.0f, 0.2f, 4.0f); + float size = Mth.clamp((float) rng(sizeMin, sizeMax) * 2.0f, 0.2f, 4.0f); + ClientParticleHelper.addForce(level, new DustParticleOptions(MAIN_COLOR, size), - center.x + px, center.y + yOffset + ringY, center.z + pz, + cx + px, cy + ringY, cz + pz, 3, 0.15 + Math.abs(tangentX), 0.12, 0.15 + Math.abs(tangentZ), 0.02); } } - private double randomBetween(double min, double max) { - double lo = Math.min(min, max); - double hi = Math.max(min, max); - return (Math.abs(hi - lo) < 1.0E-6) ? lo : lo + random.nextDouble() * (hi - lo); + private double rng(double min, double max) { + if (min >= max) return min; + return min + random.nextDouble() * (max - min); } + // TODO: maybe share this with the other emitters private double easeScale(int tick) { - if (tick <= 0) return 0.01; if (tick >= SCALE_TICKS) return 1.0; + if (tick <= 0) return 0.01; double t = tick / (double) SCALE_TICKS; - double inv = 1.0 - t; - return 0.01 + 0.99 * (1.0 - inv * inv * inv * inv * inv); + return 0.01 + 0.99 * (1.0 - Math.pow(1.0 - t, 5)); } @Override diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientEnchantRingEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientEnchantRingEmitter.java index d5a61d0..1ae4040 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientEnchantRingEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/end/respawn/runtime/emitter/client/ClientEnchantRingEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.end.respawn.runtime.emitter.client; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -14,13 +12,9 @@ import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; -/** - * Client-rendered enchant sparkle ring emitter. - * Server syncs params only; client generates particles locally. - */ @ReiAutoRegister public final class ClientEnchantRingEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "client_enchant_ring"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "client_enchant_ring"); private static final Vector3f MAIN_COLOR = new Vector3f(210f / 255f, 80f / 255f, 1.0f); private static final double TAU = Math.PI * 2.0; private static final int SCALE_TICKS = 24; @@ -70,7 +64,8 @@ private void renderEnchant(Level level, Vec3 center, int tick) { int cMin = Math.max(1, countMin); int cMax = Math.max(cMin + 1, countMax); int count = random.nextInt(cMin, cMax); - double scale = easeScale(tick); + double rawT = Math.min(1.0, Math.max(0.0, tick / (double) SCALE_TICKS)); + double scale = rawT < 1.0 ? 0.01 + 0.99 * (1.0 - Math.pow(1.0 - rawT, 5)) : 1.0; double rotation = tick * rotateSpeed; double breath = 1.0 + 0.04 * Math.sin(tick * 0.09); double r = radius * scale * breath; @@ -117,17 +112,7 @@ private void renderEnchant(Level level, Vec3 center, int tick) { } private double randomBetween(double min, double max) { - double lo = Math.min(min, max); - double hi = Math.max(min, max); - return (Math.abs(hi - lo) < 1.0E-6) ? lo : lo + random.nextDouble() * (hi - lo); - } - - private double easeScale(int tick) { - if (tick <= 0) return 0.01; - if (tick >= SCALE_TICKS) return 1.0; - double t = tick / (double) SCALE_TICKS; - double inv = 1.0 - t; - return 0.01 + 0.99 * (1.0 - inv * inv * inv * inv * inv); + return min + random.nextDouble() * Math.max(0, max - min); } @Override diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/BarrageItemEntity.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/BarrageItemEntity.java index 580d3b1..0338c1d 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/BarrageItemEntity.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/BarrageItemEntity.java @@ -1,10 +1,6 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.entities; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -14,7 +10,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkHooks; public class BarrageItemEntity extends Entity { private static final EntityDataAccessor DATA_ITEM = @@ -71,14 +66,16 @@ public void setBlock(boolean block) { } @Override - protected void defineSynchedData() { - getEntityData().define(DATA_ITEM, ItemStack.EMPTY); + protected void defineSynchedData(SynchedEntityData.Builder builder) { + builder.define(DATA_ITEM, ItemStack.EMPTY); } @Override protected void readAdditionalSaveData(CompoundTag tag) { if (tag.contains(TAG_ITEM)) { - setItem(ItemStack.of(tag.getCompound(TAG_ITEM))); + ItemStack.CODEC.parse(net.minecraft.nbt.NbtOps.INSTANCE, tag.getCompound(TAG_ITEM)) + .resultOrPartial(s -> {}) + .ifPresent(this::setItem); } roll = tag.getFloat(TAG_ROLL); scale = tag.getFloat(TAG_SCALE); @@ -87,7 +84,7 @@ protected void readAdditionalSaveData(CompoundTag tag) { @Override protected void addAdditionalSaveData(CompoundTag tag) { - tag.put(TAG_ITEM, getItem().save(new CompoundTag())); + tag.put(TAG_ITEM, getItem().save(level().registryAccess())); tag.putFloat(TAG_ROLL, roll); tag.putFloat(TAG_SCALE, scale); tag.putBoolean(TAG_BLOCK, block); @@ -102,8 +99,5 @@ public void tick() { } } - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } + // getAddEntityPacket removed in 1.21 --” NeoForge handles entity spawn packets automatically } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/SkillEntityTypes.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/SkillEntityTypes.java index 3698350..fb8605b 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/SkillEntityTypes.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/SkillEntityTypes.java @@ -1,20 +1,18 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.entities; import com.reiasu.reiparticleskill.ReiParticleSkillForge; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.bus.api.IEventBus; +import net.minecraft.core.registries.Registries; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; public final class SkillEntityTypes { public static final DeferredRegister> ENTITIES = - DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, ReiParticleSkillForge.MOD_ID); + DeferredRegister.create(Registries.ENTITY_TYPE, ReiParticleSkillForge.MOD_ID); - public static final RegistryObject> BARRAGE_ITEM = + public static final DeferredHolder, EntityType> BARRAGE_ITEM = ENTITIES.register("barrage_item", () -> EntityType.Builder.of(BarrageItemEntity::new, MobCategory.MISC) .sized(0.4F, 0.4F) diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/renderer/BarrageItemRenderer.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/renderer/BarrageItemRenderer.java index c0bc72b..3984ba1 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/renderer/BarrageItemRenderer.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/entities/renderer/BarrageItemRenderer.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.entities.renderer; import com.reiasu.reiparticleskill.entities.BarrageItemEntity; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/keys/SkillKeys.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/keys/SkillKeys.java index 21b4978..16444d2 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/keys/SkillKeys.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/keys/SkillKeys.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.keys; import com.reiasu.reiparticleskill.ReiParticleSkillForge; @@ -13,6 +11,6 @@ private SkillKeys() { } public static ResourceLocation id(String path) { - return new ResourceLocation(ReiParticleSkillForge.MOD_ID, path); + return ResourceLocation.fromNamespaceAndPath(ReiParticleSkillForge.MOD_ID, path); } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/listener/KeyListener.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/listener/KeyListener.java index 14dc05e..2adb070 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/listener/KeyListener.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/listener/KeyListener.java @@ -1,9 +1,5 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.listener; -import com.reiasu.reiparticlesapi.annotations.events.EventHandler; -import com.reiasu.reiparticlesapi.annotations.events.EventListener; import com.reiasu.reiparticlesapi.event.events.key.KeyActionEvent; import com.reiasu.reiparticlesapi.event.events.key.KeyActionType; import com.reiasu.reiparticleskill.ReiParticleSkillForge; @@ -14,17 +10,15 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import net.neoforged.bus.api.SubscribeEvent; -@EventListener(modId = ReiParticleSkillForge.MOD_ID) -@Mod.EventBusSubscriber(modid = ReiParticleSkillForge.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) +@net.neoforged.fml.common.EventBusSubscriber(modid = ReiParticleSkillForge.MOD_ID, bus = net.neoforged.fml.common.EventBusSubscriber.Bus.GAME) public final class KeyListener { private static final int USE_COOLDOWN_TICKS = 16; - @EventHandler - public void onKeyEvent(KeyActionEvent event) { + @SubscribeEvent + public static void onKeyEvent(KeyActionEvent event) { if (event == null || event.getAction() != KeyActionType.SINGLE_CLICK || !event.getServerSide()) { return; } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/listener/ServerListener.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/listener/ServerListener.java index cf23ed2..371588d 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/listener/ServerListener.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/listener/ServerListener.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.listener; import com.reiasu.reiparticleskill.barrages.SkillBarrageManager; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/mixin/EndCrystalRendererMixin.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/mixin/EndCrystalRendererMixin.java index 9f47ee8..3f3178a 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/mixin/EndCrystalRendererMixin.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/mixin/EndCrystalRendererMixin.java @@ -1,30 +1,25 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.mixin; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.reiasu.reiparticleskill.config.SkillClientConfig; import net.minecraft.client.renderer.entity.EndCrystalRenderer; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; -/** - * Suppresses the vanilla End Crystal beam so the mod's custom - * particle effects are not obscured by the bright white beam. - */ @Mixin(EndCrystalRenderer.class) public abstract class EndCrystalRendererMixin { - @Redirect( + @WrapOperation( method = "render(Lnet/minecraft/world/entity/boss/enderdragon/EndCrystal;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/boss/enderdragon/EndCrystal;getBeamTarget()Lnet/minecraft/core/BlockPos;") ) - private BlockPos reiparticleskill$hideBeam(EndCrystal crystal) { - if (!SkillClientConfig.INSTANCE.isSuppressCrystalBeam()) { - return crystal.getBeamTarget(); + private BlockPos reiparticleskill$hideBeam(EndCrystal crystal, Operation original) { + if (SkillClientConfig.INSTANCE.isSuppressCrystalBeam()) { + return null; } - return null; + return original.call(crystal); } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/RangeData.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/RangeData.java index cf1fed5..4d3ddeb 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/RangeData.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/RangeData.java @@ -1,10 +1,4 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles; -/** - * Marker/utility class preserved from the Fabric original. - * The original class was an empty data holder; kept for API compatibility. - */ public final class RangeData { } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/CollectEnderPowerEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/CollectEnderPowerEmitter.java index 4c5ac76..4c96c57 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/CollectEnderPowerEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/CollectEnderPowerEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p1; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -23,14 +21,8 @@ import java.util.List; import java.util.UUID; -/** - * Emitter that collects ender-power particles toward a target position. - * Particles spawn outward and converge on the target with alpha fade, - * rotation, and velocity damping near the destination. - * Server-side port of the Fabric original. - */ public final class CollectEnderPowerEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "collect_ender_power"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "collect_ender_power"); private static final DustParticleOptions ENDER_COLOR = new DustParticleOptions(new Vector3f(0.45f, 0.15f, 0.75f), 0.5f); @@ -157,7 +149,7 @@ protected void emitTick() { } else { progress = 1.0f; } - float alpha = GraphMathHelper.lerp(progress, 0.0f, 1.0f); + float alpha = Mth.lerp(progress, 0.0f, 1.0f); if (alpha < 0.02f) continue; if (p.sign == 0) { diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/CollectPillarsEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/CollectPillarsEmitters.java index 4468af7..306b641 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/CollectPillarsEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/CollectPillarsEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p1; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -25,15 +23,9 @@ import java.util.List; import java.util.UUID; -/** - * Emitter that spawns particles on a discrete circle and moves them - * upward toward the emitter center, simulating pillar collection. - * Also spawns vertical pillar lines during the first few ticks. - * Server-side port of the Fabric original. - */ @ReiAutoRegister public final class CollectPillarsEmitters extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "collect_pillars"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "collect_pillars"); private static final DustParticleOptions PILLAR_COLOR = new DustParticleOptions(new Vector3f(0.45f, 0.15f, 0.75f), 0.5f); @@ -193,7 +185,7 @@ protected void emitTick() { ? p.maxAge - p.age : Math.min(p.age, 20); float ageProgress = Mth.clamp((float) ageForAlpha / 20.0f, 0.0f, 1.0f); - float alpha = GraphMathHelper.lerp(ageProgress, 0.0f, 1.0f); + float alpha = Mth.lerp(ageProgress, 0.0f, 1.0f); if (alpha < 0.02f) continue; if (p.sign == 0) { @@ -205,9 +197,9 @@ protected void emitTick() { ? Mth.clamp(hLen / p.genLength, 0.0, 1.0) : 0.0; - double lerpVertical = GraphMathHelper.lerp( + double lerpVertical = Mth.lerp( (float) progress, verticalMaxSpeedMultiplier, verticalMinSpeedMultiplier); - double lerpHorizontal = GraphMathHelper.lerp( + double lerpHorizontal = Mth.lerp( (float) progress, horizontalMinSpeedMultiplier, horizontalMaxSpeedMultiplier); Vec3 dir = rel.normalize(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndBeamExplosionEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndBeamExplosionEmitter.java index 82d7645..e7d48b5 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndBeamExplosionEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndBeamExplosionEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p1; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -24,13 +22,9 @@ import java.util.List; import java.util.UUID; -/** - * End beam explosion emitter that spawns a disc wave of particles - * expanding outward with velocity drag. Server-side port of the Fabric original. - */ @ReiAutoRegister public final class EndBeamExplosionEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "end_beam_explosion"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "end_beam_explosion"); private static final DustParticleOptions EXPLOSION_COLOR = new DustParticleOptions(new Vector3f(0.45f, 0.15f, 0.75f), 0.55f); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndCrystalEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndCrystalEmitters.java index 2e6b7cc..ccfe7dc 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndCrystalEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndCrystalEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p1; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -22,14 +20,9 @@ import java.util.List; import java.util.UUID; -/** - * End crystal emitter that travels from a summon position toward a target, - * spawning particles in a rotating ring whose radius expands and contracts - * based on distance progress. Server-side port of the Fabric original. - */ @ReiAutoRegister public final class EndCrystalEmitters extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "end_crystal"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "end_crystal"); private static final DustParticleOptions CRYSTAL_COLOR = new DustParticleOptions(new Vector3f(0.45f, 0.15f, 0.75f), 0.5f); @@ -124,11 +117,7 @@ public static EndCrystalEmitters decode(FriendlyByteBuf buf) { return emitter; } - /** - * Computes the current ring radius based on distance progress. - * Radius peaks at 50% travel, shrinks to zero at endpoints. - */ - public double getCurrentRadius() { + public double getCurrentRadius() { double originalDistance = summonPos.distanceTo(target); if (originalDistance < 0.01) return 0.0; double distance = position().distanceTo(target); @@ -136,7 +125,7 @@ public double getCurrentRadius() { double progress = 1.0 - distance / originalDistance; double stepTo = Math.abs(progress - 0.5) * 2.0; - return GraphMathHelper.lerp((float) stepTo, maxRadius, 0.0); + return Mth.lerp((float) stepTo, maxRadius, 0.0); } @Override diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndLightBeamEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndLightBeamEmitter.java index 7df1633..070af40 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndLightBeamEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/EndLightBeamEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p1; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -17,14 +15,9 @@ import java.util.UUID; -/** - * End light beam emitter that travels from source toward a target position, - * spawning a trail of particles. Used in end respawn sequences. - * Server-side port of the Fabric original. - */ @ReiAutoRegister public final class EndLightBeamEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "end_light_beam"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "end_light_beam"); private static final DustParticleOptions BEAM_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.6f); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/SummonExplosionEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/SummonExplosionEmitter.java index 2763547..dc910dc 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/SummonExplosionEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p1/SummonExplosionEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p1; import com.reiasu.reiparticlesapi.network.particle.emitters.AutoParticleEmitters; @@ -12,12 +10,8 @@ import java.util.UUID; -/** - * Summon explosion emitter stub. The Fabric original is an empty placeholder - * registered via ReiAutoRegister. Preserved for API compatibility. - */ public final class SummonExplosionEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "summon_explosion"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "summon_explosion"); public SummonExplosionEmitter(Vec3 pos, Level world) { Vec3 spawn = pos == null ? Vec3.ZERO : pos; @@ -49,6 +43,6 @@ public static SummonExplosionEmitter decode(FriendlyByteBuf buf) { @Override protected void emitTick() { - // Stub — no emission logic in the original + // Stub --” no emission logic in the original } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/LightEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/LightEmitter.java index 8cd7767..3974893 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/LightEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/LightEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p2; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -20,13 +18,9 @@ import java.util.List; import java.util.UUID; -/** - * Lightning-attenuation emitter that spawns branching particle bolts - * outward from the emitter origin, matching the Fabric original's visual intent. - */ @ReiAutoRegister public final class LightEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "light"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "light"); private static final DustParticleOptions BOLT_COLOR = new DustParticleOptions(new Vector3f(0.85f, 0.92f, 1.0f), 0.55f); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/SwordAuraEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/SwordAuraEmitters.java index 1ba2a99..8f94183 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/SwordAuraEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/SwordAuraEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p2; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -20,13 +18,9 @@ import java.util.List; import java.util.UUID; -/** - * Sword aura emitter producing main arc particles and sub trail particles - * that follow the sword swing direction, matching the Fabric original. - */ @ReiAutoRegister public final class SwordAuraEmitters extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "sword_aura"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "sword_aura"); private final RandomSource random = RandomSource.create(); private final List particles = new ArrayList<>(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/SwordExplosionEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/SwordExplosionEmitters.java index 894054e..7ba781f 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/SwordExplosionEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/SwordExplosionEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p2; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -20,14 +18,9 @@ import java.util.List; import java.util.UUID; -/** - * Sword explosion emitter producing three layers of particles: - * flash (sign=0), spark (sign=1), and ring (sign=2). - * Matches the visual intent of the Fabric original. - */ @ReiAutoRegister public final class SwordExplosionEmitters extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "sword_explosion"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "sword_explosion"); private final RandomSource random = RandomSource.create(); private final List particles = new ArrayList<>(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationEmitters.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationEmitters.java index 12eaa53..362c4b3 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationEmitters.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationEmitters.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p2.formation; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -20,13 +18,9 @@ import java.util.List; import java.util.UUID; -/** - * Sword formation emitter producing vortex and outer spread particles - * around a formation center, matching the Fabric original. - */ @ReiAutoRegister public final class SwordFormationEmitters extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "sword_formation"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "sword_formation"); private final RandomSource random = RandomSource.create(); private final List particles = new ArrayList<>(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationExplosionEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationExplosionEmitter.java index d7f98ca..0a80344 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationExplosionEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationExplosionEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p2.formation; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -20,13 +18,9 @@ import java.util.List; import java.util.UUID; -/** - * Sword formation explosion emitter producing sphere-wave and disc-wave particles - * at a formation collapse point, matching the Fabric original. - */ @ReiAutoRegister public final class SwordFormationExplosionEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "sword_formation_explosion"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "sword_formation_explosion"); private final RandomSource random = RandomSource.create(); private final List particles = new ArrayList<>(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationWaveEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationWaveEmitter.java index c0740c1..478beb9 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationWaveEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/core/emitters/p2/formation/SwordFormationWaveEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.core.emitters.p2.formation; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -20,13 +18,9 @@ import java.util.List; import java.util.UUID; -/** - * Sword formation wave emitter producing spiral radian-based particles - * that expand outward from the formation center, matching the Fabric original. - */ @ReiAutoRegister public final class SwordFormationWaveEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "sword_formation_wave"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "sword_formation_wave"); private final RandomSource random = RandomSource.create(); private final List particles = new ArrayList<>(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/ParticleGroupEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/ParticleGroupEmitter.java index f74847f..8c1272e 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/ParticleGroupEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/ParticleGroupEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.display.emitter; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -18,7 +16,7 @@ @ReiAutoRegister public final class ParticleGroupEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "particle_group"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "particle_group"); private static final DustParticleOptions CORE_COLOR = new DustParticleOptions(new Vector3f(0.95f, 0.82f, 0.35f), 1.0f); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/RailgunBeamEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/RailgunBeamEmitter.java index 99d2f8d..aa7733f 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/RailgunBeamEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/RailgunBeamEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.display.emitter; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -22,13 +20,9 @@ import java.util.List; import java.util.UUID; -/** - * Railgun beam emitter that spawns a long vertical beam of particles - * with scattered disc particles at the base, matching the Fabric original. - */ @ReiAutoRegister public final class RailgunBeamEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "railgun_beam"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "railgun_beam"); private static final DustParticleOptions BEAM_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.7f); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/RailgunExplosionEmitter.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/RailgunExplosionEmitter.java index bed6580..b312181 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/RailgunExplosionEmitter.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/display/emitter/RailgunExplosionEmitter.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.display.emitter; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -20,13 +18,9 @@ import java.util.List; import java.util.UUID; -/** - * Railgun explosion emitter producing a disc wave and sphere ball of particles, - * matching the Fabric original's visual intent. - */ @ReiAutoRegister public final class RailgunExplosionEmitter extends AutoParticleEmitters { - public static final ResourceLocation CODEC_ID = new ResourceLocation("reiparticleskill", "railgun_explosion"); + public static final ResourceLocation CODEC_ID = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "railgun_explosion"); private static final DustParticleOptions WAVE_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.65f); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/ChangingComposition.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/ChangingComposition.java index 48a46f3..fecce7f 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/ChangingComposition.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/ChangingComposition.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.display; import com.reiasu.reiparticlesapi.network.particle.composition.AutoParticleComposition; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/Formation.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/Formation.java index aeead67..4d8aa53 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/Formation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/Formation.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.display; import com.reiasu.reiparticlesapi.network.particle.composition.AutoParticleComposition; @@ -17,10 +15,6 @@ import java.util.List; import java.util.Map; -/** - * Static sword-shaped formation composition. - * Renders the sword outline as defined in the Fabric original's Formation class. - */ public final class Formation extends AutoParticleComposition { private static final DustParticleOptions COLOR = new DustParticleOptions(new Vector3f(0.95f, 0.82f, 0.35f), 0.7f); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/LargeMagicCircleStyle.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/LargeMagicCircleStyle.java index 4128651..30fb35e 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/LargeMagicCircleStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/LargeMagicCircleStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.display; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -32,7 +30,7 @@ @ReiAutoRegister public final class LargeMagicCircleStyle extends ParticleGroupStyle { - public static final ResourceLocation REGISTRY_KEY = new ResourceLocation("reiparticleskill", "large_magic_circle_style"); + public static final ResourceLocation REGISTRY_KEY = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "large_magic_circle_style"); private static final DustParticleOptions PRIMARY_COLOR = new DustParticleOptions(new Vector3f(0.95f, 0.82f, 0.35f), 1.0f); private static final DustParticleOptions SECONDARY_COLOR = diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/RailgunBeamStyle.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/RailgunBeamStyle.java index ca63a01..1cf7090 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/RailgunBeamStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/RailgunBeamStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.display; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -27,14 +25,9 @@ import java.util.Map; import java.util.UUID; -/** - * Railgun beam style that renders a long beam of particles along a direction, - * with hexagonal vertex anchors and a rotating central column. - * Server-side port of the Fabric original. - */ @ReiAutoRegister public final class RailgunBeamStyle extends ParticleGroupStyle { - public static final ResourceLocation REGISTRY_KEY = new ResourceLocation("reiparticleskill", "railgun_beam_style"); + public static final ResourceLocation REGISTRY_KEY = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "railgun_beam_style"); private static final DustParticleOptions BEAM_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.75f); private static final DustParticleOptions GLOW_COLOR = diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/RailgunChargingRingStyle.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/RailgunChargingRingStyle.java index 68765aa..025aa5b 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/RailgunChargingRingStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/display/RailgunChargingRingStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.display; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -27,13 +25,9 @@ import java.util.Map; import java.util.UUID; -/** - * Railgun charging ring style that renders concentric rotating rings - * with a polygon glyph overlay, matching the Fabric original. - */ @ReiAutoRegister public final class RailgunChargingRingStyle extends ParticleGroupStyle { - public static final ResourceLocation REGISTRY_KEY = new ResourceLocation("reiparticleskill", "railgun_charging_ring_style"); + public static final ResourceLocation REGISTRY_KEY = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "railgun_charging_ring_style"); private static final DustParticleOptions RING_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.6f); private static final DustParticleOptions GLYPH_COLOR = diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EndCrystalStyle.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EndCrystalStyle.java index bea4b1b..54ecb40 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EndCrystalStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EndCrystalStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.styles; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -27,14 +25,9 @@ import java.util.Map; import java.util.UUID; -/** - * End crystal particle style rendering a rotating circle with Fourier-series glyph overlay. - * Color: purple (210, 80, 255). Supports scale-in/out and status-driven removal. - * Server-side port of the Fabric original. - */ @ReiAutoRegister public final class EndCrystalStyle extends ParticleGroupStyle { - public static final ResourceLocation REGISTRY_KEY = new ResourceLocation("reiparticleskill", "end_crystal_style"); + public static final ResourceLocation REGISTRY_KEY = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "end_crystal_style"); private static final DustParticleOptions CRYSTAL_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.55f); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EndDustStyle.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EndDustStyle.java index 4b3bb94..d677c6e 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EndDustStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EndDustStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.styles; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -21,19 +19,16 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; +import net.minecraft.util.Mth; import java.util.HashMap; import java.util.Map; import java.util.UUID; +import net.minecraft.util.Mth; -/** - * End dust style that renders randomly positioned dust particles within a radius, - * with rotation, status-driven alpha fade, and scale animation. - * Color: purple (210, 80, 255). Server-side port of the Fabric original. - */ @ReiAutoRegister public final class EndDustStyle extends ParticleGroupStyle { - public static final ResourceLocation REGISTRY_KEY = new ResourceLocation("reiparticleskill", "end_dust_style"); + public static final ResourceLocation REGISTRY_KEY = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "end_dust_style"); private static final DustParticleOptions DUST_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.55f); @@ -114,7 +109,7 @@ public void tick() { // Status handling if (status == 2) { statusTick++; - float fadeAlpha = GraphMathHelper.lerp( + float fadeAlpha = Mth.lerp( 1.0f - (float) statusTick / 10.0f, 0.0f, 1.0f); if (fadeAlpha <= 0.02f || statusTick > 10) { super.remove(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnCenterStyle.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnCenterStyle.java index 92d1768..6445c36 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnCenterStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnCenterStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.styles; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -27,15 +25,9 @@ import java.util.Map; import java.util.UUID; -/** - * Ender respawn center style that renders concentric Fourier-series glyphs - * and a large outer circle with enchantment particles. - * Features multiple rotating layers with different speeds and scale-in animation. - * Color: purple (210, 80, 255). Server-side port of the Fabric original. - */ @ReiAutoRegister public final class EnderRespawnCenterStyle extends ParticleGroupStyle { - public static final ResourceLocation REGISTRY_KEY = new ResourceLocation("reiparticleskill", "ender_respawn_center_style"); + public static final ResourceLocation REGISTRY_KEY = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "ender_respawn_center_style"); private static final DustParticleOptions CENTER_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.6f); private static final DustParticleOptions GLYPH_COLOR = diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnWaveCloudStyle.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnWaveCloudStyle.java index 5f7c6c5..87c1ad3 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnWaveCloudStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnWaveCloudStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.styles; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -23,20 +21,17 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; +import net.minecraft.util.Mth; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import net.minecraft.util.Mth; -/** - * Ender respawn wave cloud style that renders cloud-like particle rings - * with Y offset, random angles, rotation, and status-driven alpha fade. - * Color: purple (210, 80, 255). Server-side port of the Fabric original. - */ @ReiAutoRegister public final class EnderRespawnWaveCloudStyle extends ParticleGroupStyle { - public static final ResourceLocation REGISTRY_KEY = new ResourceLocation("reiparticleskill", "ender_respawn_wave_cloud_style"); + public static final ResourceLocation REGISTRY_KEY = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "ender_respawn_wave_cloud_style"); private static final DustParticleOptions CLOUD_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.5f); @@ -129,7 +124,7 @@ public void tick() { float alpha = 1.0f; if (status == 2) { statusTick++; - alpha = GraphMathHelper.lerp((float) statusTick / 20.0f, 1.0f, 0.0f); + alpha = Mth.lerp((float) statusTick / 20.0f, 1.0f, 0.0f); if (alpha <= 0.02f || statusTick > 20) { super.remove(); return; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnWaveEnchantStyle.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnWaveEnchantStyle.java index 7a6ce97..aa0a4ea 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnWaveEnchantStyle.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/particles/preview/styles/EnderRespawnWaveEnchantStyle.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.particles.preview.styles; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -23,20 +21,17 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import org.joml.Vector3f; +import net.minecraft.util.Mth; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import net.minecraft.util.Mth; -/** - * Ender respawn wave enchantment style that renders enchantment-like particle rings - * with Y offset, random angles, rotation, and status-driven alpha fade. - * Color: purple (210, 80, 255). Server-side port of the Fabric original. - */ @ReiAutoRegister public final class EnderRespawnWaveEnchantStyle extends ParticleGroupStyle { - public static final ResourceLocation REGISTRY_KEY = new ResourceLocation("reiparticleskill", "ender_respawn_wave_enchant_style"); + public static final ResourceLocation REGISTRY_KEY = ResourceLocation.fromNamespaceAndPath("reiparticleskill", "ender_respawn_wave_enchant_style"); private static final DustParticleOptions ENCHANT_COLOR = new DustParticleOptions(new Vector3f(210f / 255f, 80f / 255f, 1.0f), 0.5f); @@ -129,7 +124,7 @@ public void tick() { float alpha = 1.0f; if (status == 2) { statusTick++; - alpha = GraphMathHelper.lerp((float) statusTick / 20.0f, 1.0f, 0.0f); + alpha = Mth.lerp((float) statusTick / 20.0f, 1.0f, 0.0f); if (alpha <= 0.02f || statusTick > 20) { super.remove(); return; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/register/RuntimePortAutoRegistrar.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/register/RuntimePortAutoRegistrar.java index d1c3b9f..0a2f982 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/register/RuntimePortAutoRegistrar.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/register/RuntimePortAutoRegistrar.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.register; import com.reiasu.reiparticlesapi.annotations.ReiAutoRegister; @@ -20,20 +18,6 @@ import java.util.Collection; import java.util.function.Function; -/** - * Scans for classes annotated with {@link ReiAutoRegister} and automatically - * registers emitter codecs and style providers, removing the need for manual - * registration in {@code ReiParticleSkillForge.registerRuntimePorts()}. - *

- * Conventions: - *

    - *
  • Emitters: must have {@code public static final ResourceLocation CODEC_ID} - * and {@code public static T decode(FriendlyByteBuf)}
  • - *
  • Styles: must have {@code public static final ResourceLocation REGISTRY_KEY} - * and an inner class named {@code Provider} that - * implements {@link ParticleStyleProvider}
  • - *
- */ public final class RuntimePortAutoRegistrar { private RuntimePortAutoRegistrar() { diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/sounds/SkillSoundEvents.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/sounds/SkillSoundEvents.java index 798ca7e..a7efd51 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/sounds/SkillSoundEvents.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/sounds/SkillSoundEvents.java @@ -1,22 +1,20 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.sounds; import com.reiasu.reiparticleskill.ReiParticleSkillForge; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.bus.api.IEventBus; +import net.minecraft.core.registries.Registries; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; public final class SkillSoundEvents { public static final DeferredRegister SOUND_EVENTS = - DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, ReiParticleSkillForge.MOD_ID); + DeferredRegister.create(Registries.SOUND_EVENT, ReiParticleSkillForge.MOD_ID); - public static final RegistryObject SWORD_FORMATION = + public static final DeferredHolder SWORD_FORMATION = SOUND_EVENTS.register("sword_formation", - () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(ReiParticleSkillForge.MOD_ID, "sword_formation"))); + () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(ReiParticleSkillForge.MOD_ID, "sword_formation"))); private SkillSoundEvents() { } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/test/SkillTestBuilder.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/test/SkillTestBuilder.java index a9c1b36..72f2a0b 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/test/SkillTestBuilder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/test/SkillTestBuilder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.test; import com.reiasu.reiparticlesapi.test.SimpleTestGroup; @@ -11,10 +9,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.Vec3; -/** - * Skill test builder that creates a test group with sword formation emitter tests. - * Server-side port of the Fabric original, adapted to Forge test API. - */ public final class SkillTestBuilder implements TestGroupBuilder { public static final String ID = "skill-test-builder"; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/ClientParticleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/ClientParticleHelper.java index 15dd5dd..a1e2e3a 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/ClientParticleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/ClientParticleHelper.java @@ -1,22 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.util.RandomSource; import net.minecraft.world.level.Level; -/** - * Client-side equivalent of {@link ParticleHelper}. - * Spawns particles locally via {@link Level#addAlwaysVisibleParticle} — - * zero network packets, zero server cost. - *

- * Replicates the vanilla {@code ClientboundLevelParticlesPacket} behavior: - *

    - *
  • {@code count > 0}: spawn {@code count} particles with Gaussian offsets
  • - *
  • {@code count == 0}: spawn 1 particle with exact velocity from dist params
  • - *
- */ public final class ClientParticleHelper { private static final RandomSource RANDOM = RandomSource.create(); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/DragonRespawnStateUtil.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/DragonRespawnStateUtil.java index bbfe3f1..d9e0a97 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/DragonRespawnStateUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/DragonRespawnStateUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util; import com.reiasu.reiparticlesapi.ReiParticlesAPI; @@ -30,12 +28,6 @@ import java.util.List; import java.util.Set; -/** - * Utility singleton that orchestrates dragon respawn animation sequences. - * Manages state transitions (setup → pillars → crystal converge → end explosion) - * using the Animate system and particle emitters/styles. - * Server-side port of the Fabric original. - */ public final class DragonRespawnStateUtil { public static final DragonRespawnStateUtil INSTANCE = new DragonRespawnStateUtil(); @@ -51,9 +43,6 @@ public final class DragonRespawnStateUtil { private DragonRespawnStateUtil() { } - - // ---- Accessors ---- - public String getCurrent() { return current; } @@ -101,13 +90,7 @@ public List getCrystals() { public void setCrystals(List crystals) { this.crystals = crystals == null ? new ArrayList<>() : crystals; } - - // ---- Public API ---- - - /** - * Initialize the respawn state with world context, position, fight instance, and crystals. - */ - public void setup(ServerLevel world, BlockPos pos, EndDragonFight fight, + public void setup(ServerLevel world, BlockPos pos, EndDragonFight fight, List crystals) { this.world = world; this.pos = pos; @@ -119,11 +102,7 @@ public void setup(ServerLevel world, BlockPos pos, EndDragonFight fight, this.tickingAnimates.clear(); } - /** - * Advance to the next respawn phase by id. - * Returns true if the phase transition was recognized and handled. - */ - public boolean next(String id) { + public boolean next(String id) { if (id == null || id.isEmpty()) { return false; } @@ -146,10 +125,7 @@ public boolean next(String id) { return true; } - /** - * Handle the once-pillars event (camera shake + pillar emitters). - */ - public void handleOncePillars(BlockPos pillarPos) { + public void handleOncePillars(BlockPos pillarPos) { if (world == null || pillarPos == null) return; Vec3 center = Vec3.atCenterOf(pillarPos); @@ -169,10 +145,7 @@ public void handleOncePillars(BlockPos pillarPos) { pillarsAnimates.add(pillarAnimate); } - /** - * Handle the end phase — summon explosion and dragon invulnerability toggle. - */ - public void handleEnd() { + public void handleEnd() { if (world == null || pos == null) return; Vec3 center = Vec3.atCenterOf(pos); @@ -198,14 +171,11 @@ public void handleEnd() { .min(Comparator.comparingDouble(d -> d.position().distanceTo(summonPos))) .ifPresent(dragon -> { dragon.setInvulnerable(true); - ReiParticlesAPI.scheduler.runTask(20, () -> dragon.setInvulnerable(false)); + ReiParticlesAPI.reiScheduler().runTask(20, () -> dragon.setInvulnerable(false)); }); } - /** - * Get or create the current animate sequence for the active respawn phase. - */ - public Animate getAnimateFrom() { + public Animate getAnimateFrom() { if (currentAnimate != null && !currentAnimate.getDone()) { return currentAnimate; } @@ -241,10 +211,7 @@ public void onDone() { return animate; } - /** - * Tick all active animates. - */ - public void tick() { + public void tick() { // Tick pillar animates pillarsAnimates.removeIf(a -> { a.tick(); @@ -266,10 +233,7 @@ public void tick() { } } - /** - * Cancel all active animates and reset state. - */ - public void cancel() { + public void cancel() { for (Animate a : pillarsAnimates) { if (!a.getDone()) a.cancel(); } @@ -286,9 +250,6 @@ public void cancel() { currentAnimate = null; current = ""; } - - // ---- Internal phases ---- - private void handlePillarsPhase() { if (world == null || pos == null) return; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/ParticleHelper.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/ParticleHelper.java index a6dd7e2..343fd6e 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/ParticleHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/ParticleHelper.java @@ -1,17 +1,8 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util; import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.phys.Vec3; -/** - * Utility for sending particles with force=true so they are visible - * at long range (up to 512 blocks) instead of the default 32 blocks. - */ public final class ParticleHelper { private ParticleHelper() { @@ -24,16 +15,9 @@ public static void sendForce( double xDist, double yDist, double zDist, double speed ) { - ClientboundLevelParticlesPacket packet = new ClientboundLevelParticlesPacket( - type, true, x, y, z, - (float) xDist, (float) yDist, (float) zDist, - (float) speed, count + level.sendParticles( + type, x, y, z, count, + xDist, yDist, zDist, speed ); - Vec3 pos = new Vec3(x, y, z); - for (ServerPlayer player : level.players()) { - if (player.blockPosition().closerToCenterThan(pos, 512.0)) { - player.connection.send(packet); - } - } } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/SwordFormationHelper.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/SwordFormationHelper.java index e9a7be8..a97a5c8 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/SwordFormationHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/SwordFormationHelper.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util; import com.reiasu.reiparticlesapi.display.DisplayEntityManager; diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/SwordLightEnchantUtil.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/SwordLightEnchantUtil.java index d957e28..625cc62 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/SwordLightEnchantUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/SwordLightEnchantUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util; import com.reiasu.reiparticlesapi.barrages.BarrageOption; @@ -113,7 +111,7 @@ private static double distanceToSegment(Vec3 point, Vec3 start, Vec3 end) { } private static void playFormationSound(ServerLevel level, Vec3 pos) { - if (level == null || pos == null || !SkillSoundEvents.SWORD_FORMATION.isPresent()) { + if (level == null || pos == null || !SkillSoundEvents.SWORD_FORMATION.isBound()) { return; } level.playSound( diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/GraphMathHelper.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/GraphMathHelper.java index 924e87b..7b82c9f 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/GraphMathHelper.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/GraphMathHelper.java @@ -1,19 +1,9 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util.geom; public final class GraphMathHelper { private GraphMathHelper() { } - public static float lerp(float alpha, float from, float to) { - return from + (to - from) * alpha; - } - - public static double lerp(double alpha, double from, double to) { - return from + (to - from) * alpha; - } - public static double inverseLerp(double value, double min, double max) { if (max == min) { return 0.0; @@ -22,7 +12,7 @@ public static double inverseLerp(double value, double min, double max) { } public static double smoothstep(double edge0, double edge1, double x) { - double t = Math3DUtil.clamp(inverseLerp(x, edge0, edge1), 0.0, 1.0); + double t = Math.clamp(inverseLerp(x, edge0, edge1), 0.0, 1.0); return t * t * (3.0 - 2.0 * t); } } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/Math3DUtil.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/Math3DUtil.java index 307e81b..5a3fc9f 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/Math3DUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/Math3DUtil.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util.geom; import java.util.ArrayList; @@ -13,18 +11,10 @@ public static double length(double x, double y, double z) { return Math.sqrt(x * x + y * y + z * z); } - public static double clamp(double value, double min, double max) { - return Math.max(min, Math.min(max, value)); - } - - public static double lerp(double from, double to, double alpha) { - return from + (to - from) * alpha; - } - public static int colorOf(int r, int g, int b) { - int rr = (int) clamp(r, 0, 255); - int gg = (int) clamp(g, 0, 255); - int bb = (int) clamp(b, 0, 255); + int rr = (int) Math.clamp(r, 0, 255); + int gg = (int) Math.clamp(g, 0, 255); + int bb = (int) Math.clamp(b, 0, 255); return (rr << 16) | (gg << 8) | bb; } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/PhysicsUtil.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/PhysicsUtil.java index 6dcd838..fea1bdb 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/PhysicsUtil.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/PhysicsUtil.java @@ -1,7 +1,7 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util.geom; +import net.minecraft.util.Mth; + public final class PhysicsUtil { private PhysicsUtil() { } @@ -11,10 +11,10 @@ public static RelativeLocation applyDrag(RelativeLocation velocity, double dragF } public static RelativeLocation steer(RelativeLocation velocity, RelativeLocation desired, double blend) { - double clampedBlend = Math3DUtil.clamp(blend, 0.0, 1.0); - velocity.setX(Math3DUtil.lerp(velocity.getX(), desired.getX(), clampedBlend)); - velocity.setY(Math3DUtil.lerp(velocity.getY(), desired.getY(), clampedBlend)); - velocity.setZ(Math3DUtil.lerp(velocity.getZ(), desired.getZ(), clampedBlend)); + double clampedBlend = Math.clamp(blend, 0.0, 1.0); + velocity.setX(Mth.lerp(clampedBlend, velocity.getX(), desired.getX())); + velocity.setY(Mth.lerp(clampedBlend, velocity.getY(), desired.getY())); + velocity.setZ(Mth.lerp(clampedBlend, velocity.getZ(), desired.getZ())); return velocity; } diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/PointsBuilder.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/PointsBuilder.java index 744f144..6b5ae42 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/PointsBuilder.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/PointsBuilder.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util.geom; import java.util.ArrayList; @@ -72,15 +70,6 @@ public PointsBuilder pointsOnEach(Consumer action) { return this; } - @Deprecated - public PointsBuilder addWith(Function> generator) { - Collection generated = generator.apply(null); - if (generated != null) { - points.addAll(generated); - } - return this; - } - public PointsBuilder rotateAsAxis(double radians) { double cos = Math.cos(radians); double sin = Math.sin(radians); diff --git a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/RelativeLocation.java b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/RelativeLocation.java index dc110bb..86663d0 100644 --- a/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/RelativeLocation.java +++ b/forge-port/src/main/java/com/reiasu/reiparticleskill/util/geom/RelativeLocation.java @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// Copyright (C) 2025 Reiasu package com.reiasu.reiparticleskill.util.geom; public final class RelativeLocation { diff --git a/forge-port/src/main/resources/META-INF/mods.toml b/forge-port/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 0128c16..0000000 --- a/forge-port/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,39 +0,0 @@ -modLoader="javafml" -loaderVersion="${loader_version_range}" -license="${mod_license}" - -[[mods]] -modId="${mod_id}" -version="${mod_version}" -displayName="${mod_name}" -displayTest="IGNORE_ALL_VERSION" -authors="Reiasu" -description=''' -ReiParticleSkill gameplay module for Forge 1.20.x. -End dragon respawn effects, display and railgun commands run through ReiParticlesAPI runtime. -''' - -[[dependencies.${mod_id}]] -modId="forge" -mandatory=true -versionRange="${loader_version_range}" -ordering="NONE" -side="BOTH" - -[[dependencies.${mod_id}]] -modId="minecraft" -mandatory=true -versionRange="${minecraft_version_range}" -ordering="NONE" -side="BOTH" - -[[dependencies.${mod_id}]] -modId="reiparticlesapi" -mandatory=true -versionRange="[0,)" -ordering="AFTER" -side="BOTH" - - -[[mixins]] -config="reiparticleskill.mixins.json" diff --git a/forge-port/src/main/resources/META-INF/neoforge.mods.toml b/forge-port/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..9d9eebb --- /dev/null +++ b/forge-port/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,54 @@ +modLoader="javafml" +loaderVersion="${loader_version_range}" +license="${mod_license}" + +[[mods]] +modId="reiparticlesapi" +version="${mod_version}" +displayName="ReiParticlesAPI" +displayTest="IGNORE_ALL_VERSION" +authors="Reiasu" +description=''' +ReiParticlesAPI — particle system runtime library. +''' + +[[mods]] +modId="${mod_id}" +version="${mod_version}" +displayName="${mod_name}" +displayTest="IGNORE_ALL_VERSION" +authors="Reiasu" +description=''' +ReiParticleSkill — particle effects mod for NeoForge 1.21.1. +''' + +[[dependencies.reiparticlesapi]] +modId="neoforge" +type="required" +versionRange="${neo_version_range}" +ordering="NONE" +side="BOTH" + +[[dependencies.reiparticlesapi]] +modId="minecraft" +type="required" +versionRange="${minecraft_version_range}" +ordering="NONE" +side="BOTH" + +[[dependencies.${mod_id}]] +modId="neoforge" +type="required" +versionRange="${neo_version_range}" +ordering="NONE" +side="BOTH" + +[[dependencies.${mod_id}]] +modId="minecraft" +type="required" +versionRange="${minecraft_version_range}" +ordering="NONE" +side="BOTH" + +[[mixins]] +config="reiparticleskill.mixins.json" diff --git a/forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_cloud.json b/forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_cloud.json similarity index 100% rename from forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_cloud.json rename to forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_cloud.json diff --git a/forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_enchantment.json b/forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_enchantment.json similarity index 100% rename from forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_enchantment.json rename to forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_enchantment.json diff --git a/forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_end_rod.json b/forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_end_rod.json similarity index 100% rename from forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_end_rod.json rename to forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_end_rod.json diff --git a/forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_falling_dust.json b/forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_falling_dust.json similarity index 100% rename from forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_falling_dust.json rename to forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_falling_dust.json diff --git a/forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_firework.json b/forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_firework.json similarity index 100% rename from forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_firework.json rename to forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_firework.json diff --git a/forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_flash.json b/forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_flash.json similarity index 100% rename from forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_flash.json rename to forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_flash.json diff --git a/forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_splash.json b/forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_splash.json similarity index 100% rename from forge-port-api/src/main/resources/assets/reiparticlesapi/particles/controllable_splash.json rename to forge-port/src/main/resources/assets/reiparticlesapi/particles/controllable_splash.json diff --git a/forge-port/src/main/resources/data/reiparticleskill/enchantment/sword_light.json b/forge-port/src/main/resources/data/reiparticleskill/enchantment/sword_light.json new file mode 100644 index 0000000..34240b2 --- /dev/null +++ b/forge-port/src/main/resources/data/reiparticleskill/enchantment/sword_light.json @@ -0,0 +1,21 @@ +{ + "description": { + "translate": "enchantment.reiparticleskill.sword_light" + }, + "exclusive_set": "#minecraft:exclusive_set/damage", + "supported_items": "#minecraft:enchantable/sword", + "weight": 2, + "max_level": 1, + "min_cost": { + "base": 5, + "per_level_above_first": 6 + }, + "max_cost": { + "base": 7, + "per_level_above_first": 6 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ] +} diff --git a/forge-port/src/main/resources/pack.mcmeta b/forge-port/src/main/resources/pack.mcmeta index a602b82..73613b9 100644 --- a/forge-port/src/main/resources/pack.mcmeta +++ b/forge-port/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "pack_format": 15, - "description": "ReiParticleSkill resources" + "description": "ReiParticlesAPI resources" } } \ No newline at end of file diff --git a/forge-port/src/main/resources/reiparticleskill.mixins.json b/forge-port/src/main/resources/reiparticleskill.mixins.json index a374fa5..da2bd4b 100644 --- a/forge-port/src/main/resources/reiparticleskill.mixins.json +++ b/forge-port/src/main/resources/reiparticleskill.mixins.json @@ -1,13 +1,12 @@ { - "required": true, + "required": false, "minVersion": "0.8", "package": "com.reiasu.reiparticleskill.mixin", - "compatibilityLevel": "JAVA_17", - "refmap": "reiparticleskill.refmap.json", + "compatibilityLevel": "JAVA_21", "client": [ "EndCrystalRendererMixin" ], "injectors": { - "defaultRequire": 1 + "defaultRequire": 0 } } diff --git a/net/minecraft/core/particles/ParticleType.java b/net/minecraft/core/particles/ParticleType.java new file mode 100644 index 0000000..a33e95e --- /dev/null +++ b/net/minecraft/core/particles/ParticleType.java @@ -0,0 +1,21 @@ +package net.minecraft.core.particles; + +import com.mojang.serialization.MapCodec; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +public abstract class ParticleType { + private final boolean overrideLimiter; + + protected ParticleType(boolean p_123740_) { + this.overrideLimiter = p_123740_; + } + + public boolean getOverrideLimiter() { + return this.overrideLimiter; + } + + public abstract MapCodec codec(); + + public abstract StreamCodec streamCodec(); +}