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

fix geo miner voiding resources

This commit is contained in:
iTwins 2023-08-20 02:37:24 +02:00
parent 7da1af0383
commit f60896f620
4 changed files with 69 additions and 49 deletions

View File

@ -57,4 +57,10 @@ public interface MachineOperation {
return getRemainingTicks() <= 0;
}
/**
* This method is called when a {@link MachineOperation} is interrupted before finishing.
* Implement to specify behaviour that should happen in this case.
*/
default void cancel() {}
}

View File

@ -6,7 +6,8 @@ import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.commons.lang.Validate;
import com.google.common.base.Preconditions;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
@ -46,7 +47,7 @@ public class MachineProcessor<T extends MachineOperation> {
* The owner of this {@link MachineProcessor}.
*/
public MachineProcessor(@Nonnull MachineProcessHolder<T> owner) {
Validate.notNull(owner, "The MachineProcessHolder cannot be null.");
Preconditions.checkArgument(owner != null, "The MachineProcessHolder cannot be null.");
this.owner = owner;
}
@ -93,8 +94,8 @@ public class MachineProcessor<T extends MachineOperation> {
* {@link MachineOperation} has already been started at that {@link Location}.
*/
public boolean startOperation(@Nonnull Location loc, @Nonnull T operation) {
Validate.notNull(loc, "The location must not be null");
Validate.notNull(operation, "The operation cannot be null");
Preconditions.checkArgument(loc != null, "The location must not be null");
Preconditions.checkArgument(operation != null, "The operation cannot be null");
return startOperation(new BlockPosition(loc), operation);
}
@ -111,8 +112,8 @@ public class MachineProcessor<T extends MachineOperation> {
* {@link MachineOperation} has already been started at that {@link Block}.
*/
public boolean startOperation(@Nonnull Block b, @Nonnull T operation) {
Validate.notNull(b, "The Block must not be null");
Validate.notNull(operation, "The machine operation cannot be null");
Preconditions.checkArgument(b != null, "The Block must not be null");
Preconditions.checkArgument(operation != null, "The machine operation cannot be null");
return startOperation(new BlockPosition(b), operation);
}
@ -129,8 +130,8 @@ public class MachineProcessor<T extends MachineOperation> {
* {@link MachineOperation} has already been started at that {@link BlockPosition}.
*/
public boolean startOperation(@Nonnull BlockPosition pos, @Nonnull T operation) {
Validate.notNull(pos, "The BlockPosition must not be null");
Validate.notNull(operation, "The machine operation cannot be null");
Preconditions.checkArgument(pos != null, "The BlockPosition must not be null");
Preconditions.checkArgument(operation != null, "The machine operation cannot be null");
return machines.putIfAbsent(pos, operation) == null;
}
@ -144,7 +145,7 @@ public class MachineProcessor<T extends MachineOperation> {
* @return The current {@link MachineOperation} or null.
*/
public @Nullable T getOperation(@Nonnull Location loc) {
Validate.notNull(loc, "The location cannot be null");
Preconditions.checkArgument(loc != null, "The location cannot be null");
return getOperation(new BlockPosition(loc));
}
@ -158,15 +159,13 @@ public class MachineProcessor<T extends MachineOperation> {
* @return The current {@link MachineOperation} or null.
*/
public @Nullable T getOperation(@Nonnull Block b) {
Validate.notNull(b, "The Block cannot be null");
Preconditions.checkArgument(b != null, "The Block cannot be null");
return getOperation(new BlockPosition(b));
}
/**
* This returns the current {@link MachineOperation} at that given {@link BlockPosition}.
* We don't need to validate our input here as that is already
* covered in our public methods.
*
* @param pos
* The {@link BlockPosition} at which our machine is located.
@ -174,7 +173,7 @@ public class MachineProcessor<T extends MachineOperation> {
* @return The current {@link MachineOperation} or null.
*/
public @Nullable T getOperation(@Nonnull BlockPosition pos) {
Validate.notNull(pos, "The BlockPosition must not be null");
Preconditions.checkArgument(pos != null, "The BlockPosition must not be null");
return machines.get(pos);
}
@ -189,7 +188,7 @@ public class MachineProcessor<T extends MachineOperation> {
* {@link MachineOperation} to begin with.
*/
public boolean endOperation(@Nonnull Location loc) {
Validate.notNull(loc, "The location should not be null");
Preconditions.checkArgument(loc != null, "The location should not be null");
return endOperation(new BlockPosition(loc));
}
@ -204,7 +203,7 @@ public class MachineProcessor<T extends MachineOperation> {
* {@link MachineOperation} to begin with.
*/
public boolean endOperation(@Nonnull Block b) {
Validate.notNull(b, "The Block should not be null");
Preconditions.checkArgument(b != null, "The Block should not be null");
return endOperation(new BlockPosition(b));
}
@ -219,7 +218,7 @@ public class MachineProcessor<T extends MachineOperation> {
* {@link MachineOperation} to begin with.
*/
public boolean endOperation(@Nonnull BlockPosition pos) {
Validate.notNull(pos, "The BlockPosition cannot be null");
Preconditions.checkArgument(pos != null, "The BlockPosition cannot be null");
T operation = machines.remove(pos);
@ -231,6 +230,8 @@ public class MachineProcessor<T extends MachineOperation> {
if (operation.isFinished()) {
Event event = new AsyncMachineOperationFinishEvent(pos, this, operation);
Bukkit.getPluginManager().callEvent(event);
} else {
operation.cancel();
}
return true;
@ -240,8 +241,8 @@ public class MachineProcessor<T extends MachineOperation> {
}
public void updateProgressBar(@Nonnull BlockMenu inv, int slot, @Nonnull T operation) {
Validate.notNull(inv, "The inventory must not be null.");
Validate.notNull(operation, "The MachineOperation must not be null.");
Preconditions.checkArgument(inv != null, "The inventory must not be null.");
Preconditions.checkArgument(operation != null, "The MachineOperation must not be null.");
if (getProgressBar() == null) {
// No progress bar, no need to update anything.

View File

@ -7,7 +7,8 @@ import java.util.OptionalInt;
import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;
import org.apache.commons.lang.Validate;
import com.google.common.base.Preconditions;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
@ -77,7 +78,7 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
}
@Override
public MachineProcessor<MiningOperation> getMachineProcessor() {
public @Nonnull MachineProcessor<MiningOperation> getMachineProcessor() {
return processor;
}
@ -121,8 +122,8 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
*
* @return This method will return the current instance of {@link GEOMiner}, so that can be chained.
*/
public final GEOMiner setCapacity(int capacity) {
Validate.isTrue(capacity > 0, "The capacity must be greater than zero!");
public final @Nonnull GEOMiner setCapacity(int capacity) {
Preconditions.checkArgument(capacity > 0, "The capacity must be greater than zero!");
if (getState() == ItemState.UNREGISTERED) {
this.energyCapacity = capacity;
@ -140,8 +141,8 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
*
* @return This method will return the current instance of {@link GEOMiner}, so that can be chained.
*/
public final GEOMiner setProcessingSpeed(int speed) {
Validate.isTrue(speed > 0, "The speed must be greater than zero!");
public final @Nonnull GEOMiner setProcessingSpeed(int speed) {
Preconditions.checkArgument(speed > 0, "The speed must be greater than zero!");
this.processingSpeed = speed;
return this;
@ -155,10 +156,10 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
*
* @return This method will return the current instance of {@link GEOMiner}, so that can be chained.
*/
public final GEOMiner setEnergyConsumption(int energyConsumption) {
Validate.isTrue(energyConsumption > 0, "The energy consumption must be greater than zero!");
Validate.isTrue(energyCapacity > 0, "You must specify the capacity before you can set the consumption amount.");
Validate.isTrue(energyConsumption <= energyCapacity, "The energy consumption cannot be higher than the capacity (" + energyCapacity + ')');
public final @Nonnull GEOMiner setEnergyConsumption(int energyConsumption) {
Preconditions.checkArgument(energyConsumption > 0, "The energy consumption must be greater than zero!");
Preconditions.checkArgument(energyCapacity > 0, "You must specify the capacity before you can set the consumption amount.");
Preconditions.checkArgument(energyConsumption <= energyCapacity, "The energy consumption cannot be higher than the capacity (" + energyCapacity + ')');
this.energyConsumedPerTick = energyConsumption;
return this;
@ -188,19 +189,17 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
}
}
@Nonnull
private BlockPlaceHandler onBlockPlace() {
private @Nonnull BlockPlaceHandler onBlockPlace() {
return new BlockPlaceHandler(false) {
@Override
public void onPlayerPlace(BlockPlaceEvent e) {
public void onPlayerPlace(@Nonnull BlockPlaceEvent e) {
updateHologram(e.getBlock(), "&7Idling...");
}
};
}
@Nonnull
private BlockBreakHandler onBlockBreak() {
private @Nonnull BlockBreakHandler onBlockBreak() {
return new SimpleBlockBreakHandler() {
@Override
@ -217,21 +216,18 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
};
}
@Nonnull
@Override
public int[] getInputSlots() {
public @Nonnull int[] getInputSlots() {
return new int[0];
}
@Nonnull
@Override
public int[] getOutputSlots() {
public @Nonnull int[] getOutputSlots() {
return OUTPUT_SLOTS;
}
@Nonnull
@Override
public List<ItemStack> getDisplayRecipes() {
public @Nonnull List<ItemStack> getDisplayRecipes() {
List<ItemStack> displayRecipes = new LinkedList<>();
for (GEOResource resource : Slimefun.getRegistry().getGEOResources().values()) {
@ -249,7 +245,7 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
}
@Override
public EnergyNetComponentType getEnergyComponentType() {
public @Nonnull EnergyNetComponentType getEnergyComponentType() {
return EnergyNetComponentType.CONSUMER;
}
@ -274,7 +270,7 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
@Override
public boolean onClick(InventoryClickEvent e, Player p, int slot, ItemStack cursor, ClickAction action) {
return cursor == null || cursor.getType() == null || cursor.getType() == Material.AIR;
return cursor == null || cursor.getType() == Material.AIR;
}
});
}
@ -328,7 +324,7 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
if (resource.isObtainableFromGEOMiner()) {
OptionalInt optional = Slimefun.getGPSNetwork().getResourceManager().getSupplies(resource, b.getWorld(), b.getX() >> 4, b.getZ() >> 4);
if (!optional.isPresent()) {
if (optional.isEmpty()) {
updateHologram(b, "&4GEO-Scan required!");
return;
}
@ -339,7 +335,7 @@ public class GEOMiner extends SlimefunItem implements RecipeDisplayItem, EnergyN
return;
}
processor.startOperation(b, new MiningOperation(resource.getItem().clone(), PROCESSING_TIME));
processor.startOperation(b, new MiningOperation(resource, b, PROCESSING_TIME));
Slimefun.getGPSNetwork().getResourceManager().setSupplies(resource, b.getWorld(), b.getX() >> 4, b.getZ() >> 4, supplies - 1);
updateHologram(b, "&7Mining: &r" + resource.getName());
return;

View File

@ -1,12 +1,18 @@
package io.github.thebusybiscuit.slimefun4.implementation.operations;
import java.util.OptionalInt;
import javax.annotation.Nonnull;
import org.apache.commons.lang.Validate;
import com.google.common.base.Preconditions;
import org.bukkit.block.Block;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.api.geo.GEOResource;
import io.github.thebusybiscuit.slimefun4.api.geo.ResourceManager;
import io.github.thebusybiscuit.slimefun4.core.machines.MachineOperation;
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
import io.github.thebusybiscuit.slimefun4.implementation.items.geo.GEOMiner;
/**
@ -22,20 +28,24 @@ public class MiningOperation implements MachineOperation {
private final ItemStack result;
private final GEOResource resource;
private final Block block;
private final int totalTicks;
private int currentTicks = 0;
public MiningOperation(@Nonnull ItemStack result, int totalTicks) {
Validate.notNull(result, "The result cannot be null");
Validate.isTrue(totalTicks >= 0, "The amount of total ticks must be a positive integer or zero, received: " + totalTicks);
public MiningOperation(@Nonnull GEOResource resource, Block block, int totalTicks) {
Preconditions.checkArgument(resource != null, "The resource cannot be null");
Preconditions.checkArgument(totalTicks >= 0, "The amount of total ticks must be a positive integer or zero, received: " + totalTicks);
this.result = result;
this.resource = resource;
this.result = resource.getItem().clone();
this.block = block;
this.totalTicks = totalTicks;
}
@Override
public void addProgress(int num) {
Validate.isTrue(num > 0, "Progress must be positive.");
Preconditions.checkArgument(num > 0, "Progress must be positive.");
currentTicks += num;
}
@ -59,4 +69,11 @@ public class MiningOperation implements MachineOperation {
return totalTicks;
}
@Override
public void cancel() {
ResourceManager resourceManager = Slimefun.getGPSNetwork().getResourceManager();
OptionalInt supplies = resourceManager.getSupplies(resource, block.getWorld(), block.getX() >> 4, block.getZ() >> 4);
supplies.ifPresent(s -> resourceManager.setSupplies(resource, block.getWorld(), block.getX() >> 4, block.getZ() >> 4, s + 1));
}
}