9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 01:49:30 +00:00

Merge pull request #160 from jhqwqmc/fawe-hotfix

Fawe hotfix
This commit is contained in:
XiaoMoMi
2025-05-06 15:44:34 +08:00
committed by GitHub
12 changed files with 68 additions and 20 deletions

View File

@@ -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();

View File

@@ -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:

View File

@@ -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>"

View File

@@ -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>"

View File

@@ -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);

View File

@@ -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()) {

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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 + "/";
}

View File

@@ -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)) {

View File

@@ -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();
}
}

View File

@@ -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