From 9a3c1ff219c646e89f43a7350dd35a97f7ecc0d0 Mon Sep 17 00:00:00 2001 From: ZhuRuoLing Date: Mon, 3 Jun 2024 20:08:19 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=AE=A9=E7=94=9F=E7=89=A9=E8=BD=AC?= =?UTF-8?q?=E5=8C=96=E6=89=8B=E9=87=8C=E6=8B=BF=E4=B8=9C=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/CorruptedBeaconBlockEntity.java | 67 ++++++++++++++----- .../recipe/MobTransformRecipesLoader.java | 17 +++++ .../recipe/transform/MobTransformRecipe.java | 11 ++- .../recipe/transform/TransformOptions.java | 23 +++++++ 4 files changed, 98 insertions(+), 20 deletions(-) create mode 100644 common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/TransformOptions.java diff --git a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java index c6fc43ca7..987bbe1b7 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java @@ -6,12 +6,16 @@ import dev.dubhe.anvilcraft.data.recipe.transform.MobTransformContainer; import dev.dubhe.anvilcraft.init.ModBlockEntities; import dev.dubhe.anvilcraft.init.ModRecipeTypes; + import java.util.Objects; + import lombok.Getter; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.server.commands.data.EntityDataAccessor; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -19,7 +23,11 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BeaconBeamBlock; @@ -107,9 +115,9 @@ public static void tick( beaconBeamSection.increaseHeight(); } else { beaconBeamSection = new BeaconBeamSection(new float[]{ - (beaconBeamSection.color[0] + fs[0]) / 2.0f, - (beaconBeamSection.color[1] + fs[1]) / 2.0f, - (beaconBeamSection.color[2] + fs[2]) / 2.0f + (beaconBeamSection.color[0] + fs[0]) / 2.0f, + (beaconBeamSection.color[1] + fs[1]) / 2.0f, + (beaconBeamSection.color[2] + fs[2]) / 2.0f }); blockEntity.checkingBeamSections.add(beaconBeamSection); } @@ -185,6 +193,42 @@ public void setRemoved() { super.setRemoved(); } + private static void tryTransformEntity(Entity livingEntity, BlockPos pos, ServerLevel level, RecipeManager manager) { + MobTransformContainer container = new MobTransformContainer(level, pos, livingEntity); + var recipe = manager.getRecipeFor(ModRecipeTypes.MOB_TRANSFORM_RECIPE, container, level); + if (recipe.isEmpty()) return; + var entityType = recipe.get().result(level.random); + CompoundTag tag = new CompoundTag(); + tag.putString("id", BuiltInRegistries.ENTITY_TYPE.getKey(entityType).toString()); + Entity entity = EntityType.loadEntityRecursive(tag, level, (e) -> { + e.moveTo( + livingEntity.position().x, + livingEntity.position().y, + livingEntity.position().z, + e.getYRot(), + e.getXRot() + ); + return e; + }); + if (entity == null) return; + if (entity instanceof Mob mob) { + mob.finalizeSpawn( + level, + level.getCurrentDifficultyAt(entity.blockPosition()), + MobSpawnType.NATURAL, + null, + null + ); + } + CompoundTag compoundTag = entity.saveWithoutId(new CompoundTag()); + recipe.get().accept(compoundTag); + UUID uuid = entity.getUUID(); + entity.load(compoundTag); + entity.setUUID(uuid); + livingEntity.remove(Entity.RemovalReason.DISCARDED); + level.tryAddFreshEntityWithPassengers(entity); + } + private static void affectEntities(@NotNull Level level, BlockPos pos) { if (level.isClientSide) return; AABB aabb = new AABB(pos).expandTowards(0.0, level.getHeight(), 0.0); @@ -192,21 +236,8 @@ private static void affectEntities(@NotNull Level level, BlockPos pos) { if (list.isEmpty()) return; RecipeManager manager = Objects.requireNonNull(level.getServer()).getRecipeManager(); for (LivingEntity livingEntity : list) { - MobTransformContainer container = new MobTransformContainer(level, pos, livingEntity); livingEntity.addEffect(new MobEffectInstance(MobEffects.WITHER, 120, 0, true, true)); - var recipe = manager.getRecipeFor(ModRecipeTypes.MOB_TRANSFORM_RECIPE, container, level); - if (recipe.isEmpty()) continue; - var entityType = recipe.get().result(level.random); - Entity entity = entityType.create(level); - if (entity == null) continue; - entity.moveTo(livingEntity.position()); - CompoundTag compoundTag = entity.saveWithoutId(new CompoundTag()); - recipe.get().accept(compoundTag); - UUID uuid = entity.getUUID(); - entity.load(compoundTag); - entity.setUUID(uuid); - livingEntity.remove(Entity.RemovalReason.DISCARDED); - level.addFreshEntity(entity); + tryTransformEntity(livingEntity, pos, (ServerLevel) level, manager); } } @@ -270,6 +301,6 @@ public float[] getColor() { @SuppressWarnings("unused") public AABB getRenderBoundingBox() { return new AABB(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, - Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY); + Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY); } } diff --git a/common/src/main/java/dev/dubhe/anvilcraft/data/generator/recipe/MobTransformRecipesLoader.java b/common/src/main/java/dev/dubhe/anvilcraft/data/generator/recipe/MobTransformRecipesLoader.java index 16694fadf..0e1e5a250 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/data/generator/recipe/MobTransformRecipesLoader.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/data/generator/recipe/MobTransformRecipesLoader.java @@ -58,6 +58,20 @@ public static void init(RegistrateRecipeProvider provider) { .result(EntityType.ZOMBIE_HORSE, 0.1) .accept(provider); + MobTransformRecipe.builder("horse") + .input(EntityType.SKELETON) + .result(EntityType.STRAY, 0.8) + .result(EntityType.WITHER_SKELETON, 0.2) + .accept(provider); + + MobTransformRecipe.builder("zombie") + .input(EntityType.ZOMBIE) + .result(EntityType.DROWNED, 0.45) + .result(EntityType.HUSK, 0.45) + .result(EntityType.GIANT, 0.1) + .option() + .accept(provider); + MobTransformRecipe.builder("silverfish") .input(EntityType.SILVERFISH) .result(EntityType.ENDERMITE, 1) @@ -82,5 +96,8 @@ public static void init(RegistrateRecipeProvider provider) { .value(tag); }) .accept(provider); + + + } } diff --git a/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/MobTransformRecipe.java b/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/MobTransformRecipe.java index fa6ef3511..3eee12464 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/MobTransformRecipe.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/MobTransformRecipe.java @@ -47,7 +47,10 @@ public class MobTransformRecipe implements Recipe { .forGetter(o -> java.util.Optional.ofNullable(o.tagPredicates)), TagModification.CODEC.listOf() .optionalFieldOf("tagModifications") - .forGetter(o -> java.util.Optional.ofNullable(o.tagModifications)) + .forGetter(o -> java.util.Optional.ofNullable(o.tagModifications)), + TransformOptions.CODEC.listOf() + .optionalFieldOf("transformOptions") + .forGetter(o -> Optional.ofNullable(o.transformOptions)) ).apply(ins, MobTransformRecipe::new)); private final ResourceLocation id; @@ -59,6 +62,8 @@ public class MobTransformRecipe implements Recipe { private List tagPredicates; @Getter private List tagModifications; + @Getter + private List transformOptions; /** * 生物转化配方 @@ -68,13 +73,15 @@ public MobTransformRecipe( ResourceLocation input, List results, Optional> tagPredicates, - Optional> tagModifications + Optional> tagModifications, + Optional> options ) { this.id = id; this.results = results; this.input = BuiltInRegistries.ENTITY_TYPE.get(input); this.tagPredicates = tagPredicates.orElseGet(ArrayList::new); this.tagModifications = tagModifications.orElseGet(ArrayList::new); + this.transformOptions = options.orElseGet(ArrayList::new); } public MobTransformRecipe(ResourceLocation id) { diff --git a/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/TransformOptions.java b/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/TransformOptions.java new file mode 100644 index 000000000..3ed6f65c4 --- /dev/null +++ b/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/TransformOptions.java @@ -0,0 +1,23 @@ +package dev.dubhe.anvilcraft.data.recipe.transform; + +import com.mojang.serialization.Codec; +import net.minecraft.util.StringRepresentable; +import org.jetbrains.annotations.NotNull; + +public enum TransformOptions implements StringRepresentable { + + + KEEP_INVENTORY("keepInventory"); + + public static final Codec CODEC = StringRepresentable.fromEnum(TransformOptions::values); + private final String name; + + TransformOptions(String name) { + this.name = name; + } + + @Override + public @NotNull String getSerializedName() { + return name; + } +} From 25a67cf4ed6f0ad16740c452f34c560b7200aa2f Mon Sep 17 00:00:00 2001 From: ZhuRuoLing Date: Wed, 5 Jun 2024 23:40:06 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E7=94=9F=E7=89=A9=E8=BD=AC=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/CorruptedBeaconBlockEntity.java | 6 +- .../recipe/MobTransformRecipesLoader.java | 6 +- .../recipe/transform/MobTransformRecipe.java | 37 +++++++++-- .../recipe/transform/TransformOptions.java | 61 ++++++++++++++++++- .../recipe/MobTransformRecipeSchema.java | 19 +++++- .../AnvilCraftRecipeComponents.java | 25 ++++++++ .../anvilcraft/blockstates/discharger.json | 7 +++ .../anvilcraft/models/block/discharger.json | 6 ++ .../advancements/recipes/misc/skeleton.json | 22 +++++++ .../advancements/recipes/misc/zombie.json | 22 +++++++ .../data/anvilcraft/recipes/skeleton.json | 15 +++++ .../data/anvilcraft/recipes/zombie.json | 23 +++++++ .../anvilcraft/blockstates/discharger.json | 7 +++ .../anvilcraft/models/block/discharger.json | 6 ++ .../advancements/recipes/misc/skeleton.json | 22 +++++++ .../advancements/recipes/misc/zombie.json | 22 +++++++ .../data/anvilcraft/recipes/skeleton.json | 15 +++++ .../data/anvilcraft/recipes/zombie.json | 23 +++++++ 18 files changed, 328 insertions(+), 16 deletions(-) create mode 100644 fabric/src/generated/resources/assets/anvilcraft/blockstates/discharger.json create mode 100644 fabric/src/generated/resources/assets/anvilcraft/models/block/discharger.json create mode 100644 fabric/src/generated/resources/data/anvilcraft/advancements/recipes/misc/skeleton.json create mode 100644 fabric/src/generated/resources/data/anvilcraft/advancements/recipes/misc/zombie.json create mode 100644 fabric/src/generated/resources/data/anvilcraft/recipes/skeleton.json create mode 100644 fabric/src/generated/resources/data/anvilcraft/recipes/zombie.json create mode 100644 forge/src/generated/resources/assets/anvilcraft/blockstates/discharger.json create mode 100644 forge/src/generated/resources/assets/anvilcraft/models/block/discharger.json create mode 100644 forge/src/generated/resources/data/anvilcraft/advancements/recipes/misc/skeleton.json create mode 100644 forge/src/generated/resources/data/anvilcraft/advancements/recipes/misc/zombie.json create mode 100644 forge/src/generated/resources/data/anvilcraft/recipes/skeleton.json create mode 100644 forge/src/generated/resources/data/anvilcraft/recipes/zombie.json diff --git a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java index 987bbe1b7..31ebbc95b 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java @@ -220,11 +220,7 @@ private static void tryTransformEntity(Entity livingEntity, BlockPos pos, Server null ); } - CompoundTag compoundTag = entity.saveWithoutId(new CompoundTag()); - recipe.get().accept(compoundTag); - UUID uuid = entity.getUUID(); - entity.load(compoundTag); - entity.setUUID(uuid); + recipe.get().postProcess(livingEntity, entity); livingEntity.remove(Entity.RemovalReason.DISCARDED); level.tryAddFreshEntityWithPassengers(entity); } diff --git a/common/src/main/java/dev/dubhe/anvilcraft/data/generator/recipe/MobTransformRecipesLoader.java b/common/src/main/java/dev/dubhe/anvilcraft/data/generator/recipe/MobTransformRecipesLoader.java index 0e1e5a250..658f93b7e 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/data/generator/recipe/MobTransformRecipesLoader.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/data/generator/recipe/MobTransformRecipesLoader.java @@ -4,6 +4,7 @@ import dev.dubhe.anvilcraft.data.recipe.transform.MobTransformRecipe; import dev.dubhe.anvilcraft.data.recipe.transform.NumericTagValuePredicate; import dev.dubhe.anvilcraft.data.recipe.transform.TagModification; +import dev.dubhe.anvilcraft.data.recipe.transform.TransformOptions; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.EntityType; @@ -58,7 +59,7 @@ public static void init(RegistrateRecipeProvider provider) { .result(EntityType.ZOMBIE_HORSE, 0.1) .accept(provider); - MobTransformRecipe.builder("horse") + MobTransformRecipe.builder("skeleton") .input(EntityType.SKELETON) .result(EntityType.STRAY, 0.8) .result(EntityType.WITHER_SKELETON, 0.2) @@ -69,7 +70,8 @@ public static void init(RegistrateRecipeProvider provider) { .result(EntityType.DROWNED, 0.45) .result(EntityType.HUSK, 0.45) .result(EntityType.GIANT, 0.1) - .option() + .option(TransformOptions.KEEP_INVENTORY) + .option(TransformOptions.REPLACE_ANVIL) .accept(provider); MobTransformRecipe.builder("silverfish") diff --git a/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/MobTransformRecipe.java b/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/MobTransformRecipe.java index 3eee12464..74f806ca6 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/MobTransformRecipe.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/MobTransformRecipe.java @@ -13,11 +13,13 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.commands.data.EntityDataAccessor; import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; @@ -29,8 +31,11 @@ import javax.swing.text.html.Option; import java.util.ArrayList; import java.util.Comparator; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.UUID; import java.util.function.Consumer; import static net.minecraft.data.recipes.RecipeBuilder.ROOT_RECIPE_ADVANCEMENT; @@ -81,7 +86,7 @@ public MobTransformRecipe( this.input = BuiltInRegistries.ENTITY_TYPE.get(input); this.tagPredicates = tagPredicates.orElseGet(ArrayList::new); this.tagModifications = tagModifications.orElseGet(ArrayList::new); - this.transformOptions = options.orElseGet(ArrayList::new); + transformOptions = options.orElseGet(ArrayList::new); } public MobTransformRecipe(ResourceLocation id) { @@ -99,12 +104,19 @@ public boolean matches(@NotNull MobTransformContainer container, @NotNull Level } /** - * 修改生物nbt + * 对生物进行后处理 */ - public void accept(Tag tag) { + public void postProcess(Entity oldEntity, Entity entity) { + for (TransformOptions option : transformOptions) { + option.accept(oldEntity, entity); + } + CompoundTag compoundTag = entity.saveWithoutId(new CompoundTag()); for (TagModification tagModification : tagModifications) { - tagModification.accept(tag); + tagModification.accept(compoundTag); } + UUID uuid = entity.getUUID(); + entity.load(compoundTag); + entity.setUUID(uuid); } @Override @@ -216,6 +228,7 @@ public static class Builder { private RecipeCategory category = RecipeCategory.MISC; private List tagPredicates; private List tagModifications; + private Set options; Builder(ResourceLocation id) { this.id = id; @@ -267,6 +280,17 @@ public Builder tagModification(@NotNull Consumer predic return this; } + /** + * 生物转化额外选项 + */ + public Builder option(TransformOptions option) { + if (options == null) { + options = new HashSet<>(); + } + options.add(option); + return this; + } + /** * 构造 */ @@ -276,6 +300,9 @@ public MobTransformRecipe build() { r.results = results; r.tagPredicates = tagPredicates; r.tagModifications = tagModifications; + if (options != null) { + r.transformOptions = new ArrayList<>(options); + } return r; } @@ -298,5 +325,7 @@ public FinishedMobTransformRecipe finish() { public void accept(Consumer provider) { provider.accept(finish()); } + + } } diff --git a/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/TransformOptions.java b/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/TransformOptions.java index 3ed6f65c4..3ab85cb04 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/TransformOptions.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/data/recipe/transform/TransformOptions.java @@ -1,13 +1,50 @@ package dev.dubhe.anvilcraft.data.recipe.transform; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import dev.dubhe.anvilcraft.init.ModBlocks; import net.minecraft.util.StringRepresentable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; public enum TransformOptions implements StringRepresentable { - - KEEP_INVENTORY("keepInventory"); + KEEP_INVENTORY("keepInventory") { + @Override + public void accept(Entity oldEntity, Entity newEntity) { + if (newEntity instanceof LivingEntity n && oldEntity instanceof LivingEntity o) { + for (EquipmentSlot value : EquipmentSlot.values()) { + n.setItemSlot(value, o.getItemBySlot(value)); + } + for (InteractionHand value : InteractionHand.values()) { + n.setItemInHand(value, o.getItemInHand(value)); + } + } + } + }, + REPLACE_ANVIL("replaceAnvil") { + @Override + public void accept(Entity oldEntity, Entity newEntity) { + if (newEntity instanceof LivingEntity n && oldEntity instanceof LivingEntity o) { + for (InteractionHand value : InteractionHand.values()) { + ItemStack itemStack = o.getItemInHand(value); + if (itemStack.is(Items.ANVIL) + || itemStack.is(Items.CHIPPED_ANVIL) + || itemStack.is(Items.DAMAGED_ANVIL)) { + o.setItemInHand(value, ModBlocks.HEAVY_IRON_BLOCK.asItem().getDefaultInstance()); + n.setItemInHand(value, ModBlocks.HEAVY_IRON_BLOCK.asItem().getDefaultInstance()); + } + } + } + } + }; public static final Codec CODEC = StringRepresentable.fromEnum(TransformOptions::values); private final String name; @@ -20,4 +57,24 @@ public enum TransformOptions implements StringRepresentable { public @NotNull String getSerializedName() { return name; } + + public abstract void accept(Entity oldEntity, Entity newEntity); + + /** + * + */ + public static TransformOptions fromJson(JsonObject jsonObject) { + return CODEC.decode(JsonOps.INSTANCE, jsonObject) + .getOrThrow(false, s -> { + }).getFirst(); + } + + /** + * + */ + public JsonElement toJson() { + return CODEC.encodeStart(JsonOps.INSTANCE, this) + .getOrThrow(false, s -> { + }); + } } diff --git a/common/src/main/java/dev/dubhe/anvilcraft/integration/kubejs/recipe/MobTransformRecipeSchema.java b/common/src/main/java/dev/dubhe/anvilcraft/integration/kubejs/recipe/MobTransformRecipeSchema.java index 83040e278..673316455 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/integration/kubejs/recipe/MobTransformRecipeSchema.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/integration/kubejs/recipe/MobTransformRecipeSchema.java @@ -2,9 +2,9 @@ import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import dev.dubhe.anvilcraft.data.recipe.transform.MobTransformRecipe; import dev.dubhe.anvilcraft.data.recipe.transform.NumericTagValuePredicate; import dev.dubhe.anvilcraft.data.recipe.transform.TagModification; +import dev.dubhe.anvilcraft.data.recipe.transform.TransformOptions; import dev.dubhe.anvilcraft.data.recipe.transform.TransformResult; import dev.dubhe.anvilcraft.integration.kubejs.recipe.components.AnvilCraftRecipeComponents; import dev.latvian.mods.kubejs.recipe.RecipeJS; @@ -16,8 +16,6 @@ import net.minecraft.world.entity.EntityType; import org.apache.commons.lang3.ArrayUtils; -import java.util.function.Consumer; - /** * 生物转换配方架构 */ @@ -121,6 +119,18 @@ public MobTransformRecipeJs modifyNbt( save(); return this; } + + /** + * + */ + public MobTransformRecipeJs transformOptions( + String name + ) { + if (getValue(OPTIONS) == null) setValue(OPTIONS, new TransformOptions[0]); + setValue(OPTIONS, ArrayUtils.add(getValue(OPTIONS), TransformOptions.valueOf(name))); + save(); + return this; + } } RecipeKey ID = AnvilCraftRecipeComponents.RESOURCE_LOCATION @@ -136,6 +146,9 @@ public MobTransformRecipeJs modifyNbt( RecipeKey TAG_MOD = AnvilCraftRecipeComponents.RECIPE_TAG_MODIFY .asArray().key("tagModification").defaultOptional(); + RecipeKey OPTIONS = AnvilCraftRecipeComponents.RECIPE_TRANSFORM_OPTIONS + .asArray().key("transformOptions").defaultOptional(); + RecipeSchema SCHEMA = new RecipeSchema( MobTransformRecipeJs.class, MobTransformRecipeJs::new, ID, INPUT, RESULTS, PREDICATES, TAG_MOD diff --git a/common/src/main/java/dev/dubhe/anvilcraft/integration/kubejs/recipe/components/AnvilCraftRecipeComponents.java b/common/src/main/java/dev/dubhe/anvilcraft/integration/kubejs/recipe/components/AnvilCraftRecipeComponents.java index 669a20dc5..1e2695ad5 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/integration/kubejs/recipe/components/AnvilCraftRecipeComponents.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/integration/kubejs/recipe/components/AnvilCraftRecipeComponents.java @@ -7,6 +7,7 @@ import dev.dubhe.anvilcraft.data.recipe.anvil.RecipePredicate; import dev.dubhe.anvilcraft.data.recipe.transform.NumericTagValuePredicate; import dev.dubhe.anvilcraft.data.recipe.transform.TagModification; +import dev.dubhe.anvilcraft.data.recipe.transform.TransformOptions; import dev.dubhe.anvilcraft.data.recipe.transform.TransformResult; import dev.latvian.mods.kubejs.recipe.RecipeJS; import dev.latvian.mods.kubejs.recipe.component.RecipeComponent; @@ -201,4 +202,28 @@ public TagModification read(RecipeJS recipe, Object from) { return null; } }; + public static final RecipeComponent RECIPE_TRANSFORM_OPTIONS = new RecipeComponent<>() { + @Override + public String componentType() { + return "recipe_predicates"; + } + + @Override + public Class componentClass() { + return TagModification.class; + } + + @Override + public JsonElement write(RecipeJS recipe, TransformOptions value) { + return value.toJson(); + } + + @Override + public TransformOptions read(RecipeJS recipe, Object from) { + if (from instanceof JsonObject jsonObject) { + return TransformOptions.fromJson(jsonObject); + } + return null; + } + }; } diff --git a/fabric/src/generated/resources/assets/anvilcraft/blockstates/discharger.json b/fabric/src/generated/resources/assets/anvilcraft/blockstates/discharger.json new file mode 100644 index 000000000..d405652ce --- /dev/null +++ b/fabric/src/generated/resources/assets/anvilcraft/blockstates/discharger.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "anvilcraft:block/discharger" + } + } +} \ No newline at end of file diff --git a/fabric/src/generated/resources/assets/anvilcraft/models/block/discharger.json b/fabric/src/generated/resources/assets/anvilcraft/models/block/discharger.json new file mode 100644 index 000000000..9c01e912a --- /dev/null +++ b/fabric/src/generated/resources/assets/anvilcraft/models/block/discharger.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "anvilcraft:block/discharger" + } +} \ No newline at end of file diff --git a/fabric/src/generated/resources/data/anvilcraft/advancements/recipes/misc/skeleton.json b/fabric/src/generated/resources/data/anvilcraft/advancements/recipes/misc/skeleton.json new file mode 100644 index 000000000..f65cf9a38 --- /dev/null +++ b/fabric/src/generated/resources/data/anvilcraft/advancements/recipes/misc/skeleton.json @@ -0,0 +1,22 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:skeleton" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:skeleton" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/fabric/src/generated/resources/data/anvilcraft/advancements/recipes/misc/zombie.json b/fabric/src/generated/resources/data/anvilcraft/advancements/recipes/misc/zombie.json new file mode 100644 index 000000000..5a67373f2 --- /dev/null +++ b/fabric/src/generated/resources/data/anvilcraft/advancements/recipes/misc/zombie.json @@ -0,0 +1,22 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:zombie" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:zombie" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/fabric/src/generated/resources/data/anvilcraft/recipes/skeleton.json b/fabric/src/generated/resources/data/anvilcraft/recipes/skeleton.json new file mode 100644 index 000000000..dc0b3b84d --- /dev/null +++ b/fabric/src/generated/resources/data/anvilcraft/recipes/skeleton.json @@ -0,0 +1,15 @@ +{ + "type": "anvilcraft:mob_transform", + "id": "anvilcraft:skeleton", + "input": "minecraft:skeleton", + "results": [ + { + "probability": 0.8, + "resultEntityType": "minecraft:stray" + }, + { + "probability": 0.2, + "resultEntityType": "minecraft:wither_skeleton" + } + ] +} \ No newline at end of file diff --git a/fabric/src/generated/resources/data/anvilcraft/recipes/zombie.json b/fabric/src/generated/resources/data/anvilcraft/recipes/zombie.json new file mode 100644 index 000000000..47781098d --- /dev/null +++ b/fabric/src/generated/resources/data/anvilcraft/recipes/zombie.json @@ -0,0 +1,23 @@ +{ + "type": "anvilcraft:mob_transform", + "id": "anvilcraft:zombie", + "input": "minecraft:zombie", + "results": [ + { + "probability": 0.45, + "resultEntityType": "minecraft:drowned" + }, + { + "probability": 0.45, + "resultEntityType": "minecraft:husk" + }, + { + "probability": 0.1, + "resultEntityType": "minecraft:giant" + } + ], + "transformOptions": [ + "replaceAnvil", + "keepInventory" + ] +} \ No newline at end of file diff --git a/forge/src/generated/resources/assets/anvilcraft/blockstates/discharger.json b/forge/src/generated/resources/assets/anvilcraft/blockstates/discharger.json new file mode 100644 index 000000000..d405652ce --- /dev/null +++ b/forge/src/generated/resources/assets/anvilcraft/blockstates/discharger.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "anvilcraft:block/discharger" + } + } +} \ No newline at end of file diff --git a/forge/src/generated/resources/assets/anvilcraft/models/block/discharger.json b/forge/src/generated/resources/assets/anvilcraft/models/block/discharger.json new file mode 100644 index 000000000..9c01e912a --- /dev/null +++ b/forge/src/generated/resources/assets/anvilcraft/models/block/discharger.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "anvilcraft:block/discharger" + } +} \ No newline at end of file diff --git a/forge/src/generated/resources/data/anvilcraft/advancements/recipes/misc/skeleton.json b/forge/src/generated/resources/data/anvilcraft/advancements/recipes/misc/skeleton.json new file mode 100644 index 000000000..f65cf9a38 --- /dev/null +++ b/forge/src/generated/resources/data/anvilcraft/advancements/recipes/misc/skeleton.json @@ -0,0 +1,22 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:skeleton" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:skeleton" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/forge/src/generated/resources/data/anvilcraft/advancements/recipes/misc/zombie.json b/forge/src/generated/resources/data/anvilcraft/advancements/recipes/misc/zombie.json new file mode 100644 index 000000000..5a67373f2 --- /dev/null +++ b/forge/src/generated/resources/data/anvilcraft/advancements/recipes/misc/zombie.json @@ -0,0 +1,22 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:zombie" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:zombie" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/forge/src/generated/resources/data/anvilcraft/recipes/skeleton.json b/forge/src/generated/resources/data/anvilcraft/recipes/skeleton.json new file mode 100644 index 000000000..dc0b3b84d --- /dev/null +++ b/forge/src/generated/resources/data/anvilcraft/recipes/skeleton.json @@ -0,0 +1,15 @@ +{ + "type": "anvilcraft:mob_transform", + "id": "anvilcraft:skeleton", + "input": "minecraft:skeleton", + "results": [ + { + "probability": 0.8, + "resultEntityType": "minecraft:stray" + }, + { + "probability": 0.2, + "resultEntityType": "minecraft:wither_skeleton" + } + ] +} \ No newline at end of file diff --git a/forge/src/generated/resources/data/anvilcraft/recipes/zombie.json b/forge/src/generated/resources/data/anvilcraft/recipes/zombie.json new file mode 100644 index 000000000..47781098d --- /dev/null +++ b/forge/src/generated/resources/data/anvilcraft/recipes/zombie.json @@ -0,0 +1,23 @@ +{ + "type": "anvilcraft:mob_transform", + "id": "anvilcraft:zombie", + "input": "minecraft:zombie", + "results": [ + { + "probability": 0.45, + "resultEntityType": "minecraft:drowned" + }, + { + "probability": 0.45, + "resultEntityType": "minecraft:husk" + }, + { + "probability": 0.1, + "resultEntityType": "minecraft:giant" + } + ], + "transformOptions": [ + "replaceAnvil", + "keepInventory" + ] +} \ No newline at end of file From c52e7fece1c4a2ba2308801b92146fae866e8d20 Mon Sep 17 00:00:00 2001 From: ZhuRuoLing Date: Thu, 6 Jun 2024 00:11:26 +0800 Subject: [PATCH 3/4] code style --- .../block/entity/CorruptedBeaconBlockEntity.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java index 31ebbc95b..c937ab842 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/CorruptedBeaconBlockEntity.java @@ -115,9 +115,9 @@ public static void tick( beaconBeamSection.increaseHeight(); } else { beaconBeamSection = new BeaconBeamSection(new float[]{ - (beaconBeamSection.color[0] + fs[0]) / 2.0f, - (beaconBeamSection.color[1] + fs[1]) / 2.0f, - (beaconBeamSection.color[2] + fs[2]) / 2.0f + (beaconBeamSection.color[0] + fs[0]) / 2.0f, + (beaconBeamSection.color[1] + fs[1]) / 2.0f, + (beaconBeamSection.color[2] + fs[2]) / 2.0f }); blockEntity.checkingBeamSections.add(beaconBeamSection); } @@ -193,7 +193,12 @@ public void setRemoved() { super.setRemoved(); } - private static void tryTransformEntity(Entity livingEntity, BlockPos pos, ServerLevel level, RecipeManager manager) { + private static void tryTransformEntity( + Entity livingEntity, + BlockPos pos, + ServerLevel level, + RecipeManager manager + ) { MobTransformContainer container = new MobTransformContainer(level, pos, livingEntity); var recipe = manager.getRecipeFor(ModRecipeTypes.MOB_TRANSFORM_RECIPE, container, level); if (recipe.isEmpty()) return; From c763ea2a26f11c1954cc9efe3358ba09bbd6fa2f Mon Sep 17 00:00:00 2001 From: Gugle Date: Sat, 8 Jun 2024 18:56:18 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/anvilcraft/blockstates/discharger.json | 7 ------- .../assets/anvilcraft/models/block/discharger.json | 6 ------ .../data/anvilcraft/recipes/heating/melt_gem_cauldron.json | 4 ++-- .../assets/anvilcraft/blockstates/discharger.json | 7 ------- .../assets/anvilcraft/models/block/discharger.json | 6 ------ .../data/anvilcraft/recipes/heating/melt_gem_cauldron.json | 4 ++-- 6 files changed, 4 insertions(+), 30 deletions(-) delete mode 100644 fabric/src/generated/resources/assets/anvilcraft/blockstates/discharger.json delete mode 100644 fabric/src/generated/resources/assets/anvilcraft/models/block/discharger.json delete mode 100644 forge/src/generated/resources/assets/anvilcraft/blockstates/discharger.json delete mode 100644 forge/src/generated/resources/assets/anvilcraft/models/block/discharger.json diff --git a/fabric/src/generated/resources/assets/anvilcraft/blockstates/discharger.json b/fabric/src/generated/resources/assets/anvilcraft/blockstates/discharger.json deleted file mode 100644 index d405652ce..000000000 --- a/fabric/src/generated/resources/assets/anvilcraft/blockstates/discharger.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "anvilcraft:block/discharger" - } - } -} \ No newline at end of file diff --git a/fabric/src/generated/resources/assets/anvilcraft/models/block/discharger.json b/fabric/src/generated/resources/assets/anvilcraft/models/block/discharger.json deleted file mode 100644 index 9c01e912a..000000000 --- a/fabric/src/generated/resources/assets/anvilcraft/models/block/discharger.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "anvilcraft:block/discharger" - } -} \ No newline at end of file diff --git a/fabric/src/generated/resources/data/anvilcraft/recipes/heating/melt_gem_cauldron.json b/fabric/src/generated/resources/data/anvilcraft/recipes/heating/melt_gem_cauldron.json index d98103b07..5b61c6acf 100644 --- a/fabric/src/generated/resources/data/anvilcraft/recipes/heating/melt_gem_cauldron.json +++ b/fabric/src/generated/resources/data/anvilcraft/recipes/heating/melt_gem_cauldron.json @@ -54,10 +54,10 @@ "min": 1 }, "items": [ + "anvilcraft:ruby_block", "anvilcraft:topaz_block", - "anvilcraft:sapphire_block", "minecraft:emerald_block", - "anvilcraft:ruby_block" + "anvilcraft:sapphire_block" ] }, "offset": [ diff --git a/forge/src/generated/resources/assets/anvilcraft/blockstates/discharger.json b/forge/src/generated/resources/assets/anvilcraft/blockstates/discharger.json deleted file mode 100644 index d405652ce..000000000 --- a/forge/src/generated/resources/assets/anvilcraft/blockstates/discharger.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "anvilcraft:block/discharger" - } - } -} \ No newline at end of file diff --git a/forge/src/generated/resources/assets/anvilcraft/models/block/discharger.json b/forge/src/generated/resources/assets/anvilcraft/models/block/discharger.json deleted file mode 100644 index 9c01e912a..000000000 --- a/forge/src/generated/resources/assets/anvilcraft/models/block/discharger.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "anvilcraft:block/discharger" - } -} \ No newline at end of file diff --git a/forge/src/generated/resources/data/anvilcraft/recipes/heating/melt_gem_cauldron.json b/forge/src/generated/resources/data/anvilcraft/recipes/heating/melt_gem_cauldron.json index d98103b07..5b61c6acf 100644 --- a/forge/src/generated/resources/data/anvilcraft/recipes/heating/melt_gem_cauldron.json +++ b/forge/src/generated/resources/data/anvilcraft/recipes/heating/melt_gem_cauldron.json @@ -54,10 +54,10 @@ "min": 1 }, "items": [ + "anvilcraft:ruby_block", "anvilcraft:topaz_block", - "anvilcraft:sapphire_block", "minecraft:emerald_block", - "anvilcraft:ruby_block" + "anvilcraft:sapphire_block" ] }, "offset": [