修复玩家因下落的方块和刻意的游戏设计而死亡导致服务器崩溃

Fixes #223
This commit is contained in:
Xujiayao 2024-03-17 16:33:33 +08:00
parent c71a41f1e4
commit a21eb8fc14
4 changed files with 33 additions and 32 deletions

View file

@ -13,9 +13,6 @@ import net.fellbaum.jemoji.EmojiManager;
import net.minecraft.ChatFormatting;
import net.minecraft.advancements.DisplayInfo;
import net.minecraft.network.chat.Component;
//#if MC >= 11900
import net.minecraft.network.chat.ComponentContents;
//#endif
import net.minecraft.network.chat.MutableComponent;
//#if MC < 11900
//$$ import net.minecraft.network.chat.TextComponent;
@ -247,40 +244,21 @@ public class MinecraftEventListener {
}
});
MinecraftEvents.PLAYER_DIE.register((player, source) -> {
MinecraftEvents.PLAYER_DIE.register(player -> {
if (CONFIG.generic.announceDeathMessages) {
//#if MC >= 11900
TranslatableContents deathMessage = (TranslatableContents) source.getLocalizedDeathMessage(player).getContents();
TranslatableContents deathMessage = (TranslatableContents) player.getCombatTracker().getDeathMessage().getContents();
//#else
//$$ TranslatableComponent deathMessage = (TranslatableComponent) source.getLocalizedDeathMessage(player);
//$$ TranslatableComponent deathMessage = (TranslatableComponent) player.getCombatTracker().getDeathMessage();
//#endif
String key = deathMessage.getKey();
Object[] args = new String[deathMessage.getArgs().length];
for (int i = 0; i < deathMessage.getArgs().length; i++) {
Object object = deathMessage.getArgs()[i];
if (object instanceof Component component) {
//#if MC >= 11900
ComponentContents componentContents = component.getContents();
if (componentContents instanceof TranslatableContents) {
args[i] = Translations.translate(((TranslatableContents) componentContents).getKey());
//#else
//$$ if (component instanceof TranslatableComponent) {
//$$ args[i] = Translations.translate(((TranslatableComponent) component).getKey());
//#endif
} else {
args[i] = component.getString();
}
} else {
args[i] = object == null ? "null" : object.toString();
}
}
CHANNEL.sendMessage(Translations.translateMessage("message.deathMessage")
.replace("%deathMessage%", MarkdownSanitizer.escape(Translations.translate(key, args)))
.replace("%deathMessage%", MarkdownSanitizer.escape(Translations.translate(key, deathMessage.getArgs())))
.replace("%playerName%", MarkdownSanitizer.escape(Objects.requireNonNull(player.getDisplayName()).getString()))).queue();
if (CONFIG.multiServer.enable) {
MULTI_SERVER.sendMessage(false, false, false, null, Translations.translateMessage("message.deathMessage")
.replace("%deathMessage%", MarkdownSanitizer.escape(Translations.translate(key, args)))
.replace("%deathMessage%", MarkdownSanitizer.escape(Translations.translate(key, deathMessage.getArgs())))
.replace("%playerName%", MarkdownSanitizer.escape(player.getDisplayName().getString())));
}
}

View file

@ -6,7 +6,6 @@ import net.minecraft.advancements.AdvancementHolder;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.damagesource.DamageSource;
import java.util.Optional;
@ -41,9 +40,9 @@ public interface MinecraftEvents {
}
});
Event<PlayerDie> PLAYER_DIE = EventFactory.createArrayBacked(PlayerDie.class, callbacks -> (player, source) -> {
Event<PlayerDie> PLAYER_DIE = EventFactory.createArrayBacked(PlayerDie.class, callbacks -> player -> {
for (PlayerDie callback : callbacks) {
callback.die(player, source);
callback.die(player);
}
});
@ -77,7 +76,7 @@ public interface MinecraftEvents {
}
interface PlayerDie {
void die(ServerPlayer player, DamageSource source);
void die(ServerPlayer player);
}
interface PlayerJoin {

View file

@ -16,6 +16,6 @@ public class MixinServerPlayer {
@Inject(method = "die(Lnet/minecraft/world/damagesource/DamageSource;)V", at = @At("HEAD"))
private void die(DamageSource damageSource, CallbackInfo ci) {
MinecraftEvents.PLAYER_DIE.invoker().die((ServerPlayer) (Object) this, damageSource);
MinecraftEvents.PLAYER_DIE.invoker().die((ServerPlayer) (Object) this);
}
}

View file

@ -5,6 +5,11 @@ import com.google.gson.reflect.TypeToken;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.DetectedVersion;
import net.minecraft.locale.Language;
import net.minecraft.network.chat.Component;
//#if MC >= 11900
import net.minecraft.network.chat.ComponentContents;
//#endif
import net.minecraft.network.chat.contents.TranslatableContents;
import okhttp3.CacheControl;
import okhttp3.Request;
import okhttp3.Response;
@ -105,6 +110,25 @@ public class Translations {
}
public static String translate(String key, Object... args) {
for (int i = 0; i < args.length; i++) {
Object object = args[i];
if (object instanceof Component component) {
//#if MC >= 11900
ComponentContents componentContents = component.getContents();
if (componentContents instanceof TranslatableContents translatable) {
args[i] = translate(translatable.getKey(), translatable.getArgs());
//#else
//$$ if (component instanceof TranslatableComponent translatable) {
//$$ args[i] = translate(translatable.getKey(), translatable.getArgs());
//#endif
} else {
args[i] = component.getString();
}
} else {
args[i] = object == null ? "null" : object.toString();
}
}
String translation1 = translations.get(key);
if (translation1 != null) {
return String.format(translation1, args);