From b64e86cf91dac0c8bdc37de7e20a6e7fb137bba9 Mon Sep 17 00:00:00 2001 From: TartaricAcid Date: Sat, 9 Oct 2021 13:56:57 +0800 Subject: [PATCH] Complete the maid spawn design --- .../touhoulittlemaid/block/BlockAltar.java | 2 +- .../client/init/InitEntitiesRender.java | 2 + .../client/model/EntityBoxModel.java | 83 ++++++++++ .../renderer/entity/EntityBoxRender.java | 51 ++++++ .../crafting/AltarRecipe.java | 28 +++- .../data/AltarRecipeProvider.java | 12 +- .../entity/item/EntityBox.java | 156 ++++++++++++++++++ .../entity/item/EntityChair.java | 12 -- .../entity/item/EntityExtinguishingAgent.java | 68 ++++---- .../touhoulittlemaid/init/InitEntities.java | 2 + .../util/EntityCraftingHelper.java | 6 +- .../assets/touhou_little_maid/lang/en_us.json | 3 +- .../assets/touhou_little_maid/lang/zh_cn.json | 3 +- .../textures/entity/box/cake_box_0.png | Bin 0 -> 4407 bytes .../textures/entity/box/cake_box_1.png | Bin 0 -> 5612 bytes .../textures/entity/box/cake_box_2.png | Bin 0 -> 6754 bytes .../textures/entity/box/cake_box_3.png | Bin 0 -> 7104 bytes .../textures/entity/box/cake_box_4.png | Bin 0 -> 2461 bytes .../textures/entity/box/cake_box_5.png | Bin 0 -> 5596 bytes .../textures/entity/box/cake_box_6.png | Bin 0 -> 6801 bytes .../textures/items/entity_placeholder.png | Bin 0 -> 203 bytes .../altar/{spawn_maid.json => spawn_box.json} | 9 +- 22 files changed, 385 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/EntityBoxModel.java create mode 100644 src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityBoxRender.java create mode 100644 src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityBox.java create mode 100644 src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_0.png create mode 100644 src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_1.png create mode 100644 src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_2.png create mode 100644 src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_3.png create mode 100644 src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_4.png create mode 100644 src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_5.png create mode 100644 src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_6.png create mode 100644 src/main/resources/assets/touhou_little_maid/textures/items/entity_placeholder.png rename src/main/resources/data/touhou_little_maid/recipes/altar/{spawn_maid.json => spawn_box.json} (72%) diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/block/BlockAltar.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/block/BlockAltar.java index 9b4c31145..2f7d42f55 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/block/BlockAltar.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/block/BlockAltar.java @@ -207,7 +207,7 @@ private void spawnResultEntity(World world, PlayerEntity playerIn, PowerCapabili power.min(altarRecipe.getPowerCost()); BlockPos centrePos = getCentrePos(altar.getBlockPosList(), altar.getBlockPos()); if (world instanceof ServerWorld) { - altarRecipe.spawnOutputEntity((ServerWorld) world, centrePos, inventory); + altarRecipe.spawnOutputEntity((ServerWorld) world, centrePos.above(2), inventory); } removeAllAltarItem(world, altar); spawnParticleInCentre(world, centrePos); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/init/InitEntitiesRender.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/init/InitEntitiesRender.java index 898a84ad7..cf6055b63 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/init/InitEntitiesRender.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/init/InitEntitiesRender.java @@ -2,6 +2,7 @@ import com.github.tartaricacid.touhoulittlemaid.client.renderer.entity.*; import com.github.tartaricacid.touhoulittlemaid.client.renderer.tileentity.TileEntityAltarRenderer; +import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBox; import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityChair; import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityExtinguishingAgent; import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityPowerPoint; @@ -26,6 +27,7 @@ public static void clientSetup(FMLClientSetupEvent evt) { RenderingRegistry.registerEntityRenderingHandler(EntityDanmaku.TYPE, EntityDanmakuRenderer::new); RenderingRegistry.registerEntityRenderingHandler(EntityPowerPoint.TYPE, EntityPowerPointRenderer::new); RenderingRegistry.registerEntityRenderingHandler(EntityExtinguishingAgent.TYPE, EntityExtinguishingAgentRenderer::new); + RenderingRegistry.registerEntityRenderingHandler(EntityBox.TYPE, EntityBoxRender::new); ClientRegistry.bindTileEntityRenderer(TileEntityAltar.TYPE, TileEntityAltarRenderer::new); } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/EntityBoxModel.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/EntityBoxModel.java new file mode 100644 index 000000000..003d135d2 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/model/EntityBoxModel.java @@ -0,0 +1,83 @@ +package com.github.tartaricacid.touhoulittlemaid.client.model; + +import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBox; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.model.ModelRenderer; + +public class EntityBoxModel extends EntityModel { + private final ModelRenderer bottom; + private final ModelRenderer x1; + private final ModelRenderer x2; + private final ModelRenderer z1; + private final ModelRenderer z2; + private final ModelRenderer top; + + public EntityBoxModel() { + texWidth = 256; + texHeight = 256; + + bottom = new ModelRenderer(this); + bottom.setPos(0.0F, 24.0F, 0.0F); + bottom.texOffs(0, 0).addBox(-15.0F, -1.0F, -15.0F, 30.0F, 1.0F, 30.0F, 0.0F, false); + + x1 = new ModelRenderer(this); + x1.setPos(0.0F, 23.5F, -14.5F); + x1.texOffs(64, 31).addBox(-14.0F, -30.5F, -0.5F, 28.0F, 30.0F, 1.0F, 0.0F, false); + + x2 = new ModelRenderer(this); + x2.setPos(0.0F, 23.5F, 14.5F); + x2.texOffs(64, 31).addBox(-14.0F, -30.5F, -0.5F, 28.0F, 30.0F, 1.0F, 0.0F, false); + + z1 = new ModelRenderer(this); + z1.setPos(14.5F, 23.5F, 0.0F); + z1.texOffs(0, 31).addBox(-0.5F, -30.5F, -15.0F, 1.0F, 30.0F, 30.0F, 0.0F, false); + + z2 = new ModelRenderer(this); + z2.setPos(-14.5F, 23.5F, 0.0F); + z2.texOffs(0, 31).addBox(-0.5F, -30.5F, -15.0F, 1.0F, 30.0F, 30.0F, 0.0F, false); + + top = new ModelRenderer(this); + top.setPos(0.0F, 24.0F, 0.0F); + top.texOffs(0, 0).addBox(-15.0F, -32.0F, -15.0F, 30.0F, 1.0F, 30.0F, 0.0F, false); + top.texOffs(64, 64).addBox(-16.0F, -32.0F, -16.0F, 32.0F, 6.0F, 1.0F, 0.0F, false); + top.texOffs(64, 64).addBox(-16.0F, -32.0F, 15.0F, 32.0F, 6.0F, 1.0F, 0.0F, false); + top.texOffs(32, 61).addBox(-16.0F, -32.0F, -15.0F, 1.0F, 6.0F, 30.0F, 0.0F, false); + top.texOffs(32, 61).addBox(15.0F, -32.0F, -15.0F, 1.0F, 6.0F, 30.0F, 0.0F, false); + } + + @Override + public void setupAnim(EntityBox entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + int stage = entityIn.getOpenStage(); + if (stage == EntityBox.FIRST_STAGE) { + top.visible = true; + x1.xRot = 0; + x2.xRot = 0; + z1.zRot = 0; + z2.zRot = 0; + } else if (stage > EntityBox.SECOND_STAGE) { + top.visible = false; + x1.xRot = 0; + x2.xRot = 0; + z1.zRot = 0; + z2.zRot = 0; + } else { + top.visible = false; + x1.xRot = 0.023998277f * (EntityBox.SECOND_STAGE - stage); + x2.xRot = -0.023998277f * (EntityBox.SECOND_STAGE - stage); + z1.zRot = 0.023998277f * (EntityBox.SECOND_STAGE - stage); + z2.zRot = -0.023998277f * (EntityBox.SECOND_STAGE - stage); + } + } + + @Override + public void renderToBuffer(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + bottom.render(matrixStack, buffer, packedLight, packedOverlay); + x1.render(matrixStack, buffer, packedLight, packedOverlay); + x2.render(matrixStack, buffer, packedLight, packedOverlay); + z1.render(matrixStack, buffer, packedLight, packedOverlay); + z2.render(matrixStack, buffer, packedLight, packedOverlay); + top.render(matrixStack, buffer, packedLight, packedOverlay); + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityBoxRender.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityBoxRender.java new file mode 100644 index 000000000..dd8908702 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityBoxRender.java @@ -0,0 +1,51 @@ +package com.github.tartaricacid.touhoulittlemaid.client.renderer.entity; + +import com.github.tartaricacid.touhoulittlemaid.TouhouLittleMaid; +import com.github.tartaricacid.touhoulittlemaid.client.model.EntityBoxModel; +import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBox; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.util.ResourceLocation; + +import java.util.List; +import java.util.stream.IntStream; + +public class EntityBoxRender extends EntityRenderer { + private final List texturesGroup = Lists.newArrayList(); + private final EntityModel boxModel; + + public EntityBoxRender(EntityRendererManager manager) { + super(manager); + boxModel = new EntityBoxModel(); + IntStream.range(0, EntityBox.MAX_TEXTURE_SIZE).forEach(this::addBoxTexture); + } + + @Override + public void render(EntityBox entityBox, float entityYaw, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer bufferIn, int packedLight) { + matrixStack.pushPose(); + matrixStack.scale(-1.0F, -1.0F, 1.0F); + matrixStack.translate(0.0, -1.501, 0.0); + boxModel.setupAnim(entityBox, 0, 0, -0.1f, 0, 0); + RenderType renderType = RenderType.entityTranslucent(getTextureLocation(entityBox)); + IVertexBuilder buffer = bufferIn.getBuffer(renderType); + boxModel.renderToBuffer(matrixStack, buffer, packedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + matrixStack.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(EntityBox entity) { + return texturesGroup.get(entity.getTextureIndex()); + } + + private void addBoxTexture(int index) { + String fileName = String.format("textures/entity/box/cake_box_%s.png", index); + texturesGroup.add(new ResourceLocation(TouhouLittleMaid.MOD_ID, fileName)); + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/crafting/AltarRecipe.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/crafting/AltarRecipe.java index 4eea2a299..e3170bf08 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/crafting/AltarRecipe.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/crafting/AltarRecipe.java @@ -4,7 +4,9 @@ import com.github.tartaricacid.touhoulittlemaid.init.InitRecipes; import com.github.tartaricacid.touhoulittlemaid.inventory.AltarRecipeInventory; import com.google.common.base.Preconditions; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; +import net.minecraft.entity.MobEntity; import net.minecraft.entity.SpawnReason; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; @@ -15,12 +17,12 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.util.RecipeMatcher; import javax.annotation.Nullable; +import java.util.Objects; import static com.github.tartaricacid.touhoulittlemaid.inventory.AltarRecipeInventory.RECIPES_SIZE; @@ -40,7 +42,7 @@ public AltarRecipe(ResourceLocation id, EntityType entityType, @Nullable Comp this.entityType = entityType; this.isItemCraft = (entityType == EntityType.ITEM); if (this.isItemCraft && extraData != null) { - this.resultItem = ItemStack.of(extraData.getCompound("EntityTag").getCompound("Item")); + this.resultItem = ItemStack.of(extraData.getCompound("Item")); } else { this.resultItem = ItemStack.EMPTY; } @@ -113,10 +115,30 @@ public float getPowerCost() { } public void spawnOutputEntity(ServerWorld world, BlockPos pos, AltarRecipeInventory inventory) { - entityType.spawn(world, extraData, StringTextComponent.EMPTY, null, pos, SpawnReason.SPAWN_EGG, true, true); + if (extraData != null) { + CompoundNBT nbt = this.extraData.copy(); + nbt.putString("id", Objects.requireNonNull(entityType.getRegistryName()).toString()); + Entity resultEntity = EntityType.loadEntityRecursive(nbt, world, (e) -> { + e.moveTo(pos.getX(), pos.getY(), pos.getZ(), e.yRot, e.xRot); + this.finalizeSpawn(world, pos, e); + return e; + }); + if (resultEntity != null) { + this.finalizeSpawn(world, pos, resultEntity); + world.tryAddFreshEntityWithPassengers(resultEntity); + } + return; + } + entityType.spawn(world, null, null, null, pos, SpawnReason.SPAWN_EGG, true, true); } public boolean isItemCraft() { return isItemCraft; } + + private void finalizeSpawn(ServerWorld world, BlockPos pos, @Nullable Entity entity) { + if (entity instanceof MobEntity) { + ((MobEntity) entity).finalizeSpawn(world, world.getCurrentDifficultyAt(pos), SpawnReason.SPAWN_EGG, null, null); + } + } } diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/data/AltarRecipeProvider.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/data/AltarRecipeProvider.java index fcd22a5c1..67d782f6b 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/data/AltarRecipeProvider.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/data/AltarRecipeProvider.java @@ -17,6 +17,7 @@ import net.minecraft.item.Items; import net.minecraft.item.crafting.Ingredient; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; import net.minecraft.tags.ItemTags; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.Tags; @@ -26,6 +27,7 @@ import java.io.IOException; import java.nio.file.Path; import java.util.List; +import java.util.Objects; import static com.github.tartaricacid.touhoulittlemaid.init.InitItems.*; @@ -70,7 +72,15 @@ protected void registerRecipes() { Ingredient coal = Ingredient.of(Items.COAL); Ingredient netherWart = Ingredient.of(Items.NETHER_WART); - addEntityRecipes(InitEntities.MAID.get(), 0.5f, gemDiamond, gemLapis, ingotGold, redstone, ingotIron, coal); + { + CompoundNBT extraData = new CompoundNBT(); + ListNBT passengerList = new ListNBT(); + CompoundNBT passenger = new CompoundNBT(); + passenger.putString("id", Objects.requireNonNull(InitEntities.MAID.get().getRegistryName()).toString()); + passengerList.add(passenger); + extraData.put("Passengers", passengerList); + addEntityRecipes(InitEntities.BOX.get(), extraData, 0.5f, gemDiamond, gemLapis, ingotGold, redstone, ingotIron, coal); + } addEntityRecipes(EntityType.LIGHTNING_BOLT, 0.2f, gunpowder, gunpowder, gunpowder, blazePowder, blazePowder, blazePowder); addItemRecipes(HAKUREI_GOHEI, 0.15f, stick, stick, stick, paper, paper, paper); addItemRecipes(ULTRAMARINE_ORB_ELIXIR, 0.3f, gemEmerald, enderPearl, dyeCyan, dyeCyan, dyeCyan, dyeCyan); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityBox.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityBox.java new file mode 100644 index 000000000..00e355d85 --- /dev/null +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityBox.java @@ -0,0 +1,156 @@ +package com.github.tartaricacid.touhoulittlemaid.entity.item; + +import com.github.tartaricacid.touhoulittlemaid.init.InitSounds; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.MoverType; +import net.minecraft.entity.passive.TameableEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.IPacket; +import net.minecraft.network.datasync.DataParameter; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effects; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.fml.network.NetworkHooks; + +public class EntityBox extends Entity { + public static final int FIRST_STAGE = 64; + public static final int SECOND_STAGE = 60; + public static final int THIRD_STAGE = 0; + public static final int MAX_TEXTURE_SIZE = 7; + private static final DataParameter OPEN_STAGE = EntityDataManager.defineId(EntityBox.class, DataSerializers.INT); + private static final DataParameter TEXTURE_INDEX = EntityDataManager.defineId(EntityBox.class, DataSerializers.INT); + public static final EntityType TYPE = EntityType.Builder.of(EntityBox::new, EntityClassification.MISC) + .sized(2.0f, 2.0f).clientTrackingRange(10).build("box"); + private static final String STAGE_TAG = "OpenStage"; + private static final String TEXTURE_TAG = "TextureIndex"; + + public EntityBox(EntityType entityTypeIn, World worldIn) { + super(entityTypeIn, worldIn); + this.setRandomTexture(); + } + + public EntityBox(World worldIn) { + this(TYPE, worldIn); + } + + @Override + public void baseTick() { + if (!this.isNoGravity() && !this.onGround) { + this.move(MoverType.SELF, this.getDeltaMovement().add(0, -0.1, 0)); + } + super.baseTick(); + int stage = getOpenStage(); + this.stageChange(stage); + this.getPassengers().stream().filter(e -> e instanceof TameableEntity) + .forEach(e -> applyInvisibilityEffect((TameableEntity) e, stage)); + } + + @Override + public ActionResultType interact(PlayerEntity player, Hand hand) { + if (this.getOpenStage() == FIRST_STAGE) { + setOpenStage(FIRST_STAGE - 1); + this.playSound(InitSounds.BOX_OPEN.get(), 3.0f, 1.0f); + return ActionResultType.sidedSuccess(level.isClientSide); + } + if (this.getOpenStage() == SECOND_STAGE) { + setOpenStage(SECOND_STAGE - 1); + this.playSound(InitSounds.BOX_OPEN.get(), 3.0f, 1.0f); + return ActionResultType.sidedSuccess(level.isClientSide); + } + if (this.getOpenStage() == THIRD_STAGE) { + setOpenStage(THIRD_STAGE - 1); + this.playSound(InitSounds.BOX_OPEN.get(), 3.0f, 2.0f); + return ActionResultType.sidedSuccess(level.isClientSide); + } + return super.interact(player, hand); + } + + @Override + protected void defineSynchedData() { + this.entityData.define(OPEN_STAGE, FIRST_STAGE); + this.entityData.define(TEXTURE_INDEX, 0); + } + + @Override + protected void readAdditionalSaveData(CompoundNBT compound) { + if (compound.contains(STAGE_TAG)) { + setOpenStage(compound.getInt(STAGE_TAG)); + } + if (compound.contains(TEXTURE_TAG)) { + setTextureIndex(compound.getInt(TEXTURE_TAG)); + } + } + + @Override + protected void addAdditionalSaveData(CompoundNBT compound) { + compound.putInt(STAGE_TAG, getOpenStage()); + compound.putInt(TEXTURE_TAG, getTextureIndex()); + } + + @Override + public IPacket getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + public double getPassengersRidingOffset() { + return 0; + } + + @Override + public boolean canBeCollidedWith() { + return this.isAlive(); + } + + @Override + public boolean isPickable() { + return this.isAlive(); + } + + public int getOpenStage() { + return this.entityData.get(OPEN_STAGE); + } + + public void setOpenStage(int stage) { + this.entityData.set(OPEN_STAGE, MathHelper.clamp(stage, -1, FIRST_STAGE)); + } + + public int getTextureIndex() { + return this.entityData.get(TEXTURE_INDEX); + } + + public void setTextureIndex(int index) { + this.entityData.set(TEXTURE_INDEX, MathHelper.clamp(index, 1, MAX_TEXTURE_SIZE - 1)); + } + + public void setRandomTexture() { + setTextureIndex(random.nextInt(MAX_TEXTURE_SIZE)); + } + + private void stageChange(int stage) { + if (stage != FIRST_STAGE && stage != SECOND_STAGE && stage != THIRD_STAGE) { + this.setOpenStage(stage - 1); + } + if (stage < THIRD_STAGE) { + this.remove(); + if (!this.level.isClientSide) { + this.spawnAtLocation(Items.PAPER, 2 + random.nextInt(3)); + } + } + } + + private void applyInvisibilityEffect(TameableEntity tameable, int stage) { + if (stage >= FIRST_STAGE) { + tameable.addEffect(new EffectInstance(Effects.INVISIBILITY, 2, 1, false, false)); + } + } +} diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityChair.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityChair.java index b4e822176..7b2715909 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityChair.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityChair.java @@ -9,7 +9,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityClassification; import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; @@ -117,17 +116,6 @@ public ActionResultType interact(PlayerEntity player, Hand hand) { return ActionResultType.SUCCESS; } - @Override - public void positionRider(Entity passenger) { - super.positionRider(passenger); - if (this.hasPassenger(passenger) && passenger instanceof LivingEntity) { - // renderYawOffset 也必须同步,因为坐上的女仆朝向受 renderYawOffset 限制 - // 不同步就会导致朝向出现小问题 - // Fixme: 有问题,需要修改 - // this.yHeadRot = ((LivingEntity) passenger).yHeadRot; - } - } - @Nonnull @Override @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityExtinguishingAgent.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityExtinguishingAgent.java index 155230bc3..f7398486c 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityExtinguishingAgent.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityExtinguishingAgent.java @@ -21,7 +21,7 @@ public class EntityExtinguishingAgent extends Entity { public static final EntityType TYPE = EntityType.Builder.of(EntityExtinguishingAgent::new, EntityClassification.MISC) .sized(0.2f, 0.2f).clientTrackingRange(10).build("extinguishing_agent"); private static final int MAX_AGE = 3 * 20; - private boolean isCheck = false; + private static final int REMOVE_FIRE_AGE = 5; public EntityExtinguishingAgent(EntityType entityTypeIn, World worldIn) { super(entityTypeIn, worldIn); @@ -35,41 +35,53 @@ public EntityExtinguishingAgent(World worldIn, Vector3d position) { @Override public void baseTick() { super.baseTick(); - if (this.tickCount > MAX_AGE) { + if (tickCount > MAX_AGE) { this.remove(); return; } - if (!isCheck && tickCount == 5) { - for (int i = -2; i <= 2; i++) { - for (int j = -1; j <= 1; j++) { - for (int k = -2; k <= 2; k++) { - BlockPos pos = this.blockPosition().offset(i, j, k); - BlockState state = level.getBlockState(pos); - if (state.is(Blocks.FIRE)) { - level.removeBlock(pos, false); - } - } - } - } + if (tickCount == REMOVE_FIRE_AGE) { + this.removeBlockFire(); + this.removeEntityFire(); + } + if (level.isClientSide) { + this.spawnCloudParticle(); + } + this.playSound(SoundEvents.WOOL_PLACE, 2.0f - (1.8f / MAX_AGE) * tickCount, 0.1f); + } - List list = level.getEntitiesOfClass(LivingEntity.class, this.getBoundingBox().inflate(2, 1, 2)); - for (LivingEntity entity : list) { - entity.clearFire(); - } + private void spawnCloudParticle() { + int spawnNumber = 4; + for (int i = 0; i < spawnNumber; i++) { + double offsetX = 2 * random.nextDouble() - 1; + double offsetY = random.nextDouble() / 2; + double offsetZ = 2 * random.nextDouble() - 1; + level.addParticle(ParticleTypes.CLOUD, false, + this.getX() + offsetX, this.getY() + offsetY, this.getZ() + offsetZ, + 0, 0.1, 0); + } + } - isCheck = true; + private void removeEntityFire() { + List list = level.getEntitiesOfClass(LivingEntity.class, this.getBoundingBox().inflate(2, 1, 2)); + for (LivingEntity entity : list) { + entity.clearFire(); } - if (level.isClientSide) { - for (int i = 0; i < 4; i++) { - double offsetX = 2 * random.nextDouble() - 1; - double offsetY = random.nextDouble() / 2; - double offsetZ = 2 * random.nextDouble() - 1; - level.addParticle(ParticleTypes.CLOUD, false, - this.getX() + offsetX, this.getY() + offsetY, this.getZ() + offsetZ, - 0, 0.1, 0); + } + + private void removeBlockFire() { + int hRange = 2; + int vRange = 1; + for (int x = -hRange; x <= hRange; x++) { + for (int y = -vRange; y <= vRange; y++) { + for (int z = -hRange; z <= hRange; z++) { + BlockPos pos = this.blockPosition().offset(x, y, z); + BlockState state = level.getBlockState(pos); + if (state.is(Blocks.FIRE)) { + level.removeBlock(pos, false); + } + } } } - this.playSound(SoundEvents.WOOL_PLACE, 2.0f - (1.8f / MAX_AGE) * tickCount, 0.1f); } @Override diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/init/InitEntities.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/init/InitEntities.java index d5da56108..eb62c1e72 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/init/InitEntities.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/init/InitEntities.java @@ -4,6 +4,7 @@ import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.MaidSchedule; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.sensor.MaidHostilesSensor; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.sensor.MaidPickupEntitiesSensor; +import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityBox; import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityChair; import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityExtinguishingAgent; import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityPowerPoint; @@ -47,6 +48,7 @@ public final class InitEntities { public static RegistryObject> DANMAKU = ENTITY_TYPES.register("danmaku", () -> EntityDanmaku.TYPE); public static RegistryObject> POWER_POINT = ENTITY_TYPES.register("power_point", () -> EntityPowerPoint.TYPE); public static RegistryObject> EXTINGUISHING_AGENT = ENTITY_TYPES.register("extinguishing_agent", () -> EntityExtinguishingAgent.TYPE); + public static RegistryObject> BOX = ENTITY_TYPES.register("box", () -> EntityBox.TYPE); public static RegistryObject>> VISIBLE_PICKUP_ENTITIES = MEMORY_MODULE_TYPES.register("visible_pickup_entities", () -> new MemoryModuleType<>(Optional.empty())); public static RegistryObject> TARGET_POS = MEMORY_MODULE_TYPES.register("target_pos", () -> new MemoryModuleType<>(Optional.empty())); diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/util/EntityCraftingHelper.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/util/EntityCraftingHelper.java index e467bedff..797852e42 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/util/EntityCraftingHelper.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/util/EntityCraftingHelper.java @@ -25,13 +25,11 @@ public static Pair, CompoundNBT> getEntityData(JsonObject json) { if (element == null) { return Pair.of(type, outputData); } - CompoundNBT readData; if (element.isJsonObject()) { - readData = JsonToNBT.parseTag(GSON.toJson(element)); + outputData = JsonToNBT.parseTag(GSON.toJson(element)); } else { - readData = JsonToNBT.parseTag(JSONUtils.convertToString(element, NBT_TAG)); + outputData = JsonToNBT.parseTag(JSONUtils.convertToString(element, NBT_TAG)); } - outputData.put("EntityTag", readData); return Pair.of(type, outputData); } throw new JsonParseException("Entity Type Tag Not Found"); diff --git a/src/main/resources/assets/touhou_little_maid/lang/en_us.json b/src/main/resources/assets/touhou_little_maid/lang/en_us.json index ae716ceca..a0da0ebd4 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/en_us.json +++ b/src/main/resources/assets/touhou_little_maid/lang/en_us.json @@ -3,6 +3,7 @@ "entity.touhou_little_maid.maid": "Maid", "entity.touhou_little_maid.fairy": "Maid Fairy", "entity.touhou_little_maid.danmaku": "Danmaku", + "entity.touhou_little_maid.box": "Cake Box", "item_group.touhou_little_maid.main": "Touhou Little Maid: Main", "item.touhou_little_maid.maid_spawn_egg": "Maid Spawn Egg", "item.touhou_little_maid.fairy_spawn_egg": "Fairy Maid Spawn Egg", @@ -129,7 +130,7 @@ "jei.touhou_little_maid.altar_craft.title": "Altar Craft", "jei.touhou_little_maid.altar_craft.result": "Result: %s", "jei.touhou_little_maid.altar_craft.item_craft.result": "Craft an Item", - "jei.touhou_little_maid.altar_craft.spawn_maid.result": "Spawn New Maid", + "jei.touhou_little_maid.altar_craft.spawn_box.result": "Spawn New Maid", "jei.touhou_little_maid.altar_craft.reborn_maid.result": "Reborn Maid From Garage Kit", "jei.touhou_little_maid.altar_craft.spawn_lightning_bolt.result": "Spawn Lightning Bolt", "top.touhou_little_maid.entity_maid.task": "Mode: ", diff --git a/src/main/resources/assets/touhou_little_maid/lang/zh_cn.json b/src/main/resources/assets/touhou_little_maid/lang/zh_cn.json index 3701880f3..4f2670cba 100644 --- a/src/main/resources/assets/touhou_little_maid/lang/zh_cn.json +++ b/src/main/resources/assets/touhou_little_maid/lang/zh_cn.json @@ -3,6 +3,7 @@ "entity.touhou_little_maid.maid": "小女仆", "entity.touhou_little_maid.fairy": "妖精女仆", "entity.touhou_little_maid.danmaku": "弹幕", + "entity.touhou_little_maid.box": "蛋糕盒", "item_group.touhou_little_maid.main": "车万女仆丨主体", "item.touhou_little_maid.maid_spawn_egg": "女仆刷怪蛋", "item.touhou_little_maid.fairy_spawn_egg": "女仆妖精刷怪蛋", @@ -129,7 +130,7 @@ "jei.touhou_little_maid.altar_craft.title": "祭坛合成", "jei.touhou_little_maid.altar_craft.result": "结果:%s", "jei.touhou_little_maid.altar_craft.item_craft.result": "合成物品", - "jei.touhou_little_maid.altar_craft.spawn_maid.result": "生成新的女仆", + "jei.touhou_little_maid.altar_craft.spawn_box.result": "生成新的女仆", "jei.touhou_little_maid.altar_craft.reborn_maid.result": "Reborn Maid From Garage Kit", "jei.touhou_little_maid.altar_craft.spawn_lightning_bolt.result": "生成闪电", "top.touhou_little_maid.entity_maid.task": "模式:", diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_0.png b/src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_0.png new file mode 100644 index 0000000000000000000000000000000000000000..288d5447aa8f62287afd046fb9b227218f8fa7f3 GIT binary patch literal 4407 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 DJR?)k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_1.png b/src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_1.png new file mode 100644 index 0000000000000000000000000000000000000000..83b4563530e3eacaf864ee54b79cbe02af625dfe GIT binary patch literal 5612 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 Gc007s(YASjF0Pv~_ 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 Z;)CCP1Ys_Ro&A{u=-)8buF$*}{Xd-Sk52#q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_4.png b/src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_4.png new file mode 100644 index 0000000000000000000000000000000000000000..cc759c2189d7c101ff96d2177ad5e9658495726e GIT binary patch literal 2461 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFF6i*k&kczmscm4ar(q)eo z3QZ2;nsTD4Y{txUKBX7M+P;Zq^yoX@mWq9Oz|G^R$)owZf)^j$>J}TETf^(6yukN< zH+O5|lv~ffovF0qxc=3{Wa53xd)Lc9dRmD;fB0_a@7;Av-afM2QeFG^f=iS{?f=Nk zwTcsXofLIF-hcUU*jxcBn+ z`7S;-qZ_WZQ%s5CFQ^VZC=#e$YaLQx z`}O0;=XbxC-)0xT?*4Y~)NiZb&&gh&CnGn{`r5a=Ia%_tQMv1F|6lp>CVIZ*&AMM} zH^1F(U$wIK$Je9jb~V3Cc7He}{Jp+DwD8_P>#T=U?{OMM1f=S5KUl4=b1EeAgyy*` zhqU*Kr)*eoDo5-^F-;_I5@%qZ5p2O#NzhAqpT716rR{OPE;_Iq+@7-6J zqVf3Sw(7?>%ii}szm*+*{8;*a^C=%+%}&2he~}UB+8Kc)e!@hMLi9 z)(`Jqx=;IfdUkjG?%Lw5clYl3dcx@6+gr<~79x}#Vp?Gv%)S0g+=PQoS~?B4;QB`; zz(MlgpZmeRrDrcL>bdPKY5#9hU-atS{6CZWgypAye6py=-r};I)Ttf+XQrmkdE}$J z=TfyJ8~3U+sf=%O_?KF5|35Y6f6@0}Ub{bhx>%N|@nr7o?6>cvS1&gE^YZs+ZT&6! zxweLO<bKpq{rl|qf8DwK_Eq!vto=VfF28l}Xzxek@9T26eqJwA`QrP0 zs2y#d`(%pKf1k)WwV7Y+!jI+enDuzl-~an}(^Zmv`~MBs^6DSY4BWl(T3y-G%WuD~ zb$-0LyzaZt@6S(z-*V5MFH!&R-}8RndVc+F@O-(*X~lnGp;UFB24)xfzs!MPUMC!V+Nd z_>tQ|e@Xam?|=9IH-D)Fit6l~BA5Aas$D;iPJ`<7OUl3?eLk^~b;FaOswH4IY+#rc z?QJ$_IP|gs#2+)L;-7p8T(59u7zVwt^#R2~j)2;NqaF*t8)$+nj~NYO%B}YfF9BCF wiA+&FBG@$PFibei#9%o}jRpb1RPcCy&FcLd>J=y31Djn8p00i_>zopr02WUu8~^|S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_5.png b/src/main/resources/assets/touhou_little_maid/textures/entity/box/cake_box_5.png new file mode 100644 index 0000000000000000000000000000000000000000..7f00c48e9c068eef185512b2e437cf48d183fb87 GIT binary patch literal 5596 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 C2u@-E literal 0 HcmV?d00001 diff --git a/src/main/resources/data/touhou_little_maid/recipes/altar/spawn_maid.json b/src/main/resources/data/touhou_little_maid/recipes/altar/spawn_box.json similarity index 72% rename from src/main/resources/data/touhou_little_maid/recipes/altar/spawn_maid.json rename to src/main/resources/data/touhou_little_maid/recipes/altar/spawn_box.json index 5ac9b2d02..14a1b547c 100644 --- a/src/main/resources/data/touhou_little_maid/recipes/altar/spawn_maid.json +++ b/src/main/resources/data/touhou_little_maid/recipes/altar/spawn_box.json @@ -1,7 +1,14 @@ { "type": "touhou_little_maid:altar_crafting", "output": { - "type": "touhou_little_maid:maid" + "type": "touhou_little_maid:box", + "nbt": { + "Passengers": [ + { + "id": "touhou_little_maid:maid" + } + ] + } }, "power": 0.5, "ingredients": [