diff --git a/README.md b/README.md index 0b9b4db..853d4f6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 版本 0.0.4.0.3 提前介绍c[没有BUG的话,TeaCon最终版本将会是0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】 +# 版本 0.0.4.0.4 提前介绍c[没有BUG的话,TeaCon最终版本将会是0.0.4] 【注意:本解釋簡繁混寫,因爲趕時間,所以並不怎麽規範,請諒解】 ## 简介 现在开始你可以用拴绳拴住玩家,也可以拴住自己了,不如尝试拴住彼此来通关我的世界吧( diff --git a/gradle.properties b/gradle.properties index 246b1ae..77ccb1e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,7 +35,7 @@ mod_name=Leashed Player # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT # The mod version. See https://semver.org/ -mod_version=0.0.4.0.3 +mod_version=0.0.4.0.4 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/java/com/r3944realms/leashedplayer/compat/jei/JEIPlugin.java b/src/main/java/com/r3944realms/leashedplayer/compat/jei/JEIPlugin.java new file mode 100644 index 0000000..6f1637e --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/compat/jei/JEIPlugin.java @@ -0,0 +1,32 @@ +package com.r3944realms.leashedplayer.compat.jei; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.compat.jei.common.PotionSubtypeInterpreter; +import com.r3944realms.leashedplayer.compat.jei.crafting.TippedLeashArrowRecipeMaker; +import com.r3944realms.leashedplayer.content.items.ModItemRegister; +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.constants.RecipeTypes; +import mezz.jei.api.registration.IRecipeRegistration; +import mezz.jei.api.registration.ISubtypeRegistration; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; + +@JeiPlugin +public class JEIPlugin implements IModPlugin { + private static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, "jei_plugin"); + @Override + public @NotNull ResourceLocation getPluginUid() { + return UID; + } + + @Override + public void registerItemSubtypes(ISubtypeRegistration registration) { + registration.registerSubtypeInterpreter(ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get(), PotionSubtypeInterpreter.INSTANCE); + } + + @Override + public void registerRecipes(@NotNull IRecipeRegistration registration) { + registration.addRecipes(RecipeTypes.CRAFTING, TippedLeashArrowRecipeMaker.createRecipes()); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/compat/jei/common/PotionSubtypeInterpreter.java b/src/main/java/com/r3944realms/leashedplayer/compat/jei/common/PotionSubtypeInterpreter.java new file mode 100644 index 0000000..288aa99 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/compat/jei/common/PotionSubtypeInterpreter.java @@ -0,0 +1,28 @@ +package com.r3944realms.leashedplayer.compat.jei.common; + +import mezz.jei.api.ingredients.subtypes.IIngredientSubtypeInterpreter; +import mezz.jei.api.ingredients.subtypes.UidContext; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.PotionContents; +import org.jetbrains.annotations.NotNull; + +public class PotionSubtypeInterpreter implements IIngredientSubtypeInterpreter { + public static final PotionSubtypeInterpreter INSTANCE = new PotionSubtypeInterpreter(); + + private PotionSubtypeInterpreter() { + + } + + @Override + public @NotNull String apply(ItemStack itemStack, @NotNull UidContext context) { + if (itemStack.getComponentsPatch().isEmpty()) { + return IIngredientSubtypeInterpreter.NONE; + } + PotionContents contents = itemStack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY); + String itemDescriptionId = itemStack.getItem().getDescriptionId(); + String potionEffectId = contents.potion().map(Holder::getRegisteredName).orElse("none"); + return itemDescriptionId + ".effect_id." + potionEffectId; + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/compat/jei/crafting/TippedLeashArrowRecipeMaker.java b/src/main/java/com/r3944realms/leashedplayer/compat/jei/crafting/TippedLeashArrowRecipeMaker.java new file mode 100644 index 0000000..b833ee3 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/compat/jei/crafting/TippedLeashArrowRecipeMaker.java @@ -0,0 +1,77 @@ +package com.r3944realms.leashedplayer.compat.jei.crafting; + +import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.compat.jei.util.RegistryUtil; +import com.r3944realms.leashedplayer.content.items.ModItemRegister; +import net.minecraft.core.NonNullList; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.item.crafting.*; +import net.neoforged.neoforge.common.crafting.DataComponentIngredient; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public final class TippedLeashArrowRecipeMaker { + private static List> createRecipesA() { + String group = "jei.tipped.leash_rope_arrow_a"; + ItemStack arrowStack = new ItemStack(ModItemRegister.LEASH_ROPE_ARROW.get()); + Ingredient arrowIngredient = Ingredient.of(arrowStack); + + Registry potionRegistry = RegistryUtil.getRegistry(Registries.POTION); + return potionRegistry.holders() + .map(potion -> { + ItemStack input = PotionContents.createItemStack(Items.LINGERING_POTION, potion); + ItemStack output = PotionContents.createItemStack(ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get(), potion); + output.setCount(8); + + Ingredient potionIngredient = DataComponentIngredient.of(false, input); + NonNullList inputs = NonNullList.of(Ingredient.EMPTY, + arrowIngredient, arrowIngredient, arrowIngredient, + arrowIngredient, potionIngredient, arrowIngredient, + arrowIngredient, arrowIngredient, arrowIngredient + ); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, group + "." + output.getDescriptionId()); + ShapedRecipePattern recipe = new ShapedRecipePattern(3,3, inputs, Optional.empty()); + CraftingRecipe recipe_ = new ShapedRecipe(group, CraftingBookCategory.MISC, recipe, output); + return new RecipeHolder<>(id, recipe_); + }).toList(); + } + private static List> createRecipesB() { + String group = "jei.tipped.leash_rope_arrow_b"; + ItemStack arrowStack = new ItemStack(Items.LEAD); + Ingredient arrowIngredient = Ingredient.of(arrowStack); + + Registry potionRegistry = RegistryUtil.getRegistry(Registries.POTION); + return potionRegistry.holders() + .map(potion -> { + ItemStack input = PotionContents.createItemStack(Items.TIPPED_ARROW, potion); + ItemStack output = PotionContents.createItemStack(ModItemRegister.TIPPED_LEASH_ROPE_ARROW.get(), potion); + output.setCount(1); + + Ingredient potionIngredient = DataComponentIngredient.of(false, input); + NonNullList inputs = NonNullList.of(Ingredient.EMPTY, + arrowIngredient,potionIngredient + ); + ResourceLocation id = ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, group + "." + output.getDescriptionId()); + + CraftingRecipe recipe_ = new ShapelessRecipe(group, CraftingBookCategory.MISC, output, inputs); + return new RecipeHolder<>(id, recipe_); + }).toList(); + } + public static List> createRecipes() { + List> ret = new ArrayList<>(); + ret.addAll(createRecipesA()); + ret.addAll(createRecipesB()); + return ret; + } + private TippedLeashArrowRecipeMaker() { + + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/compat/jei/util/RegistryUtil.java b/src/main/java/com/r3944realms/leashedplayer/compat/jei/util/RegistryUtil.java new file mode 100644 index 0000000..f383f54 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/compat/jei/util/RegistryUtil.java @@ -0,0 +1,23 @@ +package com.r3944realms.leashedplayer.compat.jei.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceKey; + +public class RegistryUtil { + public static Registry getRegistry(ResourceKey> key) { + RegistryAccess registryAccess = getRegistryAccess(); + return registryAccess.registryOrThrow(key); + } + + public static RegistryAccess getRegistryAccess() { + Minecraft minecraft = Minecraft.getInstance(); + ClientLevel level = minecraft.level; + if (level == null) { + throw new IllegalStateException("Could not get registry, registry access is unavailable because the level is currently null"); + } + return level.registryAccess(); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/content/effects/type/NoLeashEffect.java b/src/main/java/com/r3944realms/leashedplayer/content/effects/type/NoLeashEffect.java index 224aea3..bd3d119 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/effects/type/NoLeashEffect.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/effects/type/NoLeashEffect.java @@ -21,7 +21,7 @@ public class NoLeashEffect extends MobEffect { if(effect != null && effect.getDuration() != 0) { if (pLivingEntity instanceof Leashable leashable) { if (leashable.getLeashHolder() instanceof LeashRopeArrow arrow) { - arrow.setOwner(null); + arrow.dropLeashHandler(); leashable.dropLeash(true, false); } leashable.dropLeash(true, true); diff --git a/src/main/java/com/r3944realms/leashedplayer/content/entities/LeashRopeArrow.java b/src/main/java/com/r3944realms/leashedplayer/content/entities/LeashRopeArrow.java index eac3606..541ef24 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/entities/LeashRopeArrow.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/entities/LeashRopeArrow.java @@ -292,8 +292,7 @@ public class LeashRopeArrow extends AbstractArrow { if(leashDataEntity != null) { pL.dropLeash(true, !(leashDataEntity instanceof LeashRopeArrow)); if(leashDataEntity instanceof LeashRopeArrow leashRopeArrow) { - leashDataEntity.playSound(SoundEvents.LEASH_KNOT_BREAK, 1, 1); - leashRopeArrow.setOwner(null); + leashRopeArrow.dropLeashHandler(); } } Entity leashKnotFence = PlayerLeashable.createLeashKnotFence((ServerLevel) this.level(), pResult.getBlockPos()); @@ -336,8 +335,7 @@ public class LeashRopeArrow extends AbstractArrow { if (this.getOwner() instanceof LivingEntity livingEntity ) { MobEffectInstance effect = livingEntity.getEffect(ModEffectRegister.NO_LEASH_EFFECT); if (effect != null && effect.getDuration() != 0) { - livingEntity.playSound(SoundEvents.LEASH_KNOT_BREAK, 1, 1); - this.setOwner(null); + this.dropLeashHandler(); } } if(entity instanceof LivingEntity livingEntity) { @@ -348,8 +346,7 @@ public class LeashRopeArrow extends AbstractArrow { if(leashDataEntity != null) { pL.dropLeash(true, !(leashDataEntity instanceof LeashRopeArrow)); if(leashDataEntity instanceof LeashRopeArrow leashRopeArrow) { - leashRopeArrow.playSound(SoundEvents.LEASH_KNOT_BREAK, 1, 1); - leashRopeArrow.setOwner(null); + leashRopeArrow.dropLeashHandler(); } } ILivingEntityExtension pLL = (ILivingEntityExtension) pL; @@ -361,8 +358,7 @@ public class LeashRopeArrow extends AbstractArrow { if(leashDataEntity != null) { pL.dropLeash(true, !(leashDataEntity instanceof LeashRopeArrow)); if (leashDataEntity instanceof LeashRopeArrow leashRopeArrow) { - leashRopeArrow.playSound(SoundEvents.LEASH_KNOT_BREAK, 1, 1); - leashRopeArrow.setOwner(null); + leashRopeArrow.dropLeashHandler(); } } ItemEntity arrow = new ItemEntity(this.level(), this.position().x, this.position().y, this.position().z, getOrginalItemStack()); @@ -379,8 +375,7 @@ public class LeashRopeArrow extends AbstractArrow { if (leashDataEntity != null) { leashable.dropLeash(true, !(leashDataEntity instanceof LeashRopeArrow)); if (leashDataEntity instanceof LeashRopeArrow leashRopeArrow) { - leashRopeArrow.playSound(SoundEvents.LEASH_KNOT_BREAK, 1, 1); - leashRopeArrow.setOwner(null); + leashRopeArrow.dropLeashHandler(); } } livingEntity.playSound(SoundEvents.LEASH_KNOT_PLACE, 1, 1); @@ -409,8 +404,7 @@ public class LeashRopeArrow extends AbstractArrow { if (leashDataEntity != null) { pL.dropLeash(true, true); if (leashDataEntity instanceof LeashRopeArrow leashRopeArrow) { - leashRopeArrow.playSound(SoundEvents.LEASH_KNOT_BREAK, 1, 1); - leashRopeArrow.setOwner(null); + leashRopeArrow.dropLeashHandler(); } } ItemEntity arrow = new ItemEntity(this.level(), this.position().x, this.position().y, this.position().z, getOrginalItemStack()); @@ -456,5 +450,8 @@ public class LeashRopeArrow extends AbstractArrow { super.handleEntityEvent(pId); } } - + public void dropLeashHandler() { + this.playSound(SoundEvents.LEASH_KNOT_PLACE, 1, 1); + this.setOwner(null); + } } diff --git a/src/main/java/com/r3944realms/leashedplayer/content/items/type/NestleRopeArrowItem.java b/src/main/java/com/r3944realms/leashedplayer/content/items/type/NestleRopeArrowItem.java index 7b3c140..baaf042 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/items/type/NestleRopeArrowItem.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/items/type/NestleRopeArrowItem.java @@ -1,6 +1,5 @@ package com.r3944realms.leashedplayer.content.items.type; -import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow; import com.r3944realms.leashedplayer.content.entities.ModEntityRegister; import com.r3944realms.leashedplayer.content.entities.NestleRopeArrow; import net.minecraft.core.Direction; diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java index 71f6890..7499072 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java @@ -20,7 +20,6 @@ import com.r3944realms.leashedplayer.network.server.DecreaseLeashRopeLength; import com.r3944realms.leashedplayer.network.server.IncreaseLeashRopeLength; import com.r3944realms.leashedplayer.utils.Enum.LanguageEnum; import com.r3944realms.leashedplayer.utils.Enum.ModPartEnum; -import io.github.kunosayo.nestle.item.NestleItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/r3944realms/leashedplayer/integration/jei/JEIPlugin.java b/src/main/java/com/r3944realms/leashedplayer/integration/jei/JEIPlugin.java deleted file mode 100644 index ae80722..0000000 --- a/src/main/java/com/r3944realms/leashedplayer/integration/jei/JEIPlugin.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.r3944realms.leashedplayer.integration.jei; - -import com.r3944realms.leashedplayer.LeashedPlayer; -import mezz.jei.api.IModPlugin; -import mezz.jei.api.JeiPlugin; -import mezz.jei.api.registration.IRecipeRegistration; -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; - -@JeiPlugin -public class JEIPlugin implements IModPlugin { - private static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, "jei_plugin"); - @Override - public @NotNull ResourceLocation getPluginUid() { - return UID; - } - - - @Override - public void registerRecipes(@NotNull IRecipeRegistration registration) { - var level = Minecraft.getInstance().level; - assert level != null; - var recipeManager = level.getRecipeManager(); - - } -} diff --git a/src/main/java/com/r3944realms/leashedplayer/integration/jei/JEIRecipeTypes.java b/src/main/java/com/r3944realms/leashedplayer/integration/jei/JEIRecipeTypes.java deleted file mode 100644 index 8ca4533..0000000 --- a/src/main/java/com/r3944realms/leashedplayer/integration/jei/JEIRecipeTypes.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.r3944realms.leashedplayer.integration.jei; - -import com.r3944realms.leashedplayer.LeashedPlayer; -import com.r3944realms.leashedplayer.content.items.repcipe.TippedLeashRopeArrowRecipe; -import mezz.jei.api.recipe.RecipeType; - -public class JEIRecipeTypes { - public static final RecipeType TIPPED_LEASH_ROPE_ARROW_A = - RecipeType.create(LeashedPlayer.MOD_ID, "tipped_leash_rope_arrow_a", TippedLeashRopeArrowRecipe.TippedLeashRopeArrowARecipe.class); - - public static final RecipeType TIPPED_LEASH_ROPE_ARROW_B = - RecipeType.create(LeashedPlayer.MOD_ID, "tipped_leash_rope_arrow_b", TippedLeashRopeArrowRecipe.TippedLeashRopeArrowBRecipe.class); -} diff --git a/src/main/java/com/r3944realms/leashedplayer/integration/jei/category/LeashedPlayerCategory.java b/src/main/java/com/r3944realms/leashedplayer/integration/jei/category/LeashedPlayerCategory.java deleted file mode 100644 index eacbd75..0000000 --- a/src/main/java/com/r3944realms/leashedplayer/integration/jei/category/LeashedPlayerCategory.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.r3944realms.leashedplayer.integration.jei.category; - -public class LeashedPlayerCategory { - -} diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinLeadItem.java b/src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinLeadItem.java index b0038f6..3abb044 100644 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinLeadItem.java +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/item/MixinLeadItem.java @@ -1,5 +1,6 @@ package com.r3944realms.leashedplayer.mixin.item; +import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow; import com.r3944realms.leashedplayer.modInterface.PlayerLeashable; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -46,6 +47,9 @@ public class MixinLeadItem implements Equipable { PlayerLeashable playerLeashable = (PlayerLeashable) pPlayer; if(leashDataEntity != null) { playerLeashable.dropLeash(true, true); + if(leashDataEntity instanceof LeashRopeArrow leashRopeArrow) { + leashRopeArrow.dropLeashHandler(); + } } //获取拴绳结实体 LeashFenceKnotEntity leashfenceknotentity = LeashFenceKnotEntity.getOrCreateKnot(pLevel, pPos); diff --git a/src/main/resources/leashedplayerlogo.png b/src/main/resources/leashedplayerlogo.png index 7756ae2..7581309 100644 Binary files a/src/main/resources/leashedplayerlogo.png and b/src/main/resources/leashedplayerlogo.png differ