1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

Added CoolerFeedPlayerEvent

This commit is contained in:
TheBusyBiscuit 2020-11-10 00:36:38 +01:00
parent 1d36ca82ba
commit 05e983917a
4 changed files with 140 additions and 11 deletions

View File

@ -29,6 +29,7 @@
* The Smelters Pick now also works on Ancient Debris
* (API) Added PlayerPreResearchEvent
* Added a config option to disable network visualizations
* (API) Added CoolerFeedPlayerEvent
#### Changes
* Removed 1.13 support

View File

@ -0,0 +1,113 @@
package io.github.thebusybiscuit.slimefun4.api.events;
import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;
import org.apache.commons.lang.Validate;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionEffect;
import io.github.thebusybiscuit.slimefun4.implementation.items.backpacks.Cooler;
/**
* This {@link Event} is called whenever a {@link Player} is
* fed through a {@link Cooler}.
*
* @author TheBusyBiscuit
*
* @see Cooler
*
*/
public class CoolerFeedPlayerEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private final Cooler cooler;
private final ItemStack coolerItem;
private ItemStack consumedItem;
private boolean cancelled;
@ParametersAreNonnullByDefault
public CoolerFeedPlayerEvent(Player player, Cooler cooler, ItemStack coolerItem, ItemStack consumedItem) {
super(player);
this.cooler = cooler;
this.coolerItem = coolerItem;
this.consumedItem = consumedItem;
}
/**
* This returns the {@link Cooler} that was used.
*
* @return The {@link Cooler} that was used
*/
@Nonnull
public Cooler getCooler() {
return cooler;
}
/**
* This returns the {@link Cooler} that was used (as an {@link ItemStack})
*
* @return The {@link Cooler} that was used
*/
@Nonnull
public ItemStack getCoolerItem() {
return coolerItem;
}
/**
* This returns the {@link ItemStack} that was consumed.
* The returned {@link ItemStack} is immutable.
*
* @return The {@link ItemStack} that was consumed
*/
@Nonnull
public ItemStack getConsumedItem() {
return consumedItem.clone();
}
/**
* This sets the {@link ItemStack} that should be "consumed".
* The {@link ItemStack} must be a potion.
* The {@link Player} will receive the {@link PotionEffect PotionEffects} of the
* provided potion upon consumption.
*
* @param item
* The new {@link ItemStack}
*/
public void setConsumedItem(@Nonnull ItemStack item) {
Validate.notNull(item, "The consumed Item cannot be null!");
Validate.isTrue(item.getItemMeta() instanceof PotionMeta, "The item must be a potion!");
this.consumedItem = item;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
@Nonnull
public static HandlerList getHandlerList() {
return handlers;
}
@Nonnull
@Override
public HandlerList getHandlers() {
return getHandlerList();
}
}

View File

@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionEffect;
import io.github.thebusybiscuit.slimefun4.api.events.CoolerFeedPlayerEvent;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerBackpack;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
@ -37,11 +38,13 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
*/
public class CoolerListener implements Listener {
private final SlimefunPlugin plugin;
private final Cooler cooler;
public CoolerListener(@Nonnull SlimefunPlugin plugin, @Nonnull Cooler cooler) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
this.plugin = plugin;
this.cooler = cooler;
}
@ -93,12 +96,12 @@ public class CoolerListener implements Listener {
private void takeJuiceFromCooler(@Nonnull Player p, @Nonnull ItemStack cooler) {
PlayerProfile.getBackpack(cooler, backpack -> {
if (backpack != null) {
SlimefunPlugin.runSync(() -> consumeJuice(p, backpack));
SlimefunPlugin.runSync(() -> consumeJuice(p, cooler, backpack));
}
});
}
private boolean consumeJuice(@Nonnull Player p, @Nonnull PlayerBackpack backpack) {
private boolean consumeJuice(@Nonnull Player p, @Nonnull ItemStack coolerItem, @Nonnull PlayerBackpack backpack) {
Inventory inv = backpack.getInventory();
int slot = -1;
@ -112,7 +115,12 @@ public class CoolerListener implements Listener {
}
if (slot >= 0) {
PotionMeta im = (PotionMeta) inv.getItem(slot).getItemMeta();
ItemStack item = inv.getItem(slot);
CoolerFeedPlayerEvent event = new CoolerFeedPlayerEvent(p, cooler, coolerItem, item);
plugin.getServer().getPluginManager().callEvent(event);
if (!event.isCancelled()) {
PotionMeta im = (PotionMeta) event.getConsumedItem().getItemMeta();
for (PotionEffect effect : im.getCustomEffects()) {
p.addPotionEffect(effect);
@ -122,7 +130,11 @@ public class CoolerListener implements Listener {
p.playSound(p.getLocation(), Sound.ENTITY_GENERIC_DRINK, 1F, 1F);
inv.setItem(slot, null);
backpack.markDirty();
return true;
} else {
return false;
}
}
return false;

View File

@ -17,6 +17,7 @@ import org.junit.jupiter.api.Test;
import be.seeseemelk.mockbukkit.MockBukkit;
import be.seeseemelk.mockbukkit.ServerMock;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import io.github.thebusybiscuit.slimefun4.api.events.CoolerFeedPlayerEvent;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerBackpack;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
@ -81,6 +82,8 @@ class TestCoolerListener {
FoodLevelChangeEvent event = new FoodLevelChangeEvent(player, 16);
listener.onHungerLoss(event);
Assertions.assertTrue(player.hasPotionEffect(PotionEffectType.HEALTH_BOOST));
server.getPluginManager().assertEventFired(CoolerFeedPlayerEvent.class, e -> e.getPlayer() == player && e.getCooler() == cooler);
}
}