mirror of
https://github.com/xSquishyLiam/mc-GeyserModelEngine-plugin.git
synced 2025-12-19 14:59:19 +00:00
Major Overhaul (needs testing)
This commit is contained in:
@@ -2,149 +2,143 @@ package re.imc.geysermodelengine;
|
||||
|
||||
import com.github.retrooper.packetevents.PacketEvents;
|
||||
import com.github.retrooper.packetevents.event.PacketListenerPriority;
|
||||
import com.google.common.cache.Cache;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.ticxo.modelengine.api.ModelEngineAPI;
|
||||
import com.ticxo.modelengine.api.model.ActiveModel;
|
||||
import com.ticxo.modelengine.api.model.ModeledEntity;
|
||||
import com.ticxo.modelengine.api.model.bone.type.Mount;
|
||||
import dev.jorel.commandapi.CommandAPI;
|
||||
import dev.jorel.commandapi.CommandAPIBukkitConfig;
|
||||
import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import re.imc.geysermodelengine.commands.ReloadCommand;
|
||||
import re.imc.geysermodelengine.listener.ModelListener;
|
||||
import re.imc.geysermodelengine.listener.MountPacketListener;
|
||||
import re.imc.geysermodelengine.model.BedrockMountControl;
|
||||
import re.imc.geysermodelengine.model.ModelEntity;
|
||||
import re.imc.geysermodelengine.managers.ConfigManager;
|
||||
import re.imc.geysermodelengine.managers.bedrock.BedrockMountControlManager;
|
||||
import re.imc.geysermodelengine.managers.commands.CommandManager;
|
||||
import re.imc.geysermodelengine.managers.model.EntityTaskManager;
|
||||
import re.imc.geysermodelengine.managers.model.ModelManager;
|
||||
import re.imc.geysermodelengine.managers.player.PlayerManager;
|
||||
import re.imc.geysermodelengine.managers.server.ServerManager;
|
||||
import re.imc.geysermodelengine.managers.model.data.ModelEntityData;
|
||||
import re.imc.geysermodelengine.runnables.BedrockMountControlRunnable;
|
||||
import re.imc.geysermodelengine.runnables.UpdateTaskRunnable;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.*;
|
||||
|
||||
public final class GeyserModelEngine extends JavaPlugin {
|
||||
public class GeyserModelEngine extends JavaPlugin {
|
||||
|
||||
@Getter
|
||||
private static GeyserModelEngine instance;
|
||||
private ConfigManager configManager;
|
||||
private ServerManager serverManager;
|
||||
|
||||
@Getter
|
||||
private static boolean alwaysSendSkin;
|
||||
private CommandManager commandManager;
|
||||
|
||||
@Getter
|
||||
private int sendDelay;
|
||||
private ModelManager modelManager;
|
||||
private EntityTaskManager entityTaskManager;
|
||||
private BedrockMountControlManager bedrockMountControlManager;
|
||||
|
||||
@Getter
|
||||
private int viewDistance;
|
||||
|
||||
@Getter
|
||||
private Set<Player> joinedPlayers = new HashSet<>();
|
||||
|
||||
@Getter
|
||||
private int joinSendDelay;
|
||||
|
||||
@Getter
|
||||
private long entityPositionUpdatePeriod;
|
||||
|
||||
@Getter
|
||||
private boolean debug;
|
||||
|
||||
@Getter
|
||||
private Map<Player, Pair<ActiveModel, Mount>> drivers = new ConcurrentHashMap<>();
|
||||
|
||||
@Getter
|
||||
private boolean initialized = false;
|
||||
|
||||
@Getter
|
||||
private List<String> enablePartVisibilityModels = new ArrayList<>();
|
||||
|
||||
@Getter
|
||||
private ScheduledExecutorService scheduler;
|
||||
private ScheduledFuture<?> updateTask;
|
||||
private PlayerManager playerManager;
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this));
|
||||
PacketEvents.getAPI().load();
|
||||
|
||||
CommandAPI.onLoad(new CommandAPIBukkitConfig(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
PacketEvents.getAPI().init();
|
||||
PacketEvents.getAPI().getEventManager().registerListener(new MountPacketListener(), PacketListenerPriority.NORMAL);
|
||||
/*
|
||||
scheduler.scheduleAtFixedRate(() -> {
|
||||
try {
|
||||
for (Map<ActiveModel, ModelEntity> models : ModelEntity.ENTITIES.values()) {
|
||||
models.values().forEach(ModelEntity::teleportToModel);
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}, 10, entityPositionUpdatePeriod, TimeUnit.MILLISECONDS);
|
||||
loadHooks();
|
||||
loadManagers();
|
||||
loadRunnables();
|
||||
|
||||
*/
|
||||
PacketEvents.getAPI().getEventManager().registerListener(new MountPacketListener(this), PacketListenerPriority.NORMAL);
|
||||
|
||||
reload();
|
||||
getCommand("geysermodelengine").setExecutor(new ReloadCommand(this));
|
||||
Bukkit.getPluginManager().registerEvents(new ModelListener(), this);
|
||||
Bukkit.getScheduler()
|
||||
.runTaskLater(GeyserModelEngine.getInstance(), () -> {
|
||||
Bukkit.getPluginManager().registerEvents(new ModelListener(this), this);
|
||||
|
||||
Bukkit.getScheduler().runTaskLater(this, () -> {
|
||||
for (World world : Bukkit.getWorlds()) {
|
||||
|
||||
for (Entity entity : world.getEntities()) {
|
||||
if (!ModelEntity.ENTITIES.containsKey(entity.getEntityId())) {
|
||||
|
||||
if (!modelManager.getEntitiesCache().containsKey(entity.getEntityId())) {
|
||||
|
||||
ModeledEntity modeledEntity = ModelEngineAPI.getModeledEntity(entity);
|
||||
|
||||
if (modeledEntity != null) {
|
||||
Optional<ActiveModel> model = modeledEntity.getModels().values().stream().findFirst();
|
||||
model.ifPresent(m -> ModelEntity.create(modeledEntity, m));
|
||||
model.ifPresent(m -> modelManager.create(modeledEntity, m));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
initialized = true;
|
||||
|
||||
}, 100);
|
||||
|
||||
|
||||
BedrockMountControl.startTask();
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
saveDefaultConfig();
|
||||
// alwaysSendSkin = getConfig().getBoolean("always-send-skin");
|
||||
sendDelay = getConfig().getInt("data-send-delay", 5);
|
||||
scheduler = Executors.newScheduledThreadPool(getConfig().getInt("thread-pool-size", 4));
|
||||
viewDistance = getConfig().getInt("entity-view-distance", 60);
|
||||
debug = getConfig().getBoolean("debug", false);
|
||||
joinSendDelay = getConfig().getInt("join-send-delay", 20);
|
||||
entityPositionUpdatePeriod = getConfig().getLong("entity-position-update-period", 35);
|
||||
enablePartVisibilityModels.addAll(getConfig().getStringList("enable-part-visibility-models"));
|
||||
|
||||
instance = this;
|
||||
if (updateTask != null) updateTask.cancel(true);
|
||||
|
||||
updateTask = scheduler.scheduleWithFixedDelay(() -> {
|
||||
try {
|
||||
for (Map<ActiveModel, ModelEntity> models : ModelEntity.ENTITIES.values()) {
|
||||
models.values().forEach(model -> model.getTask().updateEntityProperties(model.getViewers(), false));
|
||||
}
|
||||
} catch (Throwable err) {
|
||||
throw new RuntimeException(err);
|
||||
}
|
||||
}, 10, entityPositionUpdatePeriod, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
PacketEvents.getAPI().terminate();
|
||||
for (Map<ActiveModel, ModelEntity> entities : ModelEntity.ENTITIES.values()) {
|
||||
|
||||
for (Map<ActiveModel, ModelEntityData> entities : modelManager.getEntitiesCache().values()) {
|
||||
entities.forEach((model, modelEntity) -> {
|
||||
modelEntity.getEntity().remove();
|
||||
});
|
||||
}
|
||||
// Plugin shutdown logic
|
||||
|
||||
CommandAPI.onDisable();
|
||||
}
|
||||
|
||||
private void loadHooks() {
|
||||
PacketEvents.getAPI().init();
|
||||
CommandAPI.onEnable();
|
||||
}
|
||||
|
||||
private void loadManagers() {
|
||||
this.configManager = new ConfigManager(this);
|
||||
this.serverManager = new ServerManager();
|
||||
|
||||
this.commandManager = new CommandManager(this);
|
||||
|
||||
this.modelManager = new ModelManager(this);
|
||||
this.entityTaskManager = new EntityTaskManager(this);
|
||||
this.bedrockMountControlManager = new BedrockMountControlManager();
|
||||
|
||||
this.playerManager = new PlayerManager();
|
||||
}
|
||||
|
||||
private void loadRunnables() {
|
||||
Bukkit.getAsyncScheduler().runAtFixedRate(this, new UpdateTaskRunnable(this), 10, configManager.getConfig().getLong("entity-position-update-period"), TimeUnit.MILLISECONDS);
|
||||
Bukkit.getAsyncScheduler().runAtFixedRate(this, new BedrockMountControlRunnable(this), 1, 1, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
public ConfigManager getConfigManager() {
|
||||
return configManager;
|
||||
}
|
||||
|
||||
public ServerManager getServerManager() {
|
||||
return serverManager;
|
||||
}
|
||||
|
||||
public CommandManager getCommandManager() {
|
||||
return commandManager;
|
||||
}
|
||||
|
||||
public ModelManager getModelManager() {
|
||||
return modelManager;
|
||||
}
|
||||
|
||||
public EntityTaskManager getEntityTaskManager() {
|
||||
return entityTaskManager;
|
||||
}
|
||||
|
||||
public BedrockMountControlManager getBedrockMountControlManager() {
|
||||
return bedrockMountControlManager;
|
||||
}
|
||||
|
||||
public PlayerManager getPlayerManager() {
|
||||
return playerManager;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user