diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index f0718ed8..97faaa79 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -59,6 +59,7 @@ import com.minelittlepony.unicopia.player.PlayerSpeciesList; import com.minelittlepony.unicopia.power.PowersRegistry; import com.minelittlepony.unicopia.spell.SpellRegistry; import com.minelittlepony.unicopia.util.crafting.CraftingManager; +import com.minelittlepony.unicopia.world.UWorld; @Mod( modid = Unicopia.MODID, @@ -205,6 +206,13 @@ public class Unicopia implements IGuiHandler { } } + @SubscribeEvent + public static void onWorldTick(TickEvent.WorldTickEvent event) { + if (event.phase == Phase.START) { + UWorld.tick(event.world); + } + } + @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { if (event.phase == Phase.END) { diff --git a/src/main/java/com/minelittlepony/unicopia/power/PowerStomp.java b/src/main/java/com/minelittlepony/unicopia/power/PowerStomp.java index 87c0d911..d0ccddc3 100644 --- a/src/main/java/com/minelittlepony/unicopia/power/PowerStomp.java +++ b/src/main/java/com/minelittlepony/unicopia/power/PowerStomp.java @@ -14,6 +14,7 @@ import com.minelittlepony.unicopia.particle.Particles; import com.minelittlepony.unicopia.player.IPlayer; import com.minelittlepony.unicopia.player.PlayerSpeciesList; import com.minelittlepony.unicopia.power.data.Location; +import com.minelittlepony.unicopia.world.UWorld; import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.PosHelper; import com.minelittlepony.util.WorldEvent; @@ -168,13 +169,19 @@ public class PowerStomp implements IPower { IPower.takeFromPlayer(player, rad); } else if (data.hitType == 1) { - if (player.world.rand.nextInt(30) == 0) { - removeTree(player.world, data.pos()); - } else { - dropApples(player.world, data.pos()); - } + if (player.world.rand.nextInt(5) == 0) { + int cost = dropApples(player.world, data.pos()); - IPower.takeFromPlayer(player, 1); + if (cost > 0) { + IPower.takeFromPlayer(player, cost / 3); + } + } else { + UWorld.enqueueTask(() -> { + removeTree(player.world, data.pos()); + }); + + IPower.takeFromPlayer(player, 3); + } } } @@ -233,7 +240,8 @@ public class PowerStomp implements IPower { int size = measureTree(w, log, pos); if (size > 0) { pos = ascendTrunk(new ArrayList(), w, pos, log, 0); - removeTreePart(w, log, pos, 0); + + removeTreePart( w, log, pos, 0); } } @@ -303,7 +311,7 @@ public class PowerStomp implements IPower { return pos; } - private void dropApples(World w, BlockPos pos) { + private int dropApples(World w, BlockPos pos) { IBlockState log = w.getBlockState(pos); int size = measureTree(w, log, pos); if (size > 0) { @@ -312,8 +320,17 @@ public class PowerStomp implements IPower { dropApplesPart(capturedDrops, new ArrayList(), w, log, pos, 0); - capturedDrops.forEach(w::spawnEntity); + UWorld.enqueueTask(() -> { + capturedDrops.forEach(item -> { + item.setNoPickupDelay(); + w.spawnEntity(item); + }); + }); + + return capturedDrops.size() / 3; } + + return 0; } private void dropApplesPart(List drops, List done, World w, IBlockState log, BlockPos pos, int level) { diff --git a/src/main/java/com/minelittlepony/unicopia/world/UWorld.java b/src/main/java/com/minelittlepony/unicopia/world/UWorld.java new file mode 100644 index 00000000..05efc0f9 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/world/UWorld.java @@ -0,0 +1,31 @@ +package com.minelittlepony.unicopia.world; + +import java.util.Queue; + +import com.google.common.collect.Queues; +import com.minelittlepony.jumpingcastle.Exceptions; +import com.minelittlepony.unicopia.Unicopia; + +import net.minecraft.world.World; + +public class UWorld { + + private static final Queue tickTasks = Queues.newArrayDeque(); + + private static final Object locker = new Object(); + + public static void tick(World world) { + synchronized (locker) { + Runnable task; + while ((task = tickTasks.poll()) != null) { + Exceptions.logged(task, Unicopia.log); + } + } + } + + public static void enqueueTask(Runnable task) { + synchronized (locker) { + tickTasks.add(task); + } + } +}