mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-30 20:39:10 +00:00
重构框架
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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));
|
||||
// }
|
||||
// })
|
||||
// );
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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) : "");
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user