mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-25 01:49:30 +00:00
@@ -1,8 +1,10 @@
|
||||
package net.momirealms.craftengine.bukkit.compatibility.worldedit;
|
||||
|
||||
import com.fastasyncworldedit.bukkit.adapter.FaweAdapter;
|
||||
import com.fastasyncworldedit.core.configuration.Settings;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
||||
import com.sk89q.worldedit.event.extent.EditSessionEvent;
|
||||
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
|
||||
import com.sk89q.worldedit.function.mask.Mask;
|
||||
@@ -32,6 +34,7 @@ import java.util.Set;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
|
||||
private final FaweAdapter<?, ?> adapter = (FaweAdapter<?, ?>) WorldEditPlugin.getInstance().getBukkitImplAdapter();
|
||||
private final Set<CEChunk> chunksToSave;
|
||||
private final CEWorld ceWorld;
|
||||
|
||||
@@ -139,10 +142,10 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
|
||||
private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException {
|
||||
int chunkX = blockX >> 4;
|
||||
int chunkZ = blockZ >> 4;
|
||||
int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString()));
|
||||
// int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString()));
|
||||
if (BlockStateUtils.isVanillaBlock(newStateId) /* && BlockStateUtils.isVanillaBlock(oldStateId) */)
|
||||
return;
|
||||
int newStateId = BlockStateUtils.blockDataToId(this.adapter.adapt(blockState));
|
||||
int oldStateId = BlockStateUtils.blockDataToId(this.adapter.adapt(oldBlockState));
|
||||
CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId);
|
||||
if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return;
|
||||
CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ))
|
||||
.orElse(this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ)));
|
||||
ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(newStateId);
|
||||
@@ -157,6 +160,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
|
||||
private void saveAllChunks() {
|
||||
try {
|
||||
for (CEChunk ceChunk : this.chunksToSave) {
|
||||
CraftEngine.instance().debug(() -> "Saving chunk " + ceChunk.chunkPos());
|
||||
this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true);
|
||||
}
|
||||
this.chunksToSave.clear();
|
||||
|
||||
@@ -78,6 +78,8 @@ resource-pack:
|
||||
ip: "localhost"
|
||||
port: 8163
|
||||
protocol: "http"
|
||||
# The optional URL must be complete and include a trailing slash / at the end.
|
||||
#url: "http://localhost:8163/"
|
||||
deny-non-minecraft-request: true
|
||||
one-time-token: true
|
||||
rate-limit:
|
||||
|
||||
@@ -272,6 +272,7 @@ warning.config.host.s3.missing_secret: "<yellow>Issue found in config.yml at 're
|
||||
warning.config.host.s3.missing_upload_path: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'upload-path' argument for s3 host.</yellow>"
|
||||
warning.config.host.self.missing_ip: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'ip' argument for self host.</yellow>"
|
||||
warning.config.host.self.invalid_port: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Invalid port '<arg:0>' for self host.</yellow>"
|
||||
warning.config.host.self.invalid_url: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Invalid url '<arg:0>' for self host.</yellow>"
|
||||
warning.config.host.gitlab.missing_url: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'gitlab-url' argument for gitlab host.</yellow>"
|
||||
warning.config.host.gitlab.missing_token: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'access-token' argument for gitlab host.</yellow>"
|
||||
warning.config.host.gitlab.missing_project: "<yellow>Issue found in config.yml at 'resource-pack.delivery.hosting' - Missing required 'project-id' argument for gitlab host.</yellow>"
|
||||
|
||||
@@ -274,6 +274,7 @@ warning.config.host.s3.missing_secret: "<yellow>在 config.yml 的 'resource-pac
|
||||
warning.config.host.s3.missing_upload_path: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - S3 托管缺少必需的 'upload-path' 参数</yellow>"
|
||||
warning.config.host.self.missing_ip: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 自托管托管缺少必需的 'ip' 参数</yellow>"
|
||||
warning.config.host.self.invalid_port: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 自托管托管的端口 '<arg:0>' 无效</yellow>"
|
||||
warning.config.host.self.invalid_url: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - 自托管托管的 URL '<arg:0>' 无效</yellow>"
|
||||
warning.config.host.gitlab.missing_url: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - GitLab 托管缺少必需的 'gitlab-url' 参数</yellow>"
|
||||
warning.config.host.gitlab.missing_token: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - GitLab 托管缺少必需的 'access-token' 参数</yellow>"
|
||||
warning.config.host.gitlab.missing_project: "<yellow>在 config.yml 的 'resource-pack.delivery.hosting' 处发现问题 - GitLab 托管缺少必需的 'project-id' 参数</yellow>"
|
||||
|
||||
@@ -4,6 +4,7 @@ import net.kyori.adventure.text.Component;
|
||||
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
|
||||
import net.momirealms.craftengine.core.plugin.locale.LocalizedException;
|
||||
import net.momirealms.craftengine.core.plugin.locale.MessageConstants;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.incendo.cloud.Command;
|
||||
@@ -68,7 +69,6 @@ public class ReloadCommand extends BukkitCommandFeature<CommandSender> {
|
||||
long time2 = System.currentTimeMillis();
|
||||
long packTime = time2 - time1;
|
||||
handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_SUCCESS, Component.text(packTime));
|
||||
|
||||
} catch (Exception e) {
|
||||
handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE);
|
||||
plugin().logger().warn("Failed to generate resource pack", e);
|
||||
|
||||
@@ -34,6 +34,7 @@ import net.momirealms.craftengine.core.plugin.config.Config;
|
||||
import net.momirealms.craftengine.core.plugin.network.ConnectionState;
|
||||
import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
|
||||
import net.momirealms.craftengine.core.plugin.network.NetworkManager;
|
||||
import net.momirealms.craftengine.core.plugin.network.ProtocolVersion;
|
||||
import net.momirealms.craftengine.core.util.*;
|
||||
import net.momirealms.craftengine.core.world.BlockHitResult;
|
||||
import net.momirealms.craftengine.core.world.BlockPos;
|
||||
@@ -1348,7 +1349,7 @@ public class PacketConsumers {
|
||||
// When the hotbar is full, the latest creative mode inventory can only be accessed when the player opens the inventory screen. Currently, it is not worth further handling this issue.
|
||||
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SET_CREATIVE_SLOT = (user, event, packet) -> {
|
||||
try {
|
||||
if (VersionHelper.isOrAbove1_21_4()) return;
|
||||
if (user.protocolVersion().isVersionNewerThan(ProtocolVersion.V1_21_4)) return;
|
||||
if (!user.isOnline()) return;
|
||||
BukkitServerPlayer player = (BukkitServerPlayer) user;
|
||||
if (VersionHelper.isFolia()) {
|
||||
|
||||
@@ -44,6 +44,7 @@ import java.util.*;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static net.momirealms.craftengine.core.util.MiscUtils.castToMap;
|
||||
|
||||
@@ -141,6 +142,7 @@ public abstract class AbstractPackManager implements PackManager {
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
initFileSystemProvider();
|
||||
List<Map<?, ?>> list = Config.instance().settings().getMapList("resource-pack.delivery.hosting");
|
||||
if (list == null || list.isEmpty()) {
|
||||
this.resourcePackHost = NoneHost.INSTANCE;
|
||||
@@ -484,6 +486,36 @@ public abstract class AbstractPackManager implements PackManager {
|
||||
}
|
||||
}
|
||||
|
||||
private static void initFileSystemProvider() {
|
||||
String osName = System.getProperty("os.name").toLowerCase();
|
||||
String providerClass = null;
|
||||
if (osName.contains("win")) {
|
||||
providerClass = "sun.nio.fs.WindowsFileSystemProvider";
|
||||
} else if (osName.contains("nix") || osName.contains("nux") || osName.contains("aix")) {
|
||||
providerClass = "sun.nio.fs.LinuxFileSystemProvider";
|
||||
} else if (osName.contains("mac")) {
|
||||
providerClass = "sun.nio.fs.MacOSXFileSystemProvider";
|
||||
}
|
||||
if (providerClass != null) {
|
||||
try {
|
||||
System.setProperty("java.nio.file.spi.DefaultFileSystemProvider", providerClass);
|
||||
} catch (Exception ignored) {}
|
||||
}
|
||||
}
|
||||
|
||||
private static void deleteDirectory(Path folder) throws IOException {
|
||||
if (!Files.exists(folder)) return;
|
||||
try (Stream<Path> walk = Files.walk(folder)) {
|
||||
walk.sorted(Comparator.reverseOrder())
|
||||
.parallel()
|
||||
.forEach(path -> {
|
||||
try {
|
||||
Files.delete(path);
|
||||
} catch (IOException ignored) {}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateResourcePack() {
|
||||
this.plugin.logger().info("Generating resource pack...");
|
||||
@@ -494,7 +526,7 @@ public abstract class AbstractPackManager implements PackManager {
|
||||
.resolve("resource_pack");
|
||||
|
||||
try {
|
||||
org.apache.commons.io.FileUtils.deleteDirectory(generatedPackPath.toFile());
|
||||
deleteDirectory(generatedPackPath);
|
||||
} catch (IOException e) {
|
||||
this.plugin.logger().severe("Error deleting previous resource pack", e);
|
||||
}
|
||||
|
||||
@@ -66,6 +66,13 @@ public class SelfHost implements ResourcePackHost {
|
||||
if (port <= 0 || port > 65535) {
|
||||
throw new LocalizedException("warning.config.host.self.invalid_port", String.valueOf(port));
|
||||
}
|
||||
String url = arguments.getOrDefault("url", "").toString();
|
||||
if (!url.isEmpty()) {
|
||||
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
||||
throw new LocalizedException("warning.config.host.self.invalid_url", url);
|
||||
}
|
||||
if (!url.endsWith("/")) url += "/";
|
||||
}
|
||||
boolean oneTimeToken = (boolean) arguments.getOrDefault("one-time-token", true);
|
||||
String protocol = arguments.getOrDefault("protocol", "http").toString();
|
||||
boolean denyNonMinecraftRequest = (boolean) arguments.getOrDefault("deny-non-minecraft-request", true);
|
||||
@@ -76,7 +83,7 @@ public class SelfHost implements ResourcePackHost {
|
||||
maxRequests = ResourceConfigUtils.getAsInt(rateMap.getOrDefault("max-requests", 5), "max-requests");
|
||||
resetInterval = ResourceConfigUtils.getAsInt(rateMap.getOrDefault("reset-interval", 20), "reset-interval") * 1000;
|
||||
}
|
||||
selfHostHttpServer.updateProperties(ip, port, denyNonMinecraftRequest, protocol, maxRequests, resetInterval, oneTimeToken);
|
||||
selfHostHttpServer.updateProperties(ip, port, url, denyNonMinecraftRequest, protocol, maxRequests, resetInterval, oneTimeToken);
|
||||
return INSTANCE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ public class SelfHostHttpServer {
|
||||
private String ip = "localhost";
|
||||
private int port = -1;
|
||||
private String protocol = "http";
|
||||
private String url;
|
||||
private boolean denyNonMinecraft = true;
|
||||
private boolean useToken;
|
||||
|
||||
@@ -57,12 +58,14 @@ public class SelfHostHttpServer {
|
||||
|
||||
public void updateProperties(String ip,
|
||||
int port,
|
||||
String url,
|
||||
boolean denyNonMinecraft,
|
||||
String protocol,
|
||||
int maxRequests,
|
||||
int resetInternal,
|
||||
boolean token) {
|
||||
this.ip = ip;
|
||||
this.url = url;
|
||||
this.denyNonMinecraft = denyNonMinecraft;
|
||||
this.protocol = protocol;
|
||||
this.rateLimit = maxRequests;
|
||||
@@ -112,6 +115,9 @@ public class SelfHostHttpServer {
|
||||
}
|
||||
|
||||
public String url() {
|
||||
if (this.url != null && !this.url.isEmpty()) {
|
||||
return this.url;
|
||||
}
|
||||
return this.protocol + "://" + this.ip + ":" + this.port + "/";
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,10 @@ public enum ProtocolVersion {
|
||||
return name;
|
||||
}
|
||||
|
||||
public boolean isVersionNewerThan(ProtocolVersion targetVersion) {
|
||||
return this.getId() >= targetVersion.getId();
|
||||
}
|
||||
|
||||
public static ProtocolVersion getByName(String name) {
|
||||
for (ProtocolVersion version : values()) {
|
||||
if (version.getName().equals(name)) {
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
package net.momirealms.craftengine.core.util;
|
||||
|
||||
import net.momirealms.craftengine.core.plugin.network.ProtocolVersion;
|
||||
|
||||
public class ProtocolVersionUtils {
|
||||
|
||||
public static boolean isVersionNewerThan(ProtocolVersion version, ProtocolVersion targetVersion) {
|
||||
return version.getId() >= targetVersion.getId();
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx1G
|
||||
# Rule: [major update].[feature update].[bug fix]
|
||||
project_version=0.0.53-beta.3
|
||||
config_version=31
|
||||
lang_version=11
|
||||
lang_version=12
|
||||
project_group=net.momirealms
|
||||
latest_supported_version=1.21.5
|
||||
|
||||
@@ -40,7 +40,7 @@ geantyref_version=1.3.16
|
||||
zstd_version=1.5.7-2
|
||||
commons_io_version=2.18.0
|
||||
sparrow_nbt_version=0.7.3
|
||||
sparrow_util_version=0.39
|
||||
sparrow_util_version=0.40
|
||||
fastutil_version=8.5.15
|
||||
netty_version=4.1.119.Final
|
||||
joml_version=1.10.8
|
||||
|
||||
Reference in New Issue
Block a user