mirror of
https://github.com/xSquishyLiam/mc-GeyserModelEngine-plugin.git
synced 2025-12-28 19:29:20 +00:00
Major Overhaul (needs testing)
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
package re.imc.geysermodelengine.managers;
|
||||
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import re.imc.geysermodelengine.GeyserModelEngine;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class ConfigManager {
|
||||
|
||||
private final GeyserModelEngine plugin;
|
||||
|
||||
private FileConfiguration config, lang;
|
||||
|
||||
public ConfigManager(GeyserModelEngine plugin) {
|
||||
this.plugin = plugin;
|
||||
load();
|
||||
}
|
||||
|
||||
public void load() {
|
||||
this.config = YamlConfiguration.loadConfiguration(new File(plugin.getDataFolder(), "config.yml"));
|
||||
this.lang = YamlConfiguration.loadConfiguration(new File(plugin.getDataFolder(), "Lang/messages.yml"));
|
||||
}
|
||||
|
||||
public FileConfiguration getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public FileConfiguration getLang() {
|
||||
return lang;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package re.imc.geysermodelengine.managers.bedrock;
|
||||
|
||||
import com.ticxo.modelengine.api.model.ActiveModel;
|
||||
import com.ticxo.modelengine.api.model.bone.type.Mount;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class BedrockMountControlManager {
|
||||
|
||||
private final ConcurrentHashMap<Player, Pair<ActiveModel, Mount>> driversCache = new ConcurrentHashMap<>();
|
||||
|
||||
public ConcurrentHashMap<Player, Pair<ActiveModel, Mount>> getDriversCache() {
|
||||
return driversCache;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package re.imc.geysermodelengine.managers.commands;
|
||||
|
||||
import org.reflections.Reflections;
|
||||
import re.imc.geysermodelengine.GeyserModelEngine;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class CommandManager {
|
||||
|
||||
private final GeyserModelEngine plugin;
|
||||
|
||||
private final HashMap<String, CommandManagers> commandManagersCache = new HashMap<>();
|
||||
|
||||
public CommandManager(GeyserModelEngine plugin) {
|
||||
this.plugin = plugin;
|
||||
load("re.imc.geysermodelengine.managers.commands.managers");
|
||||
}
|
||||
|
||||
private void load(String path) {
|
||||
for (Class<?> clazz : new Reflections(path).getSubTypesOf(CommandManagers.class)) {
|
||||
try {
|
||||
CommandManagers commandManager = (CommandManagers) clazz.getDeclaredConstructor(GeyserModelEngine.class).newInstance(plugin);
|
||||
plugin.getLogger().warning("Loading Command Manager - " + commandManager.name());
|
||||
commandManagersCache.put(commandManager.name(), commandManager);
|
||||
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException err) {
|
||||
plugin.getLogger().severe("Failed to load Command Manager " + clazz.getName());
|
||||
throw new RuntimeException(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public HashMap<String, CommandManagers> getCommandManagersCache() {
|
||||
return commandManagersCache;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package re.imc.geysermodelengine.managers.commands;
|
||||
|
||||
import re.imc.geysermodelengine.managers.commands.subcommands.SubCommands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public interface CommandManagers {
|
||||
|
||||
String name();
|
||||
|
||||
ArrayList<SubCommands> getCommands();
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package re.imc.geysermodelengine.managers.commands.managers.geysermodelengine;
|
||||
|
||||
import dev.jorel.commandapi.CommandAPICommand;
|
||||
import re.imc.geysermodelengine.GeyserModelEngine;
|
||||
import re.imc.geysermodelengine.commands.geysermodelenginecommands.GeyserModelEngineReloadCommand;
|
||||
import re.imc.geysermodelengine.managers.commands.CommandManagers;
|
||||
import re.imc.geysermodelengine.managers.commands.subcommands.SubCommands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class GeyserModelEngineCommandManager implements CommandManagers {
|
||||
|
||||
private final ArrayList<SubCommands> commands = new ArrayList<>();
|
||||
|
||||
public GeyserModelEngineCommandManager(GeyserModelEngine plugin) {
|
||||
commands.add(new GeyserModelEngineReloadCommand(plugin));
|
||||
|
||||
registerCommand();
|
||||
}
|
||||
|
||||
private void registerCommand() {
|
||||
CommandAPICommand geyserModelEngineCommand = new CommandAPICommand(name());
|
||||
|
||||
commands.forEach(subCommands -> geyserModelEngineCommand.withSubcommand(subCommands.onCommand()));
|
||||
|
||||
geyserModelEngineCommand.register();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "geysermodelengine";
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<SubCommands> getCommands() {
|
||||
return commands;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package re.imc.geysermodelengine.managers.commands.subcommands;
|
||||
|
||||
import dev.jorel.commandapi.CommandAPICommand;
|
||||
|
||||
public interface SubCommands {
|
||||
CommandAPICommand onCommand();
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
package re.imc.geysermodelengine.managers.model;
|
||||
|
||||
import com.ticxo.modelengine.api.animation.BlueprintAnimation;
|
||||
import com.ticxo.modelengine.api.generator.blueprint.BlueprintBone;
|
||||
import com.ticxo.modelengine.api.model.ActiveModel;
|
||||
import com.ticxo.modelengine.api.model.render.DisplayRenderer;
|
||||
import me.zimzaza4.geyserutils.spigot.api.EntityUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.geysermc.floodgate.api.FloodgateApi;
|
||||
import org.joml.Vector3fc;
|
||||
import re.imc.geysermodelengine.GeyserModelEngine;
|
||||
import re.imc.geysermodelengine.managers.model.data.ModelEntityData;
|
||||
import re.imc.geysermodelengine.packet.entity.PacketEntity;
|
||||
import re.imc.geysermodelengine.runnables.EntityTaskRunnable;
|
||||
|
||||
import java.awt.*;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
||||
|
||||
public class EntityTaskManager {
|
||||
|
||||
private final GeyserModelEngine plugin;
|
||||
|
||||
private final Method scaleMethod;
|
||||
|
||||
public EntityTaskManager(GeyserModelEngine plugin) {
|
||||
this.plugin = plugin;
|
||||
|
||||
try {
|
||||
this.scaleMethod = ActiveModel.class.getMethod("getScale");
|
||||
} catch (NoSuchMethodException err) {
|
||||
throw new RuntimeException(err);
|
||||
}
|
||||
}
|
||||
|
||||
public String unstripName(BlueprintBone bone) {
|
||||
String name = bone.getName();
|
||||
if (bone.getBehaviors().get("head") != null) {
|
||||
if (!bone.getBehaviors().get("head").isEmpty()) return "hi_" + name;
|
||||
return "h_" + name;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
public void sendScale(ModelEntityData model, Collection<Player> players, float lastScale, boolean firstSend) {
|
||||
try {
|
||||
if (players.isEmpty()) return;
|
||||
|
||||
Vector3fc scale = (Vector3fc) scaleMethod.invoke(model.getActiveModel());
|
||||
|
||||
float average = (scale.x() + scale.y() + scale.z()) / 3;
|
||||
|
||||
if (!firstSend) {
|
||||
if (average == lastScale) return;
|
||||
}
|
||||
|
||||
for (Player player : players) {
|
||||
EntityUtils.sendCustomScale(player, model.getEntity().getEntityId(), average);
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
public void sendColor(ModelEntityData model, Collection<Player> players, Color lastColor, boolean firstSend) {
|
||||
if (players.isEmpty()) return;
|
||||
|
||||
Color color = new Color(model.getActiveModel().getDefaultTint().asARGB());
|
||||
if (model.getActiveModel().isMarkedHurt()) color = new Color(model.getActiveModel().getDamageTint().asARGB());
|
||||
|
||||
if (firstSend) {
|
||||
if (color.equals(lastColor)) return;
|
||||
}
|
||||
|
||||
for (Player player : players) {
|
||||
EntityUtils.sendCustomColor(player, model.getEntity().getEntityId(), color);
|
||||
}
|
||||
}
|
||||
|
||||
public void checkViewers(ModelEntityData model, Set<Player> viewers) {
|
||||
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
|
||||
if (FloodgateApi.getInstance().isFloodgatePlayer(onlinePlayer.getUniqueId())) {
|
||||
|
||||
if (canSee(onlinePlayer, model.getEntity())) {
|
||||
|
||||
if (!viewers.contains(onlinePlayer)) {
|
||||
sendSpawnPacket(model, onlinePlayer);
|
||||
viewers.add(onlinePlayer);
|
||||
}
|
||||
} else {
|
||||
if (viewers.contains(onlinePlayer)) {
|
||||
model.getEntity().sendEntityDestroyPacket(Collections.singletonList(onlinePlayer));
|
||||
viewers.remove(onlinePlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void sendSpawnPacket(ModelEntityData model, Player onlinePlayer) {
|
||||
EntityTaskRunnable task = model.getEntityTask();
|
||||
boolean firstJoined = !plugin.getPlayerManager().getPlayerJoinedCache().contains(onlinePlayer);
|
||||
|
||||
if (firstJoined) {
|
||||
task.sendEntityData(model, onlinePlayer, plugin.getConfigManager().getConfig().getInt("join-send-delay") / 50);
|
||||
} else {
|
||||
task.sendEntityData(model, onlinePlayer, 5);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean canSee(Player player, PacketEntity entity) {
|
||||
if (!player.isOnline()) return false;
|
||||
if (!plugin.getPlayerManager().getPlayerJoinedCache().contains(player)) return false;
|
||||
|
||||
Location playerLocation = player.getLocation().clone();
|
||||
Location entityLocation = entity.getLocation().clone();
|
||||
playerLocation.setY(0);
|
||||
entityLocation.setY(0);
|
||||
|
||||
if (playerLocation.getWorld() != entityLocation.getWorld()) return false;
|
||||
if (playerLocation.distanceSquared(entityLocation) > player.getSendViewDistance() * player.getSendViewDistance() * 48) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sendHitBoxToAll(ModelEntityData model) {
|
||||
for (Player viewer : model.getViewers()) {
|
||||
EntityUtils.sendCustomHitBox(viewer, model.getEntity().getEntityId(), 0.01f, 0.01f);
|
||||
}
|
||||
}
|
||||
|
||||
public void sendHitBox(ModelEntityData model, Player viewer) {
|
||||
float w = 0;
|
||||
|
||||
if (model.getActiveModel().isShadowVisible()) {
|
||||
if (model.getActiveModel().getModelRenderer() instanceof DisplayRenderer displayRenderer) {
|
||||
// w = displayRenderer.getHitbox().getShadowRadius().get();
|
||||
}
|
||||
}
|
||||
|
||||
EntityUtils.sendCustomHitBox(viewer, model.getEntity().getEntityId(), 0.02f, w);
|
||||
}
|
||||
|
||||
public boolean hasAnimation(ModelEntityData model, String animation) {
|
||||
ActiveModel activeModel = model.getActiveModel();
|
||||
BlueprintAnimation animationProperty = activeModel.getBlueprint().getAnimations().get(animation);
|
||||
return !(animationProperty == null);
|
||||
}
|
||||
|
||||
public Method getScaleMethod() {
|
||||
return scaleMethod;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package re.imc.geysermodelengine.managers.model;
|
||||
|
||||
import com.ticxo.modelengine.api.model.ActiveModel;
|
||||
import com.ticxo.modelengine.api.model.ModeledEntity;
|
||||
import re.imc.geysermodelengine.GeyserModelEngine;
|
||||
import re.imc.geysermodelengine.managers.model.data.ModelEntityData;
|
||||
import re.imc.geysermodelengine.runnables.EntityTaskRunnable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class ModelManager {
|
||||
|
||||
private final GeyserModelEngine plugin;
|
||||
|
||||
private final ConcurrentHashMap<Integer, Map<ActiveModel, ModelEntityData>> entitiesCache = new ConcurrentHashMap<>();
|
||||
private final Map<Integer, ModelEntityData> modelEntitiesCache = new ConcurrentHashMap<>();
|
||||
|
||||
public ModelManager(GeyserModelEngine plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
public void create(ModeledEntity entity, ActiveModel model) {
|
||||
ModelEntityData modelEntity = new ModelEntityData(plugin, entity, model);
|
||||
int id = entity.getBase().getEntityId();
|
||||
|
||||
Map<ActiveModel, ModelEntityData> map = entitiesCache.computeIfAbsent(id, k -> new HashMap<>());
|
||||
|
||||
for (Map.Entry<ActiveModel, ModelEntityData> entry : map.entrySet()) {
|
||||
if (entry.getKey() != model && entry.getKey().getBlueprint().getName().equals(model.getBlueprint().getName())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
map.put(model, modelEntity);
|
||||
}
|
||||
|
||||
public ConcurrentHashMap<Integer, Map<ActiveModel, ModelEntityData>> getEntitiesCache() {
|
||||
return entitiesCache;
|
||||
}
|
||||
|
||||
public Map<Integer, ModelEntityData> getModelEntitiesCache() {
|
||||
return modelEntitiesCache;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package re.imc.geysermodelengine.managers.model.data;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.ticxo.modelengine.api.model.ActiveModel;
|
||||
import com.ticxo.modelengine.api.model.ModeledEntity;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import re.imc.geysermodelengine.GeyserModelEngine;
|
||||
import re.imc.geysermodelengine.packet.entity.PacketEntity;
|
||||
import re.imc.geysermodelengine.runnables.EntityTaskRunnable;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class ModelEntityData {
|
||||
|
||||
private final GeyserModelEngine plugin;
|
||||
|
||||
private PacketEntity entity;
|
||||
|
||||
private final Set<Player> viewers = Sets.newConcurrentHashSet();
|
||||
|
||||
private final ModeledEntity modeledEntity;
|
||||
|
||||
private final ActiveModel activeModel;
|
||||
|
||||
private EntityTaskRunnable entityTask;
|
||||
|
||||
public ModelEntityData(GeyserModelEngine plugin, ModeledEntity modeledEntity, ActiveModel model) {
|
||||
this.plugin = plugin;
|
||||
|
||||
this.modeledEntity = modeledEntity;
|
||||
this.activeModel = model;
|
||||
this.entity = spawnEntity();
|
||||
|
||||
runEntityTask();
|
||||
}
|
||||
|
||||
public void teleportToModel() {
|
||||
Location location = modeledEntity.getBase().getLocation();
|
||||
entity.teleport(location);
|
||||
}
|
||||
|
||||
public PacketEntity spawnEntity() {
|
||||
entity = new PacketEntity(EntityTypes.PIG, viewers, modeledEntity.getBase().getLocation());
|
||||
return entity;
|
||||
}
|
||||
|
||||
public void runEntityTask() {
|
||||
entityTask = new EntityTaskRunnable(plugin, this);
|
||||
Bukkit.getAsyncScheduler().runAtFixedRate(plugin, entityTask, 0, 20, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
public PacketEntity getEntity() {
|
||||
return entity;
|
||||
}
|
||||
|
||||
public Set<Player> getViewers() {
|
||||
return viewers;
|
||||
}
|
||||
|
||||
public ModeledEntity getModeledEntity() {
|
||||
return modeledEntity;
|
||||
}
|
||||
|
||||
public ActiveModel getActiveModel() {
|
||||
return activeModel;
|
||||
}
|
||||
|
||||
public EntityTaskRunnable getEntityTask() {
|
||||
return entityTask;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package re.imc.geysermodelengine.managers.player;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
public class PlayerManager {
|
||||
|
||||
private final HashSet<Player> playerJoinedCache = new HashSet<>();
|
||||
|
||||
public HashSet<Player> getPlayerJoinedCache() {
|
||||
return playerJoinedCache;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package re.imc.geysermodelengine.managers.server;
|
||||
|
||||
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class ServerData {
|
||||
|
||||
private final ConcurrentHashMap<String, ScheduledTask> activeRunnablesCache = new ConcurrentHashMap<>();
|
||||
|
||||
public ConcurrentHashMap<String, ScheduledTask> getActiveRunnablesCache() {
|
||||
return activeRunnablesCache;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package re.imc.geysermodelengine.managers.server;
|
||||
|
||||
public class ServerManager {
|
||||
|
||||
private final ServerData serverData;
|
||||
|
||||
public ServerManager() {
|
||||
this.serverData = new ServerData();
|
||||
}
|
||||
|
||||
public ServerData getServerData() {
|
||||
return serverData;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user