mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-25 09:59:20 +00:00
Merge remote-tracking branch 'refs/remotes/upstream/dev' into update-1.21.6
This commit is contained in:
@@ -11,6 +11,9 @@ repositories {
|
||||
maven("https://nexus.phoenixdevt.fr/repository/maven-public/") // mmoitems
|
||||
maven("https://repo.viaversion.com") // via
|
||||
maven("https://repo.skriptlang.org/releases/") // skript
|
||||
maven("https://nexus.neetgames.com/repository/maven-releases/") // mcmmo
|
||||
maven("https://repo.dmulloy2.net/repository/public/") // mcmmo required
|
||||
maven("https://repo.auxilor.io/repository/maven-public/") // eco
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@@ -49,6 +52,21 @@ dependencies {
|
||||
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
|
||||
// MythicMobs
|
||||
compileOnly("io.lumine:Mythic-Dist:5.9.0")
|
||||
// McMMO
|
||||
compileOnly("com.gmail.nossr50.mcMMO:mcMMO:2.2.038")
|
||||
// MMOCore
|
||||
compileOnly("net.Indyuce:MMOCore-API:1.12.1-SNAPSHOT")
|
||||
// JobsReborn
|
||||
compileOnly("com.github.Zrips:Jobs:v5.2.2.3")
|
||||
// CustomFishing
|
||||
compileOnly("net.momirealms:custom-fishing:2.3.3")
|
||||
// eco
|
||||
compileOnly("com.willfp:eco:6.70.1")
|
||||
compileOnly("com.willfp:EcoJobs:3.56.1")
|
||||
compileOnly("com.willfp:EcoSkills:3.46.1")
|
||||
compileOnly("com.willfp:libreforge:4.58.1")
|
||||
// AureliumSkills
|
||||
compileOnly("com.github.Archy-X:AureliumSkills:Beta1.3.21")
|
||||
}
|
||||
|
||||
java {
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility;
|
||||
|
||||
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.bettermodel.BetterModelModel;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.model.bettermodel.BetterModelModel;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.item.CustomFishingProvider;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.item.MMOItemsProvider;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.item.MythicMobsProvider;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.item.NeigeItemsProvider;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld.LegacySlimeFormatStorageAdaptor;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.leveler.AuraSkillsLevelerProvider;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineModel;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineUtils;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.leveler.*;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.model.modelengine.ModelEngineModel;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.model.modelengine.ModelEngineUtils;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.mythicmobs.MythicMobsListener;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.papi.PlaceholderAPIUtils;
|
||||
import net.momirealms.craftengine.bukkit.compatibility.permission.LuckPermsEventListeners;
|
||||
@@ -30,10 +31,7 @@ import net.momirealms.craftengine.core.world.WorldManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
|
||||
public class BukkitCompatibilityManager implements CompatibilityManager {
|
||||
private final BukkitCraftEngine plugin;
|
||||
@@ -108,6 +106,29 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
|
||||
this.registerLevelerProvider("AuraSkills", new AuraSkillsLevelerProvider());
|
||||
logHook("AuraSkills");
|
||||
}
|
||||
if (this.isPluginEnabled("AureliumSkills")) {
|
||||
this.registerLevelerProvider("AureliumSkills", new AureliumSkillsLevelerProvider());
|
||||
}
|
||||
if (this.isPluginEnabled("McMMO")) {
|
||||
this.registerLevelerProvider("McMMO", new McMMOLevelerProvider());
|
||||
logHook("McMMO");
|
||||
}
|
||||
if (this.isPluginEnabled("MMOCore")) {
|
||||
this.registerLevelerProvider("MMOCore", new MMOCoreLevelerProvider());
|
||||
logHook("MMOCore");
|
||||
}
|
||||
if (this.isPluginEnabled("Jobs")) {
|
||||
registerLevelerProvider("Jobs", new JobsRebornLevelerProvider());
|
||||
logHook("Jobs");
|
||||
}
|
||||
if (this.isPluginEnabled("EcoSkills")) {
|
||||
registerLevelerProvider("EcoSkills", new EcoSkillsLevelerProvider());
|
||||
logHook("EcoSkills");
|
||||
}
|
||||
if (this.isPluginEnabled("EcoJobs")) {
|
||||
registerLevelerProvider("EcoJobs", new EcoJobsLevelerProvider());
|
||||
logHook("EcoJobs");
|
||||
}
|
||||
if (this.isPluginEnabled("MythicMobs")) {
|
||||
BukkitItemManager.instance().registerExternalItemProvider(new MythicMobsProvider());
|
||||
new MythicMobsListener(this.plugin);
|
||||
@@ -189,7 +210,17 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
|
||||
Plugin fastAsyncWorldEdit = Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit");
|
||||
String version = VersionHelper.isPaper() ? fastAsyncWorldEdit.getPluginMeta().getVersion() : fastAsyncWorldEdit.getDescription().getVersion();
|
||||
if (!this.fastAsyncWorldEditVersionCheck(version)) {
|
||||
this.plugin.logger().warn("[Compatibility] Please update FastAsyncWorldEdit to 2.13.0 or newer for better compatibility");
|
||||
this.plugin.logger().severe("");
|
||||
this.plugin.logger().severe("");
|
||||
if (Locale.getDefault() == Locale.SIMPLIFIED_CHINESE) {
|
||||
this.plugin.logger().severe("[Compatibility] 插件需要更新 FastAsyncWorldEdit 到 2.13.0 或更高版本,以获得更好的兼容性。(当前版本: " + version + ")");
|
||||
this.plugin.logger().severe("[Compatibility] 请前往 https://ci.athion.net/job/FastAsyncWorldEdit/ 下载最新版本");
|
||||
} else {
|
||||
this.plugin.logger().severe("[Compatibility] Please update FastAsyncWorldEdit to 2.13.0 or newer for better compatibility. (Current version: " + version + ")");
|
||||
this.plugin.logger().severe("[Compatibility] Please go to https://ci.athion.net/job/FastAsyncWorldEdit/ to download the latest version");
|
||||
}
|
||||
this.plugin.logger().severe("");
|
||||
this.plugin.logger().severe("");
|
||||
}
|
||||
new WorldEditBlockRegister(BukkitBlockManager.instance(), true);
|
||||
}
|
||||
@@ -223,6 +254,10 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
|
||||
itemManager.registerExternalItemProvider(new MMOItemsProvider());
|
||||
logHook("MMOItems");
|
||||
}
|
||||
if (this.isPluginEnabled("CustomFishing")) {
|
||||
itemManager.registerExternalItemProvider(new CustomFishingProvider());
|
||||
logHook("CustomFishing");
|
||||
}
|
||||
}
|
||||
|
||||
private Plugin getPlugin(String name) {
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.item;
|
||||
|
||||
import net.momirealms.craftengine.core.item.ExternalItemProvider;
|
||||
import net.momirealms.craftengine.core.item.ItemBuildContext;
|
||||
import net.momirealms.customfishing.api.BukkitCustomFishingPlugin;
|
||||
import net.momirealms.customfishing.api.mechanic.context.Context;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class CustomFishingProvider implements ExternalItemProvider<ItemStack> {
|
||||
@Override
|
||||
public String plugin() {
|
||||
return "CustomFishing";
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public ItemStack build(String id, ItemBuildContext context) {
|
||||
return BukkitCustomFishingPlugin.getInstance().getItemManager()
|
||||
.buildInternal(Context.player(((Player) context.player().platformPlayer())), id);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.leveler;
|
||||
|
||||
import com.archyx.aureliumskills.api.AureliumAPI;
|
||||
import com.archyx.aureliumskills.leveler.Leveler;
|
||||
import com.archyx.aureliumskills.skills.SkillRegistry;
|
||||
import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
|
||||
|
||||
public class AureliumSkillsLevelerProvider implements LevelerProvider {
|
||||
private final Leveler leveler;
|
||||
private final SkillRegistry skillRegistry;
|
||||
|
||||
public AureliumSkillsLevelerProvider() {
|
||||
this.leveler = AureliumAPI.getPlugin().getLeveler();
|
||||
this.skillRegistry = AureliumAPI.getPlugin().getSkillRegistry();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addExp(Player player, String target, double amount) {
|
||||
this.leveler.addXp(((org.bukkit.entity.Player) player.platformPlayer()), this.skillRegistry.getSkill(target), amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLevel(Player player, String target) {
|
||||
return AureliumAPI.getSkillLevel(((org.bukkit.entity.Player) player.platformPlayer()), this.skillRegistry.getSkill(target));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.leveler;
|
||||
|
||||
import com.willfp.ecojobs.api.EcoJobsAPI;
|
||||
import com.willfp.ecojobs.jobs.Job;
|
||||
import com.willfp.ecojobs.jobs.Jobs;
|
||||
import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
|
||||
|
||||
public class EcoJobsLevelerProvider implements LevelerProvider {
|
||||
|
||||
@Override
|
||||
public void addExp(Player player, String target, double amount) {
|
||||
org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) player.platformPlayer();
|
||||
for (Job job : EcoJobsAPI.getActiveJobs(bukkitPlayer)) {
|
||||
if (job.getId().equals(target)) {
|
||||
EcoJobsAPI.giveJobExperience(bukkitPlayer, job, amount);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLevel(Player player, String target) {
|
||||
Job job = Jobs.getByID(target);
|
||||
if (job == null) return 0;
|
||||
return EcoJobsAPI.getJobLevel(((org.bukkit.entity.Player) player.platformPlayer()), job);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.leveler;
|
||||
|
||||
import com.willfp.ecoskills.api.EcoSkillsAPI;
|
||||
import com.willfp.ecoskills.skills.Skills;
|
||||
import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class EcoSkillsLevelerProvider implements LevelerProvider {
|
||||
|
||||
@Override
|
||||
public void addExp(Player player, String target, double amount) {
|
||||
EcoSkillsAPI.gainSkillXP(((org.bukkit.entity.Player) player.platformPlayer()), Objects.requireNonNull(Skills.INSTANCE.getByID(target)), amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLevel(Player player, String target) {
|
||||
return EcoSkillsAPI.getSkillLevel(((org.bukkit.entity.Player) player.platformPlayer()), Objects.requireNonNull(Skills.INSTANCE.getByID(target)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.leveler;
|
||||
|
||||
import com.gamingmesh.jobs.Jobs;
|
||||
import com.gamingmesh.jobs.container.Job;
|
||||
import com.gamingmesh.jobs.container.JobProgression;
|
||||
import com.gamingmesh.jobs.container.JobsPlayer;
|
||||
import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
|
||||
|
||||
public class JobsRebornLevelerProvider implements LevelerProvider {
|
||||
|
||||
@Override
|
||||
public void addExp(Player player, String target, double amount) {
|
||||
JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(player.uuid());
|
||||
Job job = Jobs.getJob(target);
|
||||
if (jobsPlayer != null && jobsPlayer.isInJob(job)) {
|
||||
Jobs.getPlayerManager().addExperience(jobsPlayer, job, amount);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLevel(Player player, String target) {
|
||||
JobsPlayer jobsPlayer = Jobs.getPlayerManager().getJobsPlayer(player.uuid());
|
||||
if (jobsPlayer != null) {
|
||||
JobProgression jobProgression = jobsPlayer.getJobProgression(Jobs.getJob(target));
|
||||
return jobProgression.getLevel();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.leveler;
|
||||
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.experience.EXPSource;
|
||||
import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
|
||||
|
||||
public class MMOCoreLevelerProvider implements LevelerProvider {
|
||||
|
||||
@Override
|
||||
public void addExp(Player player, String target, double amount) {
|
||||
MMOCore.plugin.professionManager.get(target).giveExperience(PlayerData.get(player.uuid()), amount, null , EXPSource.OTHER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLevel(Player player, String target) {
|
||||
return PlayerData.get(player.uuid()).getCollectionSkills().getLevel(MMOCore.plugin.professionManager.get(target));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.leveler;
|
||||
|
||||
import com.gmail.nossr50.api.ExperienceAPI;
|
||||
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
|
||||
import net.momirealms.craftengine.core.entity.player.Player;
|
||||
import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider;
|
||||
|
||||
public class McMMOLevelerProvider implements LevelerProvider {
|
||||
|
||||
@Override
|
||||
public void addExp(Player player, String target, double amount) {
|
||||
ExperienceAPI.addRawXP((org.bukkit.entity.Player) player.platformPlayer(), target, (float) amount, "UNKNOWN");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLevel(Player player, String target) {
|
||||
return ExperienceAPI.getLevel((org.bukkit.entity.Player) player.platformPlayer(), PrimarySkillType.valueOf(target));
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.bettermodel;
|
||||
package net.momirealms.craftengine.bukkit.compatibility.model.bettermodel;
|
||||
|
||||
import net.momirealms.craftengine.core.entity.AbstractEntity;
|
||||
import net.momirealms.craftengine.core.entity.furniture.AbstractExternalModel;
|
||||
@@ -1,4 +1,4 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.bettermodel;
|
||||
package net.momirealms.craftengine.bukkit.compatibility.model.bettermodel;
|
||||
|
||||
import kr.toxicity.model.api.BetterModel;
|
||||
import kr.toxicity.model.api.data.renderer.BlueprintRenderer;
|
||||
@@ -1,4 +1,4 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.modelengine;
|
||||
package net.momirealms.craftengine.bukkit.compatibility.model.modelengine;
|
||||
|
||||
import net.momirealms.craftengine.core.entity.AbstractEntity;
|
||||
import net.momirealms.craftengine.core.entity.furniture.AbstractExternalModel;
|
||||
@@ -1,4 +1,4 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.modelengine;
|
||||
package net.momirealms.craftengine.bukkit.compatibility.model.modelengine;
|
||||
|
||||
import com.ticxo.modelengine.api.ModelEngineAPI;
|
||||
import com.ticxo.modelengine.api.model.ActiveModel;
|
||||
@@ -77,14 +77,22 @@ paper {
|
||||
// external models
|
||||
register("ModelEngine") { required = false }
|
||||
register("BetterModel") { required = false }
|
||||
register("FreeMinecraftModels") { required = false }
|
||||
|
||||
// external items
|
||||
register("NeigeItems") { required = false }
|
||||
register("MMOItems") { required = false }
|
||||
register("MythicMobs") { required = false }
|
||||
register("CustomFishing") { required = false }
|
||||
|
||||
// leveler
|
||||
register("AuraSkills") { required = false }
|
||||
register("AureliumSkills") { required = false }
|
||||
register("McMMO") { required = false }
|
||||
register("MMOCore") { required = false }
|
||||
register("Jobs") { required = false }
|
||||
register("EcoSkills") { required = false }
|
||||
register("EcoJobs") { required = false }
|
||||
|
||||
// anti grief lib
|
||||
register("Dominion") { required = false }
|
||||
|
||||
@@ -19,6 +19,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors {
|
||||
public static final Key CROP_BLOCK = Key.from("craftengine:crop_block");
|
||||
public static final Key GRASS_BLOCK = Key.from("craftengine:grass_block");
|
||||
public static final Key LAMP_BLOCK = Key.from("craftengine:lamp_block");
|
||||
public static final Key TRAPDOOR_BLOCK = Key.from("craftengine:trapdoor_block");
|
||||
|
||||
public static void init() {
|
||||
register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE);
|
||||
@@ -36,5 +37,6 @@ public class BukkitBlockBehaviors extends BlockBehaviors {
|
||||
register(CROP_BLOCK, CropBlockBehavior.FACTORY);
|
||||
register(GRASS_BLOCK, GrassBlockBehavior.FACTORY);
|
||||
register(LAMP_BLOCK, LampBlockBehavior.FACTORY);
|
||||
register(TRAPDOOR_BLOCK, TrapDoorBlockBehavior.FACTORY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
package net.momirealms.craftengine.bukkit.block.behavior;
|
||||
|
||||
import net.momirealms.craftengine.core.block.BlockBehavior;
|
||||
import net.momirealms.craftengine.core.block.CustomBlock;
|
||||
import net.momirealms.craftengine.core.block.ImmutableBlockState;
|
||||
import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory;
|
||||
import net.momirealms.craftengine.core.block.properties.Property;
|
||||
import net.momirealms.craftengine.core.item.context.BlockPlaceContext;
|
||||
import net.momirealms.craftengine.core.util.Half;
|
||||
import net.momirealms.craftengine.core.util.HorizontalDirection;
|
||||
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
public class TrapDoorBlockBehavior extends WaterLoggedBlockBehavior {
|
||||
public static final Factory FACTORY = new Factory();
|
||||
private final Property<Half> halfProperty;
|
||||
private final Property<HorizontalDirection> directionProperty;
|
||||
private final Property<Boolean> poweredProperty;
|
||||
private final Property<Boolean> openProperty;
|
||||
|
||||
public TrapDoorBlockBehavior(CustomBlock block,
|
||||
@Nullable Property<Boolean> waterloggedProperty,
|
||||
Property<Half> halfProperty,
|
||||
Property<HorizontalDirection> directionProperty,
|
||||
Property<Boolean> poweredProperty,
|
||||
Property<Boolean> openProperty) {
|
||||
super(block, waterloggedProperty);
|
||||
this.halfProperty = halfProperty;
|
||||
this.directionProperty = directionProperty;
|
||||
this.poweredProperty = poweredProperty;
|
||||
this.openProperty = openProperty;
|
||||
}
|
||||
//
|
||||
// @Override
|
||||
// public ImmutableBlockState updateStateForPlacement(BlockPlaceContext context, ImmutableBlockState state) {
|
||||
//
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void tick(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void neighborChanged(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static class Factory implements BlockBehaviorFactory {
|
||||
@Override
|
||||
public BlockBehavior create(CustomBlock block, Map<String, Object> arguments) {
|
||||
Property<Boolean> waterlogged = (Property<Boolean>) block.getProperty("waterlogged");
|
||||
Property<Half> half = (Property<Half>) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("half"), "warning.config.block.behavior.trapdoor.missing_half");
|
||||
Property<HorizontalDirection> direction = (Property<HorizontalDirection>) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("direction"), "warning.config.block.behavior.trapdoor.missing_direction");
|
||||
Property<Boolean> open = (Property<Boolean>) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("open"), "warning.config.block.behavior.trapdoor.missing_open");
|
||||
Property<Boolean> powered = (Property<Boolean>) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("open"), "warning.config.block.behavior.trapdoor.missing_powered");
|
||||
return new TrapDoorBlockBehavior(block, waterlogged, half, direction, powered, open);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -76,6 +76,9 @@ public final class BlockGenerator {
|
||||
// getSupportShape
|
||||
.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$getBlockSupportShape))
|
||||
.intercept(MethodDelegation.to(GetSupportShapeInterceptor.INSTANCE))
|
||||
// isPathFindable
|
||||
.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$isPathFindable))
|
||||
.intercept(MethodDelegation.to(IsPathFindableInterceptor.INSTANCE))
|
||||
// mirror
|
||||
.method(ElementMatchers.is(CoreReflections.method$BlockBehaviour$mirror))
|
||||
.intercept(MethodDelegation.to(MirrorInterceptor.INSTANCE))
|
||||
@@ -254,6 +257,21 @@ public final class BlockGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
public static class IsPathFindableInterceptor {
|
||||
public static final IsPathFindableInterceptor INSTANCE = new IsPathFindableInterceptor();
|
||||
|
||||
@RuntimeType
|
||||
public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) throws Exception {
|
||||
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
|
||||
try {
|
||||
return holder.value().isPathFindable(thisObj, args, superMethod);
|
||||
} catch (Exception e) {
|
||||
CraftEngine.instance().logger().severe("Failed to run isPathFindable", e);
|
||||
return superMethod.call();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class MirrorInterceptor {
|
||||
public static final MirrorInterceptor INSTANCE = new MirrorInterceptor();
|
||||
|
||||
|
||||
@@ -1344,6 +1344,38 @@ public final class CoreReflections {
|
||||
)
|
||||
);
|
||||
|
||||
public static final Class<?> clazz$PathComputationType = requireNonNull(
|
||||
BukkitReflectionUtils.findReobfOrMojmapClass(
|
||||
"world.level.pathfinder.PathMode",
|
||||
"world.level.pathfinder.PathComputationType"
|
||||
)
|
||||
);
|
||||
|
||||
public static final Method method$PathComputationType$values = requireNonNull(
|
||||
ReflectionUtils.getStaticMethod(clazz$PathComputationType, clazz$PathComputationType.arrayType())
|
||||
);
|
||||
|
||||
public static final Object instance$PathComputationType$LAND;
|
||||
public static final Object instance$PathComputationType$WATER;
|
||||
public static final Object instance$PathComputationType$AIR;
|
||||
|
||||
static {
|
||||
try {
|
||||
Object[] objs = (Object[]) method$PathComputationType$values.invoke(null);
|
||||
instance$PathComputationType$LAND = objs[0];
|
||||
instance$PathComputationType$WATER = objs[1];
|
||||
instance$PathComputationType$AIR = objs[2];
|
||||
} catch (ReflectiveOperationException e) {
|
||||
throw new ReflectionInitException("Failed to initialize PathComputationType", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static final Method method$BlockBehaviour$isPathFindable = requireNonNull(
|
||||
VersionHelper.isOrAbove1_20_5() ?
|
||||
ReflectionUtils.getDeclaredMethod(clazz$BlockBehaviour, boolean.class, clazz$BlockState, clazz$PathComputationType) :
|
||||
ReflectionUtils.getMethod(clazz$BlockBehaviour, boolean.class, clazz$BlockState, clazz$BlockGetter, clazz$BlockPos, clazz$PathComputationType)
|
||||
);
|
||||
|
||||
public static final Method method$BlockBehaviour$getShape = requireNonNull(
|
||||
ReflectionUtils.getDeclaredMethod(clazz$BlockBehaviour, clazz$VoxelShape, new String[]{"getShape", "a"}, clazz$BlockState, clazz$BlockGetter, CoreReflections.clazz$BlockPos, clazz$CollisionContext)
|
||||
);
|
||||
|
||||
@@ -49,6 +49,10 @@ public abstract class BlockBehavior {
|
||||
return (boolean) superMethod.call();
|
||||
}
|
||||
|
||||
public boolean isPathFindable(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
|
||||
return (boolean) superMethod.call();
|
||||
}
|
||||
|
||||
public void onBrokenAfterFall(Object thisBlock, Object[] args) throws Exception {
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ public class Properties {
|
||||
public static final Key AXIS = Key.of("craftengine:axis");
|
||||
public static final Key HORIZONTAL_DIRECTION = Key.of("craftengine:4-direction");
|
||||
public static final Key DIRECTION = Key.of("craftengine:6-direction");
|
||||
public static final Key HALF = Key.of("craftengine:half");
|
||||
|
||||
static {
|
||||
register(BOOLEAN, BooleanProperty.FACTORY);
|
||||
@@ -24,6 +25,7 @@ public class Properties {
|
||||
register(AXIS, new EnumProperty.Factory<>(Direction.Axis.class));
|
||||
register(DIRECTION, new EnumProperty.Factory<>(Direction.class));
|
||||
register(HORIZONTAL_DIRECTION, new EnumProperty.Factory<>(HorizontalDirection.class));
|
||||
register(HALF, new EnumProperty.Factory<>(Half.class));
|
||||
}
|
||||
|
||||
public static void register(Key key, PropertyFactory factory) {
|
||||
|
||||
@@ -88,9 +88,16 @@ public abstract class AbstractFurnitureManager implements FurnitureManager {
|
||||
if (byId.containsKey(id)) {
|
||||
throw new LocalizedResourceConfigException("warning.config.furniture.duplicate");
|
||||
}
|
||||
|
||||
EnumMap<AnchorType, CustomFurniture.Placement> placements = new EnumMap<>(AnchorType.class);
|
||||
Map<String, Object> placementMap = MiscUtils.castToMap(ResourceConfigUtils.requireNonNullOrThrow(section.get("placement"), "warning.config.furniture.missing_placement"), false);
|
||||
Object placementObj = section.get("placement");
|
||||
if (placementObj == null) {
|
||||
// 防呆
|
||||
if (section.containsKey("material")) {
|
||||
plugin.itemManager().parser().parseSection(pack, path, id, section);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Map<String, Object> placementMap = MiscUtils.castToMap(ResourceConfigUtils.requireNonNullOrThrow(placementObj, "warning.config.furniture.missing_placement"), false);
|
||||
if (placementMap.isEmpty()) {
|
||||
throw new LocalizedResourceConfigException("warning.config.furniture.missing_placement");
|
||||
}
|
||||
|
||||
@@ -9,11 +9,13 @@ import net.momirealms.craftengine.core.util.VersionHelper;
|
||||
import net.momirealms.sparrow.nbt.CompoundTag;
|
||||
import net.momirealms.sparrow.nbt.Tag;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class DynamicLoreModifier<I> implements ItemDataModifier<I> {
|
||||
public static final String CONTEXT_TAG_KEY = "craftengine:display_context";
|
||||
private final Map<String, List<String>> displayContexts;
|
||||
private final String defaultContext;
|
||||
|
||||
@@ -22,6 +24,10 @@ public class DynamicLoreModifier<I> implements ItemDataModifier<I> {
|
||||
this.displayContexts = displayContexts;
|
||||
}
|
||||
|
||||
public Map<String, List<String>> displayContexts() {
|
||||
return Collections.unmodifiableMap(this.displayContexts);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "dynamic-lore";
|
||||
@@ -29,7 +35,7 @@ public class DynamicLoreModifier<I> implements ItemDataModifier<I> {
|
||||
|
||||
@Override
|
||||
public Item<I> apply(Item<I> item, ItemBuildContext context) {
|
||||
String displayContext = Optional.ofNullable(item.getJavaTag("craftengine:display_context")).orElse(this.defaultContext).toString();
|
||||
String displayContext = Optional.ofNullable(item.getJavaTag(CONTEXT_TAG_KEY)).orElse(this.defaultContext).toString();
|
||||
List<String> lore = this.displayContexts.get(displayContext);
|
||||
if (lore == null) {
|
||||
lore = this.displayContexts.get(this.defaultContext);
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
package net.momirealms.craftengine.core.util;
|
||||
|
||||
public enum Half {
|
||||
TOP, BOTTOM
|
||||
}
|
||||
Reference in New Issue
Block a user