9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 20:39:10 +00:00

重构框架

This commit is contained in:
XiaoMoMi
2025-04-25 20:18:35 +08:00
parent 87d3aee888
commit bb486e542a
31 changed files with 305 additions and 192 deletions

View File

@@ -5,7 +5,6 @@ import net.momirealms.craftengine.core.block.CustomBlock;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;

View File

@@ -7,7 +7,6 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.*;
import net.momirealms.craftengine.bukkit.world.BukkitWorld;
import net.momirealms.craftengine.core.block.BlockSettings;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.block.properties.Property;
import net.momirealms.craftengine.core.entity.player.InteractionHand;

View File

@@ -7,7 +7,6 @@ import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import dev.dejvokep.boostedyaml.YamlDocument;
import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockRegister;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector;
@@ -117,6 +116,10 @@ public class BukkitBlockManager extends AbstractBlockManager {
this.resetPacketConsumers();
}
public List<Key> blockRegisterOrder() {
return Collections.unmodifiableList(this.blockRegisterOrder);
}
public static BukkitBlockManager instance() {
return instance;
}
@@ -127,12 +130,6 @@ public class BukkitBlockManager extends AbstractBlockManager {
if (this.fallingBlockRemoveListener != null) {
Bukkit.getPluginManager().registerEvents(this.fallingBlockRemoveListener, plugin.bootstrap());
}
// WorldEdit
if (this.plugin.isPluginEnabled("FastAsyncWorldEdit")) {
this.initFastAsyncWorldEditHook();
} else if (this.plugin.isPluginEnabled("WorldEdit")) {
this.initWorldEditHook();
}
}
@Override
@@ -171,20 +168,6 @@ public class BukkitBlockManager extends AbstractBlockManager {
this.tempVanillaBlockStateModels.clear();
}
public void initFastAsyncWorldEditHook() {
new WorldEditBlockRegister(this, true);
}
public void initWorldEditHook() {
WorldEditBlockRegister weBlockRegister = new WorldEditBlockRegister(this, false);
try {
for (Key newBlockId : this.blockRegisterOrder) {
weBlockRegister.register(newBlockId);
}
} catch (Exception e) {
this.plugin.logger().warn("Failed to initialize world edit hook", e);
}
}
@Nullable
public Object getMinecraftBlockHolder(int stateId) {

View File

@@ -1,93 +0,0 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.classes;
import ch.njol.skript.classes.ClassInfo;
import ch.njol.skript.classes.Parser;
import ch.njol.skript.classes.Serializer;
import ch.njol.skript.lang.ParseContext;
import ch.njol.skript.registrations.Classes;
import ch.njol.yggdrasil.Fields;
import net.momirealms.craftengine.core.block.BlockStateParser;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import org.jetbrains.annotations.Nullable;
import java.io.StreamCorruptedException;
public class CraftEngineClasses {
public static void register() {
Classes.registerClass(new ClassInfo<>(ImmutableBlockState.class, "customblockstate")
.user("custom block state")
.name("Custom Block State")
.serializer(new Serializer<>() {
@Override
public Fields serialize(ImmutableBlockState o) {
Fields f = new Fields();
f.putObject("customblockstate", o.toString());
return f;
}
@Override
public void deserialize(ImmutableBlockState o, Fields f) {
}
@Override
public ImmutableBlockState deserialize(Fields f) throws StreamCorruptedException {
String data = f.getObject("customblockstate", String.class);
assert data != null;
try {
return BlockStateParser.deserialize(data);
} catch (IllegalArgumentException ex) {
throw new StreamCorruptedException("Invalid block data: " + data);
}
}
@Override
public boolean mustSyncDeserialization() {
return true;
}
@Override
protected boolean canBeInstantiated() {
return false;
}
})
.parser(new Parser<>() {
@Override
public String toString(ImmutableBlockState o, int flags) {
return o.toString();
}
@Override
public String toVariableNameString(ImmutableBlockState o) {
return "customblockstate:" + o.toString();
}
@Override
public @Nullable ImmutableBlockState parse(String s, ParseContext context) {
return BlockStateParser.deserialize(s);
}
})
);
// Classes.registerClass(new ClassInfo<>(CustomBlock.class, "customblocks")
// .user("custom block")
// .name("Custom Block")
// .parser(new Parser<>() {
// @Override
// public String toString(CustomBlock o, int flags) {
// return o.id().toString();
// }
//
// @Override
// public String toVariableNameString(CustomBlock o) {
// return "customblock:" + o.id();
// }
//
// @Override
// public @Nullable CustomBlock parse(String s, ParseContext context) {
// return BuiltInRegistries.BLOCK.getValue(Key.of(s));
// }
// })
// );
}
}

View File

@@ -1,41 +0,0 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.condition;
import ch.njol.skript.Skript;
import ch.njol.skript.conditions.base.PropertyCondition;
import ch.njol.skript.lang.Condition;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.util.Kleenean;
import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks;
import org.bukkit.block.Block;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
public class CondIsBlockCustomBlock extends Condition {
public static void register() {
Skript.registerCondition(CondIsBlockCustomBlock.class,
"%blocks% (is|are) custom block(s)",
"%blocks% (is|are)(n't| not) custom block(s)");
}
private Expression<Block> blocks;
@Override
public boolean check(Event event) {
return blocks.check(event, CraftEngineBlocks::isCustomBlock, isNegated());
}
@Override
public String toString(@Nullable Event event, boolean debug) {
return PropertyCondition.toString(this, PropertyCondition.PropertyType.BE, event, debug, blocks, "custom block");
}
@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
blocks = (Expression<Block>) expressions[0];
setNegated(matchedPattern > 1);
return false;
}
}

View File

@@ -1,71 +0,0 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.event;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.util.StringUtils;
import net.momirealms.craftengine.bukkit.api.event.CustomBlockBreakEvent;
import net.momirealms.craftengine.bukkit.api.event.CustomBlockPlaceEvent;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.core.entity.player.InteractionHand;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
@SuppressWarnings({"unchecked"})
public class EvtCustomBlock extends SkriptEvent {
public static void register() {
Skript.registerEvent("Break Custom Block", EvtCustomBlock.class, CustomBlockBreakEvent.class, "[customblock] (break[ing]|1¦min(e|ing)) [[of] %-strings%]")
.description("Called when a custom block is broken by a player. If you use 'on mine', only events where the broken block dropped something will call the trigger.");
Skript.registerEvent("Place Custom Block", EvtCustomBlock.class, CustomBlockPlaceEvent.class, "[customblock] (plac(e|ing)|build[ing]) [[of] %-strings%]")
.description("Called when a player places a custom block.");
}
@Nullable
private Literal<String> blocks;
private String[] blockArray;
private boolean mine = false;
@Override
public boolean init(Literal<?>[] args, int matchedPattern, SkriptParser.ParseResult parser) {
if (args[0] != null) {
blocks = ((Literal<String>) args[0]);
blockArray = blocks.getAll();
}
mine = parser.mark == 1;
return true;
}
@Override
public boolean check(Event event) {
if (mine && event instanceof CustomBlockBreakEvent customBlockBreakEvent) {
if (!BlockStateUtils.isCorrectTool(customBlockBreakEvent.blockState(), customBlockBreakEvent.player().getItemInHand(InteractionHand.MAIN_HAND))) {
return false;
}
}
if (blocks == null)
return true;
String blockType;
String blockState;
if (event instanceof CustomBlockBreakEvent customBlockBreakEvent) {
blockType = customBlockBreakEvent.customBlock().id().toString();
blockState = customBlockBreakEvent.blockState().toString();
} else if (event instanceof CustomBlockPlaceEvent customBlockPlaceEvent) {
blockType = customBlockPlaceEvent.customBlock().id().toString();
blockState = customBlockPlaceEvent.blockState().toString();
} else {
return false;
}
return Arrays.stream(blockArray).anyMatch(block -> StringUtils.equals(blockType, block, true) || StringUtils.equals(blockState, block, true));
}
@Override
public String toString(@Nullable Event event, boolean debug) {
return "break/place" + (blocks != null ? " of " + blocks.toString(event, debug) : "");
}
}

View File

@@ -1,41 +0,0 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.expression;
import ch.njol.skript.expressions.base.SimplePropertyExpression;
import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks;
import net.momirealms.craftengine.core.block.CustomBlock;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.jetbrains.annotations.Nullable;
import java.util.Optional;
public class ExprBlockCustomBlockID extends SimplePropertyExpression<Object, String> {
public static void register() {
register(ExprBlockCustomBlockID.class, String.class, "block[ ]custom block id", "blocks/blockdata/customblockstates");
}
@Override
public @Nullable String convert(Object object) {
if (object instanceof ImmutableBlockState immutableBlockState)
return immutableBlockState.owner().value().id().toString();
if (object instanceof CustomBlock customBlock)
return customBlock.id().toString();
if (object instanceof Block block)
return Optional.ofNullable(CraftEngineBlocks.getCustomBlockState(block)).map(it -> it.owner().value().id().toString()).orElse(null);
if (object instanceof BlockData blockData)
return Optional.ofNullable(CraftEngineBlocks.getCustomBlockState(blockData)).map(it -> it.owner().value().id().toString()).orElse(null);
return null;
}
@Override
protected String getPropertyName() {
return "custom block id";
}
@Override
public Class<? extends String> getReturnType() {
return String.class;
}
}

View File

@@ -1,38 +0,0 @@
package net.momirealms.craftengine.bukkit.compatibility.skript.expression;
import ch.njol.skript.expressions.base.SimplePropertyExpression;
import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks;
import net.momirealms.craftengine.core.block.CustomBlock;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
import org.jetbrains.annotations.Nullable;
import java.util.Optional;
public class ExprBlockCustomBlockState extends SimplePropertyExpression<Object, ImmutableBlockState> {
public static void register() {
register(ExprBlockCustomBlockState.class, ImmutableBlockState.class, "block[ ]custom block state", "blocks/blockdata");
}
@Override
public @Nullable ImmutableBlockState convert(Object object) {
if (object instanceof Block block)
return CraftEngineBlocks.getCustomBlockState(block);
if (object instanceof BlockData blockData)
return CraftEngineBlocks.getCustomBlockState(blockData);
return null;
}
@Override
protected String getPropertyName() {
return "custom block state";
}
@Override
public Class<? extends ImmutableBlockState> getReturnType() {
return ImmutableBlockState.class;
}
}

View File

@@ -1,7 +1,5 @@
package net.momirealms.craftengine.bukkit.entity.furniture;
import net.momirealms.craftengine.bukkit.compatibility.bettermodel.BetterModelModel;
import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineModel;
import net.momirealms.craftengine.bukkit.entity.furniture.hitbox.InteractionHitBox;
import net.momirealms.craftengine.bukkit.nms.CollisionEntity;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
@@ -149,9 +147,9 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
// external model providers
Optional<ExternalModel> externalModel;
if (placementArguments.containsKey("model-engine")) {
externalModel = Optional.of(new ModelEngineModel(placementArguments.get("model-engine").toString()));
externalModel = Optional.of(plugin.compatibilityManager().createModelEngineModel(placementArguments.get("model-engine").toString()));
} else if (placementArguments.containsKey("better-model")) {
externalModel = Optional.of(new BetterModelModel(placementArguments.get("better-model").toString()));
externalModel = Optional.of(plugin.compatibilityManager().createBetterModelModel(placementArguments.get("better-model").toString()));
} else {
externalModel = Optional.empty();
}

View File

@@ -5,7 +5,6 @@ import com.google.gson.JsonObject;
import io.papermc.paper.event.player.AsyncChatCommandDecorateEvent;
import io.papermc.paper.event.player.AsyncChatDecorateEvent;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.compatibility.permission.LuckPermsEventListeners;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
import net.momirealms.craftengine.bukkit.util.LegacyInventoryUtils;
@@ -35,7 +34,6 @@ import java.util.*;
public class BukkitFontManager extends AbstractFontManager implements Listener {
private final BukkitCraftEngine plugin;
private LuckPermsEventListeners luckPermsEventListeners;
public BukkitFontManager(BukkitCraftEngine plugin) {
super(plugin);
@@ -44,9 +42,6 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
@Override
public void delayedInit() {
if (this.plugin.isPluginEnabled("LuckPerms")) {
luckPermsEventListeners = new LuckPermsEventListeners(plugin.bootstrap(), this::refreshEmojiSuggestions);
}
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
}
@@ -54,9 +49,6 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
public void disable() {
super.disable();
HandlerList.unregisterAll(this);
if (luckPermsEventListeners != null && this.plugin.isPluginEnabled("LuckPerms")) {
luckPermsEventListeners.unregisterListeners();
}
}
@Override
@@ -76,7 +68,8 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
plugin.scheduler().async().execute(() -> this.addEmojiSuggestions(event.getPlayer(), getEmojiSuggestion(event.getPlayer())));
}
private void refreshEmojiSuggestions(UUID uuid) {
@Override
public void refreshEmojiSuggestions(UUID uuid) {
Player player = Bukkit.getPlayer(uuid);
if (player == null) return;
removeEmojiSuggestions(player);

View File

@@ -1,7 +1,5 @@
package net.momirealms.craftengine.bukkit.item;
import net.momirealms.craftengine.bukkit.compatibility.item.MMOItemsProvider;
import net.momirealms.craftengine.bukkit.compatibility.item.NeigeItemsProvider;
import net.momirealms.craftengine.bukkit.item.behavior.AxeItemBehavior;
import net.momirealms.craftengine.bukkit.item.behavior.BoneMealItemBehavior;
import net.momirealms.craftengine.bukkit.item.behavior.BucketItemBehavior;
@@ -131,16 +129,6 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this.itemEventListener, this.plugin.bootstrap());
Bukkit.getPluginManager().registerEvents(this.debugStickListener, this.plugin.bootstrap());
this.hookExternalPlugins();
}
private void hookExternalPlugins() {
if (this.plugin.isPluginEnabled("NeigeItems")) {
registerExternalItemProvider(new NeigeItemsProvider());
}
if (this.plugin.isPluginEnabled("MMOItems")) {
registerExternalItemProvider(new MMOItemsProvider());
}
}
public static BukkitItemManager instance() {

View File

@@ -5,12 +5,6 @@ import net.momirealms.craftengine.bukkit.advancement.BukkitAdvancementManager;
import net.momirealms.craftengine.bukkit.api.event.CraftEngineReloadEvent;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.block.behavior.BukkitBlockBehaviors;
import net.momirealms.craftengine.bukkit.compatibility.papi.PlaceholderAPIUtils;
import net.momirealms.craftengine.bukkit.compatibility.skript.classes.CraftEngineClasses;
import net.momirealms.craftengine.bukkit.compatibility.skript.condition.CondIsBlockCustomBlock;
import net.momirealms.craftengine.bukkit.compatibility.skript.event.EvtCustomBlock;
import net.momirealms.craftengine.bukkit.compatibility.skript.expression.ExprBlockCustomBlockID;
import net.momirealms.craftengine.bukkit.compatibility.skript.expression.ExprBlockCustomBlockState;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager;
import net.momirealms.craftengine.bukkit.entity.furniture.hitbox.BukkitHitBoxTypes;
import net.momirealms.craftengine.bukkit.font.BukkitFontManager;
@@ -30,8 +24,8 @@ import net.momirealms.craftengine.bukkit.sound.BukkitSoundManager;
import net.momirealms.craftengine.bukkit.util.EventUtils;
import net.momirealms.craftengine.bukkit.util.Reflections;
import net.momirealms.craftengine.bukkit.world.BukkitWorldManager;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.ItemManager;
import net.momirealms.craftengine.core.plugin.CompatibilityManager;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.classpath.ReflectionClassPathAppender;
import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory;
@@ -56,10 +50,12 @@ import java.io.*;
import java.lang.reflect.Field;
import java.nio.file.Path;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@SuppressWarnings("unchecked")
public class BukkitCraftEngine extends CraftEngine {
private static final String COMPATIBILITY_CLASS = "net.momirealms.craftengine.bukkit.compatibility.BukkitCompatibilityManager";
private static BukkitCraftEngine instance;
private final JavaPlugin bootstrap;
private SchedulerTask tickTask;
@@ -68,7 +64,6 @@ public class BukkitCraftEngine extends CraftEngine {
private boolean requiresRestart = false;
private boolean hasMod = false;
private AntiGriefLib antiGrief;
private boolean hasPlaceholderAPI;
public BukkitCraftEngine(JavaPlugin bootstrap) {
super((p) -> {
@@ -90,6 +85,12 @@ public class BukkitCraftEngine extends CraftEngine {
} catch (Exception ignore) {
}
}
Class<?> compatibilityClass = Objects.requireNonNull(ReflectionUtils.getClazz(COMPATIBILITY_CLASS), "Compatibility class not found");
try {
super.compatibilityManager = (CompatibilityManager) Objects.requireNonNull(ReflectionUtils.getConstructor(compatibilityClass, 0)).newInstance(this);
} catch (ReflectiveOperationException e) {
logger().warn("Compatibility class could not be instantiated: " + compatibilityClass.getName());
}
}
@Override
@@ -101,6 +102,7 @@ public class BukkitCraftEngine extends CraftEngine {
super.blockManager = new BukkitBlockManager(this);
super.furnitureManager = new BukkitFurnitureManager(this);
this.successfullyLoaded = true;
super.compatibilityManager().onLoad();
}
@Override
@@ -164,20 +166,7 @@ public class BukkitCraftEngine extends CraftEngine {
super.fontManager = new BukkitFontManager(this);
super.advancementManager = new BukkitAdvancementManager(this);
super.onPluginEnable();
// compatibility
// register expansion
if (this.isPluginEnabled("PlaceholderAPI")) {
PlaceholderAPIUtils.registerExpansions(this);
this.hasPlaceholderAPI = true;
}
// skript
if (this.isPluginEnabled("Skript")) {
CraftEngineClasses.register();
EvtCustomBlock.register();
CondIsBlockCustomBlock.register();
ExprBlockCustomBlockID.register();
ExprBlockCustomBlockState.register();
}
super.compatibilityManager().onEnable();
}
@Override
@@ -217,6 +206,7 @@ public class BukkitCraftEngine extends CraftEngine {
}
}, 1, 1);
}
super.compatibilityManager().onDelayedEnable();
}
@Override
@@ -283,21 +273,6 @@ public class BukkitCraftEngine extends CraftEngine {
return instance;
}
@Override
public boolean hasPlaceholderAPI() {
return this.hasPlaceholderAPI;
}
@Override
public boolean isPluginEnabled(String plugin) {
return Bukkit.getPluginManager().isPluginEnabled(plugin);
}
@Override
public String parse(Player player, String text) {
return PlaceholderAPIUtils.parse((org.bukkit.entity.Player) player.platformPlayer(), text);
}
@Override
public BukkitNetworkManager networkManager() {
return (BukkitNetworkManager) networkManager;

View File

@@ -371,9 +371,8 @@ public class BukkitInjector {
public static void injectLevelChunkSection(Object targetSection, CESection ceSection, CEWorld ceWorld, SectionPos pos) {
try {
Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection);
if (!clazz$InjectedPalettedContainer.isInstance(container)) {
InjectedPalettedContainerHolder injectedObject = (InjectedPalettedContainerHolder) Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer);
varHandle$InjectedPalettedContainer$target.set(injectedObject, container);
if (!(container instanceof InjectedPalettedContainerHolder)) {
InjectedPalettedContainerHolder injectedObject = FastNMS.INSTANCE.createInjectedPalettedContainerHolder(container);
injectedObject.ceSection(ceSection);
injectedObject.ceWorld(ceWorld);
injectedObject.cePos(pos);

View File

@@ -7,7 +7,6 @@ import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;
import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionProtocol;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20;
@@ -56,7 +55,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
private final BiConsumer<Object, Object> packetConsumer;
private final BiConsumer<Object, Object> immediatePacketConsumer;
private final BukkitCraftEngine plugin;
private final ViaVersionProtocol viaVersionProtocol;
private final Map<ChannelPipeline, BukkitServerPlayer> users = new ConcurrentHashMap<>();
private final Map<UUID, BukkitServerPlayer> onlineUsers = new ConcurrentHashMap<>();
@@ -72,13 +70,13 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
private static final String PACKET_DECODER = "craftengine_decoder";
private static boolean hasModelEngine;
private static boolean hasViaVersion;
public BukkitNetworkManager(BukkitCraftEngine plugin) {
instance = this;
hasModelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine") != null;
hasViaVersion = Bukkit.getPluginManager().getPlugin("ViaVersion") != null;
this.plugin = plugin;
// hook via
this.viaVersionProtocol = new ViaVersionProtocol(Bukkit.getPluginManager().getPlugin("ViaVersion") != null);
// set up packet id
this.packetIds = setupPacketIds();
// register packet handlers
@@ -304,6 +302,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
return hasModelEngine;
}
public static boolean hasViaVersion() {
return hasViaVersion;
}
public void simulatePacket(@NotNull NetWorkUser player, Object packet) {
Channel channel = player.nettyChannel();
if (channel.isOpen()) {
@@ -635,8 +637,4 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
}
return output;
}
public ViaVersionProtocol viaVersionProtocol() {
return this.viaVersionProtocol;
}
}

View File

@@ -9,8 +9,6 @@ import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture;
import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent;
import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineUtils;
import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionProtocol;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager;
import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture;
import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior;
@@ -64,7 +62,6 @@ public class PacketConsumers {
private static int[] mappingsMOD;
private static IntIdentityList BLOCK_LIST;
private static IntIdentityList BIOME_LIST;
private static final UUID EMPTY_UUID = new UUID(0, 0);
public static void init(Map<Integer, Integer> map, int registrySize) {
mappings = new int[registrySize];
@@ -1249,9 +1246,8 @@ public class PacketConsumers {
player.setConnectionState(ConnectionState.PLAY);
Object dimensionKey;
if (!VersionHelper.isVersionNewerThan1_20_2()) {
ViaVersionProtocol viaVersionProtocol = BukkitNetworkManager.instance().viaVersionProtocol();
if (viaVersionProtocol.hasPlugin()) {
user.setProtocolVersion(viaVersionProtocol.getPlayerProtocolVersion(player.uuid()));
if (BukkitNetworkManager.hasViaVersion()) {
user.setProtocolVersion(CraftEngine.instance().compatibilityManager().getPlayerProtocolVersion(player.uuid()));
}
dimensionKey = Reflections.field$ClientboundLoginPacket$dimension.get(packet);
} else {
@@ -1590,7 +1586,7 @@ public class PacketConsumers {
int entityId;
if (BukkitNetworkManager.hasModelEngine()) {
int fakeId = FastNMS.INSTANCE.field$ServerboundInteractPacket$entityId(packet);
entityId = ModelEngineUtils.interactionToBaseEntity(fakeId);
entityId = CraftEngine.instance().compatibilityManager().interactionToBaseEntity(fakeId);
} else {
entityId = FastNMS.INSTANCE.field$ServerboundInteractPacket$entityId(packet);
}
@@ -2186,7 +2182,7 @@ public class PacketConsumers {
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> HANDSHAKE_C2S = (user, event, packet) -> {
try {
if (BukkitNetworkManager.instance().viaVersionProtocol().hasPlugin()) return;
if (BukkitNetworkManager.hasViaVersion()) return;
int protocolVersion = Reflections.field$ClientIntentionPacket$protocolVersion.getInt(packet);
user.setProtocolVersion(protocolVersion);
} catch (Exception e) {
@@ -2196,9 +2192,8 @@ public class PacketConsumers {
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> LOGIN_ACKNOWLEDGED = (user, event, packet) -> {
try {
ViaVersionProtocol viaVersionProtocol = BukkitNetworkManager.instance().viaVersionProtocol();
if (viaVersionProtocol.hasPlugin()) {
user.setProtocolVersion(viaVersionProtocol.getPlayerProtocolVersion(user.uuid()));
if (BukkitNetworkManager.hasViaVersion()) {
user.setProtocolVersion(CraftEngine.instance().compatibilityManager().getPlayerProtocolVersion(user.uuid()));
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ServerboundLoginAcknowledgedPacket", e);

View File

@@ -1,7 +1,5 @@
package net.momirealms.craftengine.bukkit.world;
import net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld.LegacySlimeFormatStorageAdaptor;
import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector;
@@ -11,7 +9,6 @@ import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.world.CEWorld;
import net.momirealms.craftengine.core.world.ChunkPos;
import net.momirealms.craftengine.core.world.SectionPos;
@@ -53,32 +50,7 @@ public class BukkitWorldManager implements WorldManager, Listener {
instance = this;
this.plugin = plugin;
this.worlds = new HashMap<>();
if (VersionHelper.isVersionNewerThan1_21_4()) {
try {
Class.forName("com.infernalsuite.asp.api.AdvancedSlimePaperAPI");
SlimeFormatStorageAdaptor adaptor = new SlimeFormatStorageAdaptor(this);
this.storageAdaptor = adaptor;
Bukkit.getPluginManager().registerEvents(adaptor, plugin.bootstrap());
return;
} catch (ClassNotFoundException ignored) {
}
} else {
try {
Class.forName("com.infernalsuite.aswm.api.SlimePlugin");
LegacySlimeFormatStorageAdaptor adaptor = new LegacySlimeFormatStorageAdaptor(this, 1);
this.storageAdaptor = adaptor;
Bukkit.getPluginManager().registerEvents(adaptor, plugin.bootstrap());
} catch (ClassNotFoundException ignored) {
if (Bukkit.getPluginManager().isPluginEnabled("SlimeWorldPlugin")) {
LegacySlimeFormatStorageAdaptor adaptor = new LegacySlimeFormatStorageAdaptor(this, 2);
this.storageAdaptor = adaptor;
Bukkit.getPluginManager().registerEvents(adaptor, plugin.bootstrap());
}
}
}
if (this.storageAdaptor == null) {
this.storageAdaptor = new DefaultStorageAdaptor();
}
this.storageAdaptor = new DefaultStorageAdaptor();
}
@Override