Upload almost finished code.

This commit is contained in:
SeanOMik 2020-04-08 13:34:01 -05:00
parent e1707f7d6c
commit 8999f8f169
No known key found for this signature in database
GPG Key ID: FA4D55AC05268A88
51 changed files with 3186 additions and 0 deletions

108
.gitignore vendored Normal file
View File

@ -0,0 +1,108 @@
# Created by https://www.gitignore.io/api/java,intellij+iml
# Edit at https://www.gitignore.io/?templates=java,intellij+iml
### Intellij+iml ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Intellij+iml Patch ###
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
*.iml
modules.xml
.idea/misc.xml
*.ipr
### Java ###
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# End of https://www.gitignore.io/api/java,intellij+iml

16
.idea/compiler.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="EnergeticStorage" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="EnergeticStorage" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>

7
.idea/encodings.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

116
dependency-reduced-pom.xml Normal file
View File

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.seanomik</groupId>
<artifactId>energeticstorage</artifactId>
<name>EnergeticStorage</name>
<version>0.1-SNAPSHOT</version>
<build>
<defaultGoal>clean package</defaultGoal>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.15.2_\plugins\EnergeticStorage-MC-v1.15.X-v${project.version}.jar</outputFile>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>shade</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>de.tr7zw.changeme.nbtapi</pattern>
<shadedPattern>de.tr7zw.nbtapi</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>codemc-repo</id>
<url>https://repo.codemc.org/repository/maven-public/</url>
</repository>
<repository>
<id>maven-repository</id>
<url>file:///${project.basedir}/maven-repository</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.15.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>commons-lang</artifactId>
<groupId>commons-lang</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
<exclusion>
<artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId>
</exclusion>
<exclusion>
<artifactId>bungeecord-chat</artifactId>
<groupId>net.md-5</groupId>
</exclusion>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@ -0,0 +1 @@
7afa199ad36692812fb6cb1dd0d4a6c3

View File

@ -0,0 +1 @@
1e4cb543315c99cf8407fcaa7de27cfb24a5bd11

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.shynixn.headdatabase</groupId>
<artifactId>hdb-api</artifactId>
<version>1.0</version>
</project>

View File

@ -0,0 +1 @@
8b707a9cd5cbdae2e4f38859f256bf56

View File

@ -0,0 +1 @@
ffd4d3695ad218788c4ec4d687498d34f5afadce

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.github.shynixn.headdatabase</groupId>
<artifactId>hdb-api</artifactId>
<versioning>
<release>1.0</release>
<versions>
<version>1.0</version>
</versions>
<lastUpdated>20200331035834</lastUpdated>
</versioning>
</metadata>

View File

@ -0,0 +1 @@
f1670febb88bf8bc170ef0ba7ea24075

View File

@ -0,0 +1 @@
542b3d81e8887008a78abf7c14fb2b498fd89877

View File

@ -0,0 +1 @@
0ac17404662c14763681fa66966d78e3

View File

@ -0,0 +1 @@
47d3169c630ba6ffe89c0529728a16917f4d7461

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>me.darkolythe</groupId>
<artifactId>customrecipeapi</artifactId>
<version>1.2.3</version>
</project>

View File

@ -0,0 +1 @@
e824dc420f2a4d99de3ff215cb7059eb

View File

@ -0,0 +1 @@
33e68e43923055db023fb67dbdd08b7857a9276d

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>me.darkolythe</groupId>
<artifactId>customrecipeapi</artifactId>
<versioning>
<release>1.2.3</release>
<versions>
<version>1.2.3</version>
</versions>
<lastUpdated>20200403192517</lastUpdated>
</versioning>
</metadata>

View File

@ -0,0 +1 @@
8f5304e0de19ce4868b10abb2804f858

View File

@ -0,0 +1 @@
33bb53f687e7a2cf59509d398341828bee14c9df

123
pom.xml Normal file
View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.seanomik</groupId>
<artifactId>energeticstorage</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>EnergeticStorage</name>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<defaultGoal>clean package</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>shade</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<outputFile>D:\Code\java\spigotPlugins\_TEST_SERVER_1.15.2_\plugins\EnergeticStorage-MC-v1.15.X-v${project.version}.jar</outputFile>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>shade</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>de.tr7zw.changeme.nbtapi</pattern>
<shadedPattern>de.tr7zw.nbtapi</shadedPattern>
</relocation>
</relocations>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>codemc-repo</id>
<url>https://repo.codemc.org/repository/maven-public/</url>
<layout>default</layout>
</repository>
<repository>
<id>maven-repository</id>
<url>file:///${project.basedir}/maven-repository</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.15.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>de.tr7zw</groupId>
<artifactId>item-nbt-api</artifactId>
<version>2.3.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.WesJD.AnvilGUI</groupId>
<artifactId>anvilgui</artifactId>
<version>7a87a9dd65</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,71 @@
package net.seanomik.energeticstorage;
import net.seanomik.energeticstorage.commands.ESGiveCommand;
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.utils.ItemRecipies;
import net.seanomik.energeticstorage.utils.Reference;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
public final class EnergeticStorage extends JavaPlugin implements Listener {
private static EnergeticStorage plugin;
@Override
public void onEnable() {
plugin = this;
registerCommands();
registerListener();
ItemRecipies.registerRecipes();
PlayersFile.getConfig().saveDefaultConfig();
for (Player player : Bukkit.getOnlinePlayers()) {
cachePlayersSystems(player);
}
}
private void registerCommands() {
getCommand("esgive").setExecutor(new ESGiveCommand());
}
private void registerListener() {
getServer().getPluginManager().registerEvents(Reference.ES_TERMINAL_GUI, this);
getServer().getPluginManager().registerEvents(Reference.ES_SYSTEM_GUI, this);
getServer().getPluginManager().registerEvents(Reference.ES_DRIVE_GUI, this);
getServer().getPluginManager().registerEvents(Reference.ES_SYSTEM_SECURITY_GUI, this);
getServer().getPluginManager().registerEvents(new PlayerInteractListener(), this);
getServer().getPluginManager().registerEvents(new BlockBreakListener(), this);
getServer().getPluginManager().registerEvents(new BlockPlaceListener(), this);
getServer().getPluginManager().registerEvents(this, this);
}
public void cachePlayersSystems(Player player) {
if (PlayersFile.doesPlayerHaveSystem(player.getUniqueId())) {
Reference.ES_SYSTEMS.put(player.getUniqueId(), PlayersFile.getPlayersSystems(player.getUniqueId()));
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
cachePlayersSystems(player);
}
@Override
public void onDisable() {
// Plugin shutdown logic
}
public static EnergeticStorage getPlugin() {
return plugin;
}
}

View File

@ -0,0 +1,58 @@
package net.seanomik.energeticstorage;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import java.lang.reflect.Field;
import java.util.UUID;
public enum Skulls {
LeftGreenArrow("LeftGreenArrow", 0, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTRjNDE3NDZhZjU1N2EyNGJlOGEwOTAzNjlhNTkxYWU2M2Q1Y2U5YzRiZjQwNWQzNTQyNDdkODEwYzdjNyJ9fX0=", "5da5509d-136d-4716-bc2d-d04f82058e91"),
UpGreenArrow("UpGreenArrow", 1, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjIyMWRhNDQxOGJkM2JmYjQyZWI2NGQyYWI0MjljNjFkZWNiOGY0YmY3ZDRjZmI3N2ExNjJiZTNkY2IwYjkyNyJ9fX0=", "fb271319-5c42-4f5d-9389-e89ca7caf96a"),
Computer("Computer", 2, "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzhhMGM1MDg5N2FjZmM2ZmMzNDUxODUwOGQ5NDBlY2Q1Mjg0NmI3Zjc2NGRmZTI0YTU3ZjZmYmNiNDUzNTE5NCJ9fX0=", "0676e961-2d31-4819-82be-c1b499f00f8f");
private ItemStack item;
private String name;
private String texture;
Skulls(String name, int id, String texture, String uuid) {
item = createSkull(texture, name);
this.texture = texture;
this.name = name;
}
private ItemStack createSkull (String url, String name) {
ItemStack head = new ItemStack(Material.PLAYER_HEAD, 1, (short) 3);
if (url.isEmpty()) return head;
SkullMeta headMeta = (SkullMeta) head.getItemMeta();
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), null);
gameProfile.getProperties().put("textures", new Property("textures", url));
try {
Field profileField = headMeta.getClass().getDeclaredField("profile");
profileField.setAccessible(true);
profileField.set(headMeta, gameProfile);
} catch (IllegalArgumentException | NoSuchFieldException | SecurityException | IllegalAccessException e) {
e.printStackTrace();
}
head.setItemMeta(headMeta);
return head;
}
public ItemStack getItemStack() {
return item;
}
public String getName() {
return name;
}
public String getTexture() { return texture; }
}

View File

@ -0,0 +1,142 @@
package net.seanomik.energeticstorage.commands;
import net.seanomik.energeticstorage.EnergeticStorage;
import net.seanomik.energeticstorage.files.PlayersFile;
import net.seanomik.energeticstorage.utils.ItemConstructor;
import net.seanomik.energeticstorage.utils.PermissionChecks;
import net.seanomik.energeticstorage.utils.Reference;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.sql.Ref;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ESGiveCommand implements TabExecutor {
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
List<String> tab = new ArrayList<>();
switch (args.length) {
case 1:
tab.addAll(Arrays.asList("drive", "system"));
break;
case 2:
if (args[0].equals("drive")) {
tab.addAll(Arrays.asList("1k", "4k", "16k", "64k"));
} else if (args[0].equals("system")) {
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
tab.add(player.getDisplayName());
}
}
break;
case 3:
if (args[0].equals("drive")) {
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
tab.add(player.getDisplayName());
}
}
break;
}
return tab;
}
private String generateCommandUsage(String[] args) {
if (args.length > 0) {
if (args[0].equals("drive")) {
return Reference.PREFIX + "Usage: /esgive drive [1k, 4k, 16k, 64k] (player)";
}
return Reference.PREFIX + "Usage: /esgive [drive/system] [1k, 4k, 16k, 64k] (player)";
} else {
return Reference.PREFIX + "Usage: /esgive [drive/system] [1k, 4k, 16k, 64k] (player)";
}
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!PermissionChecks.canESGive(sender)) {
sender.sendMessage(Reference.PREFIX + ChatColor.RED + "You don't have permission for this command!");
return true;
}
switch (args[0]) { // Switch on item type
case "save":
PlayersFile.savePlayerSystems(Reference.ES_SYSTEMS.get(((Player) sender).getUniqueId()));
sender.sendMessage("Saved systems!");
break;
case "system":
Player p = (Player) sender;
if (args.length == 2) {
if (!PermissionChecks.canESGiveOthers(sender)) {
sender.sendMessage(Reference.PREFIX + ChatColor.RED + "You don't have permission to give an item to another player!");
return true;
}
Player player = Bukkit.getPlayer(args[1]);
if (player != null) {
player.getInventory().addItem(ItemConstructor.createSystemBlock());
sender.sendMessage(Reference.PREFIX + ChatColor.GREEN + "Gave an ES System to " + player.getDisplayName());
} else {
sender.sendMessage(Reference.PREFIX + ChatColor.RED + "Player does not exist or is not online!");
}
} else if (args.length == 1) {
p.getInventory().addItem(ItemConstructor.createSystemBlock());
}
break;
case "drive":
if (args.length < 2) {
sender.sendMessage(generateCommandUsage(args));
break;
}
if (args[1].equals("1k") || args[1].equals("4k") || args[1].equals("16k") || args[1].equals("64k")) {
int size = Integer.parseInt(args[1].replace("k", "")) * 1024;
if (args.length == 3) {
if (!PermissionChecks.canESGiveOthers(sender)) {
sender.sendMessage(Reference.PREFIX + ChatColor.RED + "You don't have permission to give an item to another player!");
return true;
}
Player player = Bukkit.getPlayer(args[2]);
if (player != null) {
player.getInventory().addItem(ItemConstructor.createDrive(size, 0, 0));
sender.sendMessage(Reference.PREFIX + ChatColor.GREEN + "Gave an ES System to " + player.getDisplayName());
} else {
sender.sendMessage(Reference.PREFIX + ChatColor.RED + "Player does not exist or is not online!");
}
} else {
if (sender instanceof Player) {
Player player = (Player) sender;
player.getInventory().addItem(ItemConstructor.createDrive(size, 0, 0));
} else {
sender.sendMessage(Reference.PREFIX + ChatColor.RED + "Supply a player to run this command!");
sender.sendMessage(generateCommandUsage(args));
}
}
} else {
sender.sendMessage(generateCommandUsage(args));
}
break;
}
return true;
}
}

View File

@ -0,0 +1,89 @@
package net.seanomik.energeticstorage.files;
import net.seanomik.energeticstorage.EnergeticStorage;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
public class ConfigFile extends YamlConfiguration {
private static ConfigFile config;
private EnergeticStorage plugin;
private File configFile;
public static ConfigFile getConfig() {
if (ConfigFile.config == null) {
ConfigFile.config = new ConfigFile();
}
return ConfigFile.config;
}
public ConfigFile() {
this.plugin = (EnergeticStorage) EnergeticStorage.getPlugin((Class) EnergeticStorage.class);
this.configFile = new File(this.plugin.getDataFolder(), "config.yml");
this.saveDefault();
this.reload();
}
public void reload() {
try {
super.load(this.configFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void save() {
try {
super.save(this.configFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void saveDefault() {
this.plugin.saveResource("config.yml", false);
}
public void saveConfig() {
try {
super.save(this.configFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void reloadConfig() {
try {
super.load(this.configFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void saveDefaultConfig() {
try {
this.plugin.saveDefaultConfig();
}
catch (Exception e) {
e.printStackTrace();
}
}
// Auto replace alternate color codes.
@Override
public String getString(String path) {
// Only attempt to translate if the text is not empty.
return (super.getString(path).isEmpty()) ? super.getString(path) : ChatColor.translateAlternateColorCodes('&', super.getString(path));
}
public static int getMaxTypes() {
return getConfig().getInt("driveMaxTypes");
}
}

View File

@ -0,0 +1,220 @@
package net.seanomik.energeticstorage.files;
import com.google.gson.JsonParser;
import net.seanomik.energeticstorage.EnergeticStorage;
import net.seanomik.energeticstorage.objects.ESDrive;
import net.seanomik.energeticstorage.objects.ESSystem;
import net.seanomik.energeticstorage.utils.ItemSerialization;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.StringEscapeUtils;
import org.bukkit.inventory.ItemStack;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.File;
import java.util.*;
public class PlayersFile extends YamlConfiguration {
private static PlayersFile config;
private EnergeticStorage plugin;
private File configFile;
public static PlayersFile getConfig() {
if (PlayersFile.config == null) {
PlayersFile.config = new PlayersFile();
}
return PlayersFile.config;
}
public PlayersFile() {
this.plugin = (EnergeticStorage) EnergeticStorage.getPlugin((Class) EnergeticStorage.class);
this.configFile = new File(this.plugin.getDataFolder(), "players.yml");
this.saveDefault();
this.reload();
}
public void reload() {
try {
super.load(this.configFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void save() {
try {
super.save(this.configFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void saveDefault() {
this.plugin.saveResource("players.yml", false);
}
public void saveConfig() {
try {
super.save(this.configFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void reloadConfig() {
try {
super.load(this.configFile);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void saveDefaultConfig() {
try {
this.plugin.saveDefaultConfig();
}
catch (Exception e) {
e.printStackTrace();
}
}
// Auto replace alternate color codes.
@Override
public String getString(String path) {
// Only attempt to translate if the text is not empty.
return (super.getString(path) == null || super.getString(path).isEmpty()) ? super.getString(path) : ChatColor.translateAlternateColorCodes('&', super.getString(path));
}
public static boolean doesPlayerHaveSystem(UUID uuid) {
return getConfig().contains("players." + uuid + ".systems");
}
public static List<ESSystem> getPlayersSystems(UUID uuid) {
List<ESSystem> systems = new ArrayList<>();
for (String systemUUID : getConfig().getConfigurationSection("players." + uuid + ".systems").getKeys(false)) {
String systemPath = "players." + uuid + ".systems." + systemUUID + ".";
List<ESDrive> drives = new ArrayList<>();
if (getConfig().contains(systemPath + "drives")) {
for (String driveUUID : getConfig().getConfigurationSection(systemPath + "drives").getKeys(false)) {
Map<ItemStack, Integer> items = new HashMap();
if (getConfig().contains(systemPath + "drives." + driveUUID + ".items")) {
try {
JSONParser jsonParser = new JSONParser();
JSONArray itemJsonArray = (JSONArray) jsonParser.parse(getConfig().getString(systemPath + "drives." + driveUUID + ".items"));
for (int i = 0; i < itemJsonArray.size(); i++) {
JSONObject itemObject = (JSONObject) itemJsonArray.get(i);
Map.Entry<ItemStack, Integer> item = ItemSerialization.deserializeItem((String) itemObject.get("itemYAML"));
items.put(item.getKey(), item.getValue());
}
} catch (ParseException | InvalidConfigurationException e) {
e.printStackTrace();
}
}
int size = getConfig().getInt(systemPath + "drives." + driveUUID + ".size");
drives.add(new ESDrive(size, items));
}
}
List<UUID> trustedUUIDs = new ArrayList<>();
if (getConfig().contains(systemPath + "trustedUUIDs")) {
try {
JSONArray trustedJson = (JSONArray) new JSONParser().parse(getConfig().getString(systemPath + "trustedUUIDs"));
for (int i = 0; i < trustedJson.size(); i++) {
JSONObject object = (JSONObject) trustedJson.get(i);
trustedUUIDs.add(UUID.fromString((String) object.get("UUID")));
}
} catch (ParseException e) {
e.printStackTrace();
}
}
boolean isPublic = getConfig().getBoolean(systemPath + "public");
Location loc = Utils.convertStringToLocation(getConfig().getString(systemPath + "loc"));
systems.add(new ESSystem(uuid, UUID.fromString(systemUUID), loc, drives, trustedUUIDs, isPublic));
}
return systems;
}
public static void savePlayerSystem(ESSystem esSystem) {
String systemPath = "players." + esSystem.getOwner() + ".systems." + esSystem.getUUID() + ".";
getConfig().set(systemPath + "loc", Utils.convertLocationToString(esSystem.getLocation()));
getConfig().set(systemPath + "public", esSystem.isPublic());
try {
JSONArray jsonArray = new JSONArray();
for (UUID uuid : esSystem.getTrustedPlayers()) {
String object = "{\"UUID\":\"" + uuid.toString() + "\"}";
JSONObject uuidJSON = (JSONObject) new JSONParser().parse(object);
jsonArray.add(uuidJSON);
}
getConfig().set(systemPath + "trustedUUIDs", jsonArray.toJSONString());
} catch (ParseException e) {
e.printStackTrace();
}
getConfig().set(systemPath + "drives", null);
for (ESDrive drive : esSystem.getESDrives()) {
getConfig().set(systemPath + "drives." + drive.getUUID() + ".size", drive.getSize());
JSONArray itemsJson = new JSONArray();
for (Map.Entry<ItemStack, Integer> entry : drive.getItems().entrySet()) {
try {
String object = "{\"itemYAML\":\"" + StringEscapeUtils.escapeJson(ItemSerialization.serializeItem(entry.getKey(), entry.getValue())) + "\"}";
JSONObject itemJSON = (JSONObject) new JSONParser().parse(object);
itemsJson.add(itemJSON);
} catch (ParseException e) {
e.printStackTrace();
}
}
getConfig().set(systemPath + "drives." + drive.getUUID() + ".items", itemsJson.toJSONString());
}
getConfig().saveConfig();
}
public static void removePlayerSystem(UUID player, UUID uuid) {
getConfig().set("players." + player + ".systems." + uuid, null);
// Check if the config for the player is now empty, and if it is, then just remove their UUID from the config.
if (getConfig().getConfigurationSection("players." + player + ".systems").getKeys(false).size() == 0) {
getConfig().set("players." + player, null);
}
getConfig().saveConfig();
}
public static void savePlayerSystems(List<ESSystem> esSystems) {
assert esSystems != null;
for (ESSystem esSystem : esSystems) {
savePlayerSystem(esSystem);
}
}
}

View File

@ -0,0 +1,236 @@
package net.seanomik.energeticstorage.gui;
import de.tr7zw.changeme.nbtapi.NBTItem;
import net.seanomik.energeticstorage.files.PlayersFile;
import net.seanomik.energeticstorage.objects.ESDrive;
import net.seanomik.energeticstorage.objects.ESSystem;
import net.seanomik.energeticstorage.utils.Reference;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.*;
public class ESDriveGUI implements InventoryHolder, Listener {
private final Inventory globalInv;
private final String title = "Example GUI";
private Map<UUID, ESSystem> openSystems = new HashMap<>();
public ESDriveGUI() {
globalInv = Bukkit.createInventory(this, 9, title);
}
@Override
public Inventory getInventory() {
return globalInv;
}
// You can call this whenever you want to put the items in
private void initializeItems(Player player, ESSystem esSystem) {
// Only initialize the items for the players inventory, not all of them.
Inventory inv = player.getOpenInventory().getTopInventory();
// Remove all the items
inv.clear();
inv.setItem(0, createGuiItem(Material.PAPER, "Back"));
inv.setItem(1, createGuiItem(Material.BLACK_STAINED_GLASS_PANE, ""));
inv.setItem(7, createGuiItem(Material.BLACK_STAINED_GLASS_PANE, ""));
inv.setItem(8, createGuiItem(Material.BLACK_STAINED_GLASS_PANE, ""));
if (openSystems.containsKey(player.getUniqueId())) {
openSystems.replace(player.getUniqueId(), esSystem);
} else {
openSystems.put(player.getUniqueId(), esSystem);
}
for (int i = 2; i < esSystem.getESDrives().size() + 2; i++) {
ESDrive drive = esSystem.getESDrives().get(i - 2);
inv.setItem(i , drive.getDriveItem());
}
}
private ItemStack createGuiItem(Material material, String name, List<String> description) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
meta.setLore(description);
item.setItemMeta(meta);
return item;
}
private ItemStack createGuiItem(Material material, List<String> description) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setLore(description);
item.setItemMeta(meta);
return item;
}
private ItemStack createGuiItem(Material material, String name) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
item.setItemMeta(meta);
return item;
}
// You can open the inventory with this
public void openInventory(Player p, ESSystem esSystem) {
p.openInventory(globalInv);
initializeItems(p, esSystem);
if (openSystems.containsKey(p.getUniqueId())) {
openSystems.replace(p.getUniqueId(), esSystem);
} else {
openSystems.put(p.getUniqueId(), esSystem);
}
}
private enum ClickType {
NONE,
SWAP,
SWAP_RIGHT_CLICK,
INTO,
INTO_HALF,
OUT,
OUT_HALF,
SHIFT_OUT,
SHIFT_IN,
INVENTORY_CLICK
}
private ClickType findClickType(InventoryClickEvent event) {
Inventory inventory = event.getClickedInventory();
if (inventory == null || inventory.getHolder() == null || inventory.getHolder() != this) {
// Check for a shift click or bottom inventory click.
if (event.getView().getTitle().equals(title)) {
return (event.isShiftClick()) ? ClickType.SHIFT_IN : ClickType.INVENTORY_CLICK;
}
return ClickType.NONE;
}
ItemStack clickedItem = event.getCurrentItem();
ItemStack cursor = event.getCursor();
if ((clickedItem == null || clickedItem.getType() == Material.AIR) && (cursor == null || cursor.getType() == Material.AIR)) {
return ClickType.NONE;
} else if ( (clickedItem == null || clickedItem.getType() == Material.AIR) && (cursor != null || cursor.getType() != Material.AIR) ) {
return (event.isLeftClick()) ? ClickType.INTO : ClickType.INTO_HALF;
} else if (cursor == null || cursor.getType() == Material.AIR) {
return (event.isShiftClick()) ? ClickType.SHIFT_OUT : (event.isLeftClick()) ? ClickType.OUT : ClickType.OUT_HALF;
}
return (event.isLeftClick()) ? ClickType.SWAP : ClickType.SWAP_RIGHT_CLICK;
}
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
Inventory inventory = event.getInventory();
if (inventory == null || inventory.getHolder() == null || inventory.getHolder() != this) {
return;
} else {
Player player = (Player) event.getPlayer();
PlayersFile.savePlayerSystem(openSystems.get(player.getUniqueId()));
openSystems.remove(player);
}
}
// Check for clicks on items
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
ClickType clickType = findClickType(event);
if (clickType != ClickType.NONE) {
event.setCancelled(true);
Player player = (Player) event.getWhoClicked();
ItemStack clickedItem = event.getCurrentItem(); // Will be valid if clicks an item (i.e. taking an item from the inventory)
ItemStack cursor = event.getCursor(); // Will be valid if an item is put into the inventory
int slot = event.getSlot();
ESSystem esSystem = openSystems.get(player.getUniqueId());
// Make sure no items will get copied to other players open inventory
Inventory inv = player.getOpenInventory().getTopInventory();
// Handle type of click.
switch (clickType) {
case SWAP_RIGHT_CLICK:
break;
case SWAP:
break;
case SHIFT_IN:
if (Utils.isItemValid(clickedItem)) {
event.setCancelled(true);
// Add the item into the player's inventory
int driveSlot = inv.firstEmpty();
ItemStack oneClicked = clickedItem.clone();
oneClicked.setAmount(1);
inv.setItem(driveSlot, oneClicked);
List<ESDrive> drives = esSystem.getESDrives();
drives.add(driveSlot - 2, new ESDrive(clickedItem));
esSystem.setESDrives(drives);
// Remove the item from the players inventory
clickedItem.setAmount(clickedItem.getAmount() - 1);
}
break;
case INTO_HALF:
case INTO:
if (Utils.isItemValid(cursor)) {
NBTItem clickedNBT = new NBTItem(cursor);
if (clickedNBT.hasKey("ES_Drive") && clickedNBT.getBoolean("ES_Drive")) {
event.setCancelled(false);
List<ESDrive> drives = esSystem.getESDrives();
drives.add(slot - 2, new ESDrive(cursor));
esSystem.setESDrives(drives);
}
}
break;
case SHIFT_OUT:
case OUT_HALF:
case OUT:
if (slot == 0) {
player.closeInventory();
Reference.ES_SYSTEM_GUI.initializeItems(player, esSystem);
Reference.ES_SYSTEM_GUI.openInventory(player, esSystem);
} else if (slot != 1 && slot != 7 && slot != 8) {
event.setCancelled(false);
List<ESDrive> drives = esSystem.getESDrives();
drives.remove(slot - 2);
esSystem.setESDrives(drives);
}
break;
case INVENTORY_CLICK:
event.setCancelled(false);
break;
}
}
}
}

View File

@ -0,0 +1,218 @@
package net.seanomik.energeticstorage.gui;
import net.seanomik.energeticstorage.files.PlayersFile;
import net.seanomik.energeticstorage.objects.ESDrive;
import net.seanomik.energeticstorage.objects.ESSystem;
import net.seanomik.energeticstorage.utils.Reference;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.*;
public class ESSystemGUI implements InventoryHolder, Listener {
private final Inventory inv;
private final String title = "ES System";
private Map<Player, ESSystem> openSystems = new HashMap<>();
public ESSystemGUI() {
inv = Bukkit.createInventory(this, 9, title);
}
@Override
public Inventory getInventory() {
return inv;
}
// You can call this whenever you want to put the items in
public void initializeItems(Player player, ESSystem openSystem) {
for (int i = 0; i < inv.getSize(); i++) {
inv.setItem(i, createGuiItem(Material.BLACK_STAINED_GLASS_PANE, ""));
}
// Store the players open system
if (openSystems.containsKey(player)) {
openSystems.replace(player, openSystem);
} else {
openSystems.put(player, openSystem);
}
int maxSpace = 0;
int filledSpace = 0;
int filledTypes = 0;
for (ESDrive drive : openSystem.getESDrives()) {
maxSpace += drive.getSize();
filledSpace += drive.getFilledSpace();
filledTypes += drive.getFilledTypes();
}
// Get color of items text
ChatColor spaceColor = ChatColor.GREEN;
if (filledSpace >= maxSpace * 0.8) {
spaceColor = ChatColor.RED;
} else if (filledSpace >= maxSpace * 0.5) {
spaceColor = ChatColor.YELLOW;
}
// Get color of types text
ChatColor itemsColor = ChatColor.GREEN;
if (filledTypes >= Reference.MAX_DRIVE_TYPES * 0.8) {
itemsColor = ChatColor.RED;
} else if (filledTypes >= Reference.MAX_DRIVE_TYPES * 0.5) {
itemsColor = ChatColor.YELLOW;
}
List<String> lore = new ArrayList<>();
lore.add(ChatColor.BLUE + "Filled Items: " + spaceColor + filledSpace + ChatColor.BLUE + "/" + ChatColor.GREEN + maxSpace);
lore.add(ChatColor.BLUE + "Filled Types: " + itemsColor + filledTypes + ChatColor.BLUE + "/" + ChatColor.GREEN + Reference.MAX_DRIVE_TYPES);
inv.setItem(5, createGuiItem(Material.GLASS_PANE, "Drives", lore));
inv.setItem(4, createGuiItem(Material.IRON_BARS, "Security"));
inv.setItem(3, createGuiItem(Material.CHEST, "Terminal"));
}
private ItemStack createGuiItem(Material material, String name, List<String> description) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
meta.setLore(description);
item.setItemMeta(meta);
return item;
}
private ItemStack createGuiItem(Material material, List<String> description) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setLore(description);
item.setItemMeta(meta);
return item;
}
private ItemStack createGuiItem(Material material, String name) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
item.setItemMeta(meta);
return item;
}
// You can open the inventory with this
public void openInventory(Player p, ESSystem esSystem) {
if (openSystems.containsKey(p)) {
openSystems.replace(p, esSystem);
} else {
openSystems.put(p, esSystem);
}
p.openInventory(inv);
}
private enum ClickType {
NONE,
SWAP,
SWAP_RIGHT_CLICK,
INTO,
INTO_HALF,
OUT,
OUT_HALF,
SHIFT_OUT,
SHIFT_IN,
INVENTORY_CLICK
}
private ClickType findClickType(InventoryClickEvent event) {
Inventory inventory = event.getClickedInventory();
if (inventory == null || inventory.getHolder() == null || inventory.getHolder() != this) {
// Check for a shift click or bottom inventory click.
if (event.getView().getTitle().equals(title)) {
return (event.isShiftClick()) ? ClickType.SHIFT_IN : ClickType.INVENTORY_CLICK;
}
return ClickType.NONE;
}
ItemStack clickedItem = event.getCurrentItem();
ItemStack cursor = event.getCursor();
if ((clickedItem == null || clickedItem.getType() == Material.AIR) && (cursor == null || cursor.getType() == Material.AIR)) {
return ClickType.NONE;
} else if ( (clickedItem == null || clickedItem.getType() == Material.AIR) && (cursor != null || cursor.getType() != Material.AIR) ) {
return (event.isLeftClick()) ? ClickType.INTO : ClickType.INTO_HALF;
} else if (cursor == null || cursor.getType() == Material.AIR) {
return (event.isShiftClick()) ? ClickType.SHIFT_OUT : (event.isLeftClick()) ? ClickType.OUT : ClickType.OUT_HALF;
}
return (event.isLeftClick()) ? ClickType.SWAP : ClickType.SWAP_RIGHT_CLICK;
}
// Remove cached player data
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
Inventory inventory = event.getInventory();
if (inventory == null || inventory.getHolder() == null || inventory.getHolder() != this) {
return;
} else {
Player player = (Player) event.getPlayer();
openSystems.remove(player);
}
}
// Check for clicks on items
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
ClickType clickType = findClickType(event);
if (clickType != ClickType.NONE) {
event.setCancelled(true);
Player player = (Player) event.getWhoClicked();
ItemStack clickedItem = event.getCurrentItem(); // Will be valid if clicks an item (i.e. taking an item from the inventory)
ItemStack cursor = event.getCursor(); // Will be valid if an item is put into the inventory
int slot = event.getSlot();
ESSystem esSystem = openSystems.get(player);
switch (clickType) {
case SHIFT_IN:
break;
case SWAP_RIGHT_CLICK:
break;
case SWAP:
break;
case INTO_HALF:
break;
case INTO:
break;
case OUT_HALF:
break;
case OUT:
if (slot == 3) {
Reference.ES_TERMINAL_GUI.openInventory(player, esSystem);
} else if (slot == 4) {
Reference.ES_SYSTEM_SECURITY_GUI.openInventory(player, esSystem);
} else if (slot == 5) {
Reference.ES_DRIVE_GUI.openInventory(player, esSystem);
}
break;
case SHIFT_OUT:
break;
case INVENTORY_CLICK:
event.setCancelled(false);
break;
}
}
}
}

View File

@ -0,0 +1,332 @@
package net.seanomik.energeticstorage.gui;
import net.seanomik.energeticstorage.EnergeticStorage;
import net.seanomik.energeticstorage.files.PlayersFile;
import net.seanomik.energeticstorage.objects.ESSystem;
import net.seanomik.energeticstorage.utils.Reference;
import net.seanomik.energeticstorage.utils.Utils;
import net.wesjd.anvilgui.AnvilGUI;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
import java.util.*;
public class ESSystemSecurityGUI implements InventoryHolder, Listener {
private final Inventory inv;
private final String title = "ES System Security";
private final String removePlayerTitle = "Un-Trust Player";
private Map<Player, ESSystem> openSystems = new HashMap<>();
private Map<Player, Integer> openPages = new HashMap<>();
public ESSystemSecurityGUI() {
inv = Bukkit.createInventory(this, 9, title);
}
@Override
public Inventory getInventory() {
return inv;
}
// You can call this whenever you want to put the items in
public void initializeItems(Player player, ESSystem openSystem) {
Inventory inv = player.getOpenInventory().getTopInventory();
for (int i = 0; i < inv.getSize(); i++) {
inv.setItem(i, createGuiItem(Material.BLACK_STAINED_GLASS_PANE, ""));
}
inv.setItem(3, createGuiItem(Material.LIME_CONCRETE, "Trust player"));
inv.setItem(4, createGuiItem(Material.RED_CONCRETE, "Un-Trust player"));
if (openSystem.isPublic()) {
inv.setItem(5, createGuiItem(Material.IRON_BARS, "Set system to private."));
} else {
inv.setItem(5, createGuiItem(Material.WHITE_STAINED_GLASS_PANE, "Set system to public."));
}
}
public void initializeRemovePlayerItems(Player player, ESSystem openSystem) {
Inventory inv = player.getOpenInventory().getTopInventory();
//ESSystem openSystem = openSystems.get(player);
int pageIndex = 0;
if (!openPages.containsKey(player)) {
openPages.put(player, pageIndex);
} else {
pageIndex = openPages.get(player);
}
for (int i = 0; i < inv.getSize(); i++) {
inv.setItem(i, createGuiItem(Material.BLACK_STAINED_GLASS_PANE, ""));
}
List<UUID> trustedPlayers = openSystem.getTrustedPlayers();
for (int i = 10; i < 44; i++) {
// Ignore the borders
if (i == 18 || i == 27 || i == 36 || i == 17 || i == 26 || i == 35) {
continue;
}
// Find the current line we're filling
int lineIndex = i / 9 - 1;
// Fill the box if an item can go there, else just empty it.
if (i - (10 + lineIndex * 9) <= 6) { // Each line is 9 boxes.
int itemIndex = i - (10 + lineIndex * 2) + pageIndex * 28; // The start of a new line is + 2 boxes, with each page showing 28 items.
if (itemIndex < trustedPlayers.size()) {
UUID trustedUUID = trustedPlayers.get(itemIndex);
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(trustedUUID);
ItemStack item = new ItemStack(Material.PLAYER_HEAD);
SkullMeta headMeta = (SkullMeta) item.getItemMeta();
headMeta.setOwningPlayer(offlinePlayer);
headMeta.setDisplayName(offlinePlayer.getName());
headMeta.setLore(Arrays.asList("Click to un-trust."));
item.setItemMeta(headMeta);
inv.setItem(i, item);
} else {
inv.clear(i);
}
} else {
inv.clear(i);
}
inv.setItem(49, createGuiItem(Material.BEDROCK, "Back"));
inv.setItem(48, createGuiItem(Material.PAPER, "Last page"));
inv.setItem(50, createGuiItem(Material.PAPER, "Next page"));
}
}
private ItemStack createGuiItem(Material material, String name, List<String> description) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
meta.setLore(description);
item.setItemMeta(meta);
return item;
}
private ItemStack createGuiItem(Material material, List<String> description) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setLore(description);
item.setItemMeta(meta);
return item;
}
private ItemStack createGuiItem(Material material, String name) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
item.setItemMeta(meta);
return item;
}
public void openInventory(Player p, ESSystem esSystem) {
if (openSystems.containsKey(p)) {
openSystems.replace(p, esSystem);
} else {
openSystems.put(p, esSystem);
}
Inventory cloneInv = Bukkit.createInventory(this, 9, title);
p.openInventory(cloneInv);
initializeItems(p, esSystem);
}
public void openRemoveInventory(Player p, ESSystem esSystem) {
if (openSystems.containsKey(p)) {
openSystems.replace(p, esSystem);
} else {
openSystems.put(p, esSystem);
}
Inventory removeInv = Bukkit.createInventory(this, 9 * 6, removePlayerTitle);
p.openInventory(removeInv);
initializeRemovePlayerItems(p, esSystem);
}
// Remove cached player data
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
Inventory inventory = event.getInventory();
// Checks if the closing inventory is this inventory.
if (inventory.getHolder() != null && inventory.getHolder() == this) {
// This checks if the closing inventory is not a menu of this GUI class.
Bukkit.getScheduler().runTaskLater(EnergeticStorage.getPlugin(), ()-> {
Inventory inventory1 = event.getPlayer().getOpenInventory().getTopInventory();
Player player = (Player) event.getPlayer();
if (inventory1.getHolder() == null || inventory1.getHolder() != this) {
openSystems.remove(player);
}
}, (long) 0.1);
}
}
private enum ClickType {
NONE,
SWAP,
SWAP_RIGHT_CLICK,
INTO,
INTO_HALF,
OUT,
OUT_HALF,
SHIFT_OUT,
SHIFT_IN,
INVENTORY_CLICK
}
private ClickType findClickType(InventoryClickEvent event) {
Inventory inventory = event.getClickedInventory();
if (inventory == null || inventory.getHolder() == null || inventory.getHolder() != this) {
// Check for a shift click or bottom inventory click.
if (event.getView().getTitle().equals(title)) {
return (event.isShiftClick()) ? ClickType.SHIFT_IN : ClickType.INVENTORY_CLICK;
}
return ClickType.NONE;
}
ItemStack clickedItem = event.getCurrentItem();
ItemStack cursor = event.getCursor();
if ((clickedItem == null || clickedItem.getType() == Material.AIR) && (cursor == null || cursor.getType() == Material.AIR)) {
return ClickType.NONE;
} else if ( (clickedItem == null || clickedItem.getType() == Material.AIR) && (cursor != null || cursor.getType() != Material.AIR) ) {
return (event.isLeftClick()) ? ClickType.INTO : ClickType.INTO_HALF;
} else if (cursor == null || cursor.getType() == Material.AIR) {
return (event.isShiftClick()) ? ClickType.SHIFT_OUT : (event.isLeftClick()) ? ClickType.OUT : ClickType.OUT_HALF;
}
return (event.isLeftClick()) ? ClickType.SWAP : ClickType.SWAP_RIGHT_CLICK;
}
// Check for clicks on items
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
ClickType clickType = findClickType(event);
if (clickType != ClickType.NONE) {
event.setCancelled(true);
Player player = (Player) event.getWhoClicked();
ItemStack clickedItem = event.getCurrentItem(); // Will be valid if clicks an item (i.e. taking an item from the inventory)
ItemStack cursor = event.getCursor(); // Will be valid if an item is put into the inventory
int slot = event.getSlot();
ESSystem openSystem = openSystems.get(player);
// Handle type of click.
switch (clickType) {
case SHIFT_IN:
break;
case SWAP_RIGHT_CLICK:
break;
case SWAP:
break;
case INTO_HALF:
break;
case INTO:
break;
case OUT_HALF:
break;
case OUT:
if (event.getView().getTitle().equals(removePlayerTitle)) {
// At remove player menu
int pageIndex = openPages.get(player);
if (slot == 48) { // Last page
List<UUID> trustedUUIDs = openSystem.getTrustedPlayers();
if (trustedUUIDs.size() > pageIndex * 28 ) {
openPages.replace(player, pageIndex + 1);
}
} else if (slot == 49) { // Back
openInventory(player, openSystem);
} else if (slot == 50) { // Next page
openPages.replace(player, Math.max(0, pageIndex - 1));
} else {
if (Utils.isItemValid(clickedItem) && clickedItem.getType() == Material.PLAYER_HEAD) {
SkullMeta headMeta = (SkullMeta) clickedItem.getItemMeta();
OfflinePlayer unTrustingPlayer = headMeta.getOwningPlayer();
openSystem.removeTrustedPlayer(unTrustingPlayer.getUniqueId());
player.sendMessage(Reference.PREFIX + ChatColor.GREEN + unTrustingPlayer.getName() + " has been un-trusted from the system!");
player.closeInventory();
PlayersFile.savePlayerSystem(openSystem);
}
}
} else {
// At main menu
if (slot == 3) { // Add player
new AnvilGUI.Builder()
.onComplete((plr, text) -> {
if (text != null && !text.isEmpty()) {
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(text);
if (offlinePlayer.hasPlayedBefore()) {
if (!openSystem.isPlayerTrusted(offlinePlayer.getUniqueId())) {
openSystem.addTrustedPlayer(offlinePlayer.getUniqueId());
plr.sendMessage(Reference.PREFIX + ChatColor.GREEN + text + " has been trusted in the system!");
if (offlinePlayer.isOnline()) {
Player onlinePlayer = offlinePlayer.getPlayer();
onlinePlayer.sendMessage(Reference.PREFIX + ChatColor.GREEN + "You were just trusted into " + plr.getDisplayName() + "'s ES System!");
}
PlayersFile.savePlayerSystem(openSystem);
} else {
plr.sendMessage(Reference.PREFIX + ChatColor.RED + text + " is already trusted in the system!");
}
} else {
plr.sendMessage(Reference.PREFIX + ChatColor.RED + text + " doesn't exist!");
return AnvilGUI.Response.text("Player doesn't exist!");
}
}
return AnvilGUI.Response.close();
}).text("Player Name")
.item(new ItemStack(Material.PLAYER_HEAD))
.title("Enter player to trust.")
.plugin(EnergeticStorage.getPlugin())
.open(player);
} else if (slot == 4) { // Remove player
openRemoveInventory(player, openSystem);
} else if (slot == 5) { // Set to public/private
openSystem.setPublic(!openSystem.isPublic());
initializeItems(player, openSystem);
PlayersFile.savePlayerSystem(openSystem);
}
}
break;
case SHIFT_OUT:
break;
case INVENTORY_CLICK:
event.setCancelled(false);
break;
}
}
}
}

View File

@ -0,0 +1,335 @@
package net.seanomik.energeticstorage.gui;
import net.seanomik.energeticstorage.EnergeticStorage;
import net.seanomik.energeticstorage.files.PlayersFile;
import net.seanomik.energeticstorage.objects.ESSystem;
import net.seanomik.energeticstorage.utils.Reference;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.*;
public class ESTerminalGUI implements InventoryHolder, Listener {
private final Inventory globalInv;
private final String title = "ES Terminal";
private Map<UUID, ESSystem> openSystems = new HashMap<>();
private Map<UUID, Integer> openPages = new HashMap<>();
public ESTerminalGUI() {
globalInv = Bukkit.createInventory(this, 9*6, title);
}
@Override
public Inventory getInventory() {
return globalInv;
}
// You can open the inventory with this
public void openInventory(Player p, ESSystem openSystem) {
if (openSystems.containsKey(p.getUniqueId())) {
openSystems.replace(p.getUniqueId(), openSystem);
} else {
openSystems.put(p.getUniqueId(), openSystem);
}
Inventory cloneInv = Bukkit.createInventory(this, 9*6, title);
p.openInventory(cloneInv);
initializeItems(p, openSystem);
}
// You can call this whenever you want to put the items in
private void initializeItems(Player player, ESSystem openSystem) {
// Only initialize the items for the players inventory, not all of them.
Inventory inv = player.getOpenInventory().getTopInventory();
//ESSystem openSystem = openSystems.get(player.getUniqueId());
for (int i = 0; i <9*6; i++) {
inv.setItem(i, createGuiItem(Material.BLACK_STAINED_GLASS_PANE, ""));
}
inv.clear(0);
inv.setItem(1, createGuiItem(Material.LIME_STAINED_GLASS_PANE, "To insert items, put them to the left."));
inv.setItem(9, createGuiItem(Material.LIME_STAINED_GLASS_PANE, "To insert items, put them above."));
inv.setItem(49, createGuiItem(Material.COMPASS, "Search Items"));
inv.setItem(48, createGuiItem(Material.PAPER, "Last page"));
inv.setItem(50, createGuiItem(Material.PAPER, "Next page"));
// Store the current player page if it hasn't been stored already.
// If the page has been saved, then get it.
int pageIndex = 0;
if (!openPages.containsKey(player.getUniqueId())) {
openPages.put(player.getUniqueId(), pageIndex);
} else {
pageIndex = openPages.get(player.getUniqueId());
}
// Fill items
Map<ItemStack, Integer> items = openSystem.getAllItems();
for (int i = 10; i < 44; i++) {
// Ignore the borders
if (i == 18 || i == 27 || i == 36 || i == 17 || i == 26 || i == 35) {
continue;
}
// Find the current line we're filling
int lineIndex = i / 9 - 1;
// Fill the box if an item can go there, else just empty it.
if (i - (10 + lineIndex * 9) <= 6) { // Each line is 9 boxes.
int itemIndex = i - (10 + lineIndex * 2) + pageIndex * 28; // The start of a new line is + 2 boxes, with each page showing 28 items.
if (itemIndex < items.size()) {
try {
ItemStack item = (ItemStack) items.keySet().toArray()[itemIndex];
int amount = (int) items.values().toArray()[itemIndex];
ItemMeta itemMeta = item.getItemMeta();
if (itemMeta.hasLore()) {
List<String> lore = itemMeta.getLore();
if (Utils.listStringContainsString(lore, "Amount: ")) {
lore.removeIf(str -> (str.contains("Amount: ")));
}
lore.add("Amount: " + amount);
itemMeta.setLore(lore);
} else {
itemMeta.setLore(Arrays.asList("Amount: " + amount));
}
item.setItemMeta(itemMeta);
item.setAmount(Math.min(amount, 64));
inv.setItem(i, item);
} catch (NullPointerException e) {
System.out.println(Reference.PREFIX + ChatColor.RED + "A null item was stored and just attempted to load!");
inv.setItem(i, createGuiItem(Material.RED_STAINED_GLASS_PANE, "There was an error trying to load this item!"));
}
} else {
inv.clear(i);
}
} else {
inv.clear(i);
}
}
}
private ItemStack createGuiItem(Material material, String name) {
ItemStack item = new ItemStack(material, 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
item.setItemMeta(meta);
return item;
}
private enum ClickType {
NONE,
SWAP,
SWAP_RIGHT_CLICK,
INTO,
INTO_HALF,
OUT,
OUT_HALF,
SHIFT_OUT,
SHIFT_IN,
INVENTORY_CLICK
}
private ClickType findClickType(InventoryClickEvent event) {
Inventory inventory = event.getClickedInventory();
if (inventory == null || inventory.getHolder() == null || inventory.getHolder() != this) {
// Check for a shift click or bottom click.
if (event.getView().getTitle().equals(title)) {
return (event.isShiftClick()) ? ClickType.SHIFT_IN : ClickType.INVENTORY_CLICK;
}
return ClickType.NONE;
}
ItemStack clickedItem = event.getCurrentItem();
ItemStack cursor = event.getCursor();
if ((clickedItem == null || clickedItem.getType() == Material.AIR) && (cursor == null || cursor.getType() == Material.AIR)) {
return ClickType.NONE;
} else if ( (clickedItem == null || clickedItem.getType() == Material.AIR) && (cursor != null || cursor.getType() != Material.AIR) ) {
return (event.isLeftClick()) ? ClickType.INTO : ClickType.INTO_HALF;
} else if (cursor == null || cursor.getType() == Material.AIR) {
return (event.isShiftClick()) ? ClickType.SHIFT_OUT : (event.isLeftClick()) ? ClickType.OUT : ClickType.OUT_HALF;
}
return (event.isLeftClick()) ? ClickType.SWAP : ClickType.SWAP_RIGHT_CLICK;
}
@EventHandler
public void onInventoryDrag(InventoryDragEvent event) {
Inventory inventory = event.getInventory();
if (inventory == null || inventory.getHolder() == null || inventory.getHolder() != this) {
return;
} else {
event.setCancelled(true);
}
}
// Remove cached player data
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
Inventory inventory = event.getInventory();
if (inventory == null || inventory.getHolder() == null || inventory.getHolder() != this) {
return;
} else {
Player player = (Player) event.getPlayer();
PlayersFile.savePlayerSystem(openSystems.get(player.getUniqueId()));
Bukkit.getScheduler().runTaskLaterAsynchronously(EnergeticStorage.getPlugin(), () -> {
openSystems.remove(player);
openPages.remove(player);
}, (long) 0.1);
}
}
// Check for clicks on items
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
ClickType clickType = findClickType(event);
if (clickType != ClickType.NONE && clickType != ClickType.INVENTORY_CLICK) {
event.setCancelled(true);
Player player = (Player) event.getWhoClicked();
ItemStack clickedItem = event.getCurrentItem(); // Will be valid if clicks an item (i.e. taking an item from the inventory)
ItemStack cursor = event.getCursor(); // Will be valid if an item is put into the inventory
int slot = event.getSlot();
ESSystem openSystem = openSystems.get(player.getUniqueId());
// Make sure no items will get copied to other players open inventory
Inventory inv = player.getOpenInventory().getTopInventory();
int pageIndex = openPages.get(player.getUniqueId());
if (slot == 48) { // Back page
if (pageIndex != 0) {
pageIndex--;
openPages.replace(player.getUniqueId(), pageIndex);
initializeItems(player, openSystem);
}
} else if (slot == 49) { // Search
// @TODO: Add anvil gui search
} else if (slot == 50) {
Map<ItemStack, Integer> items = openSystem.getAllItems();
if (items.size() > pageIndex * 28 ) {
pageIndex++;
openPages.replace(player.getUniqueId(), pageIndex);
initializeItems(player, openSystem);
}
} else {
switch (clickType) {
case SHIFT_IN:
if (Utils.isItemValid(clickedItem)) {
if (openSystem.addItem(clickedItem)) {
event.setCancelled(false);
Bukkit.getScheduler().runTaskLater(EnergeticStorage.getPlugin(), () -> {
initializeItems(player, openSystem);
}, (long) 0.1);
}
}
break;
// Currently just ignore a into half since there really isn't any point of it.
case SWAP_RIGHT_CLICK:
if (cursor.isSimilar(clickedItem)) {
// This will take an item out one by one when the player is holding the same material.
ItemStack takingItem = cursor.clone();
takingItem.setAmount(1); // Only request to take one item
openSystem.removeItem(takingItem);
cursor.setAmount(cursor.getAmount() + 1);
Bukkit.getScheduler().runTaskLater(EnergeticStorage.getPlugin(), () -> {
initializeItems(player, openSystem);
}, (long) 0.1);
break;
}
case SWAP:
event.setCancelled(true);
if (openSystem.addItem(cursor)) {
// Remove cursor item
event.getView().setCursor(null);
Bukkit.getScheduler().runTaskLater(EnergeticStorage.getPlugin(), () -> {
initializeItems(player, openSystem);
}, (long) 0.1);
}
break;
case INTO_HALF:
case INTO:
if (Utils.isItemValid(cursor)) {
if (openSystem.addItem(cursor)) {
event.setCancelled(false);
Bukkit.getScheduler().runTaskLater(EnergeticStorage.getPlugin(), () -> {
initializeItems(player, openSystem);
}, (long) 0.1);
}
}
break;
case OUT_HALF:
case OUT:
if (Utils.isItemValid(clickedItem)) {
ItemStack takingItem = clickedItem.clone();
/*Map<ItemStack, Integer> items = openSystem.getAllItems();
int amount = items.values().toArray()[Utils.indexOfSimilarItem(items.keySet(), clickedItem)]*/
takingItem.setAmount((clickType == ClickType.OUT_HALF && clickedItem.getAmount() / 2 > 0) ? clickedItem.getAmount() / 2 : 64);
takingItem = openSystem.removeItem(takingItem);
event.getView().setCursor(takingItem);
Bukkit.getScheduler().runTaskLater(EnergeticStorage.getPlugin(), () -> {
initializeItems(player, openSystem);
}, (long) 0.1);
}
break;
case SHIFT_OUT:
if (Utils.isItemValid(clickedItem)) {
if (player.getInventory().firstEmpty() != -1) {
ItemStack takingitem = clickedItem.clone();
takingitem.setAmount(64);
ItemStack item = openSystem.removeItem(takingitem);
player.getInventory().addItem(item);
Bukkit.getScheduler().runTaskLater(EnergeticStorage.getPlugin(), () -> {
initializeItems(player, openSystem);
}, (long) 0.1);
}
}
break;
}
}
}
}
}

View File

@ -0,0 +1,54 @@
package net.seanomik.energeticstorage.listeners;
import de.tr7zw.changeme.nbtapi.NBTTileEntity;
import net.seanomik.energeticstorage.Skulls;
import net.seanomik.energeticstorage.files.PlayersFile;
import net.seanomik.energeticstorage.objects.ESDrive;
import net.seanomik.energeticstorage.objects.ESSystem;
import net.seanomik.energeticstorage.utils.PermissionChecks;
import net.seanomik.energeticstorage.utils.Reference;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import java.util.LinkedList;
import java.util.List;
public class BlockBreakListener implements Listener {
@EventHandler
public void onBlockBreakListener(BlockBreakEvent event) {
if (event.getBlock().getType() == Material.PLAYER_HEAD) {
Block block = event.getBlock();
Player player = event.getPlayer();
NBTTileEntity blockNBT = new NBTTileEntity(block.getState());
if (blockNBT.getCompound("Owner").getCompound("Properties").getCompoundList("textures").get(0).getString("Value").equals(Skulls.Computer.getTexture())) {
ESSystem esSystem = Utils.findSystemAtLocation(block.getLocation());
if (esSystem != null) {
if (esSystem.isPlayerTrusted(player) || esSystem.getOwner().equals(player.getUniqueId()) || PermissionChecks.canDestroyUntrustedSystems(player)) {
for (ESDrive drive : esSystem.getESDrives()) {
block.getLocation().getWorld().dropItem(block.getLocation(), drive.getDriveItem());
}
// Remove the system from cache and storage
PlayersFile.removePlayerSystem(player.getUniqueId(), esSystem.getUUID());
List<ESSystem> systems = new LinkedList<>(Reference.ES_SYSTEMS.get(player.getUniqueId()));
systems.removeIf(esSystem::equals);
Reference.ES_SYSTEMS.replace(player.getUniqueId(), systems);
} else {
event.setCancelled(true);
player.sendMessage(Reference.PREFIX + ChatColor.RED + "You are not trusted to this system!");
}
}
}
}
}
}

View File

@ -0,0 +1,50 @@
package net.seanomik.energeticstorage.listeners;
import de.tr7zw.changeme.nbtapi.NBTTileEntity;
import net.seanomik.energeticstorage.Skulls;
import net.seanomik.energeticstorage.files.PlayersFile;
import net.seanomik.energeticstorage.objects.ESSystem;
import net.seanomik.energeticstorage.utils.PermissionChecks;
import net.seanomik.energeticstorage.utils.Reference;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
public class BlockPlaceListener implements Listener {
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
if (event.getBlock().getType() == Material.PLAYER_HEAD) {
Block block = event.getBlock();
Player player = event.getPlayer();
NBTTileEntity blockNBT = new NBTTileEntity(block.getState());
if (blockNBT.getCompound("Owner").getCompound("Properties").getCompoundList("textures").get(0).getString("Value").equals(Skulls.Computer.getTexture())) {
if (PermissionChecks.canCreateSystem(player)) {
ESSystem newSystem = new ESSystem(player.getUniqueId(), UUID.randomUUID(), block.getLocation());
PlayersFile.savePlayerSystem(newSystem);
// If the player already has a system then add it to their cached systems, else just add it.
if (Reference.ES_SYSTEMS.containsKey(player.getUniqueId())) {
List<ESSystem> playerESSystems = new LinkedList<>(Reference.ES_SYSTEMS.get(player.getUniqueId()));
playerESSystems.add(newSystem);
Reference.ES_SYSTEMS.replace(player.getUniqueId(), playerESSystems);
} else {
Reference.ES_SYSTEMS.put(player.getUniqueId(), Arrays.asList(newSystem));
}
}
}
}
}
}

View File

@ -0,0 +1,62 @@
package net.seanomik.energeticstorage.listeners;
import de.tr7zw.changeme.nbtapi.NBTTileEntity;
import net.seanomik.energeticstorage.Skulls;
import net.seanomik.energeticstorage.objects.ESSystem;
import net.seanomik.energeticstorage.utils.PermissionChecks;
import net.seanomik.energeticstorage.utils.Reference;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
public class PlayerInteractListener implements Listener {
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getHand() == EquipmentSlot.HAND) {
if (event.getClickedBlock().getType() == Material.PLAYER_HEAD) {
Block block = event.getClickedBlock();
Player player = event.getPlayer();
NBTTileEntity blockNBT = new NBTTileEntity(block.getState());
if (blockNBT.getCompound("Owner").getCompound("Properties").getCompoundList("textures").get(0).getString("Value").equals(Skulls.Computer.getTexture())) {
event.setCancelled(true);
ESSystem esSystem = Utils.findSystemAtLocation(block.getLocation());
if (esSystem != null) {
if (esSystem.isPlayerTrusted(player) || esSystem.isPublic() || esSystem.getOwner().equals(player.getUniqueId()) || PermissionChecks.canOpenUntrustedSystem(player)) {
Reference.ES_SYSTEM_GUI.initializeItems(player, esSystem);
Reference.ES_SYSTEM_GUI.openInventory(player, esSystem);
} else {
player.sendMessage(Reference.PREFIX + ChatColor.RED + "You are not trusted to this system!");
}
} else {
player.sendMessage(Reference.PREFIX + ChatColor.RED + "You are not trusted to this system!");
}
}
/*
// You probably do not need an atomic reference IntelliJ just recommended this to me.
AtomicReference<Double> lastIncrement = new AtomicReference<>((double) 0);
Bukkit.getScheduler().runTaskTimer(plugin, ()-> {
Location a = new Location(Bukkit.getWorld(""), 0,0,0,);
Location b = new Location(Bukkit.getWorld(""), 0,0,0,);
Vector d = b.subtract(a).toVector();
lastIncrement.updateAndGet(v -> (v + 0.1));
Location line = a.add(d).multiply(lastIncrement.get());
// Spawns 1 heart particle
line.getWorld().spawnParticle(Particle.HEART, line, 1);
}, (long) 20, (long) 15); // 20 = delay, 15 = timer
*/
}
}
}
}

View File

@ -0,0 +1,184 @@
package net.seanomik.energeticstorage.objects;
import de.tr7zw.changeme.nbtapi.NBTItem;
import net.seanomik.energeticstorage.utils.ItemConstructor;
import net.seanomik.energeticstorage.utils.ItemSerialization;
import net.seanomik.energeticstorage.utils.Reference;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.Material;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.StringEscapeUtils;
import org.bukkit.inventory.ItemStack;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.util.*;
public class ESDrive implements Cloneable {
private UUID uuid;
private int size;
private Map<ItemStack, Integer> items = new HashMap<>(); // Item, amount
public ESDrive(int size) {
this.size = size;
}
public ESDrive(int size, Map<ItemStack, Integer> items) {
this(size);
uuid = UUID.randomUUID();
this.items = items;
}
public ESDrive(ItemStack driveItem) {
NBTItem driveNBT = new NBTItem(driveItem);
if (driveNBT.hasKey("ES_DriveItems")) {
try {
JSONParser jsonParser = new JSONParser();
JSONArray itemJsonArray = (JSONArray) jsonParser.parse(driveNBT.getString("ES_DriveItems"));
for (int i = 0; i < itemJsonArray.size(); i++) {
JSONObject itemObject = (JSONObject) itemJsonArray.get(i);
Map.Entry<ItemStack, Integer> item = ItemSerialization.deserializeItem((String) itemObject.get("itemYAML"));
items.put(item.getKey(), item.getValue());
}
} catch (ParseException | InvalidConfigurationException e) {
e.printStackTrace();
}
}
size = driveNBT.getInteger("ES_DriveMaxItemAmount");
uuid = (driveNBT.hasKey("ES_DriveUUID")) ? UUID.fromString(driveNBT.getString("ES_DriveUUID")) : UUID.randomUUID();
}
public UUID getUUID() {
return uuid;
}
public int getSize() {
return size;
}
public int getFilledSpace() {
int filled = 0;
for (int amount : items.values()) {
filled += amount;
}
return filled;
}
public int getFilledTypes() {
List<Material> foundItems = new ArrayList<>();
for (ItemStack item : items.keySet()) {
if (!foundItems.contains(item.getType())) {
foundItems.add(item.getType());
}
}
return foundItems.size();
}
public Map<ItemStack, Integer> getItems() { return items; }
public void setUUID(UUID uuid) {
this.uuid = uuid;
}
public void setSize(int size) {
this.size = size;
}
public void setItems(Map<ItemStack, Integer> items) { this.items = items; }
public ESDrive clone() {
try {
ESDrive drive = (ESDrive) super.clone();
if (this.items != null) {
items = new HashMap<>(items);
}
return drive;
} catch (CloneNotSupportedException var2) {
throw new Error(var2);
}
}
public boolean isAvailable(ItemStack item) {
return (Utils.isItemValid(item)) ? getFilledTypes() < Reference.MAX_DRIVE_TYPES && getFilledSpace() < size : getFilledSpace() < size;
}
public boolean addItem(ItemStack item) {
item = item.clone();
if (isAvailable(item)) {
// The item is contained, then update the amount.
if (Utils.containsSimilarItem(new ArrayList<>(items.keySet()), item, true)) {
int amount = (int) items.values().toArray()[Utils.indexOfSimilarItem(new ArrayList<>(items.keySet()), item)] + item.getAmount();
Utils.removeSimilarItem(items, item);
items.put(item, amount);
} else {
items.put(item, item.getAmount());
}
return true;
}
return false;
}
public ItemStack removeItem(ItemStack item) {
// If there isn't enough items stored to take out the requested amount, then just take out all that we can.
int foundItemAmount = (int) items.values().toArray()[Utils.indexOfSimilarItem(new ArrayList<>(items.keySet()), item)];
if (foundItemAmount - item.getAmount() < 1) {
Utils.removeSimilarItem(items, item);
item.setAmount(foundItemAmount);
} else {
int newAmount = foundItemAmount - item.getAmount();
Utils.removeSimilarItem(items, item);
items.put(item, newAmount);
}
return item;
}
private String exceptionMessage(Exception e) {
return "An exception occurred in ESDrive (UUID:" + uuid + ", Exception: " + e.getMessage() + ")";
}
public ItemStack getDriveItem() {
try {
ItemStack drive = ItemConstructor.createDrive(size, getFilledSpace(), getFilledTypes());
NBTItem driveNBT = new NBTItem(drive);
JSONArray itemsJson = new JSONArray();
for (Map.Entry<ItemStack, Integer> entry : items.entrySet()) {
try {
String object = "{\"itemYAML\":\"" + StringEscapeUtils.escapeJson(ItemSerialization.serializeItem(entry.getKey(), entry.getValue())) + "\"}";
JSONObject itemJSON = (JSONObject) new JSONParser().parse(object);
itemsJson.add(itemJSON);
} catch (ParseException e) {
e.printStackTrace();
}
}
driveNBT.setString("ES_DriveItems", itemsJson.toJSONString());
drive = driveNBT.getItem();
return drive;
} catch (Exception e) {
System.out.println(exceptionMessage(e));
}
return null;
}
}

View File

@ -0,0 +1,210 @@
package net.seanomik.energeticstorage.objects;
import net.seanomik.energeticstorage.utils.Utils;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.*;
public class ESSystem implements Cloneable {
private UUID owner;
private UUID uuid;
private Location location;
private List<ESDrive> esDrives = new ArrayList<>();
private List<UUID> trustedPlayers = new ArrayList<>();
private boolean isPublic;
public ESSystem(UUID owner, UUID uuid, Location location) {
this.owner = owner;
this.uuid = uuid;
this.location = location;
}
public ESSystem(UUID owner, UUID uuid, Location location, List<ESDrive> esDrives, List<UUID> trustedPlayers, boolean isPublic) {
this(owner, uuid, location);
this.esDrives = esDrives;
this.trustedPlayers = trustedPlayers;
this.isPublic = isPublic;
}
public void setEsDrives(List<ESDrive> esDrives) {
this.esDrives = esDrives;
}
public List<ESDrive> getEsDrives() {
return esDrives;
}
public void setTrustedPlayers(List<UUID> trustedPlayers) {
this.trustedPlayers = trustedPlayers;
}
public List<UUID> getTrustedPlayers() {
return trustedPlayers;
}
public boolean isPlayerTrusted(UUID uuid) {
return trustedPlayers.contains(uuid) || isPublic;
}
public boolean isPublic() {
return isPublic;
}
public void setPublic(boolean aPublic) {
isPublic = aPublic;
}
public boolean isPlayerTrusted(Player player) {
return trustedPlayers.contains(player.getUniqueId());
}
public void addTrustedPlayer(UUID uuid) {
trustedPlayers.add(uuid);
}
public void addTrustedPlayer(Player player) {
trustedPlayers.add(player.getUniqueId());
}
public void removeTrustedPlayer(UUID uuid) {
trustedPlayers.remove(uuid);
}
public void removeTrustedPlayer(Player player) {
trustedPlayers.remove(player.getUniqueId());
}
public UUID getUUID() {
return uuid;
}
public UUID getOwner() {
return owner;
}
public Location getLocation() {
return location;
}
public List<ESDrive> getESDrives() {
return esDrives;
}
public void setUUID(UUID id) {
this.uuid = uuid;
}
public void setOwner(UUID owner) {
this.owner = owner;
}
public void setESDrives(List<ESDrive> esDrives) {
this.esDrives = esDrives;
}
public void setLocation(Location location) {
this.location = location;
}
public ESSystem clone() {
try {
ESSystem system = (ESSystem) super.clone();
if (this.esDrives != null) {
esDrives = new ArrayList<>(esDrives);
}
return system;
} catch (CloneNotSupportedException var2) {
throw new Error(var2);
}
}
public boolean equals(Object other) {
assert other != null;
if (other instanceof ESSystem) {
ESSystem otherSystem = (ESSystem) other;
return otherSystem.getUUID() == uuid;
}
return false;
}
public ESDrive getNextAvailableDrive() {
for (ESDrive drive : esDrives) {
if (drive.isAvailable(null)) {
return drive;
}
}
return null;
}
public ESDrive findItemInAvailableDrive(ItemStack item) {
for (ESDrive drive : esDrives) {
for (ItemStack itemStack : drive.getItems().keySet()) {
if (item.isSimilar(itemStack) && drive.isAvailable(item)) {
return drive;
}
}
}
return null;
}
public Map<ItemStack, Integer> getAllItems() {
Map<ItemStack, Integer> items = new HashMap<>();
for (ESDrive drive : esDrives) {
for (Map.Entry<ItemStack, Integer> entry : drive.getItems().entrySet()) {
if (items.containsKey(entry.getKey())) {
// Set the ItemStack amount to the already existing item's amount + this amount
entry.getKey().setAmount(Math.min(entry.getValue(), 64));
items.remove(entry.getKey());
}
items.put(entry.getKey(), entry.getValue());
}
}
return items;
}
public boolean addItem(ItemStack item) {
ESDrive drive = findItemInAvailableDrive(item);
// If we failed to find the item in the next available drive, then find another drive.
if (drive == null) {
drive = getNextAvailableDrive();
if (drive == null) {
return false;
}
}
boolean addReturn = drive.addItem(item);
return addReturn;
}
public ItemStack removeItem(ItemStack item) {
// Find a drive that has this item to remove from.
ESDrive drive = null;
for (ESDrive esDrive : esDrives) {
for (ItemStack itemStack : esDrive.getItems().keySet()) {
if (Utils.removeAmountFromLore(item).isSimilar(Utils.removeAmountFromLore(itemStack))) {
drive = esDrive;
}
}
}
// If we failed to find the item in the next available drive, then find another drive.
if (drive == null) {
return null;
}
return drive.removeItem(item);
}
}

View File

@ -0,0 +1,84 @@
package net.seanomik.energeticstorage.utils;
import de.tr7zw.changeme.nbtapi.NBTItem;
import de.tr7zw.changeme.nbtapi.NBTTileEntity;
import net.seanomik.energeticstorage.Skulls;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class ItemConstructor {
private static Material DRIVE_MATERIAL = Material.BLUE_DYE;
public static ItemStack createSystemBlock() {
ItemStack systemBlock = Skulls.Computer.getItemStack();
NBTItem systemNBT = new NBTItem(systemBlock);
systemNBT.setBoolean("ES_SYSTEM", true);
systemBlock = systemNBT.getItem();
ItemMeta systemMeta = systemBlock.getItemMeta();
systemMeta.setDisplayName(ChatColor.LIGHT_PURPLE + "ES System");
systemBlock.setItemMeta(systemMeta);
return systemBlock;
}
public static ItemStack createDrive(int size, int filledItems, int filledTypes) {
int smallSize = size / 1024;
if (smallSize != 1 && smallSize != 4 && smallSize != 16 && smallSize != 64) {
return null;
}
// Get the size string for the items name.
String sizeString = size + "k";
sizeString = sizeString.substring(0, sizeString.indexOf('k') - 3);
if (sizeString.equals("65")) sizeString = "64";
ItemStack drive = new ItemStack(DRIVE_MATERIAL, 1);
// Save the items data in NBT
NBTItem driveNBT = new NBTItem(drive);
driveNBT.setBoolean("ES_Drive", true);
driveNBT.setInteger("ES_DriveMaxItemAmount", size);
driveNBT.setInteger("ES_DriveMaxTypeAmount", Reference.MAX_DRIVE_TYPES);
driveNBT.setString("ES_DriveUUID", UUID.randomUUID().toString());
drive = driveNBT.getItem();
ItemMeta driveMeta = drive.getItemMeta();
driveMeta.setDisplayName(ChatColor.LIGHT_PURPLE + "ES " + sizeString + "k Drive");
// Get color of items text
ChatColor itemsColor = ChatColor.GREEN;
if (filledItems >= size * 0.8) {
itemsColor = ChatColor.RED;
} else if (filledItems >= size * 0.5) {
itemsColor = ChatColor.YELLOW;
}
// Get color of types text
ChatColor typesColor = ChatColor.GREEN;
if (filledTypes >= Reference.MAX_DRIVE_TYPES * 0.8) {
typesColor = ChatColor.RED;
} else if (filledTypes >= Reference.MAX_DRIVE_TYPES * 0.5) {
typesColor = ChatColor.YELLOW;
}
List<String> lore = new ArrayList<>();
lore.add(ChatColor.BLUE + "Filled Items: " + itemsColor + filledItems + ChatColor.BLUE + "/" + ChatColor.GREEN + size);
lore.add(ChatColor.BLUE + "Filled Types: " + typesColor + filledTypes + ChatColor.BLUE + "/" + ChatColor.GREEN + Reference.MAX_DRIVE_TYPES);
driveMeta.setLore(lore);
drive.setItemMeta(driveMeta);
return drive;
}
}

View File

@ -0,0 +1,92 @@
package net.seanomik.energeticstorage.utils;
import net.seanomik.energeticstorage.EnergeticStorage;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapedRecipe;
public class ItemRecipies {
public static void registerRecipes() {
registerBlockRecipes();
registerDriveRecipes();
}
private static void registerBlockRecipes() {
try {
// Register system block
ItemStack esSystem = ItemConstructor.createSystemBlock();
ShapedRecipe systemRecipe = new ShapedRecipe(new NamespacedKey(EnergeticStorage.getPlugin(), "es_system"), esSystem);
systemRecipe.shape(
"III",
"RGR",
"DID");
systemRecipe.setIngredient('I', Material.IRON_INGOT);
systemRecipe.setIngredient('G', Material.GLOWSTONE_DUST);
systemRecipe.setIngredient('R', Material.REDSTONE);
systemRecipe.setIngredient('D', Material.DIAMOND);
Bukkit.getServer().addRecipe(systemRecipe);
} catch (Exception e) {
}
}
private static void registerDriveRecipes() {
try { // If the plugin was reloaded, a exception will be thrown.
// Register Drive 1k
ItemStack drive1k = ItemConstructor.createDrive(1024, 0, 0);
ShapedRecipe drv1k = new ShapedRecipe(new NamespacedKey(EnergeticStorage.getPlugin(), "es_drive_1k"), drive1k);
drv1k.shape(
"RCR",
"CRC",
"III");
drv1k.setIngredient('I', Material.IRON_INGOT);
drv1k.setIngredient('C', Material.CLAY);
drv1k.setIngredient('R', Material.REDSTONE);
Bukkit.getServer().addRecipe(drv1k);
// Register Drive 4k
ItemStack drive4k = ItemConstructor.createDrive(4096, 0, 0);
ShapedRecipe drv4k = new ShapedRecipe(new NamespacedKey(EnergeticStorage.getPlugin(), "es_drive_4k"), drive4k);
drv4k.shape(
"RBR",
"BRB",
"III");
drv4k.setIngredient('I', Material.IRON_INGOT);
drv4k.setIngredient('B', Material.BRICK);
drv4k.setIngredient('R', Material.REDSTONE);
Bukkit.getServer().addRecipe(drv4k);
// Register Drive 16k
ItemStack drive16k = ItemConstructor.createDrive(16384, 0, 0);
ShapedRecipe drv16k = new ShapedRecipe(new NamespacedKey(EnergeticStorage.getPlugin(), "es_drive_16k"), drive16k);
drv16k.shape(
"RGR",
"GRG",
"III");
drv16k.setIngredient('I', Material.IRON_INGOT);
drv16k.setIngredient('G', Material.GOLD_INGOT);
drv16k.setIngredient('R', Material.REDSTONE);
Bukkit.getServer().addRecipe(drv16k);
// Register Drive 64k
ItemStack drive64k = ItemConstructor.createDrive(65536, 0, 0);
ShapedRecipe drv64k = new ShapedRecipe(new NamespacedKey(EnergeticStorage.getPlugin(), "es_drive_64k"), drive64k);
drv64k.shape(
"RDR",
"DRD",
"III");
drv64k.setIngredient('I', Material.IRON_INGOT);
drv64k.setIngredient('D', Material.DIAMOND);
drv64k.setIngredient('R', Material.REDSTONE);
Bukkit.getServer().addRecipe(drv64k);
} catch (Exception e) {
}
}
}

View File

@ -0,0 +1,31 @@
package net.seanomik.energeticstorage.utils;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack;
import java.util.AbstractMap;
import java.util.Map;
public class ItemSerialization {
public static String serializeItem(ItemStack item, int amount) {
YamlConfiguration yaml = new YamlConfiguration();
yaml.set("amount", amount);
yaml.set("item", item);
return yaml.saveToString();
}
public static Map.Entry<ItemStack, Integer> deserializeItem(String item) throws InvalidConfigurationException {
YamlConfiguration yaml = new YamlConfiguration();
yaml.loadFromString(item);
ItemStack itemStack = yaml.getItemStack("item");
int amount = yaml.getInt("amount");
Map.Entry<ItemStack, Integer> itemEntry = new AbstractMap.SimpleEntry<>(itemStack, amount);
return itemEntry;
}
}

View File

@ -0,0 +1,25 @@
package net.seanomik.energeticstorage.utils;
import org.bukkit.command.CommandSender;
public class PermissionChecks {
public static boolean canDestroyUntrustedSystems(CommandSender sender) {
return sender.hasPermission("energeticstorage.system.destroy.untrusted");
}
public static boolean canOpenUntrustedSystem(CommandSender sender) {
return sender.hasPermission("energeticstorage.system.open.untrusted");
}
public static boolean canESGive(CommandSender sender) {
return sender.hasPermission("energeticstorage.esgive");
}
public static boolean canESGiveOthers(CommandSender sender) {
return sender.hasPermission("energeticstorage.esgive.others");
}
public static boolean canCreateSystem(CommandSender sender) {
return sender.hasPermission("energeticstorage.system.create");
}
}

View File

@ -0,0 +1,25 @@
package net.seanomik.energeticstorage.utils;
import net.seanomik.energeticstorage.files.ConfigFile;
import net.seanomik.energeticstorage.gui.ESDriveGUI;
import net.seanomik.energeticstorage.gui.ESSystemGUI;
import net.seanomik.energeticstorage.gui.ESSystemSecurityGUI;
import net.seanomik.energeticstorage.gui.ESTerminalGUI;
import net.seanomik.energeticstorage.objects.ESSystem;
import org.bukkit.ChatColor;
import java.util.*;
public class Reference {
public static String PREFIX = ChatColor.AQUA + "" + ChatColor.ITALIC + "[Energetic Storage] " + ChatColor.RESET;
public static ESTerminalGUI ES_TERMINAL_GUI = new ESTerminalGUI();
public static ESSystemGUI ES_SYSTEM_GUI = new ESSystemGUI();
public static ESDriveGUI ES_DRIVE_GUI = new ESDriveGUI();
public static ESSystemSecurityGUI ES_SYSTEM_SECURITY_GUI = new ESSystemSecurityGUI();
public static Map<UUID, List<ESSystem>> ES_SYSTEMS = new HashMap<>();
public static int MAX_DRIVE_TYPES = ConfigFile.getMaxTypes();
}

View File

@ -0,0 +1,115 @@
package net.seanomik.energeticstorage.utils;
import jdk.internal.jline.internal.Nullable;
import net.seanomik.energeticstorage.files.PlayersFile;
import net.seanomik.energeticstorage.objects.ESSystem;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.sql.Ref;
import java.util.*;
public class Utils {
public static String convertLocationToString(final Location l) {
if (l == null) {
return "";
}
return l.getWorld().getName() + ":" + l.getBlockX() + ":" + l.getBlockY() + ":" + l.getBlockZ();
}
public static Location convertStringToLocation(final String s) {
if (s == null || s.trim() == "") {
return null;
}
final String[] parts = s.split(":");
if (parts.length == 4) {
final World w = Bukkit.getServer().getWorld(parts[0]);
final int x = Integer.parseInt(parts[1]);
final int y = Integer.parseInt(parts[2]);
final int z = Integer.parseInt(parts[3]);
return new Location(w, x, y, z);
}
return null;
}
/**
* @param item Item to check if valid
* This checks if the item is not null and also not air.
*
* @return boolean - If the item is vallid or not
*/
public static boolean isItemValid(@Nullable ItemStack item) {
return item != null && item.getType() != Material.AIR;
}
public static ESSystem findSystemAtLocation(Location location) {
for (List<ESSystem> systems : Reference.ES_SYSTEMS.values()) {
for (ESSystem system : systems) {
if (system.getLocation().getBlockX() == location.getBlockX() && system.getLocation().getBlockY() == location.getBlockY() && system.getLocation().getBlockZ() == location.getBlockZ()) {
return system;
}
}
}
return null;
}
public static boolean containsSimilarItem(List<ItemStack> itemStacks, ItemStack item, boolean ignoreMeta) {
for (ItemStack itemStack : itemStacks) {
if (removeAmountFromLore(itemStack).isSimilar(item)) {
return true;
}
}
return false;
}
public static void removeSimilarItem(Map<ItemStack, Integer> itemStacks, ItemStack item) {
itemStacks.entrySet().removeIf(entry -> removeAmountFromLore(entry.getKey()).isSimilar(item));
}
public static int indexOfSimilarItem(List<ItemStack> itemStacks, ItemStack item) {
removeAmountFromLore(item);
for (ItemStack itemStack : itemStacks) {
removeAmountFromLore(itemStack);
if (itemStack.isSimilar(item)) {
return itemStacks.indexOf(itemStack);
}
}
return -1;
}
public static ItemStack removeAmountFromLore(ItemStack item) {
ItemMeta itemMeta = item.getItemMeta();
if (itemMeta != null && itemMeta.getLore() != null && !itemMeta.getLore().isEmpty()) {
itemMeta.setLore(removeAmountFromLore(itemMeta.getLore()));
item.setItemMeta(itemMeta);
}
return item;
}
public static List<String> removeAmountFromLore(List<String> lore) {
if (lore != null) {
lore.removeIf(line -> line.contains("Amount: "));
}
return lore;
}
public static boolean listStringContainsString(List<String> list, String string) {
for (String str : list) {
if (str.contains(string)) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1 @@
driveMaxTypes: 128

View File

@ -0,0 +1 @@
players: {}

View File

@ -0,0 +1,37 @@
name: EnergeticStorage
version: ${project.version}
main: net.seanomik.energeticstorage.EnergeticStorage
api-version: 1.15
authors: [SeanOMik]
commands:
esgive:
aliases: [egive]
description: Give a Energetic Storage item.
usage: /esgive
permissions:
energeticstorage.*:
description: All Energetic Storage permissions.
default: op
children:
energeticstorage.esgive: true
energeticstorage.esgive.others: true
energeticstorage.system.open.untrusted: true
energeticstorage.system.create: true
energeticstorage.system.destroy.untrusted: true
energeticstorage.esgive:
description: Give Energetic Storage items.
default: op
children:
energeticstorage.esgive.others: true
energeticstorage.esgive.others:
description: Give Energetic Storage items to other players.
default: op
energeticstorage.system.open.untrusted:
description: Gives the player permission to open untrusted systems.
default: op
energeticstorage.system.create:
description: Permission for creating new Energetic Storage.
default: op
energeticstorage.system.destroy.untrusted:
description: Permission for destroying an ES System that the player is not trusted in.
default: op

View File

@ -0,0 +1 @@
driveMaxTypes: 128

View File

@ -0,0 +1 @@
players: {}

37
target/classes/plugin.yml Normal file
View File

@ -0,0 +1,37 @@
name: EnergeticStorage
version: 0.1-SNAPSHOT
main: net.seanomik.energeticstorage.EnergeticStorage
api-version: 1.15
authors: [SeanOMik]
commands:
esgive:
aliases: [egive]
description: Give a Energetic Storage item.
usage: /esgive
permissions:
energeticstorage.*:
description: All Energetic Storage permissions.
default: op
children:
energeticstorage.esgive: true
energeticstorage.esgive.others: true
energeticstorage.system.open.untrusted: true
energeticstorage.system.create: true
energeticstorage.system.destroy.untrusted: true
energeticstorage.esgive:
description: Give Energetic Storage items.
default: op
children:
energeticstorage.esgive.others: true
energeticstorage.esgive.others:
description: Give Energetic Storage items to other players.
default: op
energeticstorage.system.open.untrusted:
description: Gives the player permission to open untrusted systems.
default: op
energeticstorage.system.create:
description: Permission for creating new Energetic Storage.
default: op
energeticstorage.system.destroy.untrusted:
description: Permission for destroying an ES System that the player is not trusted in.
default: op

View File

@ -0,0 +1,5 @@
#Generated by Maven
#Tue Apr 07 00:41:39 CDT 2020
groupId=net.seanomik
artifactId=energeticstorage
version=0.1-SNAPSHOT

View File

@ -0,0 +1,28 @@
net\seanomik\energeticstorage\gui\ESDriveGUI.class
net\seanomik\energeticstorage\gui\ESDriveGUI$ClickType.class
net\seanomik\energeticstorage\utils\ItemConstructor.class
net\seanomik\energeticstorage\files\ConfigFile.class
net\seanomik\energeticstorage\utils\PermissionChecks.class
net\seanomik\energeticstorage\utils\ItemSerialization.class
net\seanomik\energeticstorage\listeners\PlayerInteractListener.class
net\seanomik\energeticstorage\objects\ESSystem.class
net\seanomik\energeticstorage\objects\ESDrive.class
net\seanomik\energeticstorage\gui\ESDriveGUI$1.class
net\seanomik\energeticstorage\utils\ItemRecipies.class
net\seanomik\energeticstorage\gui\ESTerminalGUI.class
net\seanomik\energeticstorage\gui\ESSystemGUI.class
net\seanomik\energeticstorage\gui\ESTerminalGUI$ClickType.class
net\seanomik\energeticstorage\files\PlayersFile.class
net\seanomik\energeticstorage\gui\ESTerminalGUI$1.class
net\seanomik\energeticstorage\gui\ESSystemGUI$1.class
net\seanomik\energeticstorage\EnergeticStorage.class
net\seanomik\energeticstorage\gui\ESSystemSecurityGUI$1.class
net\seanomik\energeticstorage\gui\ESSystemSecurityGUI$ClickType.class
net\seanomik\energeticstorage\listeners\BlockBreakListener.class
net\seanomik\energeticstorage\commands\ESGiveCommand.class
net\seanomik\energeticstorage\listeners\BlockPlaceListener.class
net\seanomik\energeticstorage\gui\ESSystemSecurityGUI.class
net\seanomik\energeticstorage\utils\Utils.class
net\seanomik\energeticstorage\Skulls.class
net\seanomik\energeticstorage\utils\Reference.class
net\seanomik\energeticstorage\gui\ESSystemGUI$ClickType.class

View File

@ -0,0 +1,20 @@
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\gui\ESTerminalGUI.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\utils\ItemRecipies.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\commands\ESGiveCommand.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\utils\Utils.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\gui\ESSystemSecurityGUI.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\utils\ItemConstructor.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\listeners\BlockBreakListener.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\gui\ESDriveGUI.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\objects\ESSystem.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\gui\ESSystemGUI.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\EnergeticStorage.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\utils\PermissionChecks.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\files\PlayersFile.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\listeners\PlayerInteractListener.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\files\ConfigFile.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\utils\ItemSerialization.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\utils\Reference.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\objects\ESDrive.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\Skulls.java
D:\Code\java\spigotPlugins\myPlugins\EnergeticStorage\src\main\java\net\seanomik\energeticstorage\listeners\BlockPlaceListener.java