From e1659c32b21564066393e4a6d1d0e65914d1ced8 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 30 Sep 2022 00:23:16 +0200 Subject: [PATCH] You can now stomp apple pies. You monster --- .../unicopia/AwaitTickQueue.java | 12 +-- .../minelittlepony/unicopia/UGameEvents.java | 18 ++++ .../com/minelittlepony/unicopia/Unicopia.java | 1 + .../unicopia/block/PieBlock.java | 83 ++++++++++++++++-- .../unicopia/block/UBlocks.java | 2 +- .../unicopia/blockstates/apple_pie.json | 12 ++- .../models/block/stomped_apple_pie.json | 9 ++ .../block/stomped_apple_pie_corner.json | 9 ++ .../models/block/stomped_apple_pie_elbow.json | 9 ++ .../block/stomped_apple_pie_straight.json | 9 ++ .../textures/block/apple_pie_top_stomped.png | Bin 0 -> 2093 bytes 11 files changed, 146 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/UGameEvents.java create mode 100644 src/main/resources/assets/unicopia/models/block/stomped_apple_pie.json create mode 100644 src/main/resources/assets/unicopia/models/block/stomped_apple_pie_corner.json create mode 100644 src/main/resources/assets/unicopia/models/block/stomped_apple_pie_elbow.json create mode 100644 src/main/resources/assets/unicopia/models/block/stomped_apple_pie_straight.json create mode 100644 src/main/resources/assets/unicopia/textures/block/apple_pie_top_stomped.png diff --git a/src/main/java/com/minelittlepony/unicopia/AwaitTickQueue.java b/src/main/java/com/minelittlepony/unicopia/AwaitTickQueue.java index 7ce4d26b..82be7252 100644 --- a/src/main/java/com/minelittlepony/unicopia/AwaitTickQueue.java +++ b/src/main/java/com/minelittlepony/unicopia/AwaitTickQueue.java @@ -8,18 +8,18 @@ import net.minecraft.world.World; public class AwaitTickQueue { public static void scheduleTask(World reference, Consumer task, int ticksLater) { - if (reference instanceof ServerWorld) { + if (reference instanceof ServerWorld serverWorld) { CompletableFuture.runAsync(() -> { - task.accept(reference); - }, CompletableFuture.delayedExecutor(ticksLater * 100, TimeUnit.MILLISECONDS, reference.getServer())); + task.accept(serverWorld); + }, CompletableFuture.delayedExecutor(ticksLater * 100, TimeUnit.MILLISECONDS, serverWorld.getServer())); } } public static void scheduleTask(World reference, Consumer task) { - if (reference instanceof ServerWorld) { + if (reference instanceof ServerWorld serverWorld) { CompletableFuture.runAsync(() -> { - task.accept(reference); - }, reference.getServer()); + task.accept(serverWorld); + }, serverWorld.getServer()); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/UGameEvents.java b/src/main/java/com/minelittlepony/unicopia/UGameEvents.java new file mode 100644 index 00000000..ad09cae2 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/UGameEvents.java @@ -0,0 +1,18 @@ +package com.minelittlepony.unicopia; + +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.event.GameEvent; + +public interface UGameEvents { + + GameEvent PIE_STOMP = register("pie_stomp", 5); + + static GameEvent register(String name, int range) { + Identifier id = Unicopia.id(name); + return Registry.register(Registry.GAME_EVENT, id, new GameEvent(id.toString(), range)); + } + + static void bootstrap() { + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 1e67cff6..22e3bc41 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -72,6 +72,7 @@ public class Unicopia implements ModInitializer { ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(StateMapLoader.INSTANCE); ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(SpellbookChapterLoader.INSTANCE); + UGameEvents.bootstrap(); UBlocks.bootstrap(); UItems.bootstrap(); UPotions.bootstrap(); diff --git a/src/main/java/com/minelittlepony/unicopia/block/PieBlock.java b/src/main/java/com/minelittlepony/unicopia/block/PieBlock.java index 78449be4..b4f029ce 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/PieBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/PieBlock.java @@ -1,27 +1,37 @@ package com.minelittlepony.unicopia.block; +import com.minelittlepony.unicopia.AwaitTickQueue; +import com.minelittlepony.unicopia.UGameEvents; import com.minelittlepony.unicopia.util.SoundEmitter; import net.minecraft.block.*; +import net.minecraft.entity.Entity; import net.minecraft.entity.ai.pathing.NavigationType; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; import net.minecraft.item.*; +import net.minecraft.particle.ParticleTypes; import net.minecraft.sound.SoundEvents; import net.minecraft.stat.Stats; import net.minecraft.state.StateManager; -import net.minecraft.state.property.IntProperty; +import net.minecraft.state.property.*; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.*; +import net.minecraft.util.math.random.Random; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.*; import net.minecraft.world.event.GameEvent; -public class PieBlock extends Block { +public class PieBlock extends Block implements Waterloggable { public static final int MAX_BITES = 3; public static final IntProperty BITES = IntProperty.of("bites", 0, MAX_BITES); + public static final BooleanProperty STOMPED = BooleanProperty.of("stomped"); + public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; + private static final VoxelShape[] SHAPES; static { final int PIE_HEIGHT = 5; @@ -37,7 +47,7 @@ public class PieBlock extends Block { public PieBlock(Settings settings) { super(settings); - setDefaultState(getDefaultState().with(BITES, 0)); + setDefaultState(getDefaultState().with(STOMPED, false).with(WATERLOGGED, false)); } @Deprecated @@ -69,10 +79,15 @@ public class PieBlock extends Block { return ActionResult.PASS; } player.incrementStat(Stats.EAT_CAKE_SLICE); - player.getHungerManager().add(2, 0.1f); + player.getHungerManager().add(state.get(STOMPED) ? 1 : 2, 0.1f); int bites = state.get(BITES); world.emitGameEvent(player, GameEvent.EAT, pos); - SoundEmitter.playSoundAt(player, SoundEvents.ENTITY_PLAYER_BURP, 0.5F, world.getRandom().nextFloat() * 0.1F + 0.9F); + SoundEmitter.playSoundAt(player, SoundEvents.ENTITY_GENERIC_EAT, 0.5F, world.getRandom().nextFloat() * 0.1F + 0.9F); + if (world instanceof World ww && (!player.canConsume(false) || world.getRandom().nextInt(10) == 0)) { + AwaitTickQueue.scheduleTask(ww, w -> { + SoundEmitter.playSoundAt(player, SoundEvents.ENTITY_PLAYER_BURP, 0.5F, world.getRandom().nextFloat() * 0.1F + 0.9F); + }, 5); + } if (bites < MAX_BITES) { world.setBlockState(pos, state.with(BITES, bites + 1), Block.NOTIFY_ALL); @@ -83,24 +98,78 @@ public class PieBlock extends Block { return ActionResult.SUCCESS; } + @Override + public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random random) { + if (state.get(STOMPED)) { + Vec3d center = Vec3d.ofCenter(pos); + world.addParticle(ParticleTypes.SNEEZE, + random.nextTriangular(center.getX(), 0.9), + random.nextTriangular(center.getY(), 0.9), + random.nextTriangular(center.getZ(), 0.9), + 0, + 0, + 0 + ); + } else { + if (world.random.nextInt(10) == 0) { + Vec3d center = Vec3d.ofCenter(pos); + world.addParticle(ParticleTypes.SNEEZE, + random.nextTriangular(center.getX(), 0.2), + random.nextTriangular(center.getY(), 0.2), + random.nextTriangular(center.getZ(), 0.2), + 0, + 0.01F, + 0 + ); + } + } + } + + @Override + public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) { + if (!state.get(STOMPED)) { + world.setBlockState(pos, state.cycle(STOMPED)); + world.syncWorldEvent(WorldEvents.BLOCK_BROKEN, pos, Block.getRawIdFromState(state)); + world.emitGameEvent(UGameEvents.PIE_STOMP, pos, GameEvent.Emitter.of(entity, state)); + } + } + @Deprecated @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { if (direction == Direction.DOWN && !state.canPlaceAt(world, pos)) { return Blocks.AIR.getDefaultState(); } + if (state.get(WATERLOGGED)) { + world.createAndScheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); } @Deprecated @Override public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - return world.getBlockState(pos.down()).getMaterial().isSolid(); + return world.getBlockState(pos.down()).isSideSolidFullSquare(world, pos, Direction.UP); + } + + @Deprecated + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + return super.getDefaultState().with(WATERLOGGED, ctx.getWorld().getFluidState(ctx.getBlockPos()).getFluid() == Fluids.WATER); + } + + @Deprecated + @Override + public FluidState getFluidState(BlockState state) { + if (state.get(WATERLOGGED)) { + return Fluids.WATER.getStill(false); + } + return super.getFluidState(state); } @Override protected void appendProperties(StateManager.Builder builder) { - builder.add(BITES); + builder.add(BITES, STOMPED, WATERLOGGED); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index b100c4f8..082eeed1 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -66,7 +66,7 @@ public interface UBlocks { Block SOUR_APPLE = register("sour_apple", new FruitBlock(FabricBlockSettings.of(Material.GOURD, MapColor.GREEN).sounds(BlockSoundGroup.WOOD), Direction.DOWN, SOUR_APPLE_LEAVES, FruitBlock.DEFAULT_SHAPE)); Block SOUR_APPLE_SPROUT = register("sour_apple_sprout", new SproutBlock(0xE5FFCC88, () -> UItems.SOUR_APPLE_SEEDS, () -> UTreeGen.SOUR_APPLE_TREE.sapling().map(Block::getDefaultState).get())); - Block APPLE_PIE = register("apple_pie", new PieBlock(FabricBlockSettings.of(Material.CAKE, MapColor.ORANGE).strength(0.5F).sounds(BlockSoundGroup.WOOL))); + Block APPLE_PIE = register("apple_pie", new PieBlock(FabricBlockSettings.of(Material.CAKE, MapColor.ORANGE).strength(0.5F).sounds(BlockSoundGroup.WET_GRASS))); SegmentedCropBlock OATS = register("oats", SegmentedCropBlock.create(11, 5, AbstractBlock.Settings.copy(Blocks.WHEAT), () -> UItems.OAT_SEEDS, null, () -> UBlocks.OATS_STEM)); SegmentedCropBlock OATS_STEM = register("oats_stem", OATS.createNext(5)); diff --git a/src/main/resources/assets/unicopia/blockstates/apple_pie.json b/src/main/resources/assets/unicopia/blockstates/apple_pie.json index c6afe6ff..2fc74d17 100644 --- a/src/main/resources/assets/unicopia/blockstates/apple_pie.json +++ b/src/main/resources/assets/unicopia/blockstates/apple_pie.json @@ -1,8 +1,12 @@ { "variants": { - "bites=0": { "model": "unicopia:block/apple_pie" }, - "bites=1": { "model": "unicopia:block/apple_pie_elbow" }, - "bites=2": { "model": "unicopia:block/apple_pie_straight" }, - "bites=3": { "model": "unicopia:block/apple_pie_corner" } + "bites=0,stomped=false": { "model": "unicopia:block/apple_pie" }, + "bites=1,stomped=false": { "model": "unicopia:block/apple_pie_elbow" }, + "bites=2,stomped=false": { "model": "unicopia:block/apple_pie_straight" }, + "bites=3,stomped=false": { "model": "unicopia:block/apple_pie_corner" }, + "bites=0,stomped=true": { "model": "unicopia:block/stomped_apple_pie" }, + "bites=1,stomped=true": { "model": "unicopia:block/stomped_apple_pie_elbow" }, + "bites=2,stomped=true": { "model": "unicopia:block/stomped_apple_pie_straight" }, + "bites=3,stomped=true": { "model": "unicopia:block/stomped_apple_pie_corner" } } } diff --git a/src/main/resources/assets/unicopia/models/block/stomped_apple_pie.json b/src/main/resources/assets/unicopia/models/block/stomped_apple_pie.json new file mode 100644 index 00000000..c01a27a8 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/stomped_apple_pie.json @@ -0,0 +1,9 @@ +{ + "parent": "unicopia:block/pie_full", + "textures": { + "top": "unicopia:block/apple_pie_top_stomped", + "bottom": "unicopia:block/apple_pie_bottom", + "sides": "unicopia:block/apple_pie_side", + "inner": "unicopia:block/apple_pie_inner" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_corner.json b/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_corner.json new file mode 100644 index 00000000..14eb7794 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_corner.json @@ -0,0 +1,9 @@ +{ + "parent": "unicopia:block/pie_corner", + "textures": { + "top": "unicopia:block/apple_pie_top_stomped", + "bottom": "unicopia:block/apple_pie_bottom", + "sides": "unicopia:block/apple_pie_side", + "inner": "unicopia:block/apple_pie_inner" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_elbow.json b/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_elbow.json new file mode 100644 index 00000000..1f3f792a --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_elbow.json @@ -0,0 +1,9 @@ +{ + "parent": "unicopia:block/pie_elbow", + "textures": { + "top": "unicopia:block/apple_pie_top_stomped", + "bottom": "unicopia:block/apple_pie_bottom", + "sides": "unicopia:block/apple_pie_side", + "inner": "unicopia:block/apple_pie_inner" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_straight.json b/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_straight.json new file mode 100644 index 00000000..463904f3 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/stomped_apple_pie_straight.json @@ -0,0 +1,9 @@ +{ + "parent": "unicopia:block/pie_straight", + "textures": { + "top": "unicopia:block/apple_pie_top_stomped", + "bottom": "unicopia:block/apple_pie_bottom", + "sides": "unicopia:block/apple_pie_side", + "inner": "unicopia:block/apple_pie_inner" + } +} diff --git a/src/main/resources/assets/unicopia/textures/block/apple_pie_top_stomped.png b/src/main/resources/assets/unicopia/textures/block/apple_pie_top_stomped.png new file mode 100644 index 0000000000000000000000000000000000000000..ba91d2981abcd5f8a438e43cd3d475342cde8614 GIT binary patch literal 2093 zcmV+|2-5e7P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b@ax5nd{Ld+J1SABA<1ljS&-*PqkycckzC%vEYYnjvgy=U%oga z!t-gK@eX*0J^AbxmZR{tAU$vTG*9u{e0a9uFNpLwVmxp2CHU;$Kl=Kav+Kl}-LjS{ z3H&5G)H%vMg5d>X!o4iv$@qyF=ldym)K}jeiSNGo3s0j$OuQrgcxZjN$APNu8 zcr!N+_nd~zgzUAJokz(Ucuw;TW!ixKGXYjkv zM@MtEMG@ijhb!P>UNX>PF|6OPf*>?c9L1a9^L+n6SU3?_Et(Yvtp3_Au1K%g3hov< zz%b%1dvWgO02E>G2rv|&fKL=6CGwd$6M;vCJ{8D0IN=KtP>kGxk|l%$ag^8ISd;0t z<;Z&)DFh*6NFhU-5-PM3iISXTQN&P{%0Dpzd?pC&D~)N<2S zT6LX!=+a|PJ$LP;*FgiJG-Sk)MjkrKs1uWg(w8}|bnn5uZg5r58fPm(unO73wrJP%u`NGJG$UqsFIGvVaP*4VO zob+h-QtpRt4tf7yb>nyC+>-A9P|hvsJ}CE7w-2iIRo~mnLyy9?(r}UL1JVx$Ln|vR z_}AXvqPh>E6;wTMfiEpbbNq z`ZgnCLzXmbXM#$(p|upnMokde+e;Bd=o&?Bll%*1nfnj*p|^VbngyL=oXs$Sky}fP zk9H9BniOgCR?Wmw+;&$fsL>lNt~JJV;n-dn^2Q)It7#6@&tXc~L-r|~PqZUs z?mqaGn$gH^zuqG=Z8}K4#vzfo>1Mp5jqFjE)|#7kh7it)=_kn)z6Sv=V7l$l;L)8x z_Dull*CwC_v+Ua1w5SHR@|D~4qIU9FyST-zgpCokHt$&SZDiZ9hoTm2DRIbqpMf=E zd2o3&LwB~+ZCjH0`IxFkf!3s>DxD0`YhdH+})WY`R>F z;yquA-{*5n=4RqX(oF^UYEY(I1YXoF$w1{vIBB?a?%6ImKsC0gLcAJg-`gn)-mNBQ&n-&>j_U)em`5_HrzF3mZh#=4c`+-*fItuMi%u z#En)r;cY%e`CxR=z(`3+EKt|~KNc^@EIQp+tgir$mFib(_U@RGO?l*+9sdqo`dl0) z?LX2{*{xV;C*Sqt13g?PL^MiwVW2AUs{B< zk?B^CsHdV|hgpB(pjltj^)JcxY31Fwc;dR;mk1E`y?^i_AUq5{*dTU11va1#oVD%@ ze)s*$j>5zx6t^z-H|oRnRc?Kgd;kCe?@2^KR5;76lFM!rK@dexRd>&fUok{VA|znP zlHbZ-AwCQ?EI<)5B*tTBX1cqI#bDt*)T%ahUv=RhM*u$Fzw?M-;#44tfPop9I$D7Q z8U-?h2*<&=|L|ENfH{O#P!T$S0&yWs*^wYDgQ8K$gR`p>s~BiS0Z@Px1Tm-Y3qb_} zs0h{Icrpyf+}RJ6sX`N#5M~SUY-F_zWP{USh{C6b6Vv2q1AU2Xk}_p@wM{fhIP~^c z0X8q|RvC-&WjBJrq7!m9PDf++tMc})B?KX&1l0=#?ikQ?%AF>@J!aa4@c#9Zadf^u zjs$gvsnRB8$abcl0VE0E_k~iNEi}gkIs|}$HC^0oGsJ|#<7As zG0cbSW#nZSumZcjus<57vEm4Aqvr<93N*m&CJ}?sw92woz<3%eH=D?I5s(Vob)1sfGh-^aO=}-`a;;`K$Qln&dS{3v%19J!n6UJ^|xV?&8rNF}>a~KP6 zt{YBc<>w*OM8%^}CjSditI