mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-01 19:46:42 +01:00
Fixed crash when an earth pony tries to kick a tree during a world tick
This commit is contained in:
parent
4cb2b6d0e0
commit
a8f79d31b4
3 changed files with 65 additions and 9 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
31
src/main/java/com/minelittlepony/unicopia/world/UWorld.java
Normal file
31
src/main/java/com/minelittlepony/unicopia/world/UWorld.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue