diff --git a/README.md b/README.md
index 9a15df216..87256b95e 100644
--- a/README.md
+++ b/README.md
@@ -6,14 +6,11 @@
-
-
-
-
+
@@ -55,7 +52,7 @@ The code you contribute will be open-sourced under the GPLv3 license. If you pre
### 🌍 Translations
1. Clone this repository.
2. Create a new language file in: `/common-files/src/main/resources/translations`
-3. Once done, submit a **pull request** for review. We appreciate your contributions!
+3. Once done, submit a **pull request** to **dev** branch for review. We appreciate your contributions!
## Differences Between Versions
| Version | Official Support | Max Players | Dev Builds |
@@ -79,7 +76,7 @@ repositories {
```
```kotlin
dependencies {
- compileOnly("net.momirealms:craft-engine-core:0.0.56")
- compileOnly("net.momirealms:craft-engine-bukkit:0.0.56")
+ compileOnly("net.momirealms:craft-engine-core:0.0.57")
+ compileOnly("net.momirealms:craft-engine-bukkit:0.0.57")
}
```
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index 388c37cc5..25838c89e 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -27,7 +27,7 @@ subprojects {
expand(rootProject.properties)
}
- filesMatching(arrayListOf("commands.yml", "config.yml", "*/*.yml", "ignite.mod.json")) {
+ filesMatching(arrayListOf("commands.yml", "config.yml")) {
expand(
Pair("project_version", rootProject.properties["project_version"]),
Pair("config_version", rootProject.properties["config_version"]),
diff --git a/bukkit/compatibility/build.gradle.kts b/bukkit/compatibility/build.gradle.kts
index 55151de14..e995978d5 100644
--- a/bukkit/compatibility/build.gradle.kts
+++ b/bukkit/compatibility/build.gradle.kts
@@ -7,7 +7,7 @@ repositories {
maven("https://repo.rapture.pw/repository/maven-releases/") // slime world
maven("https://repo.infernalsuite.com/repository/maven-snapshots/") // slime world
maven("https://repo.momirealms.net/releases/")
- maven("https://mvn.lumine.io/repository/maven-public/") // model engine
+ maven("https://mvn.lumine.io/repository/maven-public/") // model engine mythic mobs
maven("https://nexus.phoenixdevt.fr/repository/maven-public/") // mmoitems
maven("https://repo.viaversion.com") // via
maven("https://repo.skriptlang.org/releases/") // skript
@@ -47,6 +47,8 @@ dependencies {
compileOnly(platform("com.intellectualsites.bom:bom-newest:1.52"))
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core")
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false }
+ // MythicMobs
+ compileOnly("io.lumine:Mythic-Dist:5.9.0")
}
java {
diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java
index 680455c0a..049efa25f 100644
--- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java
+++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java
@@ -3,11 +3,13 @@ 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.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.mythicmobs.MythicMobsListener;
import net.momirealms.craftengine.bukkit.compatibility.papi.PlaceholderAPIUtils;
import net.momirealms.craftengine.bukkit.compatibility.permission.LuckPermsEventListeners;
import net.momirealms.craftengine.bukkit.compatibility.skript.SkriptHook;
@@ -104,6 +106,12 @@ public class BukkitCompatibilityManager implements CompatibilityManager {
}
if (this.isPluginEnabled("AuraSkills")) {
this.registerLevelerProvider("AuraSkills", new AuraSkillsLevelerProvider());
+ logHook("AuraSkills");
+ }
+ if (this.isPluginEnabled("MythicMobs")) {
+ BukkitItemManager.instance().registerExternalItemProvider(new MythicMobsProvider());
+ new MythicMobsListener(this.plugin);
+ logHook("MythicMobs");
}
}
diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java
new file mode 100644
index 000000000..8b01bc237
--- /dev/null
+++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java
@@ -0,0 +1,25 @@
+package net.momirealms.craftengine.bukkit.compatibility.item;
+
+import io.lumine.mythic.bukkit.MythicBukkit;
+import net.momirealms.craftengine.core.item.ExternalItemProvider;
+import net.momirealms.craftengine.core.item.ItemBuildContext;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.Nullable;
+
+public class MythicMobsProvider implements ExternalItemProvider {
+ private MythicBukkit mythicBukkit;
+
+ @Override
+ public String plugin() {
+ return "MythicMobs";
+ }
+
+ @Nullable
+ @Override
+ public ItemStack build(String id, ItemBuildContext context) {
+ if (mythicBukkit == null || mythicBukkit.isClosed()) {
+ this.mythicBukkit = MythicBukkit.inst();
+ }
+ return mythicBukkit.getItemManager().getItemStack(id);
+ }
+}
diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/CraftEngineItemDrop.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/CraftEngineItemDrop.java
new file mode 100644
index 000000000..8c144b4c5
--- /dev/null
+++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/CraftEngineItemDrop.java
@@ -0,0 +1,64 @@
+package net.momirealms.craftengine.bukkit.compatibility.mythicmobs;
+
+import io.lumine.mythic.api.adapters.AbstractItemStack;
+import io.lumine.mythic.api.adapters.AbstractPlayer;
+import io.lumine.mythic.api.config.MythicLineConfig;
+import io.lumine.mythic.api.drops.DropMetadata;
+import io.lumine.mythic.api.drops.IItemDrop;
+import io.lumine.mythic.api.skills.SkillCaster;
+import io.lumine.mythic.bukkit.BukkitAdapter;
+import io.lumine.mythic.bukkit.adapters.BukkitItemStack;
+import io.lumine.mythic.core.drops.droppables.ItemDrop;
+import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
+import net.momirealms.craftengine.core.item.CustomItem;
+import net.momirealms.craftengine.core.item.ItemBuildContext;
+import net.momirealms.craftengine.core.plugin.CraftEngine;
+import net.momirealms.craftengine.core.util.MCUtils;
+import net.momirealms.craftengine.core.util.ReflectionUtils;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+import java.lang.reflect.Constructor;
+
+public class CraftEngineItemDrop extends ItemDrop implements IItemDrop {
+ private final CustomItem customItem;
+ private static final Constructor> constructor$BukkitItemStack = ReflectionUtils.getConstructor(BukkitItemStack.class, ItemStack.class);
+ private static final boolean useReflection = constructor$BukkitItemStack != null;
+
+ public CraftEngineItemDrop(String line, MythicLineConfig config, CustomItem customItem) {
+ super(line, config);
+ this.customItem = customItem;
+ CraftEngine.instance().debug(() -> "[MM调试] " + customItem.id() + " 注册成功");
+ }
+
+ @Override
+ public AbstractItemStack getDrop(DropMetadata dropMetadata, double amount) {
+ CraftEngine.instance().debug(() -> "[MM调试] getDrop() dropMetadata={" + dropMetadata + "}, amount={" + amount + "}");
+ ItemBuildContext context = ItemBuildContext.EMPTY;
+ SkillCaster caster = dropMetadata.getCaster();
+ if (caster != null && caster.getEntity() instanceof AbstractPlayer abstractPlayer) {
+ Entity bukkitEntity = abstractPlayer.getBukkitEntity();
+ if (bukkitEntity instanceof Player bukkitPlayer) {
+ var player = BukkitCraftEngine.instance().adapt(bukkitPlayer);
+ context = ItemBuildContext.of(player);
+ }
+ }
+ int amountInt = MCUtils.fastFloor(amount + 0.5F);
+ ItemStack itemStack = this.customItem.buildItemStack(context, amountInt);
+ return adapt(itemStack).amount(amountInt);
+ }
+
+ private static AbstractItemStack adapt(ItemStack itemStack) {
+ if (useReflection) {
+ try {
+ return (AbstractItemStack) constructor$BukkitItemStack.newInstance(itemStack);
+ } catch (Exception e) {
+ CraftEngine.instance().logger().warn("adapt(ItemStack itemStack) error: " + e.getMessage());
+ return null;
+ }
+ } else {
+ return BukkitAdapter.adapt(itemStack);
+ }
+ }
+}
diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicMobsListener.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicMobsListener.java
new file mode 100644
index 000000000..9d59cab3a
--- /dev/null
+++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicMobsListener.java
@@ -0,0 +1,31 @@
+package net.momirealms.craftengine.bukkit.compatibility.mythicmobs;
+
+import io.lumine.mythic.api.config.MythicLineConfig;
+import io.lumine.mythic.bukkit.events.MythicDropLoadEvent;
+import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
+import net.momirealms.craftengine.core.util.Key;
+import org.bukkit.Bukkit;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+
+public class MythicMobsListener implements Listener {
+ private final BukkitCraftEngine plugin;
+
+ public MythicMobsListener(BukkitCraftEngine plugin) {
+ this.plugin = plugin;
+ Bukkit.getPluginManager().registerEvents(this, plugin.javaPlugin());
+ }
+
+ @EventHandler
+ public void onMythicDropLoad(MythicDropLoadEvent event) {
+ if (!event.getDropName().equalsIgnoreCase("craftengine")) return;
+ String argument = event.getArgument();
+ plugin.debug(() -> "[MM调试] " + argument);
+ Key itemId = Key.of(argument);
+ this.plugin.itemManager().getCustomItem(itemId).ifPresent(customItem -> {
+ String line = event.getContainer().getConfigLine();
+ MythicLineConfig config = event.getConfig();
+ event.register(new CraftEngineItemDrop(line, config, customItem));
+ });
+ }
+}
diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ImageExpansion.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ImageExpansion.java
index c6ac983c1..e86171c4c 100644
--- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ImageExpansion.java
+++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/ImageExpansion.java
@@ -59,6 +59,8 @@ public class ImageExpansion extends PlaceholderExpansion {
int codepoint;
if (param.length == 4) {
codepoint = image.codepointAt(Integer.parseInt(param[2]), Integer.parseInt(param[3]));
+ } else if (param.length == 3) {
+ codepoint = image.codepointAt(Integer.parseInt(param[2]), 0);
} else if (param.length == 2) {
codepoint = image.codepointAt(0,0);
} else {
diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprCustomItem.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprCustomItem.java
index 2c3557a47..aacfe01ff 100644
--- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprCustomItem.java
+++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprCustomItem.java
@@ -7,14 +7,13 @@ import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import net.momirealms.craftengine.bukkit.api.CraftEngineItems;
+import net.momirealms.craftengine.core.item.CustomItem;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.util.Key;
import org.bukkit.event.Event;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
-import java.util.Objects;
-
public class ExprCustomItem extends SimpleExpression {
public static void register() {
@@ -36,7 +35,8 @@ public class ExprCustomItem extends SimpleExpression {
String itemId = this.itemId.getSingle(e);
if (itemId == null)
return null;
- return new ItemStack[] {Objects.requireNonNull(CraftEngineItems.byId(Key.of(itemId))).buildItemStack(ItemBuildContext.EMPTY)};
+ CustomItem customItem = CraftEngineItems.byId(Key.of(itemId));
+ return customItem == null ? null : new ItemStack[] {customItem.buildItemStack(ItemBuildContext.EMPTY)};
}
@Override
diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprEntityFurnitureID.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprEntityFurnitureID.java
index f11a78ac1..bd3d4b988 100644
--- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprEntityFurnitureID.java
+++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/expression/ExprEntityFurnitureID.java
@@ -5,7 +5,7 @@ import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.Nullable;
-import java.util.Objects;
+import java.util.Optional;
public class ExprEntityFurnitureID extends SimplePropertyExpression