9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00

add crop block

This commit is contained in:
XiaoMoMi
2025-03-29 00:39:09 +08:00
parent 80570d6f42
commit cd30c5b3b3
22 changed files with 316 additions and 84 deletions

View File

@@ -4,10 +4,14 @@ repositories {
maven("https://r.irepo.space/maven/")
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") // papi
maven("https://maven.enginehub.org/repo/") // worldguard worldedit
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/")
}
dependencies {
compileOnly(project(":core"))
compileOnly("net.momirealms:sparrow-nbt:${rootProject.properties["sparrow_nbt_version"]}")
// Platform
compileOnly("dev.folia:folia-api:${rootProject.properties["paper_version"]}-R0.1-SNAPSHOT")
// NeigeItems
@@ -17,6 +21,8 @@ dependencies {
// WorldEdit
compileOnly("com.sk89q.worldedit:worldedit-core:7.2.19")
compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.19")
// SlimeWorld
compileOnly("com.infernalsuite.asp:api:4.0.0-SNAPSHOT")
}
java {

View File

@@ -0,0 +1,40 @@
package net.momirealms.craftengine.bukkit.compatibility.slimeworld;
import com.infernalsuite.asp.api.AdvancedSlimePaperAPI;
import com.infernalsuite.asp.api.events.LoadSlimeWorldEvent;
import com.infernalsuite.asp.api.world.SlimeWorld;
import net.momirealms.craftengine.core.world.World;
import net.momirealms.craftengine.core.world.WorldManager;
import net.momirealms.craftengine.core.world.chunk.storage.DefaultStorageAdaptor;
import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
public class SlimeFormatStorageAdaptor extends DefaultStorageAdaptor implements Listener {
private final WorldManager worldManager;
@EventHandler
public void onWorldLoad(LoadSlimeWorldEvent event) {
org.bukkit.World world = Bukkit.getWorld(event.getSlimeWorld().getName());
this.worldManager.loadWorld(this.worldManager.wrap(world));
}
public SlimeFormatStorageAdaptor(WorldManager worldManager) {
this.worldManager = worldManager;
}
public SlimeWorld getWorld(String name) {
return AdvancedSlimePaperAPI.instance().getLoadedWorld(name);
}
@Override
public @NotNull WorldDataStorage adapt(@NotNull World world) {
SlimeWorld slimeWorld = getWorld(world.name());
if (slimeWorld == null) {
return super.adapt(world);
}
return new SlimeWorldDataStorage(slimeWorld);
}
}

View File

@@ -0,0 +1,68 @@
package net.momirealms.craftengine.bukkit.compatibility.slimeworld;
import com.infernalsuite.asp.api.world.SlimeChunk;
import com.infernalsuite.asp.api.world.SlimeWorld;
import net.kyori.adventure.nbt.BinaryTag;
import net.kyori.adventure.nbt.ByteArrayBinaryTag;
import net.momirealms.craftengine.core.world.ChunkPos;
import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.NBT;
import org.jetbrains.annotations.Nullable;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.lang.ref.WeakReference;
public class SlimeWorldDataStorage implements WorldDataStorage {
private final WeakReference<SlimeWorld> slimeWorld;
public SlimeWorldDataStorage(SlimeWorld slimeWorld) {
this.slimeWorld = new WeakReference<>(slimeWorld);
}
public SlimeWorld getWorld() {
return slimeWorld.get();
}
@Nullable
@Override
public CompoundTag readChunkTagAt(ChunkPos pos) {
SlimeChunk slimeChunk = getWorld().getChunk(pos.x, pos.z);
if (slimeChunk == null) return null;
BinaryTag tag = slimeChunk.getExtraData().get("craftengine");
if (tag == null) return null;
ByteArrayBinaryTag byteArrayBinaryTag = (ByteArrayBinaryTag) tag;
try {
return NBT.readCompound(new DataInputStream(new ByteArrayInputStream(byteArrayBinaryTag.value())));
} catch (IOException e) {
throw new RuntimeException("Failed to read chunk tag from slime world. " + pos, e);
}
}
@Override
public void writeChunkTagAt(ChunkPos pos, @Nullable CompoundTag nbt) {
SlimeChunk slimeChunk = getWorld().getChunk(pos.x, pos.z);
if (slimeChunk == null) return;
if (nbt == null) {
slimeChunk.getExtraData().remove("craftengine");
} else {
slimeChunk.getExtraData().computeIfAbsent("craftengine", l -> {
try {
return ByteArrayBinaryTag.byteArrayBinaryTag(NBT.toBytes(nbt));
} catch (IOException e) {
throw new RuntimeException("Failed to write chunk tag to slime world. " + pos, e);
}
});
}
}
@Override
public void flush() {
}
@Override
public void close() throws IOException {
}
}