From 43a6b49e9edfe488b78663367795b0efe0073ffc Mon Sep 17 00:00:00 2001 From: Disy Date: Tue, 25 Jun 2024 00:09:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9D=91=E6=B0=91=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=A0=86=E6=A0=88=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- .../carpetslsaddition/SLSCarpetSettings.java | 3 ++ .../mixin/entity/MixinVillagerEntity.java | 39 +++++++++++++++++++ .../assets/slsaddition/lang/en_us.json | 2 + .../assets/slsaddition/lang/zh_cn.json | 2 + src/main/resources/slsaddition.mixins.json | 2 - 6 files changed, 47 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 30d0d02..51a2bed 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ org.gradle.jvmargs=-Xmx1G # Mod Properties - mod_version = 0.11.0 + mod_version = 0.11.1 maven_group = com.github.zly2006 archives_base_name = carpet-sls-addition diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/SLSCarpetSettings.java b/src/main/java/com/github/zly2006/carpetslsaddition/SLSCarpetSettings.java index 6b55106..a90919a 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/SLSCarpetSettings.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/SLSCarpetSettings.java @@ -53,4 +53,7 @@ public class SLSCarpetSettings { @Rule(categories = {CARPET_ID, RuleCategory.OPTIMIZATION}) public static boolean optimizedOnDragonRespawn = false; + + @Rule(categories = {CARPET_ID, RuleCategory.FEATURE}) + public static boolean printStackTraceOnVillagerSpawn = false; } diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinVillagerEntity.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinVillagerEntity.java index 28da752..a25f49e 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinVillagerEntity.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinVillagerEntity.java @@ -1,17 +1,24 @@ package com.github.zly2006.carpetslsaddition.mixin.entity; import com.github.zly2006.carpetslsaddition.SLSCarpetSettings; +import com.github.zly2006.carpetslsaddition.ServerMain; +import net.minecraft.entity.EntityData; import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnReason; import net.minecraft.entity.passive.MerchantEntity; import net.minecraft.entity.passive.VillagerEntity; import net.minecraft.village.VillagerData; import net.minecraft.village.VillagerProfession; +import net.minecraft.world.LocalDifficulty; +import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(VillagerEntity.class) public abstract class MixinVillagerEntity extends MerchantEntity { @@ -19,11 +26,43 @@ public abstract class MixinVillagerEntity extends MerchantEntity { @Shadow protected abstract void decayGossip(); + @Unique int tickCount = 0; + public MixinVillagerEntity(EntityType entityType, World world) { super(entityType, world); } + @Inject(at = @At("HEAD"), method = "initialize") + private void injectInitialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CallbackInfoReturnable cir) { + if (SLSCarpetSettings.printStackTraceOnVillagerSpawn) { + var logBuilder = new StringBuilder("\n=== Villager Spawn Report ===\n"); + logBuilder.append("// Generated by Carpet SLS Addition\n"); + try { + logBuilder.append("- Spawn Reason: ").append(spawnReason.toString()).append("\n"); + logBuilder.append("- World: ").append(this.getWorld().getRegistryKey().getValue().toString()).append("\n"); + logBuilder.append("- Position: ").append("(x=%.2f, y=%.2f, z=%.2f)".formatted(this.getX(), this.getY(), this.getZ())).append("\n"); + logBuilder.append("- Stack Trance: "); + + var exception = new Exception(); + for (var element : exception.getStackTrace()) { + logBuilder.append("\n ").append(element.toString()); + } + } + catch (Exception e) { + logBuilder.append("// Sorry but we fail to generate the villager spawn report.\n"); + logBuilder.append("- Error Stack Trance: "); + + for (var element : e.getStackTrace()) { + logBuilder.append("\n ").append(element.toString()); + } + } + + logBuilder.append("\n ================================"); + ServerMain.LOGGER.warn(logBuilder.toString()); + } + } + @Inject(at = @At("HEAD"), method = "tick", cancellable = true) private void onTick(CallbackInfo ci) { if (SLSCarpetSettings.skipTicksForJoblessVillager != 0) { diff --git a/src/main/resources/assets/slsaddition/lang/en_us.json b/src/main/resources/assets/slsaddition/lang/en_us.json index 2304536..54e314e 100644 --- a/src/main/resources/assets/slsaddition/lang/en_us.json +++ b/src/main/resources/assets/slsaddition/lang/en_us.json @@ -22,6 +22,7 @@ "carpet.rule.enableCCESuppressor.name": "Enable CCE suppressor.", "carpet.rule.fakePlayersNotOccupiedSleepQuota.name": "Fake players do not occupy sleep quotas.", "carpet.rule.endermanCanPickUpMushroom.name": "Enderman can pick up mushroom", + "carpet.rule.printStackTraceOnVillagerSpawn.name": "Print the stack trace when a villager spawns", "carpet.rule.obtainableReinforcedDeepSlate.desc": "When an anvil falls on 64 dropped deepslates, they will be turned in a reinforced deepslate instead of disappearing.", "carpet.rule.skipTicksForJoblessVillager.desc": "For jobless/nitwit villagers, after performing a set number of tick operations, skip the 1 tick operation.", @@ -41,6 +42,7 @@ "carpet.rule.enableCCESuppressor.desc": "Make CCE suppressors from 1.20.1 and earlier versions available again.", "carpet.rule.fakePlayersNotOccupiedSleepQuota.desc": "Make the fake player generated by Carpet no longer occupy sleep quotas", "carpet.rule.endermanCanPickUpMushroom.desc": "Enderman can pick up the mushroom plant if enabled", + "carpet.rule.printStackTraceOnVillagerSpawn.desc": "Print the report to the server console when a villager spawns", "carpet.rule.skipTicksForJoblessVillager.extra.0": "Set to 0 to maintain the vanilla behavior", "carpet.rule.skipTicksForJoblessVillager.extra.1": "Set to a number greater than 0, the value will be +1 based on the setting", diff --git a/src/main/resources/assets/slsaddition/lang/zh_cn.json b/src/main/resources/assets/slsaddition/lang/zh_cn.json index 324f0e7..35ac7f5 100644 --- a/src/main/resources/assets/slsaddition/lang/zh_cn.json +++ b/src/main/resources/assets/slsaddition/lang/zh_cn.json @@ -22,6 +22,7 @@ "carpet.rule.enableCCESuppressor.name": "恢复CCE抑制器", "carpet.rule.fakePlayersNotOccupiedSleepQuota.name": "假人不占用睡眠名额", "carpet.rule.endermanCanPickUpMushroom.name": "末影人可拿起蘑菇", + "carpet.rule.printStackTraceOnVillagerSpawn.name": "打印村民生成报告", "carpet.rule.obtainableReinforcedDeepSlate.desc": "当铁砧在64个深板岩的掉落物上时,可以获得强化深板岩", "carpet.rule.skipTicksForJoblessVillager.desc": "对于无业/傻子村民,执行设定数量的tick运算后,跳过1tick的运算", @@ -41,6 +42,7 @@ "carpet.rule.enableCCESuppressor.desc": "让1.20.1及更早的CCE抑制器变得再次可用", "carpet.rule.fakePlayersNotOccupiedSleepQuota.desc": "让假人不再占用睡眠名额,这样即使假人不睡觉也能跳过夜晚", "carpet.rule.endermanCanPickUpMushroom.desc": "如果该选项打开,则末影人可以捡起地上的蘑菇", + "carpet.rule.printStackTraceOnVillagerSpawn.desc": "当有村民生成时,将会生成一份包含调用栈的报告,显示在控制端中", "carpet.rule.skipTicksForJoblessVillager.extra.0": "设置为0则保持原版行为", "carpet.rule.skipTicksForJoblessVillager.extra.1": "设置为大于0的数,将在设置的基础上将该值+1", diff --git a/src/main/resources/slsaddition.mixins.json b/src/main/resources/slsaddition.mixins.json index 961ccbc..8fc5480 100644 --- a/src/main/resources/slsaddition.mixins.json +++ b/src/main/resources/slsaddition.mixins.json @@ -22,9 +22,7 @@ "entity.MixinServerPlayerEntity", "entity.MixinVillagerEntity", "player.MixinPlayerInventory", - "player.AccessorPlayerAbilities", "screen.MixinAnvilScreenHandler", - "screen.MixinSlot", "server.MixinMinecraftServer", "shulker.MixinItemStack", "shulker.MixinScreenHandler",