Add hopper input
This commit is contained in:
parent
3021a8ba65
commit
351dc772f6
|
@ -11,7 +11,7 @@
|
|||
</annotationProcessing>
|
||||
<bytecodeTargetLevel>
|
||||
<module name="EnergeticStorage" target="1.8" />
|
||||
<module name="energeticstorage" target="8" />
|
||||
<module name="energeticstorage" target="1.8" />
|
||||
</bytecodeTargetLevel>
|
||||
</component>
|
||||
</project>
|
|
@ -4,7 +4,7 @@
|
|||
<groupId>net.seanomik</groupId>
|
||||
<artifactId>energeticstorage</artifactId>
|
||||
<name>EnergeticStorage</name>
|
||||
<version>0.7-SNAPSHOT</version>
|
||||
<version>0.7.1-SNAPSHOT</version>
|
||||
<build>
|
||||
<defaultGoal>clean package</defaultGoal>
|
||||
<resources>
|
||||
|
@ -59,10 +59,6 @@
|
|||
<id>codemc-repo</id>
|
||||
<url>https://repo.codemc.org/repository/maven-public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>codemc-snapshots</id>
|
||||
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
|
|
8
pom.xml
8
pom.xml
|
@ -6,7 +6,7 @@
|
|||
|
||||
<groupId>net.seanomik</groupId>
|
||||
<artifactId>energeticstorage</artifactId>
|
||||
<version>0.7-SNAPSHOT</version>
|
||||
<version>0.7.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>EnergeticStorage</name>
|
||||
|
@ -84,10 +84,10 @@
|
|||
<url>https://repo.codemc.org/repository/maven-public/</url>
|
||||
<layout>default</layout>
|
||||
</repository>
|
||||
<repository>
|
||||
<!--<repository>
|
||||
<id>codemc-snapshots</id>
|
||||
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
|
||||
</repository>
|
||||
</repository>-->
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
|
@ -102,6 +102,8 @@
|
|||
<artifactId>item-nbt-api</artifactId>
|
||||
<version>2.8.0</version>
|
||||
</dependency>
|
||||
<!-- This is currently compiled by myself with some fixes for anything older than Java 16.
|
||||
Its compiled from SeanOMik/AnvilGUI on github -->
|
||||
<dependency>
|
||||
<groupId>net.wesjd</groupId>
|
||||
<artifactId>anvilgui</artifactId>
|
||||
|
|
|
@ -2,27 +2,37 @@ package net.seanomik.energeticstorage;
|
|||
|
||||
import net.seanomik.energeticstorage.commands.ESGiveCommand;
|
||||
import net.seanomik.energeticstorage.commands.ESReloadCommand;
|
||||
import net.seanomik.energeticstorage.files.ConfigFile;
|
||||
import net.seanomik.energeticstorage.files.PlayersFile;
|
||||
import net.seanomik.energeticstorage.listeners.BlockBreakListener;
|
||||
import net.seanomik.energeticstorage.listeners.BlockPlaceListener;
|
||||
import net.seanomik.energeticstorage.listeners.PlayerInteractListener;
|
||||
import net.seanomik.energeticstorage.objects.ESSystem;
|
||||
import net.seanomik.energeticstorage.tasks.HopperTask;
|
||||
import net.seanomik.energeticstorage.utils.ItemRecipies;
|
||||
import net.seanomik.energeticstorage.utils.Reference;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.data.type.Chest;
|
||||
import org.bukkit.block.data.type.Hopper;
|
||||
import org.bukkit.craftbukkit.libs.jline.internal.Nullable;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.world.WorldSaveEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
// @TODO: Add more config options
|
||||
/*
|
||||
* Change Log:
|
||||
* - Fix /esgive command runner from getting kicked with "Illegal Characters" error.
|
||||
* - Fix systems that were placed on the walls.
|
||||
*/
|
||||
public final class EnergeticStorage extends JavaPlugin implements Listener {
|
||||
private static EnergeticStorage plugin;
|
||||
private static HopperTask hopperTask;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
|
@ -32,9 +42,15 @@ public final class EnergeticStorage extends JavaPlugin implements Listener {
|
|||
registerListener();
|
||||
ItemRecipies.registerRecipes();
|
||||
|
||||
ConfigFile.getConfig().saveDefaultConfig();
|
||||
PlayersFile.getConfig().saveDefaultConfig();
|
||||
|
||||
Reference.ES_SYSTEMS = PlayersFile.getAllSystems();
|
||||
|
||||
if (ConfigFile.isHopperInputEnabled()) {
|
||||
hopperTask = new HopperTask();
|
||||
hopperTask.runTaskTimerAsynchronously(this, 0L, 8L);
|
||||
}
|
||||
}
|
||||
|
||||
private void registerCommands() {
|
||||
|
@ -59,10 +75,10 @@ public final class EnergeticStorage extends JavaPlugin implements Listener {
|
|||
}*/
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
//cachePlayersSystems(player);
|
||||
public void onWorldSaveEvent(WorldSaveEvent event) {
|
||||
for (Map.Entry<UUID, List<ESSystem>> systemEntry : Reference.ES_SYSTEMS.entrySet()) {
|
||||
PlayersFile.savePlayerSystems(systemEntry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -73,4 +89,12 @@ public final class EnergeticStorage extends JavaPlugin implements Listener {
|
|||
public static EnergeticStorage getPlugin() {
|
||||
return plugin;
|
||||
}
|
||||
|
||||
public static HopperTask getHopperTask() {
|
||||
return hopperTask;
|
||||
}
|
||||
|
||||
public static void setHopperTask(HopperTask hopperTask) {
|
||||
EnergeticStorage.hopperTask = hopperTask;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package net.seanomik.energeticstorage.files;
|
||||
|
||||
import net.seanomik.energeticstorage.EnergeticStorage;
|
||||
import net.seanomik.energeticstorage.tasks.HopperTask;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
|
@ -59,6 +61,16 @@ public class ConfigFile extends YamlConfiguration {
|
|||
public void reloadConfig() {
|
||||
try {
|
||||
super.load(this.configFile);
|
||||
|
||||
// Check if hopper input is not enabled and if the hopperTask is running. If it is, disable it.
|
||||
// else, we enable the task.
|
||||
if (!isHopperInputEnabled() && !EnergeticStorage.getHopperTask().isCancelled()) {
|
||||
EnergeticStorage.getHopperTask().cancel();
|
||||
} else if (isHopperInputEnabled() && EnergeticStorage.getHopperTask().isCancelled()) {
|
||||
EnergeticStorage.setHopperTask(new HopperTask());
|
||||
EnergeticStorage.getHopperTask().runTaskTimerAsynchronously(EnergeticStorage.getPlugin(), 0L, 8L);
|
||||
//EnergeticStorage.setHopperTask(new HopperTask().runTaskTimerAsynchronously(EnergeticStorage.getPlugin(), 0L, 8L));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
@ -84,6 +96,8 @@ public class ConfigFile extends YamlConfiguration {
|
|||
public static int getMaxTypes() {
|
||||
return getConfig().getInt("driveMaxTypes");
|
||||
}
|
||||
|
||||
public static boolean isHopperInputEnabled(){return !getConfig().contains("allowHopperInput") || getConfig().getBoolean("allowHopperInput");}
|
||||
}
|
||||
|
||||
|
|
@ -210,11 +210,18 @@ public class ESDriveGUI implements InventoryHolder, Listener {
|
|||
NBTItem clickedNBT = new NBTItem(cursor);
|
||||
|
||||
if (clickedNBT.hasKey("ES_Drive") && clickedNBT.getBoolean("ES_Drive")) {
|
||||
event.setCancelled(false);
|
||||
|
||||
List<ESDrive> drives = esSystem.getESDrives();
|
||||
if (drives.contains(null)) {
|
||||
drives.set(drives.indexOf(null), new ESDrive(cursor));
|
||||
} else {
|
||||
drives.add(new ESDrive(cursor));
|
||||
}
|
||||
esSystem.setESDrives(drives);
|
||||
initializeItems(player, esSystem);
|
||||
|
||||
event.setCancelled(true);
|
||||
cursor.setAmount(0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -17,7 +17,7 @@ public class PlayerInteractListener implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getHand() == EquipmentSlot.HAND) {
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getHand() == EquipmentSlot.HAND && !event.getPlayer().isSneaking()) {
|
||||
if (event.getClickedBlock().getType() == Material.PLAYER_HEAD || event.getClickedBlock().getType() == Material.PLAYER_WALL_HEAD) {
|
||||
Block block = event.getClickedBlock();
|
||||
Player player = event.getPlayer();
|
||||
|
|
|
@ -0,0 +1,136 @@
|
|||
package net.seanomik.energeticstorage.tasks;
|
||||
|
||||
import net.seanomik.energeticstorage.EnergeticStorage;
|
||||
import net.seanomik.energeticstorage.files.PlayersFile;
|
||||
import net.seanomik.energeticstorage.objects.ESSystem;
|
||||
import net.seanomik.energeticstorage.utils.Reference;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.craftbukkit.libs.jline.internal.Nullable;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class HopperTask extends BukkitRunnable {
|
||||
private boolean isHopperInputting(org.bukkit.material.Hopper hopper, BlockFace hopperRelative) {
|
||||
BlockFace hopperFacing = hopper.getFacing();
|
||||
|
||||
switch (hopperRelative) {
|
||||
case UP:
|
||||
return hopperFacing == BlockFace.DOWN;
|
||||
case DOWN:
|
||||
return hopperFacing == BlockFace.UP;
|
||||
case EAST:
|
||||
return hopperFacing == BlockFace.WEST;
|
||||
case WEST:
|
||||
return hopperFacing == BlockFace.EAST;
|
||||
case SOUTH:
|
||||
return hopperFacing == BlockFace.NORTH;
|
||||
case NORTH:
|
||||
return hopperFacing == BlockFace.SOUTH;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private Map<BlockFace, Block> getRelativeHoppers(Block block) {
|
||||
// relative face, block
|
||||
Map<BlockFace, Block> hoppers = new HashMap<>();
|
||||
|
||||
Block upBlock = block.getRelative(BlockFace.UP);
|
||||
Block downBlock = block.getRelative(BlockFace.DOWN);
|
||||
Block eastBlock = block.getRelative(BlockFace.EAST);
|
||||
Block westBlock = block.getRelative(BlockFace.WEST);
|
||||
Block northBlock = block.getRelative(BlockFace.NORTH);
|
||||
Block southBlock = block.getRelative(BlockFace.SOUTH);
|
||||
|
||||
if (upBlock.getType() == Material.HOPPER) {
|
||||
hoppers.put(BlockFace.UP, upBlock);
|
||||
}
|
||||
|
||||
if (downBlock.getType() == Material.HOPPER) {
|
||||
hoppers.put(BlockFace.DOWN, downBlock);
|
||||
}
|
||||
|
||||
if (eastBlock.getType() == Material.HOPPER) {
|
||||
hoppers.put(BlockFace.EAST, eastBlock);
|
||||
}
|
||||
|
||||
if (westBlock.getType() == Material.HOPPER) {
|
||||
hoppers.put(BlockFace.WEST, westBlock);
|
||||
}
|
||||
|
||||
if (northBlock.getType() == Material.HOPPER) {
|
||||
hoppers.put(BlockFace.NORTH, northBlock);
|
||||
}
|
||||
|
||||
if (southBlock.getType() == Material.HOPPER) {
|
||||
hoppers.put(BlockFace.SOUTH, southBlock);
|
||||
}
|
||||
|
||||
return hoppers;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private ItemStack getFirstItemStack(Inventory inventory) {
|
||||
ItemStack[] items = inventory.getContents();
|
||||
for (ItemStack item : items) {
|
||||
if (item != null && item.getType() != Material.AIR) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
for (Map.Entry<UUID, List<ESSystem>> systemEntry : Reference.ES_SYSTEMS.entrySet()) {
|
||||
for (ESSystem system : systemEntry.getValue()) {
|
||||
Block systemBlock = system.getLocation().getBlock();
|
||||
|
||||
// Get all relative hoppers touching the system.
|
||||
Map<BlockFace, Block> hoppers = getRelativeHoppers(systemBlock);
|
||||
for (Map.Entry<BlockFace, Block> entry : hoppers.entrySet()) {
|
||||
Bukkit.getScheduler().runTask(EnergeticStorage.getPlugin(), () -> {
|
||||
|
||||
try {
|
||||
org.bukkit.block.Hopper hopper = (org.bukkit.block.Hopper) entry.getValue().getState();
|
||||
org.bukkit.material.Hopper hopperType = (org.bukkit.material.Hopper) hopper.getData();
|
||||
// Check if the hopper is facing towards the system
|
||||
if (isHopperInputting(hopperType, entry.getKey())) {
|
||||
|
||||
// Find the first non-null item in the hopper inventory and add it
|
||||
ItemStack firstItem = getFirstItemStack(hopper.getInventory());
|
||||
if (firstItem != null) {
|
||||
ItemStack clonedItem = firstItem.clone();
|
||||
clonedItem.setAmount(1);
|
||||
|
||||
firstItem.setAmount(firstItem.getAmount() - 1);
|
||||
|
||||
system.addItem(clonedItem);
|
||||
}
|
||||
}
|
||||
} catch (ClassCastException exception) {
|
||||
// Ignore exception. These exceptions are only thrown in rare occasions
|
||||
// that the hopper is destroyed during during this task.
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void cancel() throws IllegalStateException {
|
||||
for (Map.Entry<UUID, List<ESSystem>> systemEntry : Reference.ES_SYSTEMS.entrySet()) {
|
||||
PlayersFile.savePlayerSystems(systemEntry.getValue());
|
||||
}
|
||||
|
||||
Bukkit.getScheduler().cancelTask(this.getTaskId());
|
||||
}
|
||||
}
|
|
@ -1 +1,2 @@
|
|||
driveMaxTypes: 128
|
||||
allowHopperInput: true
|
Loading…
Reference in New Issue