From 42d59762a75414069cd87332ffd4353eff129e9b Mon Sep 17 00:00:00 2001 From: Disy <72013933+disymayufei@users.noreply.github.com> Date: Mon, 1 May 2023 12:07:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8/sit?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E6=97=B6=E7=9A=84=E5=90=84=E7=A7=8D=E5=A5=87?= =?UTF-8?q?=E8=91=A9=E9=97=AE=E9=A2=98=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: 各种坐下指令的bug --- .../zly2006/carpetslsaddition/ServerMain.java | 75 ++++++++++++++++--- .../mixin/entity/MixinPlayerEntity.java | 19 +---- 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/ServerMain.java b/src/main/java/com/github/zly2006/carpetslsaddition/ServerMain.java index c0d7747..a333a3b 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/ServerMain.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/ServerMain.java @@ -2,11 +2,8 @@ package com.github.zly2006.carpetslsaddition; import carpet.CarpetExtension; import carpet.CarpetServer; -import com.github.zly2006.carpetslsaddition.command.BotCommand; -import com.github.zly2006.carpetslsaddition.command.HatCommand; -import com.github.zly2006.carpetslsaddition.command.SitCommand; import com.github.zly2006.carpetslsaddition.network.pca.PcaSyncProtocol; -import com.github.zly2006.carpetslsaddition.util.access.SettingsManagerAccessor; +import com.github.zly2006.carpetslsaddition.util.SitEntity; import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -16,13 +13,28 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.Version; import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.ShapedRecipe; +import net.minecraft.recipe.book.CraftingRecipeCategory; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.world.World; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.io.InputStream; +import java.util.List; import java.util.Map; public class ServerMain implements ModInitializer, CarpetExtension { @@ -46,7 +58,6 @@ public class ServerMain implements ModInitializer, CarpetExtension { public void onInitialize() { INSTANCE = this; CarpetServer.manageExtension(this); - PcaSyncProtocol.init(); } @Override @@ -54,12 +65,24 @@ public class ServerMain implements ModInitializer, CarpetExtension { ServerMain.server = server; CarpetServer.settingsManager.parseSettingsClass(SLSCarpetSettings.class); ((SettingsManagerAccessor) CarpetServer.settingsManager).loadSettings(); + if (false) { + ItemStack stack = new ItemStack(Items.STONE_PICKAXE); + stack.setCustomName(Text.empty().formatted(Formatting.LIGHT_PURPLE).append("黑曜石镐")); + stack.getOrCreateSubNbt(MOD_ID).putString(ITEM_NAME, OBSIDIAN_PICKAXE); + DefaultedList ingredients = DefaultedList.ofSize(9, Ingredient.EMPTY); + ingredients.set(0, Ingredient.ofItems(Items.OBSIDIAN)); + ingredients.set(1, Ingredient.ofItems(Items.OBSIDIAN)); + ingredients.set(2, Ingredient.ofItems(Items.OBSIDIAN)); + ingredients.set(4, Ingredient.ofItems(Items.STICK)); + ingredients.set(7, Ingredient.ofItems(Items.STICK)); + server.getRecipeManager().setRecipes(List.of(new ShapedRecipe(new Identifier(MOD_ID, "recipe.obsidian_pickaxe"), MOD_ID, CraftingRecipeCategory.EQUIPMENT, 3, 3, ingredients, stack))); + } } @Override public Map canHasTranslations(String lang) { Map translation = Maps.newHashMap(); - + PcaSyncProtocol.init(); String jsonFile; try { try (InputStream stream = ServerMain.class.getResourceAsStream("/assets/slsaddition/lang/%s.json".formatted(lang))) { @@ -86,8 +109,42 @@ public class ServerMain implements ModInitializer, CarpetExtension { @Override public void registerCommands(CommandDispatcher dispatcher, CommandRegistryAccess commandBuildContext) { - HatCommand.register(dispatcher); - SitCommand.register(dispatcher); - BotCommand.register(dispatcher); + dispatcher.register(CommandManager.literal("hat") + .requires(ServerCommandSource::isExecutedByPlayer) + .requires((commandSource) -> SLSCarpetSettings.canUseHatCommand) + .executes(context -> { + ServerPlayerEntity player = context.getSource().getPlayer(); + assert player != null; + ItemStack stack = player.getMainHandStack(); + ItemStack head = player.getEquippedStack(EquipmentSlot.HEAD); + player.equipStack(EquipmentSlot.HEAD, stack); + player.getInventory().setStack(player.getInventory().selectedSlot, head); + player.currentScreenHandler.syncState(); + + return 1; + })); + + dispatcher.register(CommandManager.literal("sit") + .requires(ServerCommandSource::isExecutedByPlayer) + .requires((commandSource) -> SLSCarpetSettings.canUseSitCommand) + .executes(context -> { + ServerPlayerEntity player = context.getSource().getPlayer(); + assert player != null; + + if (player.getVehicle() != null) { // 防止重复的坐下行为 + return 1; + } + + World world = player.getWorld(); + + ArmorStandEntity armorStandEntity = new ArmorStandEntity(world, player.getX(), player.getY(), player.getZ()); + ((SitEntity) armorStandEntity).setSitEntity(true); + world.spawnEntity(armorStandEntity); + player.setSneaking(false); + player.startRiding(armorStandEntity); + + return 1; + }) + ); } } diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinPlayerEntity.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinPlayerEntity.java index 32a47ee..1effdbb 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinPlayerEntity.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinPlayerEntity.java @@ -1,6 +1,6 @@ package com.github.zly2006.carpetslsaddition.mixin.entity; -import com.github.zly2006.carpetslsaddition.util.access.PlayerAccess; +import com.github.zly2006.carpetslsaddition.PlayerAccess; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.EquipmentSlot; @@ -8,7 +8,6 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.stat.Stat; -import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -23,10 +22,6 @@ public abstract class MixinPlayerEntity implements PlayerAccess { @Shadow public abstract void resetStat(Stat stat); - @Shadow public abstract Text getName(); - - private Text displayName = null; - @Override public boolean holdingObsidianPickaxe() { ItemStack itemStack = getEquippedStack(EquipmentSlot.MAINHAND); @@ -34,18 +29,6 @@ public abstract class MixinPlayerEntity implements PlayerAccess { return compound != null && compound.contains(ITEM_NAME) && compound.getString(ITEM_NAME).equals(OBSIDIAN_PICKAXE); } - @Override - public void setDisplayName(Text name) { - this.displayName = name; - } - - @Inject(method = "getDisplayName", at = @At("HEAD"), cancellable = true) - public void injectGetDisplayName(CallbackInfoReturnable cir) { - if (this.displayName != null) { - cir.setReturnValue(displayName); - } - } - @Inject(method = "getBlockBreakingSpeed", at = @At("HEAD"), cancellable = true) private void onGetBlockBreakingSpeed(BlockState block, CallbackInfoReturnable cir) {