34 Commits
1.0.2 ... beta

Author SHA1 Message Date
xSquishyLiam
b6425ffa51 addedd namespace support 2025-09-01 14:56:01 +01:00
zimzaza4
1c47fe83d2 Merge pull request #53 from xSquishyLiam/main
Updated PE to 2.9.5 & added bstats & fixed build.yml
2025-08-31 04:07:22 +08:00
xSquishyLiam
7bbe66928c added an option to disable bStats 2025-08-30 20:56:17 +01:00
xSquishyLiam
a26ea6e148 updated actions/checkout to v4 2025-08-30 12:59:55 +01:00
xSquishyLiam
d1ef89088c learning workflows 2025-08-30 12:55:22 +01:00
xSquishyLiam
c98e807827 bumped shadow 2025-08-30 12:54:08 +01:00
xSquishyLiam
35131c2d58 i wonder 2025-08-30 12:46:37 +01:00
xSquishyLiam
6651ae99f7 addedd a comment for an idea 2025-08-30 00:49:27 +01:00
xSquishyLiam
ca9a54ae71 added `` to true for floodgate 2025-08-30 00:04:19 +01:00
xSquishyLiam
865f5f567c changed readme a bit, removed the old method 2025-08-30 00:03:33 +01:00
xSquishyLiam
b5d9d9b9ca added info about key.pem 2025-08-29 18:03:14 +01:00
xSquishyLiam
31dac482bd made the info more cleaner 2025-08-29 18:01:59 +01:00
xSquishyLiam
b2bfa2977e addedd floodgate send data to set to true info 2025-08-29 17:52:22 +01:00
xSquishyLiam
84012a23b7 bumped PE to 2.9.5 2025-08-26 01:22:14 +01:00
xSquishyLiam
3943381b2c added bstats 2025-08-21 00:12:29 +01:00
TheLividaProject
42d7ea506f Update build.gradle.kts 2025-07-23 21:36:53 +01:00
zimzaza4
e177c8af74 Merge pull request #49 from TheLividaProject/main
Bumped PacketEvents to 2.9.4
2025-07-23 04:33:42 +08:00
TheLividaProject
2c5dba8097 bumped PacketEvents to 2.9.4 2025-07-22 20:45:31 +01:00
TheLividaProject
2a9fdec8b6 Update build.gradle.kts 2025-07-22 20:17:35 +01:00
TheLividaProject
94df76b9a6 Now renames the jar to the project name and it's version 2025-07-22 18:07:31 +01:00
TheLividaProject
03f27514ef added a comment ModelListener issue in regards of pig spawning (such a thing issue) - mainly for those who want to know why it has a delay on the player join, i didn't know this when forked it and took it off but added it back now and should hopefully fix the issue 2025-07-22 17:23:06 +01:00
TheLividaProject
4679fa6f2b changed a comment about the pig issue 2025-07-22 12:23:07 +01:00
TheLividaProject
db99b2fe00 we love big spawning issue, should be fixed till better solution 2025-07-22 11:03:23 +01:00
TheLividaProject
ffd72b0a56 Merge branch 'GeyserExtensionists:main' into main 2025-07-21 22:40:21 +01:00
TheLividaProject
e83caacd2f nvm 90% sure it works i'm just dumb 2025-07-21 22:39:58 +01:00
TheLividaProject
170e67e059 just testing something 2025-07-21 22:32:45 +01:00
zimzaza4
d150d7e324 Merge pull request #48 from TheLividaProject/main
Updates to 1.21.8
2025-07-22 05:11:03 +08:00
TheLividaProject
db0367537e disables default jar hopefully 2025-07-21 22:05:39 +01:00
TheLividaProject
36ea0e5fa0 Merge branch 'GeyserExtensionists:main' into main 2025-07-21 21:59:54 +01:00
zimzaza4
f4c5167ef5 Rename .github/workflows/maven.yml to build.yml 2025-07-10 22:04:08 +08:00
zimzaza4
dc4e39506d gradle build 2025-07-10 20:35:06 +08:00
zimzaza4
5fdf93db1e Merge branch 'main' of https://github.com/TheLividaProject/mc-GeyserModelEngine-plugin
# Conflicts:
#	pom.xml
2025-07-10 20:29:36 +08:00
zimzaza4
4d75f0615c Fix maven.yml 2025-06-21 15:50:56 +08:00
zimzaza4
97e5bdefcd Update PacketEvents 2025-06-21 15:47:42 +08:00
14 changed files with 245 additions and 63 deletions

View File

@@ -8,10 +8,10 @@ on:
jobs: jobs:
build: build:
name: Build name: Build
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v4
# Setup JDK # Setup JDK
- name: Setup Java JDK - name: Setup Java JDK
@@ -20,19 +20,13 @@ jobs:
java-version: 17 java-version: 17
distribution: 'zulu' distribution: 'zulu'
- name: Restore Maven cache
uses: skjolber/maven-cache-github-action@v1
with:
step: restore
# Build # Build
- name: Build with Maven - name: Make gradlew executable
run: mvn package run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
- name: Save Maven cache
uses: skjolber/maven-cache-github-action@v1
with:
step: save
- name: Auto release - name: Auto release
uses: "marvinpinto/action-automatic-releases@latest" uses: "marvinpinto/action-automatic-releases@latest"
with: with:
@@ -40,4 +34,4 @@ jobs:
automatic_release_tag: latest automatic_release_tag: latest
prerelease: false prerelease: false
files: | files: |
target/GeyserModelEngine*.jar build/libs/GeyserModelEngine*.jar

33
.idea/workspace.xml generated
View File

@@ -5,8 +5,7 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="ff2e9770-ec88-4715-adeb-b9dbda130e1a" name="Changes" comment=""> <list default="true" id="ff2e9770-ec88-4715-adeb-b9dbda130e1a" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/src/main/java/re/imc/geysermodelengine/managers/model/data/ModelEntityData.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/re/imc/geysermodelengine/managers/model/data/ModelEntityData.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/re/imc/geysermodelengine/runnables/EntityTaskRunnable.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/re/imc/geysermodelengine/runnables/EntityTaskRunnable.java" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -60,6 +59,7 @@
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component> </component>
<component name="GradleScriptDefinitionsStorage" workingDir="$PROJECT_DIR$" gradleHome="$USER_HOME$/.gradle/wrapper/dists/gradle-8.12-bin/cetblhg4pflnnks72fxwobvgv/gradle-8.12" javaHome="$USER_HOME$/.jdks/openjdk-21.0.1" gradleVersion="8.12" />
<component name="MavenRunner"> <component name="MavenRunner">
<option name="delegateBuildToMaven" value="true" /> <option name="delegateBuildToMaven" value="true" />
</component> </component>
@@ -79,6 +79,8 @@
</component> </component>
<component name="PropertiesComponent">{ <component name="PropertiesComponent">{
&quot;keyToString&quot;: { &quot;keyToString&quot;: {
&quot;Gradle.Download Sources.executor&quot;: &quot;Run&quot;,
&quot;Gradle.GeyserModelEngine [build].executor&quot;: &quot;Run&quot;,
&quot;Gradle.GeyserModelEngine [jar].executor&quot;: &quot;Run&quot;, &quot;Gradle.GeyserModelEngine [jar].executor&quot;: &quot;Run&quot;,
&quot;Maven.GeyserModelEngine [install...].executor&quot;: &quot;Run&quot;, &quot;Maven.GeyserModelEngine [install...].executor&quot;: &quot;Run&quot;,
&quot;Maven.GeyserModelEngine [install].executor&quot;: &quot;Run&quot;, &quot;Maven.GeyserModelEngine [install].executor&quot;: &quot;Run&quot;,
@@ -86,6 +88,7 @@
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;, &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;, &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;, &quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;D:/Coding/Forks/Minecraft/GeyserModelEngine&quot;, &quot;last_opened_file_path&quot;: &quot;D:/Coding/Forks/Minecraft/GeyserModelEngine&quot;,
&quot;project.structure.last.edited&quot;: &quot;Project&quot;, &quot;project.structure.last.edited&quot;: &quot;Project&quot;,
&quot;project.structure.proportion&quot;: &quot;0.0&quot;, &quot;project.structure.proportion&quot;: &quot;0.0&quot;,
@@ -98,10 +101,33 @@
<recent name="D:\Coding\Forks\Minecraft\GeyserModelEngine" /> <recent name="D:\Coding\Forks\Minecraft\GeyserModelEngine" />
</key> </key>
<key name="MoveFile.RECENT_KEYS"> <key name="MoveFile.RECENT_KEYS">
<recent name="D:\Coding\Forks\Minecraft\GeyserModelEngine\.github\workflows" />
<recent name="D:\Coding\Forks\Minecraft\GeyserModelEngine\libs" /> <recent name="D:\Coding\Forks\Minecraft\GeyserModelEngine\libs" />
</key> </key>
</component> </component>
<component name="RunManager"> <component name="RunManager" selected="Gradle.GeyserModelEngine [build]">
<configuration name="GeyserModelEngine [build]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="build" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
<configuration name="GeyserModelEngine [jar]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true"> <configuration name="GeyserModelEngine [jar]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<ExternalSystemSettings> <ExternalSystemSettings>
<option name="executionName" /> <option name="executionName" />
@@ -126,6 +152,7 @@
</configuration> </configuration>
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="Gradle.GeyserModelEngine [build]" />
<item itemvalue="Gradle.GeyserModelEngine [jar]" /> <item itemvalue="Gradle.GeyserModelEngine [jar]" />
</list> </list>
</recent_temporary> </recent_temporary>

View File

@@ -20,27 +20,22 @@ Download the following plugins according to what server software you use.
- Put `GeyserModelEngine` in the plugins folder (only Spigot or forks of Spigot supported) - Put `GeyserModelEngine` in the plugins folder (only Spigot or forks of Spigot supported)
- Put either `geyserutils-spigot` in your plugins folder aswell (`geyserutils-velocity`/`geyserutils-bungeecord` in your Velocity/Bungeecord plugins folder if you use it) - Put either `geyserutils-spigot` in your plugins folder aswell (`geyserutils-velocity`/`geyserutils-bungeecord` in your Velocity/Bungeecord plugins folder if you use it)
- Put `GeyserModelEnginePackGenerator` and `geyserutils-geyser` into `plugins/[Geyser-Folder]/extensions` - Put `GeyserModelEnginePackGenerator` and `geyserutils-geyser` into `plugins/[Geyser-Folder]/extensions`
- Inside `floodgate` set `send-floodgate-data` to `true` in your Velocity/Bungeecord folder and copy over the key.pem into your backend `floodgate` folders
Start the server to generate the relevant configuration files, and then shut down the server to convert any models. Start the server to generate the relevant configuration files, and then shut down the server to convert any models.
# Convert Models # Convert Models
This is old method to convert model:
`GeyserModelEnginePackGenerator` is capable of generating models all by itself. After generating it will also apply this pack automatically. `GeyserModelEnginePackGenerator` is capable of generating models all by itself. After generating it will also apply this pack automatically.
- First go to `plugins/[Geyser-Folder]/extensions/geysermodelenginepackgenerator/input/` - Firstly, install [packer plugin](https://github.com/GeyserExtensionists/GeyserModelEngineBlockbenchPacker) for your blockbench.
- Create a folder in this directory with the ID of the model. (this is the same name as your model within ModelEngine 4.)
- Then, open your bbmodel, go `File -> Export -> Export GeyserModelEngine Model`, you will get a zip, just unzip it to `input` folder.
<img src="docsimg/example.jpg" width="500"> <img src="docsimg/example.jpg" width="500">
> Each model should have a separate model folder > Each model should have a separate model folder
> Subfolders are supported if you want to categorize them > Subfolders are supported if you want to categorize them
- Now use BlockBench and convert your model to a Bedrock Entity, this will allow you to export the Bedrock Geometry and Animations.
- Put the geometry, animations and texture file in this folder you've made.
<img src="docsimg/example1.jpg" width="500">
- Restart the server or reload geyser to start generating the resource pack. - Restart the server or reload geyser to start generating the resource pack.
- Go to `plugins/[Geyser-Folder]/extensions/geysermodelenginepackgenerator`, and you should see your pack generated! - Go to `plugins/[Geyser-Folder]/extensions/geysermodelenginepackgenerator`, and you should see your pack generated!
@@ -49,12 +44,6 @@ This is old method to convert model:
- Final step, reload Geyser or restart the server to load the resource pack. - Final step, reload Geyser or restart the server to load the resource pack.
- Congratulations, you've completed this tutorial! - Congratulations, you've completed this tutorial!
# Model Packer
This is new way to convert model
- Firstly, install [packer plugin](https://github.com/GeyserExtensionists/GeyserModelEngineBlockbenchPacker) for your blockbench.
- Then, open your bbmodel, go `File -> Export -> Export GeyserModelEngine Model`, you will get a zip, just unzip it to `input` folder.
# Tips # Tips
* Pay attention! The pack only regenerates when the number of models changes, you can technically speaking remove the generated_pack folder to force a reload aswell. * Pay attention! The pack only regenerates when the number of models changes, you can technically speaking remove the generated_pack folder to force a reload aswell.

View File

@@ -1,6 +1,6 @@
plugins { plugins {
id("java") id("java")
id("io.github.goooler.shadow") version "8.1.7" id("io.github.goooler.shadow") version "8.1.8"
} }
group = "re.imc" group = "re.imc"
@@ -28,8 +28,8 @@ dependencies {
compileOnly(files("libs/geyserutils-spigot-1.0-SNAPSHOT.jar")) compileOnly(files("libs/geyserutils-spigot-1.0-SNAPSHOT.jar"))
compileOnly("org.geysermc.floodgate:api:2.2.4-SNAPSHOT") compileOnly("org.geysermc.floodgate:api:2.2.4-SNAPSHOT")
implementation("com.github.retrooper:packetevents-spigot:2.9.5")
implementation("com.github.retrooper:packetevents-spigot:2.9.3") implementation("org.bstats:bstats-bukkit:3.0.2")
implementation("org.reflections:reflections:0.10.2") implementation("org.reflections:reflections:0.10.2")
} }
@@ -43,11 +43,15 @@ tasks.compileJava {
} }
tasks.shadowJar { tasks.shadowJar {
archiveFileName.set("${rootProject.name}-${version}.jar")
relocate("dev.jorel.commandapi", "re.imc.geysermodelengine.libs.commandapi") relocate("dev.jorel.commandapi", "re.imc.geysermodelengine.libs.commandapi")
relocate("com.github.retrooper", "re.imc.geysermodelengine.libs.com.github.retrooper.packetevents") relocate("com.github.retrooper", "re.imc.geysermodelengine.libs.com.github.retrooper.packetevents")
relocate("io.github.retrooper", "re.imc.geysermodelengine.libs.io.github.retrooper.packetevents") relocate("io.github.retrooper", "re.imc.geysermodelengine.libs.io.github.retrooper.packetevents")
relocate("org.bstats", "re.imc.geysermodelengine.libs.bstats")
relocate("org.reflections", "re.imc.geysermodelengine.libs.reflections") relocate("org.reflections", "re.imc.geysermodelengine.libs.reflections")
} }

152
pom.xml Normal file
View File

@@ -0,0 +1,152 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>re.imc</groupId>
<artifactId>GeyserModelEngine</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>GeyserModelEngine</name>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>16</source>
<target>16</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<relocations>
<relocation>
<pattern>com.github.retrooper.packetevents</pattern>
<shadedPattern>re.imc.geysermodelengine.libs.com.github.retrooper.packetevents</shadedPattern>
</relocation>
<relocation>
<pattern>io.github.retrooper.packetevents</pattern>
<shadedPattern>re.imc.geysermodelengine.libs.io.github.retrooper.packetevents</shadedPattern>
</relocation>
</relocations>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>papermc-repo</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>nexus</id>
<name>Lumine Public</name>
<url>https://mvn.lumine.io/repository/maven-public/</url>
</repository>
<repository>
<id>md_5-public</id>
<url>https://repo.md-5.net/content/groups/public/</url>
</repository>
<repository>
<id>opencollab-release-repo</id>
<url>https://repo.opencollab.dev/maven-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>opencollab-snapshot-repo</id>
<url>https://repo.opencollab.dev/maven-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
</repository>
<repository>
<id>codemc-releases</id>
<url>https://repo.codemc.io/repository/maven-releases/</url>
</repository>
<repository>
<id>codemc-snapshots</id>
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.20.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.ticxo.modelengine</groupId>
<artifactId>ModelEngine</artifactId>
<version>R4.0.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.geyserextensionists</groupId>
<artifactId>geyserutils-spigot</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/geyserutils-spigot-1.0-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>org.geysermc.floodgate</groupId>
<artifactId>api</artifactId>
<version>2.2.2-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.retrooper</groupId>
<artifactId>packetevents-spigot</artifactId>
<version>2.8.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,6 @@
package re.imc.geysermodelengine.Events;
public class GeyserModelEngineModelSpawn {
//Spawn Event
}

View File

@@ -2,10 +2,10 @@ package re.imc.geysermodelengine;
import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketListenerPriority; import com.github.retrooper.packetevents.event.PacketListenerPriority;
import com.ticxo.modelengine.api.model.ActiveModel;
import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPI;
import dev.jorel.commandapi.CommandAPIBukkitConfig; import dev.jorel.commandapi.CommandAPIBukkitConfig;
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import re.imc.geysermodelengine.listener.ModelListener; import re.imc.geysermodelengine.listener.ModelListener;
@@ -14,11 +14,9 @@ import re.imc.geysermodelengine.managers.ConfigManager;
import re.imc.geysermodelengine.managers.commands.CommandManager; import re.imc.geysermodelengine.managers.commands.CommandManager;
import re.imc.geysermodelengine.managers.model.EntityTaskManager; import re.imc.geysermodelengine.managers.model.EntityTaskManager;
import re.imc.geysermodelengine.managers.model.ModelManager; import re.imc.geysermodelengine.managers.model.ModelManager;
import re.imc.geysermodelengine.managers.model.data.ModelEntityData;
import re.imc.geysermodelengine.runnables.BedrockMountControlRunnable; import re.imc.geysermodelengine.runnables.BedrockMountControlRunnable;
import re.imc.geysermodelengine.runnables.UpdateTaskRunnable; import re.imc.geysermodelengine.runnables.UpdateTaskRunnable;
import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.*;
public class GeyserModelEngine extends JavaPlugin { public class GeyserModelEngine extends JavaPlugin {
@@ -46,6 +44,8 @@ public class GeyserModelEngine extends JavaPlugin {
loadManagers(); loadManagers();
loadRunnables(); loadRunnables();
loadBStats();
PacketEvents.getAPI().getEventManager().registerListener(new MountPacketListener(this), PacketListenerPriority.NORMAL); PacketEvents.getAPI().getEventManager().registerListener(new MountPacketListener(this), PacketListenerPriority.NORMAL);
Bukkit.getPluginManager().registerEvents(new ModelListener(this), this); Bukkit.getPluginManager().registerEvents(new ModelListener(this), this);
@@ -55,11 +55,7 @@ public class GeyserModelEngine extends JavaPlugin {
public void onDisable() { public void onDisable() {
PacketEvents.getAPI().terminate(); PacketEvents.getAPI().terminate();
for (Map<ActiveModel, ModelEntityData> entities : modelManager.getEntitiesCache().values()) { this.modelManager.removeEntities();
entities.forEach((model, modelEntity) -> {
modelEntity.getEntity().remove();
});
}
CommandAPI.onDisable(); CommandAPI.onDisable();
} }
@@ -69,6 +65,10 @@ public class GeyserModelEngine extends JavaPlugin {
CommandAPI.onEnable(); CommandAPI.onEnable();
} }
private void loadBStats() {
if (configManager.getConfig().getBoolean("bstats", true)) new Metrics(this, 26981);
}
private void loadManagers() { private void loadManagers() {
this.configManager = new ConfigManager(this); this.configManager = new ConfigManager(this);

View File

@@ -1,8 +1,6 @@
package re.imc.geysermodelengine.listener; package re.imc.geysermodelengine.listener;
import com.ticxo.modelengine.api.events.AddModelEvent; import com.ticxo.modelengine.api.events.*;
import com.ticxo.modelengine.api.events.ModelDismountEvent;
import com.ticxo.modelengine.api.events.ModelMountEvent;
import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ActiveModel;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -14,13 +12,11 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.world.WorldInitEvent; import org.bukkit.event.world.WorldInitEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.geysermc.floodgate.api.FloodgateApi; import org.geysermc.floodgate.api.FloodgateApi;
import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.GeyserModelEngine;
import re.imc.geysermodelengine.managers.model.data.ModelEntityData; import re.imc.geysermodelengine.managers.model.data.ModelEntityData;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
public class ModelListener implements Listener { public class ModelListener implements Listener {
@@ -33,7 +29,6 @@ public class ModelListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onAddModel(AddModelEvent event) { public void onAddModel(AddModelEvent event) {
if (event.isCancelled()) return; if (event.isCancelled()) return;
plugin.getModelManager().create(event.getTarget(), event.getModel()); plugin.getModelManager().create(event.getTarget(), event.getModel());
} }
@@ -56,18 +51,26 @@ public class ModelListener implements Listener {
} }
} }
/*
/ xSquishyLiam:
/ I'm wondering if we could move this to more of a player loading chunks instead of checking all worlds via PlayerChunkLoadEvent?
*/
@EventHandler @EventHandler
public void onWorldInit(WorldInitEvent event) { public void onWorldInit(WorldInitEvent event) {
World world = event.getWorld(); World world = event.getWorld();
world.getEntities().forEach(entity -> plugin.getModelManager().processEntities(entity)); world.getEntities().forEach(entity -> plugin.getModelManager().processEntities(entity));
} }
/*
/ xSquishyLiam - conclusion:
/ I'm assuming when a player joins the server the packet for mob spawning is instant so the client resyncs itself
/ hence why the pig is shown instead of going invisible and not displaying the texture of the modeled mob
*/
@EventHandler @EventHandler
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
if (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) return; if (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) return;
//TODO temp fix bc like why? - the issue is when a player logs out and the mob is there, the player logs back in sometimes it can display as a pig only Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> plugin.getModelManager().getPlayerJoinedCache().add(player.getUniqueId()), 10);
Bukkit.getAsyncScheduler().runDelayed(plugin, scheduledTask -> plugin.getModelManager().getPlayerJoinedCache().add(player.getUniqueId()), 10, TimeUnit.MILLISECONDS);
} }
@EventHandler @EventHandler

View File

@@ -33,6 +33,6 @@ public class MountPacketListener implements PacketListener {
if (seat == null) return; if (seat == null) return;
if (action.getAction() != WrapperPlayClientEntityAction.Action.START_SNEAKING) return; if (action.getAction() != WrapperPlayClientEntityAction.Action.START_SNEAKING) return;
ModelEngineAPI.getMountPairManager().tryDismount(event.getPlayer()); ModelEngineAPI.getMountPairManager().tryDismount(player);
} }
} }

View File

@@ -96,7 +96,6 @@ public class EntityTaskManager {
} }
} }
// Issue here - start: See ModelListener.class and look at function onPlayerJoin
private void sendSpawnPacket(ModelEntityData model, Player onlinePlayer) { private void sendSpawnPacket(ModelEntityData model, Player onlinePlayer) {
EntityTaskRunnable task = model.getEntityTask(); EntityTaskRunnable task = model.getEntityTask();
boolean firstJoined = !plugin.getModelManager().getPlayerJoinedCache().contains(onlinePlayer.getUniqueId()); boolean firstJoined = !plugin.getModelManager().getPlayerJoinedCache().contains(onlinePlayer.getUniqueId());
@@ -122,7 +121,6 @@ public class EntityTaskManager {
return true; return true;
} }
// Issue here - end
public void sendHitBoxToAll(ModelEntityData model) { public void sendHitBoxToAll(ModelEntityData model) {
for (Player viewer : model.getViewers()) { for (Player viewer : model.getViewers()) {

View File

@@ -52,6 +52,12 @@ public class ModelManager {
model.ifPresent(m -> create(modeledEntity, m)); model.ifPresent(m -> create(modeledEntity, m));
} }
public void removeEntities() {
for (Map<ActiveModel, ModelEntityData> entities : entitiesCache.values()) {
entities.forEach((model, modelEntity) -> modelEntity.getEntity().remove());
}
}
public HashSet<UUID> getPlayerJoinedCache() { public HashSet<UUID> getPlayerJoinedCache() {
return playerJoinedCache; return playerJoinedCache;
} }

View File

@@ -102,8 +102,7 @@ public class EntityTaskRunnable {
} }
public void sendEntityData(ModelEntityData model, Player player, int delay) { public void sendEntityData(ModelEntityData model, Player player, int delay) {
//TODO with ModelEngine, you can define the namespace inside the config, make an option to change it here as well? if i'm right about this EntityUtils.setCustomEntity(player, model.getEntity().getEntityId(), plugin.getConfigManager().getConfig().getString("namespace") + ":" + model.getActiveModel().getBlueprint().getName().toLowerCase());
EntityUtils.setCustomEntity(player, model.getEntity().getEntityId(), "modelengine:" + model.getActiveModel().getBlueprint().getName().toLowerCase());
plugin.getSchedulerPool().schedule(() -> { plugin.getSchedulerPool().schedule(() -> {
model.getEntity().sendSpawnPacket(Collections.singletonList(player)); model.getEntity().sendSpawnPacket(Collections.singletonList(player));
@@ -114,8 +113,8 @@ public class EntityTaskRunnable {
plugin.getEntityTaskManager().sendColor(model, Collections.singleton(player), lastColor, true); plugin.getEntityTaskManager().sendColor(model, Collections.singleton(player), lastColor, true);
updateEntityProperties(model, Collections.singleton(player), true); updateEntityProperties(model, Collections.singleton(player), true);
}, delay * 50L, TimeUnit.MILLISECONDS); }, 500, TimeUnit.MILLISECONDS);
}, 500, TimeUnit.MILLISECONDS); }, delay * 50L, TimeUnit.MILLISECONDS);
} }
public void updateEntityProperties(ModelEntityData model, Collection<Player> players, boolean firstSend, String... forceAnims) { public void updateEntityProperties(ModelEntityData model, Collection<Player> players, boolean firstSend, String... forceAnims) {
@@ -163,14 +162,15 @@ public class EntityTaskRunnable {
Map<String, Integer> intUpdates = new HashMap<>(); Map<String, Integer> intUpdates = new HashMap<>();
int i = 0; int i = 0;
for (Integer integer : booleanPacker.mapBooleansToInts(boneUpdates)) { for (Integer integer : booleanPacker.mapBooleansToInts(boneUpdates)) {
intUpdates.put("modelengine:bone" + i, integer); intUpdates.put(plugin.getConfigManager().getConfig().getString("namespace") + ":bone" + i, integer);
i++; i++;
} }
i = 0; i = 0;
for (Integer integer : booleanPacker.mapBooleansToInts(animUpdates)) { for (Integer integer : booleanPacker.mapBooleansToInts(animUpdates)) {
intUpdates.put("modelengine:anim" + i, integer); intUpdates.put(plugin.getConfigManager().getConfig().getString("namespace") + ":anim" + i, integer);
i++; i++;
} }

View File

@@ -1,3 +1,6 @@
bstats: true
namespace: "modelengine"
data-send-delay: 5 data-send-delay: 5
entity-view-distance: 50 entity-view-distance: 50
join-send-delay: 20 join-send-delay: 20
@@ -6,4 +9,5 @@ thread-pool-size: 4
model-entity-type: BAT # must be a living entity model-entity-type: BAT # must be a living entity
enable-part-visibility-models: enable-part-visibility-models:
- example - example
debug: false debug: false

View File

@@ -6,7 +6,6 @@ api-version: '1.21'
authors: authors:
- zimzaza4 - zimzaza4
- willem.dev - willem.dev
- TheLividaProject
load: STARTUP load: STARTUP