Initial Commit
This commit is contained in:
commit
9ae7e45911
116 changed files with 6876 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Project exclude paths
|
||||||
|
/target/
|
||||||
|
/.idea/
|
155
dependency-reduced-pom.xml
Normal file
155
dependency-reduced-pom.xml
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
<?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>nl.iobyte</groupId>
|
||||||
|
<artifactId>themepark</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.2.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<filters>
|
||||||
|
<filter>
|
||||||
|
<artifact>*:*</artifact>
|
||||||
|
<excludes>
|
||||||
|
<exclude>com/cryptomorin/xseries/XBlock*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XEnchantment*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XEntity*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XItemStack*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XMaterialUtil*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XPotion*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XSound*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XBiome*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/NMSExtras*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/NoteBlockMusic*</exclude>
|
||||||
|
</excludes>
|
||||||
|
</filter>
|
||||||
|
</filters>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>placeholderapi</id>
|
||||||
|
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>onarandombox</id>
|
||||||
|
<url>http://repo.onarandombox.com/content/groups/public</url>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>MG-Dev Jenkins CI Maven Repository</id>
|
||||||
|
<url>https://ci.mg-dev.eu/plugin/repository/everything</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot-api</artifactId>
|
||||||
|
<version>1.12.2-R0.1-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commons-lang</artifactId>
|
||||||
|
<groupId>commons-lang</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>json-simple</artifactId>
|
||||||
|
<groupId>com.googlecode.json-simple</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>snakeyaml</artifactId>
|
||||||
|
<groupId>org.yaml</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>bungeecord-chat</artifactId>
|
||||||
|
<groupId>net.md-5</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>me.clip</groupId>
|
||||||
|
<artifactId>placeholderapi</artifactId>
|
||||||
|
<version>2.10.9</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>annotations</artifactId>
|
||||||
|
<groupId>org.jetbrains</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.bergerkiller.bukkit</groupId>
|
||||||
|
<artifactId>TrainCarts</artifactId>
|
||||||
|
<version>1.16.5-v1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>LightAPI-fork</artifactId>
|
||||||
|
<groupId>io.github.qveshn</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>SmoothCoastersAPI</artifactId>
|
||||||
|
<groupId>me.m56738</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>cloud-paper</artifactId>
|
||||||
|
<groupId>org.bergerhealer.cloud.commandframework</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>cloud-annotations</artifactId>
|
||||||
|
<groupId>org.bergerhealer.cloud.commandframework</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>cloud-minecraft-extras</artifactId>
|
||||||
|
<groupId>org.bergerhealer.cloud.commandframework</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commodore</artifactId>
|
||||||
|
<groupId>me.lucko</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>adventure-platform-bukkit</artifactId>
|
||||||
|
<groupId>net.kyori</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.bergerkiller.bukkit</groupId>
|
||||||
|
<artifactId>BKCommonLib</artifactId>
|
||||||
|
<version>1.16.5-v1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>Mountiplex</artifactId>
|
||||||
|
<groupId>com.bergerkiller.mountiplex</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.target>11</maven.compiler.target>
|
||||||
|
<maven.compiler.source>11</maven.compiler.source>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
</project>
|
125
pom.xml
Normal file
125
pom.xml
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
<?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>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>11</maven.compiler.source>
|
||||||
|
<maven.compiler.target>11</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<groupId>nl.iobyte</groupId>
|
||||||
|
<artifactId>themepark</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>placeholderapi</id>
|
||||||
|
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>onarandombox</id>
|
||||||
|
<url>http://repo.onarandombox.com/content/groups/public</url>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>MG-Dev Jenkins CI Maven Repository</id>
|
||||||
|
<url>https://ci.mg-dev.eu/plugin/repository/everything</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot-api</artifactId>
|
||||||
|
<version>1.12.2-R0.1-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>nl.iobyte</groupId>
|
||||||
|
<artifactId>commandapi</artifactId>
|
||||||
|
<version>1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>nl.iobyte</groupId>
|
||||||
|
<artifactId>menuapi</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zaxxer</groupId>
|
||||||
|
<artifactId>HikariCP</artifactId>
|
||||||
|
<version>4.0.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>me.clip</groupId>
|
||||||
|
<artifactId>placeholderapi</artifactId>
|
||||||
|
<version>2.10.9</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.dumptruckman.minecraft</groupId>
|
||||||
|
<artifactId>JsonConfiguration</artifactId>
|
||||||
|
<version>1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.minidev</groupId>
|
||||||
|
<artifactId>json-smart</artifactId>
|
||||||
|
<version>1.1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.bergerkiller.bukkit</groupId>
|
||||||
|
<artifactId>TrainCarts</artifactId>
|
||||||
|
<version>1.16.5-v1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.bergerkiller.bukkit</groupId>
|
||||||
|
<artifactId>BKCommonLib</artifactId>
|
||||||
|
<version>1.16.5-v1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.cryptomorin</groupId>
|
||||||
|
<artifactId>XSeries</artifactId>
|
||||||
|
<version>8.1.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.2.0</version>
|
||||||
|
<configuration>
|
||||||
|
<filters>
|
||||||
|
<filter>
|
||||||
|
<artifact>*:*</artifact>
|
||||||
|
<excludes>
|
||||||
|
<exclude>com/cryptomorin/xseries/XBlock*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XEnchantment*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XEntity*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XItemStack*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XMaterialUtil*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XPotion*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XSound*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/XBiome*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/NMSExtras*</exclude>
|
||||||
|
<exclude>com/cryptomorin/xseries/NoteBlockMusic*</exclude>
|
||||||
|
</excludes>
|
||||||
|
</filter>
|
||||||
|
</filters>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
75
src/main/java/nl/iobyte/themepark/ThemePark.java
Normal file
75
src/main/java/nl/iobyte/themepark/ThemePark.java
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
package nl.iobyte.themepark;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.MenuAPI;
|
||||||
|
import nl.iobyte.themepark.api.ThemeParkAPI;
|
||||||
|
import nl.iobyte.themepark.commands.ThemeParkCommand;
|
||||||
|
import nl.iobyte.themepark.listeners.*;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
public class ThemePark extends JavaPlugin {
|
||||||
|
|
||||||
|
private static ThemePark instance;
|
||||||
|
private final ThemeParkAPI api = new ThemeParkAPI();
|
||||||
|
private boolean disabling = false;
|
||||||
|
|
||||||
|
public void onEnable() {
|
||||||
|
instance = this;
|
||||||
|
api.enable();
|
||||||
|
loadCommands();
|
||||||
|
loadListeners();
|
||||||
|
loadTrainCarts();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadCommands() {
|
||||||
|
new ThemeParkCommand();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadListeners() {
|
||||||
|
PluginManager pm = Bukkit.getPluginManager();
|
||||||
|
pm.registerEvents(new PlayerListener(), this);
|
||||||
|
pm.registerEvents(new RegionListener(), this);
|
||||||
|
pm.registerEvents(new AttractionListener(), this);
|
||||||
|
pm.registerEvents(new StatusListener(), this);
|
||||||
|
pm.registerEvents(new RideCountListener(), this);
|
||||||
|
pm.registerEvents(new StatusSignListener(), this);
|
||||||
|
pm.registerEvents(new GeneralListener(), this);
|
||||||
|
MenuAPI.register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadTrainCarts() {
|
||||||
|
try {
|
||||||
|
Plugin plugin = Bukkit.getPluginManager().getPlugin("Train_Carts");
|
||||||
|
if (plugin != null && plugin.isEnabled()) {
|
||||||
|
Class<?> clazz = Class.forName("com.bergerkiller.bukkit.tc.signactions.SignAction");
|
||||||
|
Class<?> sign = Class.forName("nl.iobyte.themepark.traincarts.RideCountSign");
|
||||||
|
Method method = clazz.getMethod("register", clazz);
|
||||||
|
method.invoke(clazz, sign.newInstance());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("["+getName()+"] Unable to hook into TrainCarts");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDisable() {
|
||||||
|
disabling = true;
|
||||||
|
api.disable();
|
||||||
|
|
||||||
|
instance = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ThemePark getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThemeParkAPI getAPI() {
|
||||||
|
return api;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDisabling() {
|
||||||
|
return disabling;
|
||||||
|
}
|
||||||
|
}
|
110
src/main/java/nl/iobyte/themepark/api/ThemeParkAPI.java
Normal file
110
src/main/java/nl/iobyte/themepark/api/ThemeParkAPI.java
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
package nl.iobyte.themepark.api;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.AttractionService;
|
||||||
|
import nl.iobyte.themepark.api.config.ConfigurationManager;
|
||||||
|
import nl.iobyte.themepark.api.database.DatabaseService;
|
||||||
|
import nl.iobyte.themepark.api.event.EventDispatcher;
|
||||||
|
import nl.iobyte.themepark.api.load.DataLoadService;
|
||||||
|
import nl.iobyte.themepark.api.menu.MenuService;
|
||||||
|
import nl.iobyte.themepark.api.ridecount.RideCountService;
|
||||||
|
import nl.iobyte.themepark.api.sign.SignManager;
|
||||||
|
|
||||||
|
public class ThemeParkAPI {
|
||||||
|
|
||||||
|
//Data
|
||||||
|
private ConfigurationManager configurationManager;
|
||||||
|
private final DataLoadService dataLoadService = new DataLoadService();
|
||||||
|
private final DatabaseService databaseService = new DatabaseService();
|
||||||
|
private final MenuService menuService = new MenuService();
|
||||||
|
private EventDispatcher eventDispatcher;
|
||||||
|
|
||||||
|
//Attraction
|
||||||
|
private final AttractionService attractionService = new AttractionService();
|
||||||
|
private final RideCountService rideCountService = new RideCountService();
|
||||||
|
private final SignManager signManager = new SignManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable the API
|
||||||
|
*/
|
||||||
|
public void enable() {
|
||||||
|
//Prepare Configuration
|
||||||
|
configurationManager = new ConfigurationManager(ThemePark.getInstance());
|
||||||
|
|
||||||
|
//Load data
|
||||||
|
eventDispatcher = new EventDispatcher(ThemePark.getInstance());
|
||||||
|
dataLoadService.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable the API
|
||||||
|
*/
|
||||||
|
public void disable() {
|
||||||
|
databaseService.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the configuration manager
|
||||||
|
* @return ConfigurationManager
|
||||||
|
*/
|
||||||
|
public ConfigurationManager getConfigurationManager() {
|
||||||
|
return configurationManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the attraction service
|
||||||
|
* @return AttractionService
|
||||||
|
*/
|
||||||
|
public AttractionService getAttractionService() {
|
||||||
|
return attractionService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data load service
|
||||||
|
* @return DataLoadService
|
||||||
|
*/
|
||||||
|
public DataLoadService getDataLoadService() {
|
||||||
|
return dataLoadService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the menu service
|
||||||
|
* @return MenuService
|
||||||
|
*/
|
||||||
|
public MenuService getMenuService() {
|
||||||
|
return menuService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the ride count service
|
||||||
|
* @return RideCountService
|
||||||
|
*/
|
||||||
|
public RideCountService getRideCountService() {
|
||||||
|
return rideCountService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the sign manager
|
||||||
|
* @return SignManager
|
||||||
|
*/
|
||||||
|
public SignManager getSignManager() {
|
||||||
|
return signManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the database service
|
||||||
|
* @return DatabaseService
|
||||||
|
*/
|
||||||
|
public DatabaseService getDatabaseService() {
|
||||||
|
return databaseService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the event dispatcher
|
||||||
|
* @return EventDispatcher
|
||||||
|
*/
|
||||||
|
public EventDispatcher getEventDispatcher() {
|
||||||
|
return eventDispatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,190 @@
|
||||||
|
package nl.iobyte.themepark.api.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.event.attraction.AttractionCreateEvent;
|
||||||
|
import nl.iobyte.themepark.api.event.attraction.AttractionRemoveEvent;
|
||||||
|
import nl.iobyte.themepark.api.event.region.RegionCreateEvent;
|
||||||
|
import nl.iobyte.themepark.api.event.region.RegionRemoveEvent;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class AttractionService {
|
||||||
|
|
||||||
|
private final LinkedHashMap<String, Region> regions = new LinkedHashMap<>();
|
||||||
|
private final Map<String, Attraction> attractions = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Region
|
||||||
|
* @param region Region
|
||||||
|
*/
|
||||||
|
public void addRegion(Region region) {
|
||||||
|
if(region.getID() == null || region.getID().isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(hasRegion(region.getID()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
regions.put(region.getID(), region);
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new RegionCreateEvent(
|
||||||
|
region
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has Region with ID
|
||||||
|
* @param id String
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean hasRegion(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return regions.containsKey(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Region by ID
|
||||||
|
* @param id String
|
||||||
|
* @return Region
|
||||||
|
*/
|
||||||
|
public Region getRegion(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return regions.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Map with Regions
|
||||||
|
* @return LinkedHashMap<String, Region>
|
||||||
|
*/
|
||||||
|
public LinkedHashMap<String, Region> getRegions() {
|
||||||
|
return regions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove Region by ID
|
||||||
|
* @param id String
|
||||||
|
* @return Region
|
||||||
|
*/
|
||||||
|
public Region removeRegion(String id) {
|
||||||
|
Region region = regions.remove(id);
|
||||||
|
if(region == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
for(Attraction attraction : region.getAttractions().values())
|
||||||
|
attractions.remove(attraction.getID());
|
||||||
|
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new RegionRemoveEvent(
|
||||||
|
region
|
||||||
|
));
|
||||||
|
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Attraction
|
||||||
|
* @param attraction Attraction
|
||||||
|
*/
|
||||||
|
public void addAttraction(Attraction attraction) {
|
||||||
|
if(attraction.getID() == null || attraction.getID().isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(hasAttraction(attraction.getID()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!hasRegion(attraction.getRegionID()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
getRegion(attraction.getRegionID()).addAttraction(attraction);
|
||||||
|
attractions.put(attraction.getID(), attraction);
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new AttractionCreateEvent(
|
||||||
|
attraction
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has Attraction with ID
|
||||||
|
* @param id String
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean hasAttraction(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return attractions.containsKey(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Attraction by ID
|
||||||
|
* @param id String
|
||||||
|
* @return Attraction
|
||||||
|
*/
|
||||||
|
public Attraction getAttraction(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return attractions.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Attraction by Name
|
||||||
|
* @param name String
|
||||||
|
* @return Attraction
|
||||||
|
*/
|
||||||
|
public Attraction getAttractionByName(String name) {
|
||||||
|
if(name == null || name.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
name = Text.strip(name);
|
||||||
|
for(Attraction attraction : attractions.values())
|
||||||
|
if(Text.strip(attraction.getName()).equals(name))
|
||||||
|
return attraction;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Attraction> getAttractionsByStatus(Status status) {
|
||||||
|
if(status == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Map<String, Attraction> map = new HashMap<>();
|
||||||
|
for(Map.Entry<String, Attraction> entrySet : attractions.entrySet())
|
||||||
|
if(entrySet.getValue().getStatus() == status)
|
||||||
|
map.put(entrySet.getKey(), entrySet.getValue());
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Map with Attractions
|
||||||
|
* @return Map<String, Attraction>
|
||||||
|
*/
|
||||||
|
public Map<String, Attraction> getAttractions() {
|
||||||
|
return attractions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove Attraction by ID
|
||||||
|
* @param id String
|
||||||
|
* @return Attraction
|
||||||
|
*/
|
||||||
|
public Attraction removeAttraction(String id) {
|
||||||
|
Attraction attraction = attractions.remove(id);
|
||||||
|
if(attraction == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
getRegion(attraction.getRegionID()).removeAttraction(id);
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new AttractionRemoveEvent(
|
||||||
|
attraction
|
||||||
|
));
|
||||||
|
|
||||||
|
return attraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,187 @@
|
||||||
|
package nl.iobyte.themepark.api.attraction.enums;
|
||||||
|
|
||||||
|
import com.cryptomorin.xseries.XMaterial;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.event.status.*;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public enum Status {
|
||||||
|
|
||||||
|
CONSTRUCTION(1, "&7", "#95a5a6", "Under Contruction", "STAINED_CLAY:1",false),
|
||||||
|
OPEN(2, "&a", "#4cd137", "Open", "STAINED_CLAY:5", true),
|
||||||
|
CLOSED(3, "&4", "#e84118", "Closed", "STAINED_CLAY:14", false),
|
||||||
|
MAINTENANCE(4, "&6", "#f39c12", "Under Maintenance", "STAINED_CLAY:4", false),
|
||||||
|
MALFUNCTION(5, "&5", "#8e44ad", "Malfunction", "STAINED_CLAY:11", false);
|
||||||
|
|
||||||
|
private final int id;
|
||||||
|
private String color, hex_color, name;
|
||||||
|
private XMaterial material;
|
||||||
|
private boolean teleport;
|
||||||
|
Status(int id, String color, String hex_color, String name, String material, boolean teleport) {
|
||||||
|
this.id = id;
|
||||||
|
this.color = color;
|
||||||
|
this.hex_color = hex_color;
|
||||||
|
this.name = name;
|
||||||
|
this.material = XMaterial.matchXMaterial(material).orElse(XMaterial.RED_CONCRETE);
|
||||||
|
this.teleport = teleport;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ID of Status
|
||||||
|
* @return Integer
|
||||||
|
*/
|
||||||
|
public int getID() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Color of Status
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Color of Status
|
||||||
|
* @param color String
|
||||||
|
*/
|
||||||
|
public void setColor(String color) {
|
||||||
|
String old = this.color;
|
||||||
|
this.color = color;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new StatusColorChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
color
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get HexColor of Status
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getHexColor() {
|
||||||
|
return hex_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set HexColor of Status
|
||||||
|
* @param hex_color String
|
||||||
|
*/
|
||||||
|
public void setHexColor(String hex_color) {
|
||||||
|
String old = this.hex_color;
|
||||||
|
this.hex_color = hex_color;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new StatusHexColorChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
hex_color
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Name of Status
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Name of Status
|
||||||
|
* @param name String
|
||||||
|
*/
|
||||||
|
public void setName(String name) {
|
||||||
|
String old = this.name;
|
||||||
|
this.name = name;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new StatusNameChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
name
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get XMaterial of Status
|
||||||
|
* @return XMaterial
|
||||||
|
*/
|
||||||
|
public XMaterial getMaterial() {
|
||||||
|
return material;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Material of Status
|
||||||
|
* @param material Material
|
||||||
|
*/
|
||||||
|
public void setMaterial(XMaterial material) {
|
||||||
|
XMaterial old = this.material;
|
||||||
|
this.material = material;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new StatusMaterialChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
material
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Item of Status
|
||||||
|
* @return ItemStack
|
||||||
|
*/
|
||||||
|
public ItemStack getItem() {
|
||||||
|
return material.parseItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can Teleport with Status
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean canTeleport() {
|
||||||
|
return teleport;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if can Teleport with Status
|
||||||
|
* @param teleport Boolean
|
||||||
|
*/
|
||||||
|
public void setCanTeleport(boolean teleport) {
|
||||||
|
boolean old = this.teleport;
|
||||||
|
this.teleport = teleport;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new StatusTeleportChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
teleport
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Status by name of enum
|
||||||
|
* @param str String
|
||||||
|
* @return Status
|
||||||
|
*/
|
||||||
|
public static Status get(String str) {
|
||||||
|
if(str == null || str.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
return Status.valueOf(str.toUpperCase());
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Status by ID
|
||||||
|
* @param id Integer
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public static Status get(int id) {
|
||||||
|
if(id <= 1 || id > values().length)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
for(Status status : values())
|
||||||
|
if(status.id == id)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
package nl.iobyte.themepark.api.attraction.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.event.attraction.*;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
public class Attraction {
|
||||||
|
|
||||||
|
private final String id;
|
||||||
|
private String region_id, name,cover;
|
||||||
|
private Status status;
|
||||||
|
private transient Location location;
|
||||||
|
|
||||||
|
public Attraction(String id, String region_id, String name, String cover, Status status, Location location) {
|
||||||
|
this.id = id;
|
||||||
|
this.region_id = region_id;
|
||||||
|
this.name = name;
|
||||||
|
this.cover = cover;
|
||||||
|
this.status = status;
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ID of Attraction
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getID() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get RegionID of Attraction
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getRegionID() {
|
||||||
|
return region_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set RegionID of Attraction
|
||||||
|
* @param region_id String
|
||||||
|
*/
|
||||||
|
public void setRegionID(String region_id) {
|
||||||
|
String old = this.region_id;
|
||||||
|
this.region_id = region_id;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new AttractionRegionChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
region_id
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Name of Attraction
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Name of Attraction
|
||||||
|
* @param name String
|
||||||
|
*/
|
||||||
|
public void setName(String name) {
|
||||||
|
String old = this.name;
|
||||||
|
this.name = name;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new AttractionNameChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
name
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Cover of Attraction
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getCover() {
|
||||||
|
return cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Cover of Attraction
|
||||||
|
* @param cover String
|
||||||
|
*/
|
||||||
|
public void setCover(String cover) {
|
||||||
|
String old = this.cover;
|
||||||
|
this.cover = cover;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new AttractionCoverChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
cover
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Status of Attraction
|
||||||
|
* @return Status
|
||||||
|
*/
|
||||||
|
public Status getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Status of Attraction
|
||||||
|
* @param status Attraction
|
||||||
|
*/
|
||||||
|
public void setStatus(Status status) {
|
||||||
|
Status old = this.status;
|
||||||
|
this.status = status;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new AttractionStatusChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
status
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Location of Attraction
|
||||||
|
* @return Location
|
||||||
|
*/
|
||||||
|
public Location getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Location of Attraction
|
||||||
|
* @param location Attraction
|
||||||
|
*/
|
||||||
|
public void setLocation(Location location) {
|
||||||
|
Location old = this.location;
|
||||||
|
this.location = location;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new AttractionLocationChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
location
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,115 @@
|
||||||
|
package nl.iobyte.themepark.api.attraction.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.config.objects.Configuration;
|
||||||
|
import nl.iobyte.themepark.api.event.region.RegionNameChangeEvent;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
public class Region {
|
||||||
|
|
||||||
|
private final String id;
|
||||||
|
private String name;
|
||||||
|
private transient final Configuration configuration;
|
||||||
|
private final LinkedHashMap<String, Attraction> attractions = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
public Region(String id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
configuration = new Configuration(ThemePark.getInstance(), "attractions/"+id+".yml", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ID of Region
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getID() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Name of Region
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Name of Region
|
||||||
|
* @param name String
|
||||||
|
*/
|
||||||
|
public void setName(String name) {
|
||||||
|
String old = this.name;
|
||||||
|
this.name = name;
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new RegionNameChangeEvent(
|
||||||
|
this,
|
||||||
|
old,
|
||||||
|
name
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Map with Attractions
|
||||||
|
* @return LinkedHashMap<String, Attraction>
|
||||||
|
*/
|
||||||
|
public LinkedHashMap<String, Attraction> getAttractions() {
|
||||||
|
return attractions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Region Configuration file
|
||||||
|
* @return Configuration
|
||||||
|
*/
|
||||||
|
public Configuration getConfiguration() {
|
||||||
|
return configuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Attraction to Region
|
||||||
|
* @param attraction Attraction
|
||||||
|
*/
|
||||||
|
public void addAttraction(Attraction attraction) {
|
||||||
|
if(attraction.getID() == null || attraction.getID().isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(hasAttraction(attraction.getID()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
attractions.put(attraction.getID(), attraction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Has Attraction with ID
|
||||||
|
* @param id String
|
||||||
|
* @return Attraction
|
||||||
|
*/
|
||||||
|
public boolean hasAttraction(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return attractions.containsKey(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Attraction by ID from Region
|
||||||
|
* @param id String
|
||||||
|
* @return Attraction
|
||||||
|
*/
|
||||||
|
public Attraction getAttraction(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return attractions.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove Attraction by ID from Region
|
||||||
|
* @param id String
|
||||||
|
* @return Attraction
|
||||||
|
*/
|
||||||
|
public Attraction removeAttraction(String id) {
|
||||||
|
return attractions.remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,252 @@
|
||||||
|
package nl.iobyte.themepark.api.config;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageKey;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageLocation;
|
||||||
|
import nl.iobyte.themepark.api.config.objects.Configuration;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ConfigurationManager {
|
||||||
|
|
||||||
|
private final Map<StorageLocation, Configuration> locations = new HashMap<>();
|
||||||
|
|
||||||
|
public ConfigurationManager(Plugin plugin) {
|
||||||
|
for(StorageLocation location : StorageLocation.values())
|
||||||
|
locations.put(location, new Configuration(plugin, location.getName(), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get configuration instance belonging to a storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @return Configuration instance
|
||||||
|
*/
|
||||||
|
public Configuration getConfiguration(StorageLocation location) {
|
||||||
|
if(location == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return locations.get(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save specific storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
*/
|
||||||
|
public void save(StorageLocation location) {
|
||||||
|
if(location == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
getConfiguration(location).save();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save all storage locations
|
||||||
|
*/
|
||||||
|
public void saveAll() {
|
||||||
|
for(Configuration configuration : locations.values())
|
||||||
|
configuration.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if configuration contains storage key
|
||||||
|
* @param key StorageKey
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean contains(StorageKey key) {
|
||||||
|
if(key == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return contains(key.getLocation(), key.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if storage location contains path
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @param path String
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean contains(StorageLocation location, String path) {
|
||||||
|
if(location == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return getConfiguration(location).contains(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set value to StorageKey
|
||||||
|
* @param key StorageKey
|
||||||
|
* @param value Object to set StorageKey to
|
||||||
|
*/
|
||||||
|
public void set(StorageKey key, Object value) {
|
||||||
|
if(key == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
set(key.getLocation(), key.getPath(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set value to path in storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @param path String
|
||||||
|
* @param value Object to set path to
|
||||||
|
*/
|
||||||
|
public void set(StorageLocation location, String path, Object value) {
|
||||||
|
if(location == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
getConfiguration(location).set(path, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get object value of storage key
|
||||||
|
* @param key StorageKey
|
||||||
|
* @return Object
|
||||||
|
*/
|
||||||
|
public Object get(StorageKey key) {
|
||||||
|
if(key == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return get(key.getLocation(), key.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get object value of path in storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @param path Path
|
||||||
|
* @return Object
|
||||||
|
*/
|
||||||
|
public Object get(StorageLocation location, String path) {
|
||||||
|
if(location == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getConfiguration(location).get(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string value of storage key
|
||||||
|
* @param key StorageKey
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getString(StorageKey key) {
|
||||||
|
if(key == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getString(key.getLocation(), key.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string value of path in storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @param path Path
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getString(StorageLocation location, String path) {
|
||||||
|
if(location == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getConfiguration(location).getString(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get int value of storage key
|
||||||
|
* @param key StorageKey
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public int getInt(StorageKey key) {
|
||||||
|
if(key == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return getInt(key.getLocation(), key.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get int value of path in storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @param path Path
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public int getInt(StorageLocation location, String path) {
|
||||||
|
if(location == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return getConfiguration(location).getInt(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get boolean value of storage key
|
||||||
|
* @param key StorageKey
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public boolean getBoolean(StorageKey key) {
|
||||||
|
if(key == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return getBoolean(key.getLocation(), key.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get boolean value of path in storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @param path Path
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public boolean getBoolean(StorageLocation location, String path) {
|
||||||
|
if(location == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return getConfiguration(location).getBoolean(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string list value of storage key
|
||||||
|
* @param key StorageKey
|
||||||
|
* @return List<String>
|
||||||
|
*/
|
||||||
|
public List<String> getStringList(StorageKey key) {
|
||||||
|
if(key == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getStringList(key.getLocation(), key.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string list value of path in storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @param path Path
|
||||||
|
* @return List<String>
|
||||||
|
*/
|
||||||
|
public List<String> getStringList(StorageLocation location, String path) {
|
||||||
|
if(location == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getConfiguration(location).getStringList(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string list value of storage key
|
||||||
|
* @param key StorageKey
|
||||||
|
* @return List<String>
|
||||||
|
*/
|
||||||
|
public ConfigurationSection getSection(StorageKey key) {
|
||||||
|
if(key == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getSection(key.getLocation(), key.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string list value of path in storage location
|
||||||
|
* @param location StorageLocation
|
||||||
|
* @param path Path
|
||||||
|
* @return List<String>
|
||||||
|
*/
|
||||||
|
public ConfigurationSection getSection(StorageLocation location, String path) {
|
||||||
|
if(location == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return getConfiguration(location).getSection(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package nl.iobyte.themepark.api.config.enums;
|
||||||
|
|
||||||
|
public enum StorageKey {
|
||||||
|
|
||||||
|
//Database Settings
|
||||||
|
MYSQL_ENABLED(StorageLocation.SETTINGS, "mysql.enabled"),
|
||||||
|
MYSQL_URL(StorageLocation.SETTINGS, "mysql.url"),
|
||||||
|
MYSQL_HOST(StorageLocation.SETTINGS, "mysql.host"),
|
||||||
|
MYSQL_PORT(StorageLocation.SETTINGS, "mysql.port"),
|
||||||
|
MYSQL_NAME(StorageLocation.SETTINGS, "mysql.name"),
|
||||||
|
MYSQL_USERNAME(StorageLocation.SETTINGS, "mysql.username"),
|
||||||
|
MYSQL_PASSWORD(StorageLocation.SETTINGS, "mysql.password"),
|
||||||
|
|
||||||
|
//Menu Settings
|
||||||
|
MENU_SIZE_MAIN(StorageLocation.MENU, "menu.main.size"),
|
||||||
|
MENU_TITLE_MAIN(StorageLocation.MENU, "menu.main.title"),
|
||||||
|
MENU_TITLE_STATUS(StorageLocation.MENU, "menu.status.title"),
|
||||||
|
|
||||||
|
//Menu Item
|
||||||
|
MENU_ITEM_ENABLED(StorageLocation.MENU, "menu.item.enabled"),
|
||||||
|
MENU_ITEM_MATERIAL(StorageLocation.MENU, "menu.item.material"),
|
||||||
|
MENU_ITEM_DATA(StorageLocation.MENU, "menu.item.data"),
|
||||||
|
MENU_ITEM_NAME(StorageLocation.MENU, "menu.item.name"),
|
||||||
|
MENU_ITEM_SLOT(StorageLocation.MENU, "menu.item.slot"),
|
||||||
|
MENU_ITEM_CLEAR(StorageLocation.MENU, "menu.item.clear"),
|
||||||
|
MENU_ITEM_WORLDS(StorageLocation.MENU, "menu.item.worlds"),
|
||||||
|
|
||||||
|
//Status Sign
|
||||||
|
SIGN_STATUS_NAME(StorageLocation.SETTINGS, "sign.status.name"),
|
||||||
|
SIGN_STATUS_TITLE(StorageLocation.SETTINGS, "sign.status.title");
|
||||||
|
|
||||||
|
private final StorageLocation location;
|
||||||
|
private final String path;
|
||||||
|
StorageKey(StorageLocation location, String path) {
|
||||||
|
this.location = location;
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get storage location key is stored in
|
||||||
|
* @return StorageLocation
|
||||||
|
*/
|
||||||
|
public StorageLocation getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get path to value
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package nl.iobyte.themepark.api.config.enums;
|
||||||
|
|
||||||
|
public enum StorageLocation {
|
||||||
|
|
||||||
|
SIGN_DATA("sign.yml"),
|
||||||
|
MESSAGE("message.yml"),
|
||||||
|
SETTINGS("settings.yml"),
|
||||||
|
STATUS_SETTINGS("status.yml"),
|
||||||
|
REGIONS("regions.yml"),
|
||||||
|
MENU("menu.yml");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
StorageLocation(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns filename of StorageLocation
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,170 @@
|
||||||
|
package nl.iobyte.themepark.api.config.objects;
|
||||||
|
|
||||||
|
import com.dumptruckman.bukkit.configuration.json.JsonConfiguration;
|
||||||
|
import nl.iobyte.themepark.logger.ThemeParkLogger;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Configuration {
|
||||||
|
|
||||||
|
private final Plugin plugin;
|
||||||
|
private File file;
|
||||||
|
private FileConfiguration config;
|
||||||
|
private final String fileName;
|
||||||
|
|
||||||
|
public Configuration(Plugin plugin, String fileName, boolean update) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.fileName = fileName;
|
||||||
|
load(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load config from file
|
||||||
|
*/
|
||||||
|
private void load(boolean update) {
|
||||||
|
file = new File(plugin.getDataFolder(), fileName);
|
||||||
|
if(!file.getParentFile().exists()) {
|
||||||
|
if (!file.getParentFile().mkdirs()) {
|
||||||
|
ThemeParkLogger.toConsole("Unable to create parent directories for config file: " + fileName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!file.exists()) {
|
||||||
|
if(plugin.getResource(fileName) == null) {
|
||||||
|
try {
|
||||||
|
if(!file.createNewFile())
|
||||||
|
ThemeParkLogger.toConsole("Unable to create config file: " + fileName);
|
||||||
|
} catch(Exception e) {
|
||||||
|
ThemeParkLogger.toConsole("Unable to create config file: " + fileName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
plugin.saveResource(fileName, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fileName.endsWith(".json")) {
|
||||||
|
config = JsonConfiguration.loadConfiguration(file);
|
||||||
|
} else {
|
||||||
|
config = YamlConfiguration.loadConfiguration(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!update)
|
||||||
|
return;
|
||||||
|
|
||||||
|
new ConfigurationUpdater(this).update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get plugin
|
||||||
|
* @return Plugin
|
||||||
|
*/
|
||||||
|
public Plugin getPlugin() {
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get file name of configuration
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getFileName() {
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save config to file
|
||||||
|
*/
|
||||||
|
public void save() {
|
||||||
|
try {
|
||||||
|
config.save(file);
|
||||||
|
} catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete config file
|
||||||
|
*/
|
||||||
|
public void delete() {
|
||||||
|
if(!file.delete())
|
||||||
|
ThemeParkLogger.toConsole("Unable to remove file: "+fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if config contains path
|
||||||
|
* @param key Path
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean contains(String key) {
|
||||||
|
return config.contains(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set config value
|
||||||
|
* @param key Path to value
|
||||||
|
* @param value Value
|
||||||
|
*/
|
||||||
|
public void set(String key, Object value) {
|
||||||
|
config.set(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get object
|
||||||
|
* @param key Path to object
|
||||||
|
* @return Object
|
||||||
|
*/
|
||||||
|
public Object get(String key) {
|
||||||
|
return config.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get string
|
||||||
|
* @param key Path to string
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getString(String key) {
|
||||||
|
return config.getString(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get integer
|
||||||
|
* @param key Path to integer
|
||||||
|
* @return Integer
|
||||||
|
*/
|
||||||
|
public int getInt(String key) {
|
||||||
|
return config.getInt(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get boolean
|
||||||
|
* @param key Path to boolean
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean getBoolean(String key) {
|
||||||
|
return config.getBoolean(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get List of strings
|
||||||
|
* @param key Path to list
|
||||||
|
* @return List of strings
|
||||||
|
*/
|
||||||
|
public List<String> getStringList(String key) {
|
||||||
|
return config.getStringList(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get section of config
|
||||||
|
* @param key Path to section
|
||||||
|
* @return Section of config
|
||||||
|
*/
|
||||||
|
public ConfigurationSection getSection(String key) {
|
||||||
|
return config.getConfigurationSection(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
package nl.iobyte.themepark.api.config.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.utils.VersionComparator;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
public class ConfigurationUpdater {
|
||||||
|
|
||||||
|
private final Configuration config;
|
||||||
|
|
||||||
|
public ConfigurationUpdater(Configuration config) {
|
||||||
|
this.config = config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCurrentVersion() {
|
||||||
|
if(!config.contains("version"))
|
||||||
|
return "1.0";
|
||||||
|
|
||||||
|
return config.getString("version");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
if(config.getFileName().endsWith(".json")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
InputStream resource = config.getPlugin().getResource(config.getFileName());
|
||||||
|
if(resource == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FileConfiguration data;
|
||||||
|
try(InputStreamReader reader = new InputStreamReader(resource, StandardCharsets.UTF_8)) {
|
||||||
|
data = YamlConfiguration.loadConfiguration(reader);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String saved_version = "1.0";
|
||||||
|
if(data.contains("version"))
|
||||||
|
saved_version = data.getString("version");
|
||||||
|
|
||||||
|
VersionComparator comparator = new VersionComparator();
|
||||||
|
int i = comparator.compare(saved_version, getCurrentVersion());
|
||||||
|
if(i <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
insertChanges(data.getConfigurationSection(""), "");
|
||||||
|
config.set("version", saved_version);
|
||||||
|
config.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void insertChanges(ConfigurationSection section, String root) {
|
||||||
|
if(section == null || section.getKeys(false).isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
String path;
|
||||||
|
for(String str : section.getKeys(false)) {
|
||||||
|
path = root.equals("") ? str : root + "." + str;
|
||||||
|
ConfigurationSection s = section.getConfigurationSection(str);
|
||||||
|
if(s != null) {
|
||||||
|
insertChanges(s, path);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(config.contains(path))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
config.set(path, section.get(str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
package nl.iobyte.themepark.api.database;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.database.objects.Database;
|
||||||
|
import nl.iobyte.themepark.api.database.objects.types.NullDatabase;
|
||||||
|
import nl.iobyte.themepark.scheduler.Task;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class DatabaseService {
|
||||||
|
|
||||||
|
private final Map<String, Database> databases = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Database to DatabaseService
|
||||||
|
* @param id String
|
||||||
|
* @param database Database
|
||||||
|
*/
|
||||||
|
public void addDatabase(String id, Database database) {
|
||||||
|
if(id == null || id.isEmpty() || database == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(databases.containsKey(id))
|
||||||
|
return;
|
||||||
|
|
||||||
|
databases.put(id, database);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Database
|
||||||
|
* @param id String
|
||||||
|
* @return Database
|
||||||
|
*/
|
||||||
|
public Database getDatabase(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return new NullDatabase();
|
||||||
|
|
||||||
|
return databases.getOrDefault(id, new NullDatabase());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<Boolean> executeAsync(String id, String query, Map<Integer, Object> objects) {
|
||||||
|
return getDatabase(id).executeAsync(query, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean execute(String id, String query, Map<Integer, Object> objects) {
|
||||||
|
return getDatabase(id).execute(query, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<Integer> executeUpdateAsync(String id, String query, Map<Integer, Object> objects) {
|
||||||
|
return getDatabase(id).executeUpdateAsync(query, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int executeUpdate(String id, String query, Map<Integer, Object> objects) {
|
||||||
|
return getDatabase(id).executeUpdate(query, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<ArrayList<Map<String, Object>>> executeQueryAsync(String id, String query, Map<Integer, Object> objects) {
|
||||||
|
return getDatabase(id).executeQueryAsync(query, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Map<String, Object>> executeQuery(String id, String query, Map<Integer, Object> objects) {
|
||||||
|
return getDatabase(id).executeQuery(query, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if Database exists
|
||||||
|
* @param id String
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public boolean hasDatabase(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return databases.containsKey(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove Database
|
||||||
|
* @param id String
|
||||||
|
*/
|
||||||
|
public void removeDatabase(String id) {
|
||||||
|
Database db = databases.remove(id);
|
||||||
|
if(db == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
db.closeConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
for(Database database : databases.values())
|
||||||
|
database.closeConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,122 @@
|
||||||
|
package nl.iobyte.themepark.api.database.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.scheduler.ThemeParkScheduler;
|
||||||
|
import nl.iobyte.themepark.scheduler.Task;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public abstract class Database {
|
||||||
|
|
||||||
|
public abstract Connection getConnection() throws SQLException;
|
||||||
|
|
||||||
|
public abstract void closeConnection();
|
||||||
|
|
||||||
|
public Task<Boolean> executeAsync(String query, Map<Integer, Object> objects) {
|
||||||
|
Task<Boolean> task = new Task<>();
|
||||||
|
ThemeParkScheduler.runAsync(() -> task.success(execute(
|
||||||
|
query,
|
||||||
|
objects
|
||||||
|
)));
|
||||||
|
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean execute(String query, Map<Integer, Object> objects) {
|
||||||
|
if(query == null || query.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
boolean b = false;
|
||||||
|
try(Connection conn = getConnection()) {
|
||||||
|
PreparedStatement statement = conn.prepareStatement(query);
|
||||||
|
statement.closeOnCompletion();
|
||||||
|
if(objects != null)
|
||||||
|
for(Map.Entry<Integer, Object> entry : objects.entrySet())
|
||||||
|
statement.setObject(entry.getKey(), entry.getValue());
|
||||||
|
|
||||||
|
b = statement.execute();
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.out.println("Query: "+query);
|
||||||
|
System.out.println("Map: "+objects);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<Integer> executeUpdateAsync(String query, Map<Integer, Object> objects) {
|
||||||
|
Task<Integer> task = new Task<>();
|
||||||
|
ThemeParkScheduler.runAsync(() -> task.success(executeUpdate(
|
||||||
|
query,
|
||||||
|
objects
|
||||||
|
)));
|
||||||
|
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int executeUpdate(String query, Map<Integer, Object> objects) {
|
||||||
|
if (query == null || query.isEmpty())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
try(Connection conn = getConnection()) {
|
||||||
|
PreparedStatement statement = conn.prepareStatement(query);
|
||||||
|
statement.closeOnCompletion();
|
||||||
|
for (Map.Entry<Integer, Object> entry : objects.entrySet())
|
||||||
|
statement.setObject(entry.getKey(), entry.getValue());
|
||||||
|
|
||||||
|
i = statement.executeUpdate();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<ArrayList<Map<String, Object>>> executeQueryAsync(String query, Map<Integer, Object> objects) {
|
||||||
|
Task<ArrayList<Map<String, Object>>> task = new Task<>();
|
||||||
|
ThemeParkScheduler.runAsync(() -> task.success(executeQuery(
|
||||||
|
query,
|
||||||
|
objects
|
||||||
|
)));
|
||||||
|
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Map<String, Object>> executeQuery(String query, Map<Integer, Object> objects) {
|
||||||
|
if (query == null || query.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
ArrayList<Map<String, Object>> set = null;
|
||||||
|
try(Connection conn = getConnection()) {
|
||||||
|
PreparedStatement statement = conn.prepareStatement(query);
|
||||||
|
statement.closeOnCompletion();
|
||||||
|
if (objects != null)
|
||||||
|
for (Map.Entry<Integer, Object> entry : objects.entrySet())
|
||||||
|
statement.setObject(entry.getKey(), entry.getValue());
|
||||||
|
|
||||||
|
set = new ArrayList<>();
|
||||||
|
|
||||||
|
ResultSet result = statement.executeQuery();
|
||||||
|
ResultSetMetaData metadata = result.getMetaData();
|
||||||
|
int columnCount = metadata.getColumnCount();
|
||||||
|
while(result.next()) {
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
for(int i = 1; i <= columnCount; i++)
|
||||||
|
map.put(metadata.getColumnName(i), result.getObject(i));
|
||||||
|
|
||||||
|
set.add(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
result.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package nl.iobyte.themepark.api.database.objects.types;
|
||||||
|
|
||||||
|
import com.zaxxer.hikari.HikariConfig;
|
||||||
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.database.objects.Database;
|
||||||
|
import nl.iobyte.themepark.logger.ThemeParkLogger;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public class MySQLDatabase extends Database {
|
||||||
|
|
||||||
|
private final String dbName;
|
||||||
|
private final HikariDataSource source;
|
||||||
|
|
||||||
|
public MySQLDatabase(String url, String host, int port, String dbName, String username, String password) {
|
||||||
|
if(url == null || url.isEmpty())
|
||||||
|
url = "jdbc:mysql://%host%:%port%/%database%?useSSL=false";
|
||||||
|
|
||||||
|
this.dbName = dbName;
|
||||||
|
HikariConfig config = new HikariConfig();
|
||||||
|
config.setPoolName(ThemePark.getInstance().getName());
|
||||||
|
config.setUsername(username);
|
||||||
|
config.setPassword(password);
|
||||||
|
config.setDriverClassName("com.mysql.jdbc.Driver");
|
||||||
|
config.setMaximumPoolSize(5);
|
||||||
|
config.setJdbcUrl(url.replace("%host%", host).replace("%port%", String.valueOf(port)).replace("%database%", dbName));
|
||||||
|
source = new HikariDataSource(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Connection
|
||||||
|
* @return Connection
|
||||||
|
*/
|
||||||
|
public Connection getConnection() throws SQLException {
|
||||||
|
return source.getConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close connection
|
||||||
|
*/
|
||||||
|
public void closeConnection() {
|
||||||
|
ThemeParkLogger.toConsole("Closing the database connection for " + dbName);
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package nl.iobyte.themepark.api.database.objects.types;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.database.objects.Database;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class NullDatabase extends Database {
|
||||||
|
|
||||||
|
public Connection getConnection() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void closeConnection() {}
|
||||||
|
|
||||||
|
public boolean execute(String query, Map<Integer, Object> objects) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int executeUpdate(String query, Map<Integer, Object> objects) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Map<String, Object>> executeQuery(String query, Map<Integer, Object> objects) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
package nl.iobyte.themepark.api.database.objects.types;
|
||||||
|
|
||||||
|
import com.zaxxer.hikari.HikariConfig;
|
||||||
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.database.objects.Database;
|
||||||
|
import nl.iobyte.themepark.logger.ThemeParkLogger;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public class SQLiteDatabase extends Database {
|
||||||
|
|
||||||
|
private final String dbName;
|
||||||
|
private String v;
|
||||||
|
private HikariDataSource source;
|
||||||
|
|
||||||
|
public SQLiteDatabase(String dbName) {
|
||||||
|
this.dbName = dbName;
|
||||||
|
|
||||||
|
File dbFile = new File(ThemePark.getInstance().getDataFolder(), dbName + ".db");
|
||||||
|
if (!dbFile.exists()) {
|
||||||
|
try {
|
||||||
|
ThemeParkLogger.toConsole("Generating the " + dbName + ".db!");
|
||||||
|
if (!dbFile.createNewFile()) {
|
||||||
|
ThemeParkLogger.toConsole("Couldn't generate the " + dbName + ".db!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
ThemeParkLogger.toConsole("Couldn't generate the " + dbName + ".db!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HikariConfig config = new HikariConfig();
|
||||||
|
config.setPoolName(ThemePark.getInstance().getName());
|
||||||
|
config.setUsername(null);
|
||||||
|
config.setPassword(null);
|
||||||
|
config.setDriverClassName("org.sqlite.JDBC");
|
||||||
|
config.setConnectionTestQuery("SELECT 1");
|
||||||
|
config.setMaximumPoolSize(5);
|
||||||
|
|
||||||
|
Properties prop = new Properties();
|
||||||
|
prop.setProperty("date_string_format", "yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
|
config.setJdbcUrl("jdbc:sqlite:" + dbFile.getAbsolutePath());
|
||||||
|
config.setDataSourceProperties(prop);
|
||||||
|
source = new HikariDataSource(config);
|
||||||
|
|
||||||
|
try(Connection conn = getConnection()) {
|
||||||
|
PreparedStatement statement = conn.prepareStatement("SELECT sqlite_version() AS version");
|
||||||
|
statement.closeOnCompletion();
|
||||||
|
|
||||||
|
ResultSet set = statement.executeQuery();
|
||||||
|
while(set.next()) {
|
||||||
|
v = set.getString("version");
|
||||||
|
}
|
||||||
|
|
||||||
|
set.close();
|
||||||
|
} catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(v == null) {
|
||||||
|
System.out.println("Unable to get SQLite version.");
|
||||||
|
} else {
|
||||||
|
System.out.println("SQLite database running on version: "+v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Database Connection
|
||||||
|
* @return Connection
|
||||||
|
*/
|
||||||
|
public Connection getConnection() throws SQLException {
|
||||||
|
return source.getConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close Connection
|
||||||
|
*/
|
||||||
|
public void closeConnection() {
|
||||||
|
ThemeParkLogger.toConsole("Closing the database connection for " + dbName + ".db!");
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package nl.iobyte.themepark.api.event;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
|
||||||
|
public class EventDispatcher {
|
||||||
|
|
||||||
|
private final Plugin plugin;
|
||||||
|
|
||||||
|
public EventDispatcher(Plugin plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch Event without Callback
|
||||||
|
* @param event Event
|
||||||
|
*/
|
||||||
|
public void call(Event event) {
|
||||||
|
call(event, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch Event with Callback
|
||||||
|
* @param event Event
|
||||||
|
* @param callback Runnable
|
||||||
|
*/
|
||||||
|
public void call(Event event, Runnable callback) {
|
||||||
|
PluginManager pm = Bukkit.getPluginManager();
|
||||||
|
if(Bukkit.isPrimaryThread()) {
|
||||||
|
pm.callEvent(event);
|
||||||
|
if(callback != null)
|
||||||
|
callback.run();
|
||||||
|
} else {
|
||||||
|
Bukkit.getScheduler().runTask(plugin, () -> {
|
||||||
|
pm.callEvent(event);
|
||||||
|
if(callback != null)
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(plugin, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
|
||||||
|
public class AttractionCoverChangeEvent extends AttractionEvent<String> {
|
||||||
|
|
||||||
|
public AttractionCoverChangeEvent(Attraction attraction, String old, String current) {
|
||||||
|
super(attraction, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.iobyte.themepark.api.event.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
|
||||||
|
public class AttractionCreateEvent extends AttractionEvent<Object> {
|
||||||
|
|
||||||
|
public AttractionCreateEvent(Attraction attraction) {
|
||||||
|
super(attraction, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
|
||||||
|
public class AttractionDescriptionChangeEvent extends AttractionEvent<String> {
|
||||||
|
|
||||||
|
public AttractionDescriptionChangeEvent(Attraction attraction, String old, String current) {
|
||||||
|
super(attraction, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.iobyte.themepark.api.event.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
public class AttractionLocationChangeEvent extends AttractionEvent<Location> {
|
||||||
|
|
||||||
|
public AttractionLocationChangeEvent(Attraction attraction, Location old, Location current) {
|
||||||
|
super(attraction, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
|
||||||
|
public class AttractionNameChangeEvent extends AttractionEvent<String> {
|
||||||
|
|
||||||
|
public AttractionNameChangeEvent(Attraction attraction, String old, String current) {
|
||||||
|
super(attraction, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
|
||||||
|
public class AttractionRegionChangeEvent extends AttractionEvent<String> {
|
||||||
|
|
||||||
|
public AttractionRegionChangeEvent(Attraction attraction, String old, String current) {
|
||||||
|
super(attraction, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.iobyte.themepark.api.event.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
|
||||||
|
public class AttractionRemoveEvent extends AttractionEvent<Object> {
|
||||||
|
|
||||||
|
public AttractionRemoveEvent(Attraction attraction) {
|
||||||
|
super(attraction, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.iobyte.themepark.api.event.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
|
||||||
|
public class AttractionStatusChangeEvent extends AttractionEvent<Status> {
|
||||||
|
|
||||||
|
public AttractionStatusChangeEvent(Attraction attraction, Status old, Status current) {
|
||||||
|
super(attraction, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package nl.iobyte.themepark.api.event.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
|
||||||
|
public class AttractionEvent<T> extends ChangeEvent<T> {
|
||||||
|
|
||||||
|
private final Attraction attraction;
|
||||||
|
|
||||||
|
public AttractionEvent(Attraction attraction, T old, T current) {
|
||||||
|
super(old, current);
|
||||||
|
this.attraction = attraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Attraction getAttraction() {
|
||||||
|
return attraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package nl.iobyte.themepark.api.event.objects;
|
||||||
|
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class ChangeEvent<T> extends Event {
|
||||||
|
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
private final T old, current;
|
||||||
|
|
||||||
|
public ChangeEvent(T old, T current) {
|
||||||
|
this.old = old;
|
||||||
|
this.current = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getOld() {
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getCurrent() {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package nl.iobyte.themepark.api.event.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
|
||||||
|
public class RegionEvent<T> extends ChangeEvent<T> {
|
||||||
|
|
||||||
|
private final Region region;
|
||||||
|
|
||||||
|
public RegionEvent(Region region, T old, T current) {
|
||||||
|
super(old, current);
|
||||||
|
this.region = region;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Region getRegion() {
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package nl.iobyte.themepark.api.event.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
|
||||||
|
public class StatusEvent<T> extends ChangeEvent<T> {
|
||||||
|
|
||||||
|
private final Status status;
|
||||||
|
|
||||||
|
public StatusEvent(Status status, T old, T current) {
|
||||||
|
super(old, current);
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Status getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.iobyte.themepark.api.event.region;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.RegionEvent;
|
||||||
|
|
||||||
|
public class RegionCreateEvent extends RegionEvent<Object> {
|
||||||
|
|
||||||
|
public RegionCreateEvent(Region region) {
|
||||||
|
super(region, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.region;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.RegionEvent;
|
||||||
|
|
||||||
|
public class RegionNameChangeEvent extends RegionEvent<String> {
|
||||||
|
|
||||||
|
public RegionNameChangeEvent(Region region, String old, String current) {
|
||||||
|
super(region, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.iobyte.themepark.api.event.region;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.RegionEvent;
|
||||||
|
|
||||||
|
public class RegionRemoveEvent extends RegionEvent<Object> {
|
||||||
|
|
||||||
|
public RegionRemoveEvent(Region region) {
|
||||||
|
super(region, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
package nl.iobyte.themepark.api.event.ridecount;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.event.objects.ChangeEvent;
|
||||||
|
import nl.iobyte.themepark.api.ridecount.objects.RideCount;
|
||||||
|
|
||||||
|
public class RideCountAddEvent extends ChangeEvent<Integer> {
|
||||||
|
|
||||||
|
private final RideCount count;
|
||||||
|
|
||||||
|
public RideCountAddEvent(RideCount count, int old, int current) {
|
||||||
|
super(old, current);
|
||||||
|
this.count = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RideCount getRideCount() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.status;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.StatusEvent;
|
||||||
|
|
||||||
|
public class StatusColorChangeEvent extends StatusEvent<String> {
|
||||||
|
|
||||||
|
public StatusColorChangeEvent(Status status, String old, String current) {
|
||||||
|
super(status, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.status;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.StatusEvent;
|
||||||
|
|
||||||
|
public class StatusHexColorChangeEvent extends StatusEvent<String> {
|
||||||
|
|
||||||
|
public StatusHexColorChangeEvent(Status status, String old, String current) {
|
||||||
|
super(status, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.iobyte.themepark.api.event.status;
|
||||||
|
|
||||||
|
import com.cryptomorin.xseries.XMaterial;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.StatusEvent;
|
||||||
|
|
||||||
|
public class StatusMaterialChangeEvent extends StatusEvent<XMaterial> {
|
||||||
|
|
||||||
|
public StatusMaterialChangeEvent(Status status, XMaterial old, XMaterial current) {
|
||||||
|
super(status, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.status;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.StatusEvent;
|
||||||
|
|
||||||
|
public class StatusNameChangeEvent extends StatusEvent<String> {
|
||||||
|
|
||||||
|
public StatusNameChangeEvent(Status status, String old, String current) {
|
||||||
|
super(status, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.api.event.status;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.StatusEvent;
|
||||||
|
|
||||||
|
public class StatusTeleportChangeEvent extends StatusEvent<Boolean> {
|
||||||
|
|
||||||
|
public StatusTeleportChangeEvent(Status status, boolean old, boolean current) {
|
||||||
|
super(status, old, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.api.load;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.load.interfaces.IDataLoader;
|
||||||
|
import nl.iobyte.themepark.api.load.objects.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DataLoadService {
|
||||||
|
|
||||||
|
private final List<IDataLoader> loaders = new ArrayList<>();
|
||||||
|
|
||||||
|
public DataLoadService() {
|
||||||
|
addLoader(new DatabaseLoader());
|
||||||
|
addLoader(new StatusDataLoader());
|
||||||
|
addLoader(new SignDataLoader());
|
||||||
|
addLoader(new MenuDataLoader());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add IDataLoader
|
||||||
|
* @param dataLoader IDataLoader
|
||||||
|
*/
|
||||||
|
public void addLoader(IDataLoader dataLoader) {
|
||||||
|
loaders.add(dataLoader);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call all IDataLoaders
|
||||||
|
*/
|
||||||
|
public void init() {
|
||||||
|
for(IDataLoader loader : loaders)
|
||||||
|
loader.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package nl.iobyte.themepark.api.load.interfaces;
|
||||||
|
|
||||||
|
public interface IDataLoader {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when loading data
|
||||||
|
*/
|
||||||
|
void load();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
package nl.iobyte.themepark.api.load.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.ThemeParkAPI;
|
||||||
|
import nl.iobyte.themepark.api.config.ConfigurationManager;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageKey;
|
||||||
|
import nl.iobyte.themepark.api.database.DatabaseService;
|
||||||
|
import nl.iobyte.themepark.api.database.objects.types.MySQLDatabase;
|
||||||
|
import nl.iobyte.themepark.api.database.objects.types.SQLiteDatabase;
|
||||||
|
import nl.iobyte.themepark.api.load.interfaces.IDataLoader;
|
||||||
|
|
||||||
|
public class DatabaseLoader implements IDataLoader {
|
||||||
|
|
||||||
|
public void load() {
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
DatabaseService service = api.getDatabaseService();
|
||||||
|
ConfigurationManager manager = api.getConfigurationManager();
|
||||||
|
|
||||||
|
//Add SQLite Database
|
||||||
|
service.addDatabase(
|
||||||
|
"local",
|
||||||
|
new SQLiteDatabase("sqlite")
|
||||||
|
);
|
||||||
|
|
||||||
|
if(manager.getBoolean(StorageKey.MYSQL_ENABLED))
|
||||||
|
service.addDatabase(
|
||||||
|
"remote",
|
||||||
|
new MySQLDatabase(
|
||||||
|
manager.getString(StorageKey.MYSQL_URL),
|
||||||
|
manager.getString(StorageKey.MYSQL_HOST),
|
||||||
|
manager.getInt(StorageKey.MYSQL_PORT),
|
||||||
|
manager.getString(StorageKey.MYSQL_NAME),
|
||||||
|
manager.getString(StorageKey.MYSQL_USERNAME),
|
||||||
|
manager.getString(StorageKey.MYSQL_PASSWORD)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
//Create Database tables
|
||||||
|
loadTables(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadTables(DatabaseService service) {
|
||||||
|
//Create SQLite Tables
|
||||||
|
service.execute(
|
||||||
|
"local",
|
||||||
|
"CREATE TABLE IF NOT EXISTS counts(uuid VARCHAR(255) NOT NULL, attraction_id VARCHAR(255) NOT NULL, year SMALLINT(2), month SMALLINT(2), week SMALLINT(2), day SMALLINT(2), count SMALLINT(2), UNIQUE(uuid, attraction_id, year, day))",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
//Create MySQL Tables
|
||||||
|
service.execute(
|
||||||
|
"remote",
|
||||||
|
"CREATE TABLE IF NOT EXISTS regions(id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id))",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
service.execute(
|
||||||
|
"remote",
|
||||||
|
"CREATE TABLE IF NOT EXISTS attractions(id VARCHAR(255) NOT NULL, region_id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, cover VARCHAR(255) NOT NULL, status_id INT(11), PRIMARY KEY(id))",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
service.execute(
|
||||||
|
"remote",
|
||||||
|
"CREATE TABLE IF NOT EXISTS states(id INT(11), name VARCHAR(255) NOT NULL, color VARCHAR(7) NOT NULL, PRIMARY KEY(id))",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package nl.iobyte.themepark.api.load.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.MenuAPI;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.load.interfaces.IDataLoader;
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.handlers.StatusMenuHandler;
|
||||||
|
|
||||||
|
public class MenuDataLoader implements IDataLoader {
|
||||||
|
|
||||||
|
public void load() {
|
||||||
|
//Register default IActionHandlers
|
||||||
|
MenuAPI.addActionHandler(new StatusMenuHandler());
|
||||||
|
|
||||||
|
//Load Menu's
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().init();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package nl.iobyte.themepark.api.load.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.ThemeParkAPI;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.config.ConfigurationManager;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageLocation;
|
||||||
|
import nl.iobyte.themepark.api.load.interfaces.IDataLoader;
|
||||||
|
import nl.iobyte.themepark.api.sign.objects.StatusSign;
|
||||||
|
import nl.iobyte.themepark.utils.LocationUtil;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class SignDataLoader implements IDataLoader {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when loading data
|
||||||
|
*/
|
||||||
|
public void load() {
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
ConfigurationManager manager = api.getConfigurationManager();
|
||||||
|
|
||||||
|
for(Attraction attraction : api.getAttractionService().getAttractions().values()) {
|
||||||
|
if(attraction == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!manager.contains(StorageLocation.SIGN_DATA, "signs." + attraction.getID())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> locations = manager.getStringList(StorageLocation.SIGN_DATA, "signs." + attraction.getID());
|
||||||
|
for(String string : locations) {
|
||||||
|
Location location = LocationUtil.fromString(string);
|
||||||
|
if(location == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(!(location.getBlock().getState() instanceof Sign)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
api.getSignManager().addSign(new StatusSign(attraction, location));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,191 @@
|
||||||
|
package nl.iobyte.themepark.api.load.objects;
|
||||||
|
|
||||||
|
import com.cryptomorin.xseries.XMaterial;
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.ThemeParkAPI;
|
||||||
|
import nl.iobyte.themepark.api.attraction.AttractionService;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageKey;
|
||||||
|
import nl.iobyte.themepark.api.config.objects.Configuration;
|
||||||
|
import nl.iobyte.themepark.api.config.ConfigurationManager;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageLocation;
|
||||||
|
import nl.iobyte.themepark.api.database.objects.Database;
|
||||||
|
import nl.iobyte.themepark.api.load.interfaces.IDataLoader;
|
||||||
|
import nl.iobyte.themepark.utils.LocationUtil;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class StatusDataLoader implements IDataLoader {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when loading data
|
||||||
|
*/
|
||||||
|
public void load() {
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
ConfigurationManager manager = api.getConfigurationManager();
|
||||||
|
|
||||||
|
//Load data
|
||||||
|
loadStatus(manager);
|
||||||
|
loadRegions(api, manager);
|
||||||
|
|
||||||
|
//Insert into Database
|
||||||
|
prepareDatabase(api);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadStatus(ConfigurationManager manager) {
|
||||||
|
if(!manager.contains(StorageLocation.STATUS_SETTINGS, "states"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ConfigurationSection section = manager.getSection(StorageLocation.STATUS_SETTINGS, "states");
|
||||||
|
if(section.getKeys(false).isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Status status;
|
||||||
|
String path;
|
||||||
|
for(String id : section.getKeys(false)) {
|
||||||
|
status = Status.get(id);
|
||||||
|
if(status == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
path = "states."+id;
|
||||||
|
if(manager.contains(StorageLocation.STATUS_SETTINGS, path+".name"))
|
||||||
|
status.setName(manager.getString(StorageLocation.STATUS_SETTINGS, path+".name"));
|
||||||
|
|
||||||
|
if(manager.contains(StorageLocation.STATUS_SETTINGS, path+".color"))
|
||||||
|
status.setColor(manager.getString(StorageLocation.STATUS_SETTINGS, path+".color"));
|
||||||
|
|
||||||
|
if(manager.contains(StorageLocation.STATUS_SETTINGS, path+".hex_color"))
|
||||||
|
status.setHexColor(manager.getString(StorageLocation.STATUS_SETTINGS, path+".hex_color"));
|
||||||
|
|
||||||
|
if(manager.contains(StorageLocation.STATUS_SETTINGS, path+".teleport"))
|
||||||
|
status.setCanTeleport(manager.getBoolean(StorageLocation.STATUS_SETTINGS, path+".teleport"));
|
||||||
|
|
||||||
|
XMaterial material = null;
|
||||||
|
if(manager.contains(StorageLocation.STATUS_SETTINGS, path+".material"))
|
||||||
|
material = XMaterial.matchXMaterial(manager.getString(StorageLocation.STATUS_SETTINGS, path + ".material")).orElse(XMaterial.RED_CONCRETE);
|
||||||
|
|
||||||
|
if(material == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
status.setMaterial(material);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load Regions from config
|
||||||
|
* @param api ThemeParkAPI
|
||||||
|
* @param manager ConfigurationManager
|
||||||
|
*/
|
||||||
|
private void loadRegions(ThemeParkAPI api, ConfigurationManager manager) {
|
||||||
|
//See if any regions exist
|
||||||
|
AttractionService attractionService = api.getAttractionService();
|
||||||
|
if(!manager.contains(StorageLocation.REGIONS, "regions"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ConfigurationSection section = manager.getSection(StorageLocation.REGIONS, "regions");
|
||||||
|
if(section.getKeys(false).isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Load regions
|
||||||
|
for(String id : section.getKeys(false)) {
|
||||||
|
String name = manager.getString(StorageLocation.REGIONS, "regions."+id+".name");
|
||||||
|
|
||||||
|
Region region = new Region(id, name);
|
||||||
|
attractionService.addRegion(region);
|
||||||
|
loadAttractions(api, region); //try loading Attractions for Region
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load Attractions for specific Region
|
||||||
|
* @param api ThemeParkAPI
|
||||||
|
* @param region Region
|
||||||
|
*/
|
||||||
|
private void loadAttractions(ThemeParkAPI api, Region region) {
|
||||||
|
//See if any attractions exist
|
||||||
|
Configuration config = region.getConfiguration();
|
||||||
|
if(!config.contains("attractions"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ConfigurationSection section = config.getSection("attractions");
|
||||||
|
if(section.getKeys(false).isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Load Attractions
|
||||||
|
for(String id : section.getKeys(false)) {
|
||||||
|
String name = config.getString("attractions."+id+".name");
|
||||||
|
String cover = config.getString("attractions."+id+".cover");
|
||||||
|
Status status = Status.get(config.getString("attractions."+id+".status"));
|
||||||
|
Location location = LocationUtil.fromString(config.getString("attractions."+id+".location"));
|
||||||
|
|
||||||
|
Attraction attraction = new Attraction(id, region.getID(), name, cover, status, location);
|
||||||
|
api.getAttractionService().addAttraction(attraction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareDatabase(ThemeParkAPI api) {
|
||||||
|
AttractionService service = api.getAttractionService();
|
||||||
|
Database db = api.getDatabaseService().getDatabase("remote");
|
||||||
|
|
||||||
|
//Variables
|
||||||
|
int size;
|
||||||
|
Map<Integer, Object> parameters = new HashMap<>();
|
||||||
|
|
||||||
|
//Prepare Status Query Parameters
|
||||||
|
for(Status status : Status.values()) {
|
||||||
|
size = parameters.size();
|
||||||
|
parameters.put(size + 1, status.getID());
|
||||||
|
parameters.put(size + 2, status.getName());
|
||||||
|
parameters.put(size + 3, status.getHexColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
//Execute Status Query
|
||||||
|
db.executeAsync(
|
||||||
|
"INSERT IGNORE INTO states(id, name, color) VALUES "+ Strings.repeat("(?,?,?),", Status.values().length - 1)+"(?,?,?)",
|
||||||
|
new HashMap<>(parameters)
|
||||||
|
);
|
||||||
|
|
||||||
|
//Prepare Region Query Parameters
|
||||||
|
parameters.clear();
|
||||||
|
for(Region region : service.getRegions().values()) {
|
||||||
|
size = parameters.size();
|
||||||
|
parameters.put(size + 1, region.getID());
|
||||||
|
parameters.put(size + 2, region.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(parameters.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Execute Region Query
|
||||||
|
db.executeAsync(
|
||||||
|
"INSERT IGNORE INTO regions(id, name) VALUES "+ Strings.repeat("(?,?),", service.getRegions().values().size() - 1)+"(?,?)",
|
||||||
|
new HashMap<>(parameters)
|
||||||
|
);
|
||||||
|
|
||||||
|
//Prepare Attraction Query Parameters
|
||||||
|
parameters.clear();
|
||||||
|
for(Attraction attraction : service.getAttractions().values()) {
|
||||||
|
size = parameters.size();
|
||||||
|
parameters.put(size + 1, attraction.getID());
|
||||||
|
parameters.put(size + 2, attraction.getRegionID());
|
||||||
|
parameters.put(size + 3, attraction.getName());
|
||||||
|
parameters.put(size + 4, attraction.getCover());
|
||||||
|
parameters.put(size + 5, attraction.getStatus().getID());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(parameters.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Execute Region Query
|
||||||
|
db.executeAsync(
|
||||||
|
"INSERT IGNORE INTO attractions(id, region_id, name, cover, status_id) VALUES "+ Strings.repeat("(?,?,?,?,?),", service.getAttractions().values().size() - 1)+"(?,?,?,?,?)",
|
||||||
|
parameters
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
35
src/main/java/nl/iobyte/themepark/api/menu/MenuService.java
Normal file
35
src/main/java/nl/iobyte/themepark/api/menu/MenuService.java
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.api.menu;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.MainMenu;
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.StatusMenu;
|
||||||
|
|
||||||
|
public class MenuService {
|
||||||
|
|
||||||
|
private final MainMenu mainMenu = new MainMenu();
|
||||||
|
private final StatusMenu statusMenu = new StatusMenu();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load all menu's
|
||||||
|
*/
|
||||||
|
public void init() {
|
||||||
|
mainMenu.load();
|
||||||
|
statusMenu.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get main menu
|
||||||
|
* @return MainMenu
|
||||||
|
*/
|
||||||
|
public MainMenu getMainMenu() {
|
||||||
|
return mainMenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get status menu
|
||||||
|
* @return StatusMenu
|
||||||
|
*/
|
||||||
|
public StatusMenu getStatusMenu() {
|
||||||
|
return statusMenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
129
src/main/java/nl/iobyte/themepark/api/menu/objects/MainMenu.java
Normal file
129
src/main/java/nl/iobyte/themepark/api/menu/objects/MainMenu.java
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
package nl.iobyte.themepark.api.menu.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.MenuAPI;
|
||||||
|
import nl.iobyte.menuapi.action.HandlerAction;
|
||||||
|
import nl.iobyte.menuapi.basic.Menu;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IActionHandler;
|
||||||
|
import nl.iobyte.menuapi.item.ItemBuilder;
|
||||||
|
import nl.iobyte.menuapi.item.MenuItem;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.config.ConfigurationManager;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageKey;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageLocation;
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.handlers.CommandMenuHandler;
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.handlers.JsonMessageMenuHandler;
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.handlers.PlainMessageMenuHandler;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class MainMenu {
|
||||||
|
|
||||||
|
private Menu menu;
|
||||||
|
|
||||||
|
public void load() {
|
||||||
|
ConfigurationManager manager = ThemePark.getInstance().getAPI().getConfigurationManager();
|
||||||
|
|
||||||
|
//Prepare Menu
|
||||||
|
menu = new Menu(manager.getString(StorageKey.MENU_TITLE_MAIN), manager.getInt(StorageKey.MENU_SIZE_MAIN));
|
||||||
|
|
||||||
|
//Load Items
|
||||||
|
loadItems(manager);
|
||||||
|
|
||||||
|
//Build Menu
|
||||||
|
menu.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadItems(ConfigurationManager manager) {
|
||||||
|
//See if any items exist
|
||||||
|
if(!manager.contains(StorageLocation.MENU, "items"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ConfigurationSection section = manager.getSection(StorageLocation.MENU, "items");
|
||||||
|
if(section.getKeys(false).isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Load items
|
||||||
|
String path;
|
||||||
|
ItemBuilder builder;
|
||||||
|
MenuItem item;
|
||||||
|
IActionHandler handler;
|
||||||
|
for(String id : section.getKeys(false)) {
|
||||||
|
path = "items."+id;
|
||||||
|
|
||||||
|
int slot = manager.getInt(StorageLocation.MENU, path+".slot");
|
||||||
|
if(slot < 0 || slot >= menu.getSize())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
String name = manager.getString(StorageLocation.MENU, path+".name");
|
||||||
|
if(name == null || name.equals(""))
|
||||||
|
name = " ";
|
||||||
|
|
||||||
|
Material material = Material.getMaterial(manager.getString(StorageLocation.MENU, path+".material"));
|
||||||
|
if(material == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int amount = manager.getInt(StorageLocation.MENU, path+".amount");
|
||||||
|
if(amount < 1)
|
||||||
|
amount = 1;
|
||||||
|
|
||||||
|
short data = Short.parseShort(manager.getString(StorageLocation.MENU, path+".data"));
|
||||||
|
if(data < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
builder = new ItemBuilder(material, amount, data);
|
||||||
|
builder.setName(name);
|
||||||
|
|
||||||
|
String lore = manager.getString(StorageLocation.MENU, path+".lore");
|
||||||
|
if(lore == null || lore.equals("")) {
|
||||||
|
builder.setLore(manager.getStringList(StorageLocation.MENU, path+".lore"));
|
||||||
|
} else {
|
||||||
|
builder.setLore(lore);
|
||||||
|
}
|
||||||
|
|
||||||
|
item = new MenuItem(
|
||||||
|
builder.getItem(),
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
handler = getHandler(manager, path);
|
||||||
|
if(handler != null) {
|
||||||
|
item.addActions(handler);
|
||||||
|
} else {
|
||||||
|
item.addActions(new HandlerAction(
|
||||||
|
manager.getString(StorageLocation.MENU, path+".action")
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.setItem(
|
||||||
|
slot,
|
||||||
|
item
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IActionHandler getHandler(ConfigurationManager manager, String path) {
|
||||||
|
String action = manager.getString(StorageLocation.MENU, path+".action");
|
||||||
|
if(action == null || action.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if(MenuAPI.hasActionHandler(action))
|
||||||
|
return MenuAPI.getActionHandler(action);
|
||||||
|
|
||||||
|
switch (action.toUpperCase()) {
|
||||||
|
case "COMMAND":
|
||||||
|
return new CommandMenuHandler(manager.getString(StorageLocation.MENU, path+".command"));
|
||||||
|
case "JSON_MESSAGE":
|
||||||
|
return new JsonMessageMenuHandler(manager.getString(StorageLocation.MENU, path+".message"));
|
||||||
|
case "PLAIN_MESSAGE":
|
||||||
|
return new PlainMessageMenuHandler(manager.getString(StorageLocation.MENU, path+".message"));
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void open(Player player) {
|
||||||
|
menu.open(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,276 @@
|
||||||
|
package nl.iobyte.themepark.api.menu.objects;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import nl.iobyte.menuapi.enums.Types;
|
||||||
|
import nl.iobyte.menuapi.item.ItemBuilder;
|
||||||
|
import nl.iobyte.menuapi.item.MenuItem;
|
||||||
|
import nl.iobyte.menuapi.multi.MenuPage;
|
||||||
|
import nl.iobyte.menuapi.multi.MultiMenu;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.ThemeParkAPI;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageKey;
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.actions.PageAction;
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.actions.TPAction;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StatusMenu {
|
||||||
|
|
||||||
|
private MultiMenu menu;
|
||||||
|
private final HashMap<String, List<Integer>> region_index = new HashMap<>();
|
||||||
|
private final HashMap<String, Integer> attraction_index = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the menu
|
||||||
|
*/
|
||||||
|
public void load() {
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
region_index.clear();
|
||||||
|
attraction_index.clear();
|
||||||
|
|
||||||
|
//Prepare data
|
||||||
|
LinkedHashMap<Integer, Region> regions = new LinkedHashMap<>();
|
||||||
|
LinkedHashMap<Integer, List<Attraction>> attractions = new LinkedHashMap<>();
|
||||||
|
for(Region region : api.getAttractionService().getRegions().values()) {
|
||||||
|
if(region.getAttractions().isEmpty()) {
|
||||||
|
regions.put(regions.size(), region);
|
||||||
|
attractions.put(attractions.size(), new ArrayList<>());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Iterable<List<Attraction>> iterable = Iterables.partition(region.getAttractions().values(), 8);
|
||||||
|
for(List<Attraction> list : iterable) {
|
||||||
|
regions.put(regions.size(), region);
|
||||||
|
attractions.put(attractions.size(), list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Prepare menu
|
||||||
|
loadMenuPages(api, regions.size());
|
||||||
|
|
||||||
|
//Load menu content
|
||||||
|
loadMenuContent(regions, attractions);
|
||||||
|
|
||||||
|
//Load next/previous page items
|
||||||
|
loadPageItems();
|
||||||
|
|
||||||
|
//Build Menu
|
||||||
|
menu.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update Region item
|
||||||
|
* @param region Region
|
||||||
|
*/
|
||||||
|
public void updateRegion(Region region) {
|
||||||
|
if(region == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!region_index.containsKey(region.getID()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
List<Integer> indexes = region_index.get(region.getID());
|
||||||
|
if(indexes == null || indexes.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(int slot : indexes) {
|
||||||
|
menu.setItem(slot, getRegion(region));
|
||||||
|
menu.updateItem(slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update Attraction item
|
||||||
|
* @param attraction Attraction
|
||||||
|
*/
|
||||||
|
public void updateAttraction(Attraction attraction) {
|
||||||
|
if(attraction == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!attraction_index.containsKey(attraction.getID()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
int slot = attraction_index.get(attraction.getID());
|
||||||
|
if(slot < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
menu.setItem(slot, getAttraction(attraction));
|
||||||
|
menu.updateItem(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open menu on first page for Player
|
||||||
|
* @param player Player
|
||||||
|
*/
|
||||||
|
public void open(Player player) {
|
||||||
|
open(player, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open menu for Player
|
||||||
|
* @param player Player
|
||||||
|
* @param page Integer
|
||||||
|
*/
|
||||||
|
public void open(Player player, int page) {
|
||||||
|
menu.open(player, page);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize menu and page sizes
|
||||||
|
* @param api ThemeParkAPI
|
||||||
|
* @param regions Integer
|
||||||
|
*/
|
||||||
|
private void loadMenuPages(ThemeParkAPI api, int regions) {
|
||||||
|
ArrayList<Integer> page_sizes = new ArrayList<>();
|
||||||
|
if(regions <= 6) {
|
||||||
|
if(regions == 0)
|
||||||
|
regions = 1;
|
||||||
|
|
||||||
|
page_sizes.add(regions * 9);
|
||||||
|
} else {
|
||||||
|
int pages = regions / 5;
|
||||||
|
for (int i = 0; i < pages; i++)
|
||||||
|
page_sizes.add(54);
|
||||||
|
|
||||||
|
pages = regions % 5;
|
||||||
|
if (pages > 0)
|
||||||
|
page_sizes.add(pages * 9 + 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu = new MultiMenu(api.getConfigurationManager().getString(StorageKey.MENU_TITLE_STATUS), page_sizes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add regions and attractions to menu
|
||||||
|
* @param regions LinkedHashMap<Integer, Region>
|
||||||
|
* @param attractions LinkedHashMap<Integer, List<Attraction>>
|
||||||
|
*/
|
||||||
|
private void loadMenuContent(LinkedHashMap<Integer, Region> regions, LinkedHashMap<Integer, List<Attraction>> attractions) {
|
||||||
|
int region_size = regions.size();
|
||||||
|
for(int i = 0; i < region_size; i++) {
|
||||||
|
Region region = regions.get(i);
|
||||||
|
if(region == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int j = 1;
|
||||||
|
int start_index = i * 9;
|
||||||
|
if(region_size > 6)
|
||||||
|
start_index += (i / 5) * 9;
|
||||||
|
|
||||||
|
//Add item index to map
|
||||||
|
List<Integer> indexes = region_index.computeIfAbsent(region.getID(), s -> new ArrayList<>());
|
||||||
|
indexes.add(start_index);
|
||||||
|
region_index.put(region.getID(), indexes);
|
||||||
|
|
||||||
|
//Add item to menu
|
||||||
|
menu.setItem(start_index, new MenuItem(getRegion(region), true));
|
||||||
|
|
||||||
|
List<Attraction> list = attractions.get(i);
|
||||||
|
if(list == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Add attractions to menu
|
||||||
|
for(Attraction attraction : list) {
|
||||||
|
MenuItem item = new MenuItem(getAttraction(attraction), true);
|
||||||
|
item.addActions(Types.NORMAL.getTypesList(), new TPAction(attraction));
|
||||||
|
|
||||||
|
int slot = start_index + j;
|
||||||
|
attraction_index.put(attraction.getID(), slot);
|
||||||
|
menu.setItem(slot, item);
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load next/previous page items
|
||||||
|
*/
|
||||||
|
private void loadPageItems() {
|
||||||
|
int page_size = menu.getPageSizes().size();
|
||||||
|
for (int i = 0; i < page_size; i++) {
|
||||||
|
MenuPage page = menu.getPage(i + 1);
|
||||||
|
int size = page.getSize();
|
||||||
|
if (i > 0)
|
||||||
|
page.setItem(size - 6, getPrevious(i));
|
||||||
|
|
||||||
|
if (i < (page_size - 1))
|
||||||
|
page.setItem(size - 4, getNext(i));
|
||||||
|
|
||||||
|
if(page_size > 1) {
|
||||||
|
ItemBuilder builder = new ItemBuilder(Material.MINECART);
|
||||||
|
builder.setName("&6Page: &f" + (i + 1));
|
||||||
|
page.setItem(size - 5, new MenuItem(builder.getItem(), true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ItemStack of Region
|
||||||
|
* @param region Region
|
||||||
|
* @return ItemStack
|
||||||
|
*/
|
||||||
|
private static ItemStack getRegion(Region region) {
|
||||||
|
ItemBuilder builder = new ItemBuilder(Material.NAME_TAG);
|
||||||
|
builder.setName(region.getName());
|
||||||
|
|
||||||
|
return builder.getItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ItemStack of Attraction
|
||||||
|
* @param attraction Attraction
|
||||||
|
* @return ItemStack
|
||||||
|
*/
|
||||||
|
private static ItemStack getAttraction(Attraction attraction) {
|
||||||
|
ItemBuilder builder = new ItemBuilder(attraction.getStatus().getItem());
|
||||||
|
builder.setName(attraction.getName())
|
||||||
|
.setLore(attraction.getStatus().getColor() + attraction.getStatus().getName());
|
||||||
|
|
||||||
|
return builder.getItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get next page MenuItem
|
||||||
|
* @param page Integer
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
private MenuItem getNext(int page) {
|
||||||
|
return getPage("&6&LNext \u23F5", page + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get previous page MenuItem
|
||||||
|
* @param page Integer
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
private MenuItem getPrevious(int page) {
|
||||||
|
return getPage("&6&L\u23F4 Previous", page - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get next/previous page MenuItem
|
||||||
|
* @param text String
|
||||||
|
* @param page Integer
|
||||||
|
* @return MenuItem
|
||||||
|
*/
|
||||||
|
private MenuItem getPage(String text, int page) {
|
||||||
|
ItemBuilder builder = new ItemBuilder(Material.ARROW);
|
||||||
|
builder.setName(text);
|
||||||
|
|
||||||
|
MenuItem item = new MenuItem(builder.getItem(), true);
|
||||||
|
item.addActions(new PageAction(
|
||||||
|
menu,
|
||||||
|
page + 1
|
||||||
|
));
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package nl.iobyte.themepark.api.menu.objects.actions;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.action.MenuAction;
|
||||||
|
import nl.iobyte.menuapi.multi.MultiMenu;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class PageAction extends MenuAction {
|
||||||
|
|
||||||
|
private final MultiMenu menu;
|
||||||
|
private final int page;
|
||||||
|
|
||||||
|
public PageAction(MultiMenu menu, int page) {
|
||||||
|
this.menu = menu;
|
||||||
|
this.page = page;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Player player) {
|
||||||
|
menu.open(player, page);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package nl.iobyte.themepark.api.menu.objects.actions;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.action.MenuAction;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class TPAction extends MenuAction {
|
||||||
|
|
||||||
|
private final Attraction attraction;
|
||||||
|
|
||||||
|
public TPAction(Attraction attraction) {
|
||||||
|
this.attraction = attraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Player player) {
|
||||||
|
Bukkit.dispatchCommand(player, "pp attraction warp "+attraction.getID());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package nl.iobyte.themepark.api.menu.objects.handlers;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.enums.Types;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IActionHandler;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CommandMenuHandler implements IActionHandler {
|
||||||
|
|
||||||
|
private final String command;
|
||||||
|
|
||||||
|
public CommandMenuHandler(String command) {
|
||||||
|
if(command.startsWith("/"))
|
||||||
|
command = command.replaceFirst("/", "");
|
||||||
|
|
||||||
|
this.command = command;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getID() {
|
||||||
|
return "COMMAND";
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ClickType> getClickTypes() {
|
||||||
|
return Types.NORMAL.getTypesList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Player player) {
|
||||||
|
player.closeInventory();
|
||||||
|
Bukkit.dispatchCommand(player, command);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package nl.iobyte.themepark.api.menu.objects.handlers;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.enums.Types;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IActionHandler;
|
||||||
|
import nl.iobyte.themepark.utils.PlaceHolder;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class JsonMessageMenuHandler implements IActionHandler {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
public JsonMessageMenuHandler(String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getID() {
|
||||||
|
return "JSON_MESSAGE";
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ClickType> getClickTypes() {
|
||||||
|
return Types.NORMAL.getTypesList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Player player) {
|
||||||
|
player.closeInventory();
|
||||||
|
Bukkit.dispatchCommand(
|
||||||
|
Bukkit.getConsoleSender(),
|
||||||
|
"tellraw "+player.getName()+" "+PlaceHolder.setPlaceHolders(
|
||||||
|
player,
|
||||||
|
message
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.api.menu.objects.handlers;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.enums.Types;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IActionHandler;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.utils.PlaceHolder;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class PlainMessageMenuHandler implements IActionHandler {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
public PlainMessageMenuHandler(String message) {
|
||||||
|
this.message = Text.color(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getID() {
|
||||||
|
return "PLAIN_MESSAGE";
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ClickType> getClickTypes() {
|
||||||
|
return Types.NORMAL.getTypesList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Player player) {
|
||||||
|
player.closeInventory();
|
||||||
|
player.sendMessage(PlaceHolder.setPlaceHolders(
|
||||||
|
player,
|
||||||
|
message
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package nl.iobyte.themepark.api.menu.objects.handlers;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.enums.Types;
|
||||||
|
import nl.iobyte.menuapi.interfaces.IActionHandler;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StatusMenuHandler implements IActionHandler {
|
||||||
|
|
||||||
|
public String getID() {
|
||||||
|
return "STATUS_MENU";
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ClickType> getClickTypes() {
|
||||||
|
return Types.NORMAL.getTypesList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute(Player player) {
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getStatusMenu().open(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package nl.iobyte.themepark.api.message;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageLocation;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public enum MessageKey {
|
||||||
|
|
||||||
|
//Prefix
|
||||||
|
PREFIX("prefix"),
|
||||||
|
|
||||||
|
//Session
|
||||||
|
CLIENT_UNABLE_TO_CONNECT("client.connect.unable"),
|
||||||
|
CLIENT_GENERATE_TO_CONNECT("client.connect.generate"),
|
||||||
|
CLIENT_CLICK_TO_CONNECT("client.connect.click"),
|
||||||
|
CLIENT_HOVER_TO_CONNECT("client.connect.hover"),
|
||||||
|
|
||||||
|
//Connection
|
||||||
|
CLIENT_CONNECTION_EXISTS("client.connection.exists"),
|
||||||
|
CLIENT_CONNECTION_OPEN("client.connection.open"),
|
||||||
|
CLIENT_CONNECTION_CLOSED("client.connection.closed"),
|
||||||
|
|
||||||
|
//Ridecount
|
||||||
|
RIDECOUNT_ADD("ridecount.add"),
|
||||||
|
|
||||||
|
//Attraction Teleport
|
||||||
|
ATTRACTION_TELEPORT_STATUS("attraction.teleport.status"),
|
||||||
|
ATTRACTION_TELEPORT_SUCCESS("attraction.teleport.success");
|
||||||
|
|
||||||
|
private final String path;
|
||||||
|
MessageKey(String path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get path to message
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get and color message from config
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getMessage() {
|
||||||
|
String msg = Text.color(ThemePark.getInstance().getAPI().getConfigurationManager().getString(StorageLocation.MESSAGE, path));
|
||||||
|
if(this != MessageKey.PREFIX)
|
||||||
|
msg = msg.replace("{prefix}", MessageKey.PREFIX.getMessage());
|
||||||
|
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send message with color to Player
|
||||||
|
* @param player Player
|
||||||
|
*/
|
||||||
|
public void send(Player player) {
|
||||||
|
player.sendMessage(getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
25
src/main/java/nl/iobyte/themepark/api/message/Text.java
Normal file
25
src/main/java/nl/iobyte/themepark/api/message/Text.java
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
package nl.iobyte.themepark.api.message;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
|
||||||
|
public class Text {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Color text
|
||||||
|
* @param str String
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public static String color(String str) {
|
||||||
|
return ChatColor.translateAlternateColorCodes('&', str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strip text of color
|
||||||
|
* @param str String
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public static String strip(String str) {
|
||||||
|
return ChatColor.stripColor(color(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,110 @@
|
||||||
|
package nl.iobyte.themepark.api.ridecount;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.ridecount.objects.AttractionCount;
|
||||||
|
import nl.iobyte.themepark.api.ridecount.objects.RideCount;
|
||||||
|
import nl.iobyte.themepark.api.ridecount.objects.TopData;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class RideCountService {
|
||||||
|
|
||||||
|
private final Map<String, AttractionCount> counts = new ConcurrentHashMap<>();
|
||||||
|
private final TopData topData = new TopData();
|
||||||
|
private boolean changed = false;
|
||||||
|
|
||||||
|
public AttractionCount getCount(String id) {
|
||||||
|
if(id == null || id.isEmpty())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if(!ThemePark.getInstance().getAPI().getAttractionService().hasAttraction(id))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return counts.computeIfAbsent(id, k -> new AttractionCount(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCount(String id, UUID uuid, int amount, int total_amount) {
|
||||||
|
if(amount == 0 || total_amount == 0 || id == null || id.isEmpty() || uuid == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
AttractionCount count = getCount(id);
|
||||||
|
if(count == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
count.setCount(uuid, amount, total_amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RideCount getCount(String id, UUID uuid) {
|
||||||
|
if(id == null || id.isEmpty() || uuid == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
AttractionCount count = getCount(id);
|
||||||
|
if(count == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return count.getCount(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCount(String id, UUID uuid, int amount) {
|
||||||
|
if(amount == 0 || id == null || id.isEmpty() || uuid == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
AttractionCount count = getCount(id);
|
||||||
|
if(count == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
count.addCount(uuid, amount);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearCount(UUID uuid) {
|
||||||
|
if(uuid == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(AttractionCount attractionCount : counts.values())
|
||||||
|
attractionCount.removeCount(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasChanged() {
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<RideCount> getChanges(long timestamp) {
|
||||||
|
List<RideCount> list = new ArrayList<>();
|
||||||
|
for(AttractionCount attractionCount : counts.values())
|
||||||
|
for(Map<Integer, Map<UUID, RideCount>> m1 : attractionCount.getCounts().values())
|
||||||
|
for(Map<UUID, RideCount> m2 : m1.values())
|
||||||
|
for(RideCount count : m2.values())
|
||||||
|
if(count.getUpdatedAt() != -1 && count.getUpdatedAt() > timestamp)
|
||||||
|
list.add(count);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearNonApplicable() {
|
||||||
|
changed = false;
|
||||||
|
Calendar calendar = new GregorianCalendar();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
|
||||||
|
int year = calendar.get(Calendar.YEAR);
|
||||||
|
int day = calendar.get(Calendar.DAY_OF_YEAR);
|
||||||
|
for(AttractionCount attractionCount : counts.values()) {
|
||||||
|
attractionCount.removeOld(
|
||||||
|
year,
|
||||||
|
day
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<UUID, RideCount> map = attractionCount.getCounts(year, day);
|
||||||
|
if(map == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
map.entrySet().removeIf(e -> Bukkit.getPlayer(e.getValue().getUUID()) == null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TopData getTopData() {
|
||||||
|
return topData;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,151 @@
|
||||||
|
package nl.iobyte.themepark.api.ridecount.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.event.ridecount.RideCountAddEvent;
|
||||||
|
import nl.iobyte.themepark.scheduler.ThemeParkScheduler;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class AttractionCount {
|
||||||
|
|
||||||
|
private final String attraction_id;
|
||||||
|
private final Map<Integer, Map<Integer, Map<UUID, RideCount>>> counts = new ConcurrentHashMap<>();
|
||||||
|
private int current_year, current_month, current_week, current_day;
|
||||||
|
private long next_day;
|
||||||
|
|
||||||
|
public AttractionCount(String attraction_id) {
|
||||||
|
this.attraction_id = attraction_id;
|
||||||
|
updateTimes();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAttractionID() {
|
||||||
|
return attraction_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<Integer, Map<Integer, Map<UUID, RideCount>>> getCounts() {
|
||||||
|
return counts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<Integer, Map<UUID, RideCount>> getCounts(int year) {
|
||||||
|
return counts.get(year);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<UUID, RideCount> getCounts(int year, int day) {
|
||||||
|
Map<Integer, Map<UUID, RideCount>> map = getCounts(year);
|
||||||
|
if(map == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return map.get(day);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove() {
|
||||||
|
counts.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeOld(int year, int day) {
|
||||||
|
counts.entrySet().removeIf(e -> e.getKey() != year);
|
||||||
|
counts.values().forEach(m -> m.entrySet().removeIf(e -> e.getKey() != day));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<UUID, RideCount> get(int year, int day) {
|
||||||
|
Map<Integer, Map<UUID, RideCount>> ym = counts.computeIfAbsent(year, k -> new ConcurrentHashMap<>());
|
||||||
|
return ym.computeIfAbsent(day, k -> new ConcurrentHashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCount(UUID uuid, int amount, int total_amount) {
|
||||||
|
if(next_day <= System.currentTimeMillis())
|
||||||
|
updateTimes();
|
||||||
|
|
||||||
|
Map<UUID, RideCount> counts = get(current_year, current_day);
|
||||||
|
counts.computeIfAbsent(uuid, k -> new RideCount(
|
||||||
|
uuid,
|
||||||
|
attraction_id,
|
||||||
|
amount,
|
||||||
|
total_amount,
|
||||||
|
current_year,
|
||||||
|
current_month,
|
||||||
|
current_week,
|
||||||
|
current_day
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public RideCount getCount(UUID uuid) {
|
||||||
|
if(next_day <= System.currentTimeMillis())
|
||||||
|
updateTimes();
|
||||||
|
|
||||||
|
Map<UUID, RideCount> counts = get(current_year, current_day);
|
||||||
|
return counts.get(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCount(UUID uuid, int amount) {
|
||||||
|
if(next_day <= System.currentTimeMillis())
|
||||||
|
updateTimes();
|
||||||
|
|
||||||
|
ThemeParkScheduler.runAsync(() -> {
|
||||||
|
Map<UUID, RideCount> counts = get(current_year, current_day);
|
||||||
|
RideCount rc = counts.computeIfAbsent(uuid, k -> {
|
||||||
|
ArrayList<Map<String, Object>> result = ThemePark.getInstance().getAPI().getDatabaseService().executeQuery(
|
||||||
|
"local",
|
||||||
|
"SELECT sum(count) AS total_count FROM counts WHERE uuid=? AND attraction_id=? AND year=? AND month=? GROUP BY uuid",
|
||||||
|
new HashMap<Integer, Object>(){{
|
||||||
|
put(1, uuid);
|
||||||
|
put(2, attraction_id);
|
||||||
|
put(3, current_year);
|
||||||
|
put(4, current_month);
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
|
||||||
|
int total_amount = 0;
|
||||||
|
if(result != null)
|
||||||
|
for(Map<String, Object> row : result)
|
||||||
|
total_amount = (int) row.get("total_count");
|
||||||
|
|
||||||
|
return new RideCount(
|
||||||
|
uuid,
|
||||||
|
attraction_id,
|
||||||
|
0,
|
||||||
|
total_amount,
|
||||||
|
current_year,
|
||||||
|
current_month,
|
||||||
|
current_week,
|
||||||
|
current_day
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
//Event Parameters
|
||||||
|
int old = rc.getCount();
|
||||||
|
int current = old + amount;
|
||||||
|
|
||||||
|
//Add amount -> execute event
|
||||||
|
rc.addCount(amount);
|
||||||
|
ThemePark.getInstance().getAPI().getEventDispatcher().call(new RideCountAddEvent(
|
||||||
|
rc,
|
||||||
|
old,
|
||||||
|
current
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeCount(UUID uuid) {
|
||||||
|
for(Map<Integer, Map<UUID, RideCount>> m1 : counts.values())
|
||||||
|
for(Map<UUID, RideCount> m2 : m1.values())
|
||||||
|
m2.entrySet().removeIf(e -> e.getKey() == uuid && e.getValue().getUpdatedAt() == -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateTimes() {
|
||||||
|
Calendar calendar = new GregorianCalendar();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.set(Calendar.HOUR, 0);
|
||||||
|
calendar.set(Calendar.MINUTE, 0);
|
||||||
|
calendar.set(Calendar.SECOND, 0);
|
||||||
|
calendar.set(Calendar.MILLISECOND, 0);
|
||||||
|
|
||||||
|
current_year = calendar.get(Calendar.YEAR);
|
||||||
|
current_month = calendar.get(Calendar.MONTH) + 1;
|
||||||
|
current_week = calendar.get(Calendar.WEEK_OF_YEAR);
|
||||||
|
current_day = calendar.get(Calendar.DAY_OF_YEAR);
|
||||||
|
next_day = calendar.getTimeInMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
package nl.iobyte.themepark.api.ridecount.objects;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class RideCount {
|
||||||
|
|
||||||
|
private final UUID uuid;
|
||||||
|
private final String attraction_id;
|
||||||
|
private final int year, month, week, day;
|
||||||
|
private int count, total_count;
|
||||||
|
private long updated_at;
|
||||||
|
|
||||||
|
public RideCount(UUID uuid, String attraction_id, int count, int total_count, int year, int month, int week, int day) {
|
||||||
|
this(
|
||||||
|
uuid,
|
||||||
|
attraction_id,
|
||||||
|
count,
|
||||||
|
total_count,
|
||||||
|
year,
|
||||||
|
month,
|
||||||
|
week,
|
||||||
|
day,
|
||||||
|
-1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RideCount(UUID uuid, String attraction_id, int count, int total_count, int year, int month, int week, int day, long updated_at) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
this.attraction_id = attraction_id;
|
||||||
|
this.count = count;
|
||||||
|
this.total_count = total_count;
|
||||||
|
this.year = year;
|
||||||
|
this.month = month;
|
||||||
|
this.week = week;
|
||||||
|
this.day = day;
|
||||||
|
this.updated_at = updated_at;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getUUID() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAttractionID() {
|
||||||
|
return attraction_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getYear() {
|
||||||
|
return year;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMonth() {
|
||||||
|
return month;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWeek() {
|
||||||
|
return week;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDay() {
|
||||||
|
return day;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTotalCount() {
|
||||||
|
return total_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCount(int count) {
|
||||||
|
this.count += count;
|
||||||
|
this.total_count += count;
|
||||||
|
updated_at = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getUpdatedAt() {
|
||||||
|
return updated_at;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
package nl.iobyte.themepark.api.ridecount.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.ThemeParkAPI;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.database.objects.Database;
|
||||||
|
import nl.iobyte.themepark.scheduler.ThemeParkScheduler;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
public class TopData {
|
||||||
|
|
||||||
|
public CompletableFuture<HashMap<UUID, Integer>> getDay(Attraction attraction) {
|
||||||
|
return get(attraction, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<HashMap<UUID, Integer>> getWeek(Attraction attraction) {
|
||||||
|
return get(attraction, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<HashMap<UUID, Integer>> getMonth(Attraction attraction) {
|
||||||
|
return get(attraction, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<HashMap<UUID, Integer>> getYear(Attraction attraction) {
|
||||||
|
return get(attraction, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CompletableFuture<HashMap<UUID, Integer>> get(Attraction attraction, int i) {
|
||||||
|
CompletableFuture<HashMap<UUID, Integer>> fc = new CompletableFuture<>();
|
||||||
|
if(attraction == null) {
|
||||||
|
fc.complete(null);
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
if(!api.getAttractionService().hasAttraction(attraction.getID())) {
|
||||||
|
fc.complete(null);
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Database db = api.getDatabaseService().getDatabase("local");
|
||||||
|
if(db == null) {
|
||||||
|
fc.complete(null);
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeParkScheduler.runAsync(() -> {
|
||||||
|
Calendar calendar = new GregorianCalendar();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
|
||||||
|
HashMap<Integer, Object> map = new HashMap<>();
|
||||||
|
map.put(1, attraction.getID());
|
||||||
|
|
||||||
|
String timeSort;
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
timeSort = "day=? AND year=?";
|
||||||
|
map.put(2, calendar.get(Calendar.DAY_OF_YEAR));
|
||||||
|
map.put(3, calendar.get(Calendar.YEAR));
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
timeSort = "week=? AND year=?";
|
||||||
|
map.put(2, calendar.get(Calendar.WEEK_OF_YEAR));
|
||||||
|
map.put(3, calendar.get(Calendar.YEAR));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
timeSort = "month=? AND year=?";
|
||||||
|
map.put(2, calendar.get(Calendar.MONTH) + 1);
|
||||||
|
map.put(3, calendar.get(Calendar.YEAR));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
timeSort = "year=?";
|
||||||
|
map.put(2, calendar.get(Calendar.YEAR));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<Map<String, Object>> results = db.executeQuery("SELECT uuid, SUM(count) AS count FROM counts WHERE attraction_id=? AND "+timeSort+" GROUP BY uuid ORDER BY count DESC LIMIT 3", map);
|
||||||
|
if(results == null || results.isEmpty()) {
|
||||||
|
fc.complete(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMap<UUID, Integer> top = new HashMap<>();
|
||||||
|
for(Map<String, Object> m : results) {
|
||||||
|
UUID uuid = UUID.fromString((String) m.get("uuid"));
|
||||||
|
int points = (int) m.get("count");
|
||||||
|
if(points < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
top.put(uuid, points);
|
||||||
|
}
|
||||||
|
|
||||||
|
fc.complete(top);
|
||||||
|
});
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<HashMap<UUID, Integer>> getTotal(Attraction attraction) {
|
||||||
|
CompletableFuture<HashMap<UUID, Integer>> fc = new CompletableFuture<>();
|
||||||
|
if(attraction == null) {
|
||||||
|
fc.complete(null);
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
if(!api.getAttractionService().hasAttraction(attraction.getID())) {
|
||||||
|
fc.complete(null);
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Database db = api.getDatabaseService().getDatabase("local");
|
||||||
|
if(db == null) {
|
||||||
|
fc.complete(null);
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeParkScheduler.runAsync(() -> {
|
||||||
|
HashMap<Integer, Object> map = new HashMap<>();
|
||||||
|
map.put(1, attraction.getID());
|
||||||
|
|
||||||
|
ArrayList<Map<String, Object>> results = db.executeQuery("SELECT uuid, SUM(count) AS count FROM counts WHERE attraction_id=? GROUP BY uuid ORDER BY count DESC LIMIT 3", map);
|
||||||
|
if(results == null || results.isEmpty()) {
|
||||||
|
fc.complete(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMap<UUID, Integer> top = new HashMap<>();
|
||||||
|
for(Map<String, Object> m : results) {
|
||||||
|
UUID uuid = UUID.fromString((String) m.get("uuid"));
|
||||||
|
int points = (int) m.get("count");
|
||||||
|
if(points < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
top.put(uuid, points);
|
||||||
|
}
|
||||||
|
|
||||||
|
fc.complete(top);
|
||||||
|
});
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
119
src/main/java/nl/iobyte/themepark/api/sign/SignManager.java
Normal file
119
src/main/java/nl/iobyte/themepark/api/sign/SignManager.java
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
package nl.iobyte.themepark.api.sign;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageLocation;
|
||||||
|
import nl.iobyte.themepark.api.sign.objects.StatusSign;
|
||||||
|
import nl.iobyte.themepark.utils.LocationUtil;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class SignManager {
|
||||||
|
|
||||||
|
private final HashMap<Attraction, ArrayList<StatusSign>> signs = new HashMap<>();
|
||||||
|
|
||||||
|
public HashMap<Attraction, ArrayList<StatusSign>> getSigns() {
|
||||||
|
return signs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSign(StatusSign sign) {
|
||||||
|
if(sign == null || sign.getLocation() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!(sign.getLocation().getBlock().getState() instanceof Sign))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(signs.containsKey(sign.getAttraction())) {
|
||||||
|
signs.get(sign.getAttraction()).add(sign);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<StatusSign> array = new ArrayList<>();
|
||||||
|
array.add(sign);
|
||||||
|
signs.put(sign.getAttraction(), array);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasSigns(Attraction attraction) {
|
||||||
|
if(attraction == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return signs.containsKey(attraction) && (signs.get(attraction).size() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSign(Attraction attraction, Location location) {
|
||||||
|
if(attraction == null || location == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ArrayList<StatusSign> array = signs.get(attraction);
|
||||||
|
if(array == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
String loc = LocationUtil.toString(location);
|
||||||
|
|
||||||
|
for(StatusSign sign : array) {
|
||||||
|
String str = LocationUtil.toString(sign.getLocation());
|
||||||
|
if(loc.equals(str))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(Attraction attraction) {
|
||||||
|
if(attraction == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!hasSigns(attraction))
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(StatusSign sign : signs.get(attraction))
|
||||||
|
sign.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(Attraction attraction) {
|
||||||
|
if(attraction == null || !signs.containsKey(attraction))
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(StatusSign sign : signs.get(attraction))
|
||||||
|
sign.getLocation().getBlock().setType(Material.AIR);
|
||||||
|
|
||||||
|
signs.remove(attraction);
|
||||||
|
ThemePark.getInstance().getAPI().getConfigurationManager().set(StorageLocation.SIGN_DATA, "signs."+attraction.getID(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeSign(StatusSign sign) {
|
||||||
|
if(sign == null || sign.getLocation() == null || sign.getAttraction() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!hasSigns(sign.getAttraction()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Location loc1 = sign.getLocation();
|
||||||
|
String str1 = LocationUtil.toString(loc1);
|
||||||
|
ArrayList<StatusSign> array = signs.get(sign.getAttraction());
|
||||||
|
for(StatusSign s : new ArrayList<>(array)) {
|
||||||
|
Location loc2 = s.getLocation();
|
||||||
|
if(loc1 == null || loc2 == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
String str2 = LocationUtil.toString(loc2);
|
||||||
|
|
||||||
|
if(!str1.equals(str2))
|
||||||
|
return;
|
||||||
|
|
||||||
|
array.remove(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(array.isEmpty()) {
|
||||||
|
signs.remove(sign.getAttraction());
|
||||||
|
ThemePark.getInstance().getAPI().getConfigurationManager().set(StorageLocation.SIGN_DATA, "signs."+sign.getAttraction().getID(), null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
signs.put(sign.getAttraction(), array);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package nl.iobyte.themepark.api.sign.objects;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
|
||||||
|
public class StatusSign {
|
||||||
|
|
||||||
|
private final Attraction attraction;
|
||||||
|
private final Location location;
|
||||||
|
|
||||||
|
public StatusSign(Attraction attraction, Location location) {
|
||||||
|
this.attraction = attraction;
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Attraction getAttraction() {
|
||||||
|
return attraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
Status status = attraction.getStatus();
|
||||||
|
if(!location.getChunk().isLoaded())
|
||||||
|
location.getChunk().load();
|
||||||
|
|
||||||
|
if(!(location.getBlock().getState() instanceof Sign)) {
|
||||||
|
ThemePark.getInstance().getAPI().getSignManager().removeSign(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sign sign = (Sign) location.getBlock().getState();
|
||||||
|
sign.setLine(1, Text.color(attraction.getName()));
|
||||||
|
sign.setLine(2, Text.color(status.getColor()+status.getName()));
|
||||||
|
sign.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package nl.iobyte.themepark.commands;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.CommandFactory;
|
||||||
|
import nl.iobyte.commandapi.middlewares.PermissionMiddleware;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.commands.subcommands.HelpCommand;
|
||||||
|
import nl.iobyte.themepark.commands.subcommands.ItemCommand;
|
||||||
|
import nl.iobyte.themepark.commands.subcommands.MenuCommand;
|
||||||
|
import nl.iobyte.themepark.commands.subcommands.attraction.AttractionCommands;
|
||||||
|
import nl.iobyte.themepark.commands.subcommands.region.RegionCommands;
|
||||||
|
import nl.iobyte.themepark.commands.subcommands.ridecount.RideCountCommands;
|
||||||
|
import nl.iobyte.themepark.commands.subcommands.status.StatusCommands;
|
||||||
|
|
||||||
|
public class ThemeParkCommand {
|
||||||
|
|
||||||
|
//Load command data
|
||||||
|
public ThemeParkCommand() {
|
||||||
|
CommandFactory factory = new CommandFactory("themepark");
|
||||||
|
factory.addSubCommand(new HelpCommand(factory))
|
||||||
|
.addSubCommand(new MenuCommand());
|
||||||
|
|
||||||
|
//Admin
|
||||||
|
factory.addSubCommand(new ItemCommand());
|
||||||
|
|
||||||
|
//Region
|
||||||
|
RegionCommands.load(factory);
|
||||||
|
|
||||||
|
//Attraction
|
||||||
|
AttractionCommands.load(factory);
|
||||||
|
|
||||||
|
//Status
|
||||||
|
StatusCommands.load(factory);
|
||||||
|
|
||||||
|
//RideCount
|
||||||
|
RideCountCommands.load(factory);
|
||||||
|
|
||||||
|
//Middleware
|
||||||
|
factory.addMiddleware(new PermissionMiddleware());
|
||||||
|
|
||||||
|
//Register command
|
||||||
|
factory.registerCommand(ThemePark.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package nl.iobyte.themepark.commands.arguments;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.ICommandArgument;
|
||||||
|
import nl.iobyte.commandapi.objects.ArgumentCheck;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionArgument implements ICommandArgument<Attraction> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message to display when giving an error
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getMessage(String[] args) {
|
||||||
|
return "No Attraction found with ID: "+ ChatColor.WHITE+args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if argument is valid Attraction
|
||||||
|
* @param sender CommandSender
|
||||||
|
* @param args Arguments passed by Command
|
||||||
|
* @param previousArguments Previous arguments
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public ArgumentCheck checkArgument(CommandSender sender, String[] args, List<Object> previousArguments) {
|
||||||
|
return new ArgumentCheck(ThemePark.getInstance().getAPI().getAttractionService().hasAttraction(args[0]), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Attraction passed by command
|
||||||
|
* @param sender CommandSender
|
||||||
|
* @param args Arguments passed by Command
|
||||||
|
* @param previousArguments Previous arguments
|
||||||
|
* @return Attraction
|
||||||
|
*/
|
||||||
|
public Attraction getArgument(CommandSender sender, String[] args, List<Object> previousArguments) {
|
||||||
|
return ThemePark.getInstance().getAPI().getAttractionService().getAttraction(args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package nl.iobyte.themepark.commands.arguments;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.ICommandArgument;
|
||||||
|
import nl.iobyte.commandapi.objects.ArgumentCheck;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NoAttractionArgument implements ICommandArgument<String> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message to display when giving an error
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getMessage(String[] args) {
|
||||||
|
return "Attraction with ID: "+ChatColor.WHITE+args[0]+ChatColor.RED+" already exists";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if argument is a not existing Attraction
|
||||||
|
* @param sender CommandSender
|
||||||
|
* @param args Arguments passed by Command
|
||||||
|
* @param previousArguments Previous arguments
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public ArgumentCheck checkArgument(CommandSender sender, String[] args, List<Object> previousArguments) {
|
||||||
|
return new ArgumentCheck(!ThemePark.getInstance().getAPI().getAttractionService().hasAttraction(args[0]), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get String passed by command
|
||||||
|
* @param sender CommandSender
|
||||||
|
* @param args Arguments passed by Command
|
||||||
|
* @param previousArguments Previous arguments
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getArgument(CommandSender sender, String[] args, List<Object> previousArguments) {
|
||||||
|
return args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package nl.iobyte.themepark.commands.arguments;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.ICommandArgument;
|
||||||
|
import nl.iobyte.commandapi.objects.ArgumentCheck;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NoRegionArgument implements ICommandArgument<String> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message to display when giving an error
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getMessage(String[] args) {
|
||||||
|
return "Region with ID: "+ChatColor.WHITE+args[0]+ChatColor.RED+" already exists";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if argument is a not existing Attraction
|
||||||
|
* @param sender CommandSender
|
||||||
|
* @param args Arguments passed by Command
|
||||||
|
* @param previousArguments Previous arguments
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public ArgumentCheck checkArgument(CommandSender sender, String[] args, List<Object> previousArguments) {
|
||||||
|
return new ArgumentCheck(!ThemePark.getInstance().getAPI().getAttractionService().hasRegion(args[0]), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get String passed by command
|
||||||
|
* @param sender CommandSender
|
||||||
|
* @param args Arguments passed by Command
|
||||||
|
* @param previousArguments Previous arguments
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getArgument(CommandSender sender, String[] args, List<Object> previousArguments) {
|
||||||
|
return args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package nl.iobyte.themepark.commands.arguments;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.ICommandArgument;
|
||||||
|
import nl.iobyte.commandapi.objects.ArgumentCheck;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RegionArgument implements ICommandArgument<Region> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message to display when giving an error
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getMessage(String[] args) {
|
||||||
|
return "No Region found with ID: "+ ChatColor.WHITE+args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if argument is valid Region
|
||||||
|
* @param sender CommandSender
|
||||||
|
* @param args Arguments passed by Command
|
||||||
|
* @param previousArguments Previous arguments
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
public ArgumentCheck checkArgument(CommandSender sender, String[] args, List<Object> previousArguments) {
|
||||||
|
return new ArgumentCheck(ThemePark.getInstance().getAPI().getAttractionService().hasRegion(args[0]), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Region passed by command
|
||||||
|
* @param sender CommandSender
|
||||||
|
* @param args Arguments passed by Command
|
||||||
|
* @param previousArguments Previous arguments
|
||||||
|
* @return Region
|
||||||
|
*/
|
||||||
|
public Region getArgument(CommandSender sender, String[] args, List<Object> previousArguments) {
|
||||||
|
return ThemePark.getInstance().getAPI().getAttractionService().getRegion(args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.CommandFactory;
|
||||||
|
import nl.iobyte.commandapi.arguments.number.IntegerArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class HelpCommand extends SubCommand {
|
||||||
|
|
||||||
|
private final CommandFactory factory;
|
||||||
|
|
||||||
|
public HelpCommand(CommandFactory factory) {
|
||||||
|
super(new String[]{"help"});
|
||||||
|
|
||||||
|
this.factory = factory;
|
||||||
|
addSyntax("/themepark help");
|
||||||
|
addSyntax("/themepark help <page>")
|
||||||
|
.addArgument(new IntegerArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Send CommandSender list of commands it has access to
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
List<SubCommand> commands = factory.getApplicableSubCommands(sender);
|
||||||
|
if(commands.size() <= 5) {
|
||||||
|
sendSinglePage(sender, commands);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMultiPage(sender, commands, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendSinglePage(CommandSender sender, List<SubCommand> commands) {
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &6&lThemePark &l&f====<"));
|
||||||
|
for (SubCommand command : commands)
|
||||||
|
sender.sendMessage(Text.color("&f" + command.getApplicableSyntaxList(sender).get(0).getUsage()));
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &6&lThemePark &l&f====<"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendMultiPage(CommandSender sender, List<SubCommand> commands, List<Object> list, int i) {
|
||||||
|
int page = 1;
|
||||||
|
int pages = (int) Math.ceil(((double) commands.size()) / 5);
|
||||||
|
if(i == 1)
|
||||||
|
page = (Integer) list.get(0);
|
||||||
|
|
||||||
|
if(page < 1 || page > pages) {
|
||||||
|
sender.sendMessage(Text.color("&6&lThemePark &f➢ Page &6"+page+" &fdoesn't exist"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
page--;
|
||||||
|
int start = page * 5;
|
||||||
|
int end = page * 5 + 5;
|
||||||
|
if(end > commands.size())
|
||||||
|
end = commands.size();
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &6&lThemePark &f(&6"+(page + 1)+"&f/&6"+pages+"&f) &l&f====<"));
|
||||||
|
for(i = start; i < end; i++)
|
||||||
|
sender.sendMessage(Text.color("&f" + commands.get(i).getApplicableSyntaxList(sender).get(0).getUsage()));
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &6&lThemePark &l&f====<"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.menuapi.item.ItemBuilder;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.config.ConfigurationManager;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageKey;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ItemCommand extends SubCommand {
|
||||||
|
|
||||||
|
public ItemCommand() {
|
||||||
|
super("themepark.admin", "item");
|
||||||
|
|
||||||
|
addSyntax("/themepark item")
|
||||||
|
.setAllowConsole(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPlayerCommand(Player player, List<Object> objects, int i) {
|
||||||
|
ConfigurationManager manager = ThemePark.getInstance().getAPI().getConfigurationManager();
|
||||||
|
|
||||||
|
Material material = Material.getMaterial(manager.getString(StorageKey.MENU_ITEM_MATERIAL));
|
||||||
|
short data = Short.parseShort(manager.getString(StorageKey.MENU_ITEM_DATA));
|
||||||
|
String name = Text.color(manager.getString(StorageKey.MENU_ITEM_NAME));
|
||||||
|
if(material == null || name.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemBuilder builder = new ItemBuilder(material, 1, data);
|
||||||
|
builder.setName(name);
|
||||||
|
|
||||||
|
player.getInventory().addItem(builder.getItem());
|
||||||
|
player.updateInventory();
|
||||||
|
player.sendMessage(Text.color("&6&lThemeParkMC &f➢ Added item to your inventory"));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Give CommandSender overview of Plugin status
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> objects, int i) {}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.StringArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.menu.MenuService;
|
||||||
|
import nl.iobyte.themepark.scheduler.ThemeParkScheduler;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class MenuCommand extends SubCommand {
|
||||||
|
|
||||||
|
public MenuCommand() {
|
||||||
|
super(null, "menu");
|
||||||
|
|
||||||
|
addSyntax("/themepark menu");
|
||||||
|
|
||||||
|
addSyntax("/themepark menu")
|
||||||
|
.addArgument(new StringArgument("status"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPlayerCommand(Player player, List<Object> objects, int i) {
|
||||||
|
MenuService service = ThemePark.getInstance().getAPI().getMenuService();
|
||||||
|
if(i == 0) {
|
||||||
|
ThemeParkScheduler.runSync(() -> service.getMainMenu().open(player));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeParkScheduler.runSync(() -> service.getStatusMenu().open(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> objects, int i) {}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.CommandFactory;
|
||||||
|
|
||||||
|
public class AttractionCommands {
|
||||||
|
|
||||||
|
public static void load(CommandFactory factory) {
|
||||||
|
factory.addSubCommand(new AttractionListCommand())
|
||||||
|
.addSubCommand(new AttractionWarpCommand())
|
||||||
|
.addSubCommand(new AttractionCreateCommand())
|
||||||
|
.addSubCommand(new AttractionRegionCommand())
|
||||||
|
.addSubCommand(new AttractionNameCommand())
|
||||||
|
.addSubCommand(new AttractionCoverCommand())
|
||||||
|
.addSubCommand(new AttractionStatusCommand())
|
||||||
|
.addSubCommand(new AttractionLocationCommand())
|
||||||
|
.addSubCommand(new AttractionRemoveCommand());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.StringArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionCoverCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionCoverCommand() {
|
||||||
|
super("themepark.admin", "attraction", "cover");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction cover <id> <url>")
|
||||||
|
.addArgument(new AttractionArgument())
|
||||||
|
.addArgument(new StringArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
String url = (String) list.get(1);
|
||||||
|
attraction.setCover(url);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the cover of attraction &f"+attraction.getID()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.EnumArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.MessageArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.StringArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.NoAttractionArgument;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.RegionArgument;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionCreateCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionCreateCommand() {
|
||||||
|
super("themepark.admin", "attraction", "create");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction create <id> <region_id> <name>")
|
||||||
|
.addArgument(new NoAttractionArgument())
|
||||||
|
.addArgument(new RegionArgument())
|
||||||
|
.addArgument(new MessageArgument());
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction create <id> <region_id> <name> <status>")
|
||||||
|
.addArgument(new NoAttractionArgument())
|
||||||
|
.addArgument(new RegionArgument())
|
||||||
|
.addArgument(new MessageArgument())
|
||||||
|
.addArgument(new EnumArgument(Status.values()));
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction create <id> <region_id> <name> <status> <url>")
|
||||||
|
.addArgument(new NoAttractionArgument())
|
||||||
|
.addArgument(new RegionArgument())
|
||||||
|
.addArgument(new MessageArgument())
|
||||||
|
.addArgument(new EnumArgument(Status.values()))
|
||||||
|
.addArgument(new StringArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
String id = (String) list.get(0);
|
||||||
|
Region region = (Region) list.get(1);
|
||||||
|
String name = (String) list.get(2);
|
||||||
|
Status status = Status.CONSTRUCTION;
|
||||||
|
if(i != 0)
|
||||||
|
status = (Status) list.get(3);
|
||||||
|
|
||||||
|
String cover = "https://via.placeholder.com/500x500";
|
||||||
|
if(i > 1)
|
||||||
|
cover = (String) list.get('4');
|
||||||
|
|
||||||
|
Location location = null;
|
||||||
|
if(sender instanceof Player)
|
||||||
|
location = ((Player) sender).getLocation();
|
||||||
|
|
||||||
|
ThemePark.getInstance().getAPI().getAttractionService().addAttraction(new Attraction(
|
||||||
|
id,
|
||||||
|
region.getID(),
|
||||||
|
name,
|
||||||
|
cover,
|
||||||
|
status,
|
||||||
|
location
|
||||||
|
));
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully created attraction &f"+id));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import nl.iobyte.commandapi.arguments.number.IntegerArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.RegionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionListCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionListCommand() {
|
||||||
|
super("themepark.admin", "attraction", "list");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction list");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction list <page>")
|
||||||
|
.addArgument(new IntegerArgument());
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction list <region>")
|
||||||
|
.addArgument(new RegionArgument());
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction list <region> <page>")
|
||||||
|
.addArgument(new RegionArgument())
|
||||||
|
.addArgument(new IntegerArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
int page = 1;
|
||||||
|
String title = "&6&lThemePark";
|
||||||
|
Collection<Attraction> attractions;
|
||||||
|
if(i < 2) {
|
||||||
|
if(i == 1)
|
||||||
|
page = (Integer) list.get(0);
|
||||||
|
|
||||||
|
attractions = ThemePark.getInstance().getAPI().getAttractionService().getAttractions().values();
|
||||||
|
} else {
|
||||||
|
if(i == 3)
|
||||||
|
page = (Integer) list.get(1);
|
||||||
|
|
||||||
|
Region region = (Region) list.get(0);
|
||||||
|
title = region.getName();
|
||||||
|
attractions = region.getAttractions().values();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(attractions.size() <= 5) {
|
||||||
|
sendSinglePage(sender, title, attractions);
|
||||||
|
} else {
|
||||||
|
sendMultiPage(sender, page, title, attractions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendSinglePage(CommandSender sender, String title, Collection<Attraction> attractions) {
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &r"+title+" &l&f====<"));
|
||||||
|
if(attractions.isEmpty()) {
|
||||||
|
sender.sendMessage(Text.color("&6No attractions found"));
|
||||||
|
} else {
|
||||||
|
for (Attraction attraction : attractions)
|
||||||
|
sender.sendMessage(Text.color(
|
||||||
|
"&6ID: &f" + attraction.getID()
|
||||||
|
+ " &6Region: &f" + attraction.getRegionID()
|
||||||
|
+ " &6Name: &r" + attraction.getName()
|
||||||
|
+ " &6Status: &r" + attraction.getStatus().getColor() + attraction.getStatus().getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &r"+title+" &l&f====<"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendMultiPage(CommandSender sender, int page, String title, Collection<Attraction> attractions) {
|
||||||
|
int pages = (int) Math.ceil(((double) attractions.size()) / 5);
|
||||||
|
if(page < 1 || page > pages) {
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ Page &6"+page+" &fdoesn't exist"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for(List<Attraction> lr : Iterables.partition(attractions, 5)) {
|
||||||
|
i++;
|
||||||
|
if(i != page)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &r"+title+" &f(&6"+page+"&f/&6"+pages+"&f) &l&f====<"));
|
||||||
|
for(Attraction attraction : lr)
|
||||||
|
sender.sendMessage(Text.color(
|
||||||
|
"&6ID: &f"+attraction.getID()
|
||||||
|
+" &6Region: &f"+attraction.getRegionID()
|
||||||
|
+" &6Name: &r"+attraction.getName()
|
||||||
|
+" &6Status: &r"+attraction.getStatus().getColor()+attraction.getStatus().getName()));
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &r"+title+" &l&f====<"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionLocationCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionLocationCommand() {
|
||||||
|
super("themepark.admin", "attraction", "location");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction location <id>")
|
||||||
|
.addArgument(new AttractionArgument())
|
||||||
|
.setAllowConsole(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
attraction.setLocation(player.getLocation());
|
||||||
|
player.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the location of attraction &f"+attraction.getID()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.MessageArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionNameCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionNameCommand() {
|
||||||
|
super("themepark.admin", "attraction", "name");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction name <id> <name>")
|
||||||
|
.addArgument(new AttractionArgument())
|
||||||
|
.addArgument(new MessageArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
String name = (String) list.get(1);
|
||||||
|
attraction.setName(name);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the name of attraction &f"+attraction.getID()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.RegionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionRegionCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionRegionCommand() {
|
||||||
|
super("themepark.admin", "attraction", "region");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction region <attraction_id> <region_id>")
|
||||||
|
.addArgument(new AttractionArgument())
|
||||||
|
.addArgument(new RegionArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
Region region = (Region) list.get(1);
|
||||||
|
attraction.setRegionID(region.getID());
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the region of attraction &f"+attraction.getID()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionRemoveCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionRemoveCommand() {
|
||||||
|
super("themepark.admin", "attraction", "remove");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction remove <id>")
|
||||||
|
.addArgument(new AttractionArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
ThemePark.getInstance().getAPI().getAttractionService().removeAttraction(attraction.getID());
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully removed attraction &f"+attraction.getID()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.EnumArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionStatusCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionStatusCommand() {
|
||||||
|
super("themepark.admin", "attraction", "status");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction status <id> <status>")
|
||||||
|
.addArgument(new AttractionArgument())
|
||||||
|
.addArgument(new EnumArgument(Status.values()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
Status status = (Status) list.get(1);
|
||||||
|
attraction.setStatus(status);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the status of attraction &f"+attraction.getID()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.attraction;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.MessageKey;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import nl.iobyte.themepark.scheduler.ThemeParkScheduler;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AttractionWarpCommand extends SubCommand {
|
||||||
|
|
||||||
|
public AttractionWarpCommand() {
|
||||||
|
super("themepark.admin", "attraction", "warp");
|
||||||
|
|
||||||
|
addSyntax("/themepark attraction warp <id>")
|
||||||
|
.addArgument(new AttractionArgument())
|
||||||
|
.setAllowConsole(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
if(!attraction.getStatus().canTeleport()) {
|
||||||
|
String message = MessageKey.ATTRACTION_TELEPORT_STATUS.getMessage();
|
||||||
|
message = message.replace("{name}", attraction.getName());
|
||||||
|
message = message.replace("{status}", attraction.getStatus().getColor() + attraction.getStatus().getName());
|
||||||
|
player.sendMessage(Text.color(message));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(attraction.getLocation() == null) {
|
||||||
|
player.sendMessage(Text.color("&6&lThemeParkMC &f➢ &4No location available for this attraction"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeParkScheduler.runSync(() -> {
|
||||||
|
player.teleport(attraction.getLocation());
|
||||||
|
String message = MessageKey.ATTRACTION_TELEPORT_SUCCESS.getMessage();
|
||||||
|
message = message.replace("{name}", attraction.getName());
|
||||||
|
player.sendMessage(Text.color(message));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.region;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.CommandFactory;
|
||||||
|
|
||||||
|
public class RegionCommands {
|
||||||
|
|
||||||
|
public static void load(CommandFactory factory) {
|
||||||
|
factory.addSubCommand(new RegionListCommand())
|
||||||
|
.addSubCommand(new RegionCreateCommand())
|
||||||
|
.addSubCommand(new RegionNameCommand())
|
||||||
|
.addSubCommand(new RegionRemoveCommand());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.region;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.MessageArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.NoRegionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RegionCreateCommand extends SubCommand {
|
||||||
|
|
||||||
|
public RegionCreateCommand() {
|
||||||
|
super("themepark.admin", "region", "create");
|
||||||
|
|
||||||
|
addSyntax("/themepark region create <id> <name>")
|
||||||
|
.addArgument(new NoRegionArgument())
|
||||||
|
.addArgument(new MessageArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
String id = (String) list.get(0);
|
||||||
|
String name = (String) list.get(1);
|
||||||
|
|
||||||
|
ThemePark.getInstance().getAPI().getAttractionService().addRegion(new Region(
|
||||||
|
id,
|
||||||
|
name
|
||||||
|
));
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully created region &f"+id));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.region;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import nl.iobyte.commandapi.arguments.number.IntegerArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RegionListCommand extends SubCommand {
|
||||||
|
|
||||||
|
public RegionListCommand() {
|
||||||
|
super("themepark.admin", "region", "list");
|
||||||
|
|
||||||
|
addSyntax("/themepark region list");
|
||||||
|
|
||||||
|
addSyntax("/themepark region list <page>")
|
||||||
|
.addArgument(new IntegerArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Collection<Region> regions = ThemePark.getInstance().getAPI().getAttractionService().getRegions().values();
|
||||||
|
if(regions.size() <= 5) {
|
||||||
|
sendSinglePage(sender, regions);
|
||||||
|
} else {
|
||||||
|
sendMultiPage(sender, regions, list, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendSinglePage(CommandSender sender, Collection<Region> regions) {
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &6&lThemePark &l&f====<"));
|
||||||
|
if(regions.isEmpty()) {
|
||||||
|
sender.sendMessage(Text.color("&6No regions found"));
|
||||||
|
} else {
|
||||||
|
for (Region region : regions)
|
||||||
|
sender.sendMessage(Text.color("&6ID: &f" + region.getID() + " &6Name: &r" + region.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &6&lThemePark &l&f====<"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendMultiPage(CommandSender sender, Collection<Region> regions, List<Object> list, int i) {
|
||||||
|
int page = 1;
|
||||||
|
int pages = (int) Math.ceil(((double) regions.size()) / 5);
|
||||||
|
if(i == 1)
|
||||||
|
page = (Integer) list.get(0);
|
||||||
|
|
||||||
|
if(page < 1 || page > pages) {
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ Page &6"+page+" &fdoesn't exist"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
for(List<Region> lr : Iterables.partition(regions, 5)) {
|
||||||
|
i++;
|
||||||
|
if(i != page)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &6&lThemePark &f(&6"+(page + 1)+"&f/&6"+pages+"&f) &l&f====<"));
|
||||||
|
for(Region region : lr)
|
||||||
|
sender.sendMessage(Text.color("&6ID: &f"+region.getID()+" &6Name: &r"+region.getName()));
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color("&f&l>==== &6&lThemePark &l&f====<"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.region;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.MessageArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.RegionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RegionNameCommand extends SubCommand {
|
||||||
|
|
||||||
|
public RegionNameCommand() {
|
||||||
|
super("themepark.admin", "region", "name");
|
||||||
|
|
||||||
|
addSyntax("/themepark region name <id> <name>")
|
||||||
|
.addArgument(new RegionArgument())
|
||||||
|
.addArgument(new MessageArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Region region = (Region) list.get(0);
|
||||||
|
String name = (String) list.get(1);
|
||||||
|
region.setName(name);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the name of region &f"+region.getID()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.region;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.RegionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RegionRemoveCommand extends SubCommand {
|
||||||
|
|
||||||
|
public RegionRemoveCommand() {
|
||||||
|
super("themepark.admin", "region", "remove");
|
||||||
|
|
||||||
|
addSyntax("/themepark region remove <id>")
|
||||||
|
.addArgument(new RegionArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Region region = (Region) list.get(0);
|
||||||
|
ThemePark.getInstance().getAPI().getAttractionService().removeRegion(region.getID());
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully removed region &f"+region.getID()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.ridecount;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.PlayersArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.number.IntegerArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RideCountAddCommand extends SubCommand {
|
||||||
|
|
||||||
|
public RideCountAddCommand() {
|
||||||
|
super("themepark.admin", "ridecount", "add");
|
||||||
|
|
||||||
|
addSyntax("/themepark ridecount add <attraction> <selector> <amount>")
|
||||||
|
.addArgument(new AttractionArgument())
|
||||||
|
.addArgument(new PlayersArgument())
|
||||||
|
.addArgument(new IntegerArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
List<Player> players = (List<Player>) list.get(1);
|
||||||
|
int amount = (Integer) list.get(2);
|
||||||
|
|
||||||
|
for(Player player : players)
|
||||||
|
ThemePark.getInstance().getAPI().getRideCountService().addCount(
|
||||||
|
attraction.getID(),
|
||||||
|
player.getUniqueId(),
|
||||||
|
amount
|
||||||
|
);
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color(
|
||||||
|
"&6&lThemeParkMC &f➢ &aSuccessfully added count of: &6"+amount+"x &ato attraction: &f"+attraction.getID()+" &afor &6"+players.size()+" &aplayers"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.ridecount;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.CommandFactory;
|
||||||
|
|
||||||
|
public class RideCountCommands {
|
||||||
|
|
||||||
|
public static void load(CommandFactory factory) {
|
||||||
|
factory.addSubCommand(new RideCountGetCommand())
|
||||||
|
.addSubCommand(new RideCountAddCommand());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.ridecount;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.PlayerArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.api.ridecount.objects.RideCount;
|
||||||
|
import nl.iobyte.themepark.commands.arguments.AttractionArgument;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RideCountGetCommand extends SubCommand {
|
||||||
|
|
||||||
|
public RideCountGetCommand() {
|
||||||
|
super("themepark.admin", "ridecount", "get");
|
||||||
|
|
||||||
|
addSyntax("/themepark ridecount get <attraction> <player>")
|
||||||
|
.addArgument(new AttractionArgument())
|
||||||
|
.addArgument(new PlayerArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Attraction attraction = (Attraction) list.get(0);
|
||||||
|
Player player = (Player) list.get(1);
|
||||||
|
|
||||||
|
RideCount count = ThemePark.getInstance().getAPI().getRideCountService().getCount(
|
||||||
|
attraction.getID(),
|
||||||
|
player.getUniqueId()
|
||||||
|
);
|
||||||
|
|
||||||
|
sender.sendMessage(Text.color(
|
||||||
|
"&6&lThemeParkMC &f➢ You have ridden attraction: &f"+attraction.getID()+" &ffor &6"+(count == null ? 0 : count.getCount())+"x"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.status;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.EnumArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.StringArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StatusColorCommand extends SubCommand {
|
||||||
|
|
||||||
|
public StatusColorCommand() {
|
||||||
|
super("themepark.admin", "status", "color");
|
||||||
|
|
||||||
|
addSyntax("/themepark status color <id> <color>")
|
||||||
|
.addArgument(new EnumArgument(Status.values()))
|
||||||
|
.addArgument(new StringArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Status status = (Status) list.get(0);
|
||||||
|
String color = (String) list.get(1);
|
||||||
|
status.setColor(color);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the color of status &f"+status.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.status;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.CommandFactory;
|
||||||
|
|
||||||
|
public class StatusCommands {
|
||||||
|
|
||||||
|
public static void load(CommandFactory factory) {
|
||||||
|
factory.addSubCommand(new StatusNameCommand())
|
||||||
|
.addSubCommand(new StatusColorCommand())
|
||||||
|
.addSubCommand(new StatusHexColorCommand())
|
||||||
|
.addSubCommand(new StatusMaterialCommand())
|
||||||
|
.addSubCommand(new StatusTeleportCommand());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.status;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.EnumArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.StringArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StatusHexColorCommand extends SubCommand {
|
||||||
|
|
||||||
|
public StatusHexColorCommand() {
|
||||||
|
super("themepark.admin", "status", "hex_color");
|
||||||
|
|
||||||
|
addSyntax("/themepark status hex_color <id> <color>")
|
||||||
|
.addArgument(new EnumArgument(Status.values()))
|
||||||
|
.addArgument(new StringArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Status status = (Status) list.get(0);
|
||||||
|
String hex_color = (String) list.get(1);
|
||||||
|
status.setHexColor(hex_color);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the hex color of status &f"+status.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.status;
|
||||||
|
|
||||||
|
import com.cryptomorin.xseries.XMaterial;
|
||||||
|
import nl.iobyte.commandapi.arguments.EnumArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.MaterialArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.number.ShortArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StatusMaterialCommand extends SubCommand {
|
||||||
|
|
||||||
|
public StatusMaterialCommand() {
|
||||||
|
super("themepark.admin", "status", "material");
|
||||||
|
|
||||||
|
addSyntax("/themepark status material <status> <material>")
|
||||||
|
.addArgument(new EnumArgument(Status.values()))
|
||||||
|
.addArgument(new MaterialArgument());
|
||||||
|
|
||||||
|
addSyntax("/themepark status material <status> <material> <data>")
|
||||||
|
.addArgument(new EnumArgument(Status.values()))
|
||||||
|
.addArgument(new MaterialArgument())
|
||||||
|
.addArgument(new ShortArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Status status = (Status) list.get(0);
|
||||||
|
XMaterial material;
|
||||||
|
if(i == 0) {
|
||||||
|
material = XMaterial.matchXMaterial((Material) list.get(1));
|
||||||
|
} else {
|
||||||
|
material = XMaterial.matchXMaterial(list.get(1).toString()+":"+list.get(2).toString()).orElse(null);
|
||||||
|
if(material == null) {
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &4Unable to parse specified material:data"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status.setMaterial(material);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the material of status &f"+status.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.status;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.EnumArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.MessageArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StatusNameCommand extends SubCommand {
|
||||||
|
|
||||||
|
public StatusNameCommand() {
|
||||||
|
super("themepark.admin", "status", "name");
|
||||||
|
|
||||||
|
addSyntax("/themepark status name <id> <name>")
|
||||||
|
.addArgument(new EnumArgument(Status.values()))
|
||||||
|
.addArgument(new MessageArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Status status = (Status) list.get(0);
|
||||||
|
String name = (String) list.get(1);
|
||||||
|
status.setName(name);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed the name of status &f"+status.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nl.iobyte.themepark.commands.subcommands.status;
|
||||||
|
|
||||||
|
import nl.iobyte.commandapi.arguments.BooleanArgument;
|
||||||
|
import nl.iobyte.commandapi.arguments.EnumArgument;
|
||||||
|
import nl.iobyte.commandapi.interfaces.SubCommand;
|
||||||
|
import nl.iobyte.themepark.api.attraction.enums.Status;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StatusTeleportCommand extends SubCommand {
|
||||||
|
|
||||||
|
public StatusTeleportCommand() {
|
||||||
|
super("themepark.admin", "status", "teleport");
|
||||||
|
|
||||||
|
addSyntax("/themepark status teleport <id> <teleport>")
|
||||||
|
.addArgument(new EnumArgument(Status.values()))
|
||||||
|
.addArgument(new BooleanArgument());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayerCommand(Player player, List<Object> list, int i) {
|
||||||
|
onConsoleCommand(player, list, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConsoleCommand(CommandSender sender, List<Object> list, int i) {
|
||||||
|
Status status = (Status) list.get(0);
|
||||||
|
boolean b = (boolean) list.get(1);
|
||||||
|
status.setCanTeleport(b);
|
||||||
|
sender.sendMessage(Text.color("&6&lThemeParkMC &f➢ &aSuccessfully changed if status &f"+status.toString()+" &acan teleport"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,212 @@
|
||||||
|
package nl.iobyte.themepark.listeners;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.ThemeParkAPI;
|
||||||
|
import nl.iobyte.themepark.api.attraction.AttractionService;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.config.objects.Configuration;
|
||||||
|
import nl.iobyte.themepark.api.event.attraction.*;
|
||||||
|
import nl.iobyte.themepark.utils.LocationUtil;
|
||||||
|
import nl.iobyte.themepark.utils.StatusMessage;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class AttractionListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onCreate(AttractionCreateEvent e) {
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
Attraction attraction = e.getAttraction();
|
||||||
|
Region region = api.getAttractionService().getRegion(
|
||||||
|
attraction.getRegionID()
|
||||||
|
);
|
||||||
|
|
||||||
|
//Add to Region's config
|
||||||
|
String path = "attractions."+attraction.getID();
|
||||||
|
Configuration config = region.getConfiguration();
|
||||||
|
config.set(path+".name", attraction.getName());
|
||||||
|
config.set(path+".cover", attraction.getCover());
|
||||||
|
config.set(path+".status", attraction.getStatus().toString());
|
||||||
|
config.set(path+".location", LocationUtil.toString(attraction.getLocation()));
|
||||||
|
|
||||||
|
//Update Menu
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getStatusMenu().load();
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"INSERT IGNORE INTO attractions(id, region_id, name, cover, status_id) VALUES (?,?,?,?,?)",
|
||||||
|
new HashMap<Integer, Object>() {{
|
||||||
|
put(1, attraction.getID());
|
||||||
|
put(2, attraction.getRegionID());
|
||||||
|
put(3, attraction.getName());
|
||||||
|
put(4, attraction.getCover());
|
||||||
|
put(5, attraction.getStatus().getID());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onRegionChange(AttractionRegionChangeEvent e) {
|
||||||
|
Attraction attraction = e.getAttraction();
|
||||||
|
AttractionService service = ThemePark.getInstance().getAPI().getAttractionService();
|
||||||
|
|
||||||
|
//Remove from old Region
|
||||||
|
Region region = service.getRegion(e.getOld());
|
||||||
|
region.removeAttraction(attraction.getID());
|
||||||
|
|
||||||
|
//Remove from old Region's config
|
||||||
|
Configuration config = region.getConfiguration();
|
||||||
|
config.set("attractions."+attraction.getID(), null);
|
||||||
|
|
||||||
|
//Add to new Region
|
||||||
|
region = service.getRegion(e.getCurrent());
|
||||||
|
region.addAttraction(attraction);
|
||||||
|
|
||||||
|
//Add to new Region's config
|
||||||
|
String path = "attractions."+attraction.getID();
|
||||||
|
config = region.getConfiguration();
|
||||||
|
config.set(path+".name", attraction.getName());
|
||||||
|
config.set(path+".cover", attraction.getCover());
|
||||||
|
config.set(path+".status", attraction.getStatus().toString());
|
||||||
|
config.set(path+".location", LocationUtil.toString(attraction.getLocation()));
|
||||||
|
|
||||||
|
//Update Menu
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getStatusMenu().load();
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"UPDATE attractions SET region_id=? WHERE id=?",
|
||||||
|
new HashMap<Integer, Object>() {{
|
||||||
|
put(1, e.getCurrent());
|
||||||
|
put(2, attraction.getID());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onNameChange(AttractionNameChangeEvent e) {
|
||||||
|
Attraction attraction = e.getAttraction();
|
||||||
|
Region region = ThemePark.getInstance().getAPI().getAttractionService().getRegion(
|
||||||
|
attraction.getRegionID()
|
||||||
|
);
|
||||||
|
|
||||||
|
//Change name in Region's config
|
||||||
|
Configuration config = region.getConfiguration();
|
||||||
|
config.set("attractions."+attraction.getID()+".name", e.getCurrent());
|
||||||
|
|
||||||
|
//Update Menu
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getStatusMenu().updateAttraction(attraction);
|
||||||
|
|
||||||
|
//Update Sign
|
||||||
|
ThemePark.getInstance().getAPI().getSignManager().update(attraction);
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"UPDATE attractions SET name=? WHERE id=?",
|
||||||
|
new HashMap<>() {{
|
||||||
|
put(1, e.getCurrent());
|
||||||
|
put(2, attraction.getID());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onCoverChange(AttractionCoverChangeEvent e) {
|
||||||
|
Attraction attraction = e.getAttraction();
|
||||||
|
Region region = ThemePark.getInstance().getAPI().getAttractionService().getRegion(
|
||||||
|
attraction.getRegionID()
|
||||||
|
);
|
||||||
|
|
||||||
|
//Change cover in Region's config
|
||||||
|
Configuration config = region.getConfiguration();
|
||||||
|
config.set("attractions."+attraction.getID()+".cover", e.getCurrent());
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"UPDATE attractions SET cover=? WHERE id=?",
|
||||||
|
new HashMap<Integer, Object>() {{
|
||||||
|
put(1, e.getCurrent());
|
||||||
|
put(2, attraction.getID());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onStatusChange(AttractionStatusChangeEvent e) {
|
||||||
|
Attraction attraction = e.getAttraction();
|
||||||
|
Region region = ThemePark.getInstance().getAPI().getAttractionService().getRegion(
|
||||||
|
attraction.getRegionID()
|
||||||
|
);
|
||||||
|
|
||||||
|
//Change status in Region's config
|
||||||
|
Configuration config = region.getConfiguration();
|
||||||
|
config.set("attractions."+attraction.getID()+".status", e.getCurrent().toString());
|
||||||
|
|
||||||
|
//Update Menu
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getStatusMenu().updateAttraction(attraction);
|
||||||
|
|
||||||
|
//Update Sign
|
||||||
|
ThemePark.getInstance().getAPI().getSignManager().update(attraction);
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"UPDATE attractions SET status_id=? WHERE id=?",
|
||||||
|
new HashMap<>() {{
|
||||||
|
put(1, e.getCurrent().getID());
|
||||||
|
put(2, attraction.getID());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
|
||||||
|
//Send Message
|
||||||
|
StatusMessage.broadcast(attraction);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onLocationChange(AttractionLocationChangeEvent e) {
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
Attraction attraction = e.getAttraction();
|
||||||
|
Region region = api.getAttractionService().getRegion(
|
||||||
|
attraction.getRegionID()
|
||||||
|
);
|
||||||
|
|
||||||
|
//Change location in Region's config
|
||||||
|
Configuration config = region.getConfiguration();
|
||||||
|
config.set("attractions."+attraction.getID()+".location", LocationUtil.toString(e.getCurrent()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onRemove(AttractionRemoveEvent e) {
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
Attraction attraction = e.getAttraction();
|
||||||
|
Region region = api.getAttractionService().getRegion(
|
||||||
|
attraction.getRegionID()
|
||||||
|
);
|
||||||
|
|
||||||
|
//Remove from Region's config
|
||||||
|
Configuration config = region.getConfiguration();
|
||||||
|
config.set("attractions."+attraction.getID(), null);
|
||||||
|
|
||||||
|
//Update Menu
|
||||||
|
api.getMenuService().getStatusMenu().load();
|
||||||
|
|
||||||
|
//Update Sign
|
||||||
|
ThemePark.getInstance().getAPI().getSignManager().remove(attraction);
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"DELETE attractions, ridecounts FROM attractions LEFT JOIN attractions.id=ridecounts.attraction_id WHERE attractions.id=?",
|
||||||
|
new HashMap<>() {{
|
||||||
|
put(1, attraction.getID());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package nl.iobyte.themepark.listeners;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.AttractionService;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Attraction;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.AttractionEvent;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.RegionEvent;
|
||||||
|
import nl.iobyte.themepark.api.event.objects.StatusEvent;
|
||||||
|
import nl.iobyte.themepark.api.menu.objects.StatusMenu;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
public class GeneralListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onRegion(RegionEvent<?> e) {
|
||||||
|
StatusMenu menu = ThemePark.getInstance().getAPI().getMenuService().getStatusMenu();
|
||||||
|
if(e.getCurrent() == null) {
|
||||||
|
menu.load();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.updateRegion(e.getRegion());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onAttraction(AttractionEvent<?> e) {
|
||||||
|
StatusMenu menu = ThemePark.getInstance().getAPI().getMenuService().getStatusMenu();
|
||||||
|
if(e.getCurrent() == null) {
|
||||||
|
menu.load();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String name = e.getEventName();
|
||||||
|
if(name.contains("Location") || name.contains("Cover"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
menu.updateAttraction(e.getAttraction());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onStatus(StatusEvent<?> e) {
|
||||||
|
String name = e.getEventName();
|
||||||
|
if(!name.contains("Name") && !name.contains("Color"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
StatusMenu menu = ThemePark.getInstance().getAPI().getMenuService().getStatusMenu();
|
||||||
|
AttractionService service = ThemePark.getInstance().getAPI().getAttractionService();
|
||||||
|
for(Attraction attraction : service.getAttractions().values())
|
||||||
|
if(attraction.getStatus() == e.getStatus())
|
||||||
|
menu.updateAttraction(attraction);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
208
src/main/java/nl/iobyte/themepark/listeners/PlayerListener.java
Normal file
208
src/main/java/nl/iobyte/themepark/listeners/PlayerListener.java
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
package nl.iobyte.themepark.listeners;
|
||||||
|
|
||||||
|
import nl.iobyte.menuapi.item.ItemBuilder;
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.ThemeParkAPI;
|
||||||
|
import nl.iobyte.themepark.api.config.ConfigurationManager;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageKey;
|
||||||
|
import nl.iobyte.themepark.api.message.Text;
|
||||||
|
import nl.iobyte.themepark.scheduler.ThemeParkScheduler;
|
||||||
|
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.block.Action;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
|
import org.bukkit.event.player.*;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
public class PlayerListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onJoin(PlayerJoinEvent e) {
|
||||||
|
Player player = e.getPlayer();
|
||||||
|
ThemeParkAPI api = ThemePark.getInstance().getAPI();
|
||||||
|
|
||||||
|
//Handle Menu item onJoin
|
||||||
|
doItem(player);
|
||||||
|
|
||||||
|
//Load RideCount data
|
||||||
|
Calendar calendar = new GregorianCalendar();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
api.getDatabaseService().executeQueryAsync(
|
||||||
|
"local",
|
||||||
|
"SELECT count, attraction_id, (SELECT sum(count) FROM counts AS t1 WHERE t1.uuid=t2.uuid AND t1.attraction_id=t2.attraction_id AND t1.year=t2.year AND t1.month=? GROUP BY t1.uuid) AS total_count FROM counts AS t2 WHERE uuid=? AND year=? AND day=?",
|
||||||
|
new HashMap<>() {{
|
||||||
|
put(1, calendar.get(Calendar.MONTH));
|
||||||
|
put(2, player.getUniqueId().toString());
|
||||||
|
put(3, calendar.get(Calendar.YEAR));
|
||||||
|
put(4, calendar.get(Calendar.DAY_OF_YEAR));
|
||||||
|
}}
|
||||||
|
).setWhenSuccessful(result -> {
|
||||||
|
if(result != null)
|
||||||
|
for(Map<String, Object> row : result)
|
||||||
|
api.getRideCountService().setCount(
|
||||||
|
(String) row.get("attraction_id"),
|
||||||
|
player.getUniqueId(),
|
||||||
|
(int) row.get("count"),
|
||||||
|
(int) (row.get("total_count") == null ? row.get("count") : row.get("total_count"))
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onSwitch(PlayerChangedWorldEvent e) {
|
||||||
|
//Handle Menu item onSwitch
|
||||||
|
doItem(e.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onQuit(PlayerQuitEvent e) {
|
||||||
|
Player player = e.getPlayer();
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
|
|
||||||
|
//Clear Unwanted RideCount
|
||||||
|
ThemeParkScheduler.runAsync(() -> ThemePark.getInstance().getAPI().getRideCountService().clearCount(uuid));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Handle Menu item
|
||||||
|
@EventHandler
|
||||||
|
public void onInteract(PlayerInteractEvent e) {
|
||||||
|
if(e.getItem() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ConfigurationManager manager = ThemePark.getInstance().getAPI().getConfigurationManager();
|
||||||
|
Material material = Material.getMaterial(manager.getString(StorageKey.MENU_ITEM_MATERIAL));
|
||||||
|
|
||||||
|
ItemStack item = e.getItem();
|
||||||
|
if(item.getType() != material)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!item.hasItemMeta())
|
||||||
|
return;
|
||||||
|
|
||||||
|
String name = Text.color(manager.getString(StorageKey.MENU_ITEM_NAME));
|
||||||
|
if(!item.getItemMeta().getDisplayName().equals(name))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
e.setCancelled(true);
|
||||||
|
Player player = e.getPlayer();
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getMainMenu().open(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Handle Menu item drop
|
||||||
|
@EventHandler
|
||||||
|
public void onDrop(PlayerDropItemEvent e) {
|
||||||
|
Player player = e.getPlayer();
|
||||||
|
if(player.hasPermission("themepark.admin"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ConfigurationManager manager = ThemePark.getInstance().getAPI().getConfigurationManager();
|
||||||
|
if(!manager.getBoolean(StorageKey.MENU_ITEM_ENABLED))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Material material = Material.getMaterial(manager.getString(StorageKey.MENU_ITEM_MATERIAL));
|
||||||
|
ItemStack item = e.getItemDrop().getItemStack();
|
||||||
|
if(item.getType() != material)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!item.hasItemMeta())
|
||||||
|
return;
|
||||||
|
|
||||||
|
String name = Text.color(manager.getString(StorageKey.MENU_ITEM_NAME));
|
||||||
|
if(!item.getItemMeta().getDisplayName().equals(name))
|
||||||
|
return;
|
||||||
|
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onClick(InventoryClickEvent e) {
|
||||||
|
Player player = (Player) e.getWhoClicked();
|
||||||
|
if(player.hasPermission("themepark.admin"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Inventory inventory = e.getClickedInventory();
|
||||||
|
if(inventory.getType() != InventoryType.PLAYER)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ConfigurationManager manager = ThemePark.getInstance().getAPI().getConfigurationManager();
|
||||||
|
if(!manager.getBoolean(StorageKey.MENU_ITEM_ENABLED))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemStack item = e.getCursor();
|
||||||
|
if(item == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Material material = Material.getMaterial(manager.getString(StorageKey.MENU_ITEM_MATERIAL));
|
||||||
|
if(item.getType() != material)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!item.hasItemMeta())
|
||||||
|
return;
|
||||||
|
|
||||||
|
String name = Text.color(manager.getString(StorageKey.MENU_ITEM_NAME));
|
||||||
|
if(!item.getItemMeta().getDisplayName().equals(name))
|
||||||
|
return;
|
||||||
|
|
||||||
|
e.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called on join / world switch
|
||||||
|
* @param player Player
|
||||||
|
*/
|
||||||
|
private void doItem(Player player) {
|
||||||
|
ConfigurationManager manager = ThemePark.getInstance().getAPI().getConfigurationManager();
|
||||||
|
|
||||||
|
CompletableFuture<ItemStack> fc = new CompletableFuture<>();
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(ThemePark.getInstance(), () -> {
|
||||||
|
if(!manager.getBoolean(StorageKey.MENU_ITEM_ENABLED)) {
|
||||||
|
fc.complete(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Material material = Material.getMaterial(manager.getString(StorageKey.MENU_ITEM_MATERIAL));
|
||||||
|
short data = Short.parseShort(manager.getString(StorageKey.MENU_ITEM_DATA));
|
||||||
|
String name = Text.color(manager.getString(StorageKey.MENU_ITEM_NAME));
|
||||||
|
if(material == null || name.isEmpty()) {
|
||||||
|
fc.complete(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemBuilder builder = new ItemBuilder(material, 1, data);
|
||||||
|
builder.setName(name);
|
||||||
|
if(manager.getBoolean(StorageKey.MENU_ITEM_CLEAR))
|
||||||
|
player.getInventory().clear();
|
||||||
|
|
||||||
|
List<String> worlds = manager.getStringList(StorageKey.MENU_ITEM_WORLDS);
|
||||||
|
if(worlds != null && !worlds.isEmpty()) {
|
||||||
|
if (worlds.contains(player.getLocation().getWorld().getName())) {
|
||||||
|
fc.complete(new ItemStack(Material.AIR));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fc.complete(builder.getItem());
|
||||||
|
});
|
||||||
|
|
||||||
|
fc.thenAccept(item -> {
|
||||||
|
if(item == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int slot = manager.getInt(StorageKey.MENU_ITEM_SLOT);
|
||||||
|
player.getInventory().setItem(slot, item);
|
||||||
|
player.updateInventory();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,90 @@
|
||||||
|
package nl.iobyte.themepark.listeners;
|
||||||
|
|
||||||
|
import nl.iobyte.themepark.ThemePark;
|
||||||
|
import nl.iobyte.themepark.api.attraction.objects.Region;
|
||||||
|
import nl.iobyte.themepark.api.config.enums.StorageLocation;
|
||||||
|
import nl.iobyte.themepark.api.event.region.RegionCreateEvent;
|
||||||
|
import nl.iobyte.themepark.api.event.region.RegionNameChangeEvent;
|
||||||
|
import nl.iobyte.themepark.api.event.region.RegionRemoveEvent;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class RegionListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onCreate(RegionCreateEvent e) {
|
||||||
|
Region region = e.getRegion();
|
||||||
|
|
||||||
|
//Add Region to config
|
||||||
|
ThemePark.getInstance().getAPI().getConfigurationManager().set(
|
||||||
|
StorageLocation.REGIONS,
|
||||||
|
"regions."+region.getID()+".name",
|
||||||
|
region.getName()
|
||||||
|
);
|
||||||
|
|
||||||
|
//Update Menu
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getStatusMenu().load();
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"INSERT IGNORE INTO regions(id, name) VALUES (?,?)",
|
||||||
|
new HashMap<>() {{
|
||||||
|
put(1, region.getID());
|
||||||
|
put(2, region.getName());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onNameChange(RegionNameChangeEvent e) {
|
||||||
|
Region region = e.getRegion();
|
||||||
|
|
||||||
|
//Change Region name in config
|
||||||
|
ThemePark.getInstance().getAPI().getConfigurationManager().set(
|
||||||
|
StorageLocation.REGIONS,
|
||||||
|
"regions."+region.getID()+".name",
|
||||||
|
region.getName()
|
||||||
|
);
|
||||||
|
|
||||||
|
//Update Menu
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getStatusMenu().updateRegion(region);
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"UPDATE regions SET name=? WHERE id=?",
|
||||||
|
new HashMap<>() {{
|
||||||
|
put(1, region.getName());
|
||||||
|
put(2, region.getID());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onRemove(RegionRemoveEvent e) {
|
||||||
|
Region region = e.getRegion();
|
||||||
|
region.getConfiguration().delete();
|
||||||
|
|
||||||
|
//Remove Region from config
|
||||||
|
ThemePark.getInstance().getAPI().getConfigurationManager().set(
|
||||||
|
StorageLocation.REGIONS,
|
||||||
|
"regions."+region.getID(),
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
//Update Menu
|
||||||
|
ThemePark.getInstance().getAPI().getMenuService().getStatusMenu().load();
|
||||||
|
|
||||||
|
//Update MySQL Database
|
||||||
|
ThemePark.getInstance().getAPI().getDatabaseService().executeAsync(
|
||||||
|
"remote",
|
||||||
|
"DELETE regions, attractions, ridecounts FROM regions LEFT JOIN attractions ON regions.id=attractions.region_id LEFT JOIN ridecounts ON attractions.id=ridecounts.attraction_id WHERE regions.id=?",
|
||||||
|
new HashMap<>() {{
|
||||||
|
put(1, region.getID());
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue