Fixed crash when an earth pony tries to kick a tree during a world tick

This commit is contained in:
Sollace 2019-02-09 20:50:01 +02:00
parent 4cb2b6d0e0
commit a8f79d31b4
3 changed files with 65 additions and 9 deletions

View file

@ -59,6 +59,7 @@ import com.minelittlepony.unicopia.player.PlayerSpeciesList;
import com.minelittlepony.unicopia.power.PowersRegistry; import com.minelittlepony.unicopia.power.PowersRegistry;
import com.minelittlepony.unicopia.spell.SpellRegistry; import com.minelittlepony.unicopia.spell.SpellRegistry;
import com.minelittlepony.unicopia.util.crafting.CraftingManager; import com.minelittlepony.unicopia.util.crafting.CraftingManager;
import com.minelittlepony.unicopia.world.UWorld;
@Mod( @Mod(
modid = Unicopia.MODID, 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 @SubscribeEvent
public static void onPlayerTick(TickEvent.PlayerTickEvent event) { public static void onPlayerTick(TickEvent.PlayerTickEvent event) {
if (event.phase == Phase.END) { if (event.phase == Phase.END) {

View file

@ -14,6 +14,7 @@ import com.minelittlepony.unicopia.particle.Particles;
import com.minelittlepony.unicopia.player.IPlayer; import com.minelittlepony.unicopia.player.IPlayer;
import com.minelittlepony.unicopia.player.PlayerSpeciesList; import com.minelittlepony.unicopia.player.PlayerSpeciesList;
import com.minelittlepony.unicopia.power.data.Location; import com.minelittlepony.unicopia.power.data.Location;
import com.minelittlepony.unicopia.world.UWorld;
import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.MagicalDamageSource;
import com.minelittlepony.util.PosHelper; import com.minelittlepony.util.PosHelper;
import com.minelittlepony.util.WorldEvent; import com.minelittlepony.util.WorldEvent;
@ -168,13 +169,19 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
IPower.takeFromPlayer(player, rad); IPower.takeFromPlayer(player, rad);
} else if (data.hitType == 1) { } else if (data.hitType == 1) {
if (player.world.rand.nextInt(30) == 0) { if (player.world.rand.nextInt(5) == 0) {
removeTree(player.world, data.pos()); int cost = dropApples(player.world, data.pos());
} else {
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<PowerStomp.Data> {
int size = measureTree(w, log, pos); int size = measureTree(w, log, pos);
if (size > 0) { if (size > 0) {
pos = ascendTrunk(new ArrayList<BlockPos>(), w, pos, log, 0); pos = ascendTrunk(new ArrayList<BlockPos>(), w, pos, log, 0);
removeTreePart(w, log, pos, 0);
removeTreePart( w, log, pos, 0);
} }
} }
@ -303,7 +311,7 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
return pos; return pos;
} }
private void dropApples(World w, BlockPos pos) { private int dropApples(World w, BlockPos pos) {
IBlockState log = w.getBlockState(pos); IBlockState log = w.getBlockState(pos);
int size = measureTree(w, log, pos); int size = measureTree(w, log, pos);
if (size > 0) { if (size > 0) {
@ -312,8 +320,17 @@ public class PowerStomp implements IPower<PowerStomp.Data> {
dropApplesPart(capturedDrops, new ArrayList<BlockPos>(), w, log, pos, 0); dropApplesPart(capturedDrops, new ArrayList<BlockPos>(), 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<EntityItem> drops, List<BlockPos> done, World w, IBlockState log, BlockPos pos, int level) { private void dropApplesPart(List<EntityItem> drops, List<BlockPos> done, World w, IBlockState log, BlockPos pos, int level) {

View file

@ -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<Runnable> 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);
}
}
}