From 373a2c64cdb113b7d47354598cfef8db32cbf3a0 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 19 Feb 2019 12:44:50 +0200 Subject: [PATCH] You will explode twice when the alicorn amulet breaks --- .../unicopia/item/ItemAlicornAmulet.java | 17 +++++++- .../unicopia/power/PowerStomp.java | 8 ++-- .../minelittlepony/unicopia/world/UWorld.java | 43 +++++++++++++++++-- 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/item/ItemAlicornAmulet.java b/src/main/java/com/minelittlepony/unicopia/item/ItemAlicornAmulet.java index 3d718ecc..2fd2b885 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ItemAlicornAmulet.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ItemAlicornAmulet.java @@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.player.IPlayer; import com.minelittlepony.unicopia.player.PlayerSpeciesList; import com.minelittlepony.unicopia.spell.SpellAffinity; +import com.minelittlepony.unicopia.world.UWorld; import com.minelittlepony.util.MagicalDamageSource; import com.minelittlepony.util.lang.ClientLocale; import com.minelittlepony.util.vector.VecHelper; @@ -56,7 +57,6 @@ public class ItemAlicornAmulet extends ItemArmor implements IDependable { setTranslationKey(name); setRegistryName(domain, name); - setMaxDamage(0); } @Override @@ -204,6 +204,21 @@ public class ItemAlicornAmulet extends ItemArmor implements IDependable { } } + if (itemStack.getItemDamage() >= getMaxDamage(itemStack) - 1) { + itemStack.damageItem(10, player); + + player.attackEntityFrom(DAMAGE_SOURCE, player.getMaxHealth() - 0.01F); + player.getFoodStats().setFoodLevel(1); + + Vec3d pos = player.getPositionVector(); + + player.world.newExplosion(player, pos.x, pos.y, pos.z, 10, false, false); + + UWorld.scheduleTask(w -> { + w.newExplosion(player, pos.x, pos.y, pos.z, 6, false, true); + }, 50); + } + iplayer.getInventory().enforceDependency(this); } diff --git a/src/main/java/com/minelittlepony/unicopia/power/PowerStomp.java b/src/main/java/com/minelittlepony/unicopia/power/PowerStomp.java index 24993a90..a7dd718c 100644 --- a/src/main/java/com/minelittlepony/unicopia/power/PowerStomp.java +++ b/src/main/java/com/minelittlepony/unicopia/power/PowerStomp.java @@ -179,9 +179,7 @@ public class PowerStomp implements IPower { if (harmed || player.world.rand.nextInt(5) == 0) { if (!harmed || player.world.rand.nextInt(30) == 0) { - UWorld.enqueueTask(() -> { - removeTree(player.world, data.pos()); - }); + UWorld.enqueueTask(w -> removeTree(w, data.pos())); } IPower.takeFromPlayer(player, 3); @@ -331,10 +329,10 @@ public class PowerStomp implements IPower { dropApplesPart(capturedDrops, new ArrayList(), w, log, pos, 0); - UWorld.enqueueTask(() -> { + UWorld.enqueueTask(wo -> { capturedDrops.forEach(item -> { item.setNoPickupDelay(); - w.spawnEntity(item); + wo.spawnEntity(item); }); }); diff --git a/src/main/java/com/minelittlepony/unicopia/world/UWorld.java b/src/main/java/com/minelittlepony/unicopia/world/UWorld.java index 7435e473..73f9299d 100644 --- a/src/main/java/com/minelittlepony/unicopia/world/UWorld.java +++ b/src/main/java/com/minelittlepony/unicopia/world/UWorld.java @@ -1,8 +1,12 @@ package com.minelittlepony.unicopia.world; +import java.util.List; import java.util.Queue; import java.util.Random; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import com.google.common.collect.Lists; import com.google.common.collect.Queues; import com.minelittlepony.jumpingcastle.Exceptions; import com.minelittlepony.unicopia.Unicopia; @@ -27,16 +31,23 @@ public class UWorld implements IWorldGenerator { return instance; } - private static final Queue tickTasks = Queues.newArrayDeque(); + private static final Queue> tickTasks = Queues.newArrayDeque(); + private static List delayedTasks = Lists.newArrayList(); private static final Object locker = new Object(); - public static void enqueueTask(Runnable task) { + public static void enqueueTask(Consumer task) { synchronized (locker) { tickTasks.add(task); } } + public static void scheduleTask(Consumer task, int ticksLater) { + synchronized (locker) { + delayedTasks.add(new DelayedTask(task, ticksLater)); + } + } + private final BlockInteractions blocks = new BlockInteractions(); private final CloudGen cloudsGen = new CloudGen(); @@ -53,9 +64,12 @@ public class UWorld implements IWorldGenerator { public void onUpdate(World world) { synchronized (locker) { - Runnable task; + delayedTasks = delayedTasks.stream().filter(DelayedTask::tick).collect(Collectors.toList()); + + Consumer task; while ((task = tickTasks.poll()) != null) { - Exceptions.logged(task, Unicopia.log); + Consumer i = task; + Exceptions.logged(() -> i.accept(world), Unicopia.log); } } } @@ -86,4 +100,25 @@ public class UWorld implements IWorldGenerator { } } } + + private static class DelayedTask { + final Consumer task; + + int ticksDelay; + + DelayedTask(Consumer task, int ticks) { + this.task = task; + this.ticksDelay = ticks; + } + + boolean tick() { + if (ticksDelay-- <= 0) { + tickTasks.add(task); + + return false; + } + + return true; + } + } }