mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-19 19:25:48 +00:00
Added AndroidFarmEvent (+ refactored Farmer Androids)
This commit is contained in:
parent
47fc037536
commit
4c879ac3b3
@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#### Additions
|
#### Additions
|
||||||
* Added Bee Armor (1.15+ only)
|
* Added Bee Armor (1.15+ only)
|
||||||
|
* (API) Added AndroidFarmEvent
|
||||||
|
|
||||||
#### Changes
|
#### Changes
|
||||||
* Performance optimizations for Cargo networks
|
* Performance optimizations for Cargo networks
|
||||||
|
@ -0,0 +1,122 @@
|
|||||||
|
package io.github.thebusybiscuit.slimefun4.api.events;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.AndroidInstance;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.FarmerAndroid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This {@link Event} is fired before a {@link FarmerAndroid} harvests a {@link Block}.
|
||||||
|
* If this {@link Event} is cancelled, the {@link Block} will not be harvested.
|
||||||
|
* <p>
|
||||||
|
* The {@link Event} will still be fired for non-harvestable blocks.
|
||||||
|
*
|
||||||
|
* @author TheBusyBiscuit
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class AndroidFarmEvent extends Event implements Cancellable {
|
||||||
|
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
|
||||||
|
private final Block block;
|
||||||
|
private final AndroidInstance android;
|
||||||
|
private final boolean isAdvanced;
|
||||||
|
private ItemStack drop;
|
||||||
|
private boolean cancelled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param block
|
||||||
|
* The harvested {@link Block}
|
||||||
|
* @param android
|
||||||
|
* The {@link AndroidInstance} that triggered this {@link Event}
|
||||||
|
* @param isAdvanced
|
||||||
|
* Whether this is an advanced farming action
|
||||||
|
* @param drop
|
||||||
|
* The item to be dropped or null
|
||||||
|
*/
|
||||||
|
public AndroidFarmEvent(@Nonnull Block block, @Nonnull AndroidInstance android, boolean isAdvanced, @Nullable ItemStack drop) {
|
||||||
|
this.block = block;
|
||||||
|
this.android = android;
|
||||||
|
this.isAdvanced = isAdvanced;
|
||||||
|
this.drop = drop;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the mined {@link Block}
|
||||||
|
*
|
||||||
|
* @return the mined {@link Block}
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
public Block getBlock() {
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This returns the harvested item or null.
|
||||||
|
*
|
||||||
|
* @return The harvested item or null
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public ItemStack getDrop() {
|
||||||
|
return drop;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether this was invoked via an advanced farming action
|
||||||
|
*
|
||||||
|
* @return Whether it is advanced
|
||||||
|
*/
|
||||||
|
public boolean isAdvanced() {
|
||||||
|
return isAdvanced;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will set the {@link ItemStack} result.
|
||||||
|
*
|
||||||
|
* @param drop
|
||||||
|
* The result or null
|
||||||
|
*/
|
||||||
|
public void setDrop(@Nullable ItemStack drop) {
|
||||||
|
this.drop = drop;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the {@link AndroidInstance} who
|
||||||
|
* triggered this {@link Event}
|
||||||
|
*
|
||||||
|
* @return the involved {@link AndroidInstance}
|
||||||
|
*/
|
||||||
|
@Nonnull
|
||||||
|
public AndroidInstance getAndroid() {
|
||||||
|
return android;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCancelled(boolean cancel) {
|
||||||
|
cancelled = cancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return getHandlerList();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -46,8 +46,6 @@ public class ThirdPartyPluginService extends IntegrationsManager {
|
|||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void loadExoticGarden(Plugin plugin, Function<Block, Optional<ItemStack>> method) {
|
public void loadExoticGarden(Plugin plugin, Function<Block, Optional<ItemStack>> method) {
|
||||||
// TODO: Move this method to IntegrationsManager and think of a better way to handle this
|
|
||||||
// For next RC!
|
|
||||||
if (plugin.getName().equals("ExoticGarden")) {
|
if (plugin.getName().equals("ExoticGarden")) {
|
||||||
exoticGardenIntegration = method;
|
exoticGardenIntegration = method;
|
||||||
}
|
}
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.implementation.items.androids;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import javax.annotation.ParametersAreNonnullByDefault;
|
|
||||||
|
|
||||||
import org.bukkit.Effect;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
|
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
|
||||||
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The {@link AdvancedFarmerAndroid} is an extension of the {@link FarmerAndroid}.
|
|
||||||
* It also allows the {@link Player} to harvest plants from the addon ExoticGarden.
|
|
||||||
*
|
|
||||||
* @author John000708
|
|
||||||
* @author TheBusyBiscuit
|
|
||||||
*
|
|
||||||
* @see FarmerAndroid
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class AdvancedFarmerAndroid extends FarmerAndroid {
|
|
||||||
|
|
||||||
@ParametersAreNonnullByDefault
|
|
||||||
public AdvancedFarmerAndroid(Category category, int tier, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
|
||||||
super(category, tier, item, recipeType, recipe);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AndroidType getAndroidType() {
|
|
||||||
return AndroidType.ADVANCED_FARMER;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void exoticFarm(BlockMenu menu, Block block) {
|
|
||||||
farm(menu, block);
|
|
||||||
|
|
||||||
if (SlimefunPlugin.getIntegrations().isExoticGardenInstalled()) {
|
|
||||||
Optional<ItemStack> result = SlimefunPlugin.getThirdPartySupportService().harvestExoticGardenPlant(block);
|
|
||||||
|
|
||||||
if (result.isPresent()) {
|
|
||||||
ItemStack drop = result.get();
|
|
||||||
menu.pushItem(drop, getOutputSlots());
|
|
||||||
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,15 +1,22 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.implementation.items.androids;
|
package io.github.thebusybiscuit.slimefun4.implementation.items.androids;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Effect;
|
import org.bukkit.Effect;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.data.Ageable;
|
import org.bukkit.block.data.Ageable;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.api.events.AndroidFarmEvent;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
@ -17,38 +24,62 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
|
|||||||
|
|
||||||
public class FarmerAndroid extends ProgrammableAndroid {
|
public class FarmerAndroid extends ProgrammableAndroid {
|
||||||
|
|
||||||
|
@ParametersAreNonnullByDefault
|
||||||
public FarmerAndroid(Category category, int tier, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
public FarmerAndroid(Category category, int tier, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
super(category, tier, item, recipeType, recipe);
|
super(category, tier, item, recipeType, recipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AndroidType getAndroidType() {
|
public AndroidType getAndroidType() {
|
||||||
return AndroidType.FARMER;
|
return getTier() == 1 ? AndroidType.FARMER : AndroidType.ADVANCED_FARMER;
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isFullGrown(Block block) {
|
|
||||||
BlockData data = block.getBlockData();
|
|
||||||
|
|
||||||
if (!(data instanceof Ageable)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ageable ageable = (Ageable) data;
|
|
||||||
return ageable.getAge() >= ageable.getMaximumAge();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void farm(BlockMenu menu, Block block) {
|
protected void farm(Block b, BlockMenu menu, Block block, boolean isAdvanced) {
|
||||||
if (isFullGrown(block)) {
|
Material blockType = block.getType();
|
||||||
ItemStack drop = getDropFromCrop(block.getType());
|
BlockData data = block.getBlockData();
|
||||||
|
ItemStack drop = null;
|
||||||
|
|
||||||
if (drop != null && menu.fits(drop, getOutputSlots())) {
|
if (data instanceof Ageable && ((Ageable) data).getAge() >= ((Ageable) data).getMaximumAge()) {
|
||||||
menu.pushItem(drop, getOutputSlots());
|
drop = getDropFromCrop(blockType);
|
||||||
Ageable ageable = (Ageable) block.getBlockData();
|
|
||||||
ageable.setAge(0);
|
|
||||||
block.setBlockData(ageable);
|
|
||||||
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getType());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AndroidInstance instance = new AndroidInstance(this, b);
|
||||||
|
|
||||||
|
AndroidFarmEvent event = new AndroidFarmEvent(block, instance, isAdvanced, drop);
|
||||||
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
|
||||||
|
handleExoticGarden(event);
|
||||||
|
|
||||||
|
if (!event.isCancelled()) {
|
||||||
|
drop = event.getDrop();
|
||||||
|
|
||||||
|
if (drop != null && menu.pushItem(drop, getOutputSlots()) == null) {
|
||||||
|
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, blockType);
|
||||||
|
|
||||||
|
if (data instanceof Ageable) {
|
||||||
|
((Ageable) data).setAge(0);
|
||||||
|
block.setBlockData(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deprecated method.
|
||||||
|
*
|
||||||
|
* @deprecated This will be moved into an {@link EventHandler} inside exoticgarden itself on the next update.
|
||||||
|
*
|
||||||
|
* @param event
|
||||||
|
* the event
|
||||||
|
* @param isAdvanced
|
||||||
|
* is advanced
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
private void handleExoticGarden(AndroidFarmEvent event) {
|
||||||
|
if (event.isAdvanced() && SlimefunPlugin.getIntegrations().isExoticGardenInstalled()) {
|
||||||
|
Optional<ItemStack> result = SlimefunPlugin.getThirdPartySupportService().harvestExoticGardenPlant(event.getBlock());
|
||||||
|
result.ifPresent(event::setDrop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.implementation.items.androids;
|
package io.github.thebusybiscuit.slimefun4.implementation.items.androids;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.ParametersAreNonnullByDefault;
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@ -191,7 +192,7 @@ public enum Instruction {
|
|||||||
*/
|
*/
|
||||||
FARM_FORWARD(AndroidType.FARMER, HeadTexture.SCRIPT_FARM_FORWARD, (android, b, inv, face) -> {
|
FARM_FORWARD(AndroidType.FARMER, HeadTexture.SCRIPT_FARM_FORWARD, (android, b, inv, face) -> {
|
||||||
Block target = b.getRelative(face);
|
Block target = b.getRelative(face);
|
||||||
android.farm(inv, target);
|
android.farm(b, inv, target, false);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -200,7 +201,7 @@ public enum Instruction {
|
|||||||
*/
|
*/
|
||||||
FARM_DOWN(AndroidType.FARMER, HeadTexture.SCRIPT_FARM_DOWN, (android, b, inv, face) -> {
|
FARM_DOWN(AndroidType.FARMER, HeadTexture.SCRIPT_FARM_DOWN, (android, b, inv, face) -> {
|
||||||
Block target = b.getRelative(BlockFace.DOWN);
|
Block target = b.getRelative(BlockFace.DOWN);
|
||||||
android.farm(inv, target);
|
android.farm(b, inv, target, false);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -211,7 +212,7 @@ public enum Instruction {
|
|||||||
*/
|
*/
|
||||||
FARM_EXOTIC_FORWARD(AndroidType.ADVANCED_FARMER, HeadTexture.SCRIPT_FARM_FORWARD, (android, b, inv, face) -> {
|
FARM_EXOTIC_FORWARD(AndroidType.ADVANCED_FARMER, HeadTexture.SCRIPT_FARM_FORWARD, (android, b, inv, face) -> {
|
||||||
Block target = b.getRelative(face);
|
Block target = b.getRelative(face);
|
||||||
android.exoticFarm(inv, target);
|
android.farm(b, inv, target, true);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -222,7 +223,7 @@ public enum Instruction {
|
|||||||
*/
|
*/
|
||||||
FARM_EXOTIC_DOWN(AndroidType.ADVANCED_FARMER, HeadTexture.SCRIPT_FARM_DOWN, (android, b, inv, face) -> {
|
FARM_EXOTIC_DOWN(AndroidType.ADVANCED_FARMER, HeadTexture.SCRIPT_FARM_DOWN, (android, b, inv, face) -> {
|
||||||
Block target = b.getRelative(BlockFace.DOWN);
|
Block target = b.getRelative(BlockFace.DOWN);
|
||||||
android.exoticFarm(inv, target);
|
android.farm(b, inv, target, true);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -880,11 +880,7 @@ public class ProgrammableAndroid extends SlimefunItem implements InventoryBlock,
|
|||||||
throw new UnsupportedOperationException("Non-woodcutter Android tried to chop a Tree!");
|
throw new UnsupportedOperationException("Non-woodcutter Android tried to chop a Tree!");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void farm(BlockMenu menu, Block block) {
|
protected void farm(Block b, BlockMenu menu, Block block, boolean isAdvanced) {
|
||||||
throw new UnsupportedOperationException("Non-farming Android tried to farm!");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void exoticFarm(BlockMenu menu, Block block) {
|
|
||||||
throw new UnsupportedOperationException("Non-farming Android tried to farm!");
|
throw new UnsupportedOperationException("Non-farming Android tried to farm!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,6 @@ import io.github.thebusybiscuit.slimefun4.implementation.items.RadioactiveItem;
|
|||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.VanillaItem;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.VanillaItem;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientAltar;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientAltar;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientPedestal;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.altar.AncientPedestal;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.AdvancedFarmerAndroid;
|
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.AndroidInterface;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.AndroidInterface;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.ButcherAndroid;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.ButcherAndroid;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.FarmerAndroid;
|
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.FarmerAndroid;
|
||||||
@ -1895,7 +1894,7 @@ public final class SlimefunItemSetup {
|
|||||||
new ItemStack[] {null, SlimefunItems.GPS_TRANSMITTER, null, new ItemStack(Material.DIAMOND_SWORD), SlimefunItems.PROGRAMMABLE_ANDROID_2, new ItemStack(Material.DIAMOND_SWORD), null, SlimefunItems.ELECTRIC_MOTOR, null})
|
new ItemStack[] {null, SlimefunItems.GPS_TRANSMITTER, null, new ItemStack(Material.DIAMOND_SWORD), SlimefunItems.PROGRAMMABLE_ANDROID_2, new ItemStack(Material.DIAMOND_SWORD), null, SlimefunItems.ELECTRIC_MOTOR, null})
|
||||||
.register(plugin);
|
.register(plugin);
|
||||||
|
|
||||||
new AdvancedFarmerAndroid(categories.androids, 2, SlimefunItems.PROGRAMMABLE_ANDROID_2_FARMER, RecipeType.ENHANCED_CRAFTING_TABLE,
|
new FarmerAndroid(categories.androids, 2, SlimefunItems.PROGRAMMABLE_ANDROID_2_FARMER, RecipeType.ENHANCED_CRAFTING_TABLE,
|
||||||
new ItemStack[] {null, SlimefunItems.GPS_TRANSMITTER, null, new ItemStack(Material.DIAMOND_HOE), SlimefunItems.PROGRAMMABLE_ANDROID_2, new ItemStack(Material.DIAMOND_HOE), null, SlimefunItems.ELECTRIC_MOTOR, null})
|
new ItemStack[] {null, SlimefunItems.GPS_TRANSMITTER, null, new ItemStack(Material.DIAMOND_HOE), SlimefunItems.PROGRAMMABLE_ANDROID_2, new ItemStack(Material.DIAMOND_HOE), null, SlimefunItems.ELECTRIC_MOTOR, null})
|
||||||
.register(plugin);
|
.register(plugin);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user