diff --git a/RageSpigot/.idea/.name b/RageSpigot/.idea/.name new file mode 100644 index 0000000..76dec34 --- /dev/null +++ b/RageSpigot/.idea/.name @@ -0,0 +1 @@ +ragespigot-parent \ No newline at end of file diff --git a/RageSpigot/.idea/codeStyles/Project.xml b/RageSpigot/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..565c347 --- /dev/null +++ b/RageSpigot/.idea/codeStyles/Project.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/compiler.xml b/RageSpigot/.idea/compiler.xml new file mode 100644 index 0000000..b890ebb --- /dev/null +++ b/RageSpigot/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/dbnavigator.xml b/RageSpigot/.idea/dbnavigator.xml new file mode 100644 index 0000000..b2c7134 --- /dev/null +++ b/RageSpigot/.idea/dbnavigator.xml @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/encodings.xml b/RageSpigot/.idea/encodings.xml new file mode 100644 index 0000000..82a9a2a --- /dev/null +++ b/RageSpigot/.idea/encodings.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml b/RageSpigot/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml new file mode 100644 index 0000000..6e5d5b7 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__com_google_code_gson_gson_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__com_google_guava_guava_19_0.xml b/RageSpigot/.idea/libraries/Maven__com_google_guava_guava_19_0.xml new file mode 100644 index 0000000..68e23cc --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__com_google_guava_guava_19_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml b/RageSpigot/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml new file mode 100644 index 0000000..f3f3738 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__com_googlecode_json_simple_json_simple_1_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml b/RageSpigot/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml new file mode 100644 index 0000000..2ec8376 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__javax_persistence_persistence_api_1_0.xml b/RageSpigot/.idea/libraries/Maven__javax_persistence_persistence_api_1_0.xml new file mode 100644 index 0000000..e60370e --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__javax_persistence_persistence_api_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__jline_jline_2_12.xml b/RageSpigot/.idea/libraries/Maven__jline_jline_2_12.xml new file mode 100644 index 0000000..eaff5ff --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__jline_jline_2_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__junit_junit_4_11.xml b/RageSpigot/.idea/libraries/Maven__junit_junit_4_11.xml new file mode 100644 index 0000000..f33320d --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__junit_junit_4_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__junit_junit_4_12.xml b/RageSpigot/.idea/libraries/Maven__junit_junit_4_12.xml new file mode 100644 index 0000000..d411041 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__junit_junit_4_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__mysql_mysql_connector_java_5_1_14.xml b/RageSpigot/.idea/libraries/Maven__mysql_mysql_connector_java_5_1_14.xml new file mode 100644 index 0000000..762fc70 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__mysql_mysql_connector_java_5_1_14.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__net_jafama_jafama_2_1_0.xml b/RageSpigot/.idea/libraries/Maven__net_jafama_jafama_2_1_0.xml new file mode 100644 index 0000000..ccf860b --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__net_jafama_jafama_2_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_8_SNAPSHOT.xml b/RageSpigot/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_8_SNAPSHOT.xml new file mode 100644 index 0000000..b996b2a --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__net_md_5_bungeecord_chat_1_8_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__net_sf_jopt_simple_jopt_simple_3_2.xml b/RageSpigot/.idea/libraries/Maven__net_sf_jopt_simple_jopt_simple_3_2.xml new file mode 100644 index 0000000..69c4269 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__net_sf_jopt_simple_jopt_simple_3_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__net_sf_trove4j_trove4j_3_0_3.xml b/RageSpigot/.idea/libraries/Maven__net_sf_trove4j_trove4j_3_0_3.xml new file mode 100644 index 0000000..72d4d7e --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__net_sf_trove4j_trove4j_3_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__org_avaje_ebean_2_8_1.xml b/RageSpigot/.idea/libraries/Maven__org_avaje_ebean_2_8_1.xml new file mode 100644 index 0000000..91f161a --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__org_avaje_ebean_2_8_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/RageSpigot/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..f58bbc1 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml b/RageSpigot/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml new file mode 100644 index 0000000..78dbe45 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__org_spigotmc_minecraft_server_1_8_8_SNAPSHOT.xml b/RageSpigot/.idea/libraries/Maven__org_spigotmc_minecraft_server_1_8_8_SNAPSHOT.xml new file mode 100644 index 0000000..3ba266c --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__org_spigotmc_minecraft_server_1_8_8_SNAPSHOT.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__org_xerial_sqlite_jdbc_3_7_2.xml b/RageSpigot/.idea/libraries/Maven__org_xerial_sqlite_jdbc_3_7_2.xml new file mode 100644 index 0000000..071c336 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__org_xerial_sqlite_jdbc_3_7_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/libraries/Maven__org_yaml_snakeyaml_1_15.xml b/RageSpigot/.idea/libraries/Maven__org_yaml_snakeyaml_1_15.xml new file mode 100644 index 0000000..02d9152 --- /dev/null +++ b/RageSpigot/.idea/libraries/Maven__org_yaml_snakeyaml_1_15.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/misc.xml b/RageSpigot/.idea/misc.xml new file mode 100644 index 0000000..d30d09e --- /dev/null +++ b/RageSpigot/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/modules.xml b/RageSpigot/.idea/modules.xml new file mode 100644 index 0000000..47a6117 --- /dev/null +++ b/RageSpigot/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/uiDesigner.xml b/RageSpigot/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/RageSpigot/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/vcs.xml b/RageSpigot/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/RageSpigot/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/RageSpigot/.idea/workspace.xml b/RageSpigot/.idea/workspace.xml new file mode 100644 index 0000000..3ac9311 --- /dev/null +++ b/RageSpigot/.idea/workspace.xml @@ -0,0 +1,929 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pipeline + channelRead0 + moveToWorld + packetHandler + DedicatedServer + PacketPlayOutSpawnEntity + PacketPlayOutNamedEntity + new PacketPlayOutNamedEntity + setCustomName + PacketPlayOutPlayer + PacketPlayOutPlayerInf + Rotation + EntityLiving + PacketPlayOutAnimation + PacketPlayOutEntity + PacketPlayOutEntityLook + Pac + PacketPlayOutEntityHead + PacketPlayOutRel + protocol version + Unsupported + PacketPlayOutNamed + PacketPlayOutEntityMet + save + Stopping server + boolean flag2 = entity.damageEntity(DamageSource.playerAttack(this), f); + setVelocity + + + setVel + a(Entity entity, float f, double d0, double d1) { + + + FastMath. + MathHelper.clamp + MathHelper.floor + MathHelper.g + MathHelper.b + MathHelper.c + MathHelper.a + MathHelper.f + MathHelper.d + MathHelper.nextInt + + + C:\Users\skruf\Documents\RageMC\RageSpigot\RageSpigot-Server + C:\Users\skruf\Documents\RageMC\RageSpigot + C:\Users\skruf\Documents\RageMC\RageSpigot\RageSpigot-Server\src\main\java\gg\ragemc\spigot\handler + C:\Users\skruf\Documents\Projects\RageMC\RageSpigot\RageSpigot-API + C:\Users\skruf\Documents\Projects\RageMC\RageSpigot + C:\Users\david\IdeaProjects\RageSpigot\RageSpigot-Server\src\main\java + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1540031886311 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dPractice:jar + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.8 + + + + + + + + dPractice + + + + + + + + 1.8 + + + + + + + + Maven: com.google.code.gson:gson:2.3.1 + + + + + + + + \ No newline at end of file diff --git a/dPractice/dPractice.iml b/dPractice/dPractice.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/dPractice/dPractice.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/dPractice/pom.xml b/dPractice/pom.xml new file mode 100644 index 0000000..7bdc27c --- /dev/null +++ b/dPractice/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + me.devkevin.practice + dPractice + 1.0-SNAPSHOT + + + + + + + + com.google.code.gson + gson + 2.3.1 + compile + + + + org.projectlombok + lombok + 1.14.8 + provided + + + redis.clients + jedis + 2.8.1 + jar + compile + + + + org.mongodb + mongodb-driver + LATEST + + + net.sf.trove4j + trove4j + 3.0.3 + + + net.sf.trove4j + trove4j + 3.0.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.1 + + + package + + shade + + + + + + + \ No newline at end of file diff --git a/dPractice/src/main/java/META-INF/MANIFEST.MF b/dPractice/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000..45a2f66 --- /dev/null +++ b/dPractice/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: me.devkevin.practice.Practice + diff --git a/dPractice/src/main/java/me/devkevin/practice/CustomLocation.java b/dPractice/src/main/java/me/devkevin/practice/CustomLocation.java new file mode 100644 index 0000000..39f9829 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/CustomLocation.java @@ -0,0 +1,169 @@ +package me.devkevin.practice; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; + +import java.util.StringJoiner; + +public class CustomLocation { + private final long timestamp; + private String world; + private double x; + private double y; + private double z; + private float yaw; + private float pitch; + + public CustomLocation(final double x, final double y, final double z) { + this(x, y, z, 0.0f, 0.0f); + } + + public CustomLocation(final String world, final double x, final double y, final double z) { + this(world, x, y, z, 0.0f, 0.0f); + } + + public CustomLocation(final double x, final double y, final double z, final float yaw, final float pitch) { + this("world", x, y, z, yaw, pitch); + } + + public CustomLocation(final String world, final double x, final double y, final double z, final float yaw, final float pitch) { + this.timestamp = System.currentTimeMillis(); + this.world = world; + this.x = x; + this.y = y; + this.z = z; + this.yaw = yaw; + this.pitch = pitch; + } + + public static CustomLocation fromBukkitLocation(final Location location) { + return new CustomLocation(location.getWorld().getName(), location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + } + + public static CustomLocation stringToLocation(final String string) { + final String[] split = string.split(", "); + final double x = Double.parseDouble(split[0]); + final double y = Double.parseDouble(split[1]); + final double z = Double.parseDouble(split[2]); + final CustomLocation customLocation = new CustomLocation(x, y, z); + if (split.length == 4) { + customLocation.setWorld(split[3]); + } else if (split.length >= 5) { + customLocation.setYaw(Float.parseFloat(split[3])); + customLocation.setPitch(Float.parseFloat(split[4])); + if (split.length >= 6) { + customLocation.setWorld(split[5]); + } + } + return customLocation; + } + + public static String locationToString(final CustomLocation loc) { + final StringJoiner joiner = new StringJoiner(", "); + joiner.add(Double.toString(loc.getX())); + joiner.add(Double.toString(loc.getY())); + joiner.add(Double.toString(loc.getZ())); + if (loc.getYaw() == 0.0f && loc.getPitch() == 0.0f) { + if (loc.getWorld().equals("world")) { + return joiner.toString(); + } + joiner.add(loc.getWorld()); + return joiner.toString(); + } else { + joiner.add(Float.toString(loc.getYaw())); + joiner.add(Float.toString(loc.getPitch())); + if (loc.getWorld().equals("world")) { + return joiner.toString(); + } + joiner.add(loc.getWorld()); + return joiner.toString(); + } + } + + public Location toBukkitLocation() { + return new Location(this.toBukkitWorld(), this.x, this.y, this.z, this.yaw, this.pitch); + } + + public double getGroundDistanceTo(final CustomLocation location) { + return Math.sqrt(Math.pow(this.x - location.x, 2.0) + Math.pow(this.z - location.z, 2.0)); + } + + public double getDistanceTo(final CustomLocation location) { + return Math.sqrt(Math.pow(this.x - location.x, 2.0) + Math.pow(this.y - location.y, 2.0) + Math.pow(this.z - location.z, 2.0)); + } + + public World toBukkitWorld() { + if (this.world == null) { + return Bukkit.getServer().getWorlds().get(0); + } + return Bukkit.getServer().getWorld(this.world); + } + + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof CustomLocation)) { + return false; + } + final CustomLocation location = (CustomLocation) obj; + return location.x == this.x && location.y == this.y && location.z == this.z && location.pitch == this.pitch && location.yaw == this.yaw; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("x", this.x).append("y", this.y).append("z", this.z).append("yaw", this.yaw).append("pitch", this.pitch).append("world", this.world).append("timestamp", this.timestamp).toString(); + } + + public long getTimestamp() { + return this.timestamp; + } + + public String getWorld() { + return this.world; + } + + public void setWorld(final String world) { + this.world = world; + } + + public double getX() { + return this.x; + } + + public void setX(final double x) { + this.x = x; + } + + public double getY() { + return this.y; + } + + public void setY(final double y) { + this.y = y; + } + + public double getZ() { + return this.z; + } + + public void setZ(final double z) { + this.z = z; + } + + public float getYaw() { + return this.yaw; + } + + public void setYaw(final float yaw) { + this.yaw = yaw; + } + + public float getPitch() { + return this.pitch; + } + + public void setPitch(final float pitch) { + this.pitch = pitch; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/Practice.java b/dPractice/src/main/java/me/devkevin/practice/Practice.java new file mode 100644 index 0000000..aa087ee --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/Practice.java @@ -0,0 +1,208 @@ +package me.devkevin.practice; + +import com.bizarrealex.aether.Aether; +import gg.ragemc.spigot.RageSpigot; +import lombok.Getter; +import me.devkevin.practice.board.PracticeBoard; +import me.devkevin.practice.leaderboards.LeaderBoardsManager; +import net.minecraft.server.v1_8_R3.MinecraftServer; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.inventory.Recipe; +import org.bukkit.plugin.java.JavaPlugin; +import me.devkevin.practice.cache.StatusCache; +import me.devkevin.practice.commands.FlyCommand; +import me.devkevin.practice.commands.InvCommand; +import me.devkevin.practice.commands.PartyCommand; +import me.devkevin.practice.commands.duel.AcceptCommand; +import me.devkevin.practice.commands.duel.DuelCommand; +import me.devkevin.practice.commands.duel.SpectateCommand; +import me.devkevin.practice.commands.event.*; +import me.devkevin.practice.commands.management.*; +import me.devkevin.practice.commands.time.DayCommand; +import me.devkevin.practice.commands.time.NightCommand; +import me.devkevin.practice.commands.time.SunsetCommand; +import me.devkevin.practice.commands.toggle.SettingsCommand; +import me.devkevin.practice.commands.warp.WarpCommand; +import me.devkevin.practice.ffa.FFAManager; +import me.devkevin.practice.file.Config; +import me.devkevin.practice.handler.CustomMovementHandler; +import me.devkevin.practice.listeners.*; +import me.devkevin.practice.managers.*; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.runnable.ExpBarRunnable; +import me.devkevin.practice.runnable.SaveDataRunnable; +import me.devkevin.practice.settings.ProfileOptionsListeners; +import me.devkevin.practice.util.inventory.UIListener; +import me.devkevin.practice.util.timer.TimerManager; +import me.devkevin.practice.util.timer.impl.EnderpearlTimer; + +import java.util.Arrays; +import java.util.Iterator; + +public class Practice extends JavaPlugin { + + + @Getter private static Practice instance; + @Getter private Config mainConfig; + @Getter private InventoryManager inventoryManager; + @Getter private EditorManager editorManager; + @Getter private PlayerManager playerManager; + @Getter private ArenaManager arenaManager; + @Getter private MatchManager matchManager; + @Getter private PartyManager partyManager; + @Getter private QueueManager queueManager; + @Getter private EventManager eventManager; + @Getter private ItemManager itemManager; + @Getter private KitManager kitManager; + @Getter private FFAManager ffaManager; + @Getter private SpawnManager spawnManager; + @Getter private TournamentManager tournamentManager; + @Getter private ChunkManager chunkManager; + @Getter private TimerManager timerManager; + + public static Practice getInstance() { + return Practice.instance; + } + + public void test() { + for (final PlayerData playerData : this.playerManager.getAllData()) { + this.playerManager.saveData(playerData); + } + } + + @Override + public void onDisable() { + for (final PlayerData playerData : this.playerManager.getAllData()) { + this.playerManager.saveData(playerData); + } + this.arenaManager.saveArenas(); + this.kitManager.saveKits(); + this.spawnManager.saveConfig(); + } + + @Override + public void onEnable() { + Practice.instance = this; + this.mainConfig = new Config("config", this); + RageSpigot.INSTANCE.addMovementHandler(new CustomMovementHandler()); + this.registerCommands(); + this.registerListeners(); + new Aether (this, new PracticeBoard ()); + this.registerManagers(); + this.getServer().getScheduler().runTaskTimerAsynchronously(this, new SaveDataRunnable(), 6000L, 6000L); + this.getServer().getScheduler().runTaskTimerAsynchronously(this, new ExpBarRunnable(), 2L, 2L); + new StatusCache().start(); + new LeaderBoardsManager (); + } + + private void registerCommands() { + Arrays.asList(new SettingsCommand(), new ResetStatsCommand(), new JoinEventCommand(), new LeaveEventCommand(), new StatusEventCommand(), new HostCommand(), new EventManagerCommand(), new AcceptCommand(), new SunsetCommand(), new ArenaCommand(), new NightCommand(), new FlyCommand(), new PartyCommand(), new DuelCommand(), new SpectateCommand(), new DayCommand(), new KitCommand(), new SpectateEventCommand(), new InvCommand(), new SpawnsCommand(), new WarpCommand(), new TournamentCommand()).forEach(command -> this.registerCommand(command, this.getName())); + } + + private void registerListeners() { + Arrays.asList(new EntityListener(), new PlayerListener(), new MatchListener(), new WorldListener(), new EnderpearlListener(this), new UIListener(), new ProfileOptionsListeners(), new InventoryListener()).forEach(listener -> this.getServer().getPluginManager().registerEvents(listener, this)); + } + + private void registerManagers() { + this.spawnManager = new SpawnManager(); + this.arenaManager = new ArenaManager(); + this.chunkManager = new ChunkManager(); + this.editorManager = new EditorManager(); + this.itemManager = new ItemManager(); + this.kitManager = new KitManager(); + this.matchManager = new MatchManager(); + this.partyManager = new PartyManager(); + this.playerManager = new PlayerManager(); + this.queueManager = new QueueManager(); + this.inventoryManager = new InventoryManager(); + this.eventManager = new EventManager(); + this.tournamentManager = new TournamentManager(); + this.timerManager = new TimerManager(this); + if (this.timerManager.getTimer(EnderpearlTimer.class) == null) { + this.timerManager.registerTimer(new EnderpearlTimer()); + } + } + + public void registerCommand(final Command cmd, final String fallbackPrefix) { + MinecraftServer.getServer().server.getCommandMap().register(cmd.getName(), fallbackPrefix, cmd); + } + + private void registerCommand(final Command cmd) { + this.registerCommand(cmd, this.getName()); + } + + private void removeCrafting(final Material material) { + final Iterator iterator = this.getServer().recipeIterator(); + while (iterator.hasNext()) { + final Recipe recipe = iterator.next(); + if (recipe != null && recipe.getResult().getType() == material) { + iterator.remove(); + } + } + } + + public Config getMainConfig() { + return this.mainConfig; + } + + public InventoryManager getInventoryManager() { + return this.inventoryManager; + } + + public EditorManager getEditorManager() { + return this.editorManager; + } + + public PlayerManager getPlayerManager() { + return this.playerManager; + } + + public ArenaManager getArenaManager() { + return this.arenaManager; + } + + public MatchManager getMatchManager() { + return this.matchManager; + } + + public PartyManager getPartyManager() { + return this.partyManager; + } + + public QueueManager getQueueManager() { + return this.queueManager; + } + + public EventManager getEventManager() { + return this.eventManager; + } + + public ItemManager getItemManager() { + return this.itemManager; + } + + public KitManager getKitManager() { + return this.kitManager; + } + + public FFAManager getFfaManager() { + return this.ffaManager; + } + + public SpawnManager getSpawnManager() { + return this.spawnManager; + } + + public TournamentManager getTournamentManager() { + return this.tournamentManager; + } + + public ChunkManager getChunkManager() { + return this.chunkManager; + } + + public TimerManager getTimerManager() { + return this.timerManager; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/arena/Arena.java b/dPractice/src/main/java/me/devkevin/practice/arena/Arena.java new file mode 100644 index 0000000..5f161a4 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/arena/Arena.java @@ -0,0 +1,105 @@ +package me.devkevin.practice.arena; + +import me.devkevin.practice.CustomLocation; + +import java.util.List; + +public class Arena { + private final String name; + private List standaloneArenas; + private List availableArenas; + private CustomLocation a; + private CustomLocation b; + private CustomLocation min; + private CustomLocation max; + private boolean enabled; + + public Arena(final String name, final List standaloneArenas, final List availableArenas, final CustomLocation a, final CustomLocation b, final CustomLocation min, final CustomLocation max, final boolean enabled) { + this.name = name; + this.standaloneArenas = standaloneArenas; + this.availableArenas = availableArenas; + this.a = a; + this.b = b; + this.min = min; + this.max = max; + this.enabled = enabled; + } + + public Arena(final String name) { + this.name = name; + } + + public StandaloneArena getAvailableArena() { + final StandaloneArena arena = this.availableArenas.get(0); + this.availableArenas.remove(0); + return arena; + } + + public void addStandaloneArena(final StandaloneArena arena) { + this.standaloneArenas.add(arena); + } + + public void addAvailableArena(final StandaloneArena arena) { + this.availableArenas.add(arena); + } + + public String getName() { + return this.name; + } + + public List getStandaloneArenas() { + return this.standaloneArenas; + } + + public void setStandaloneArenas(final List standaloneArenas) { + this.standaloneArenas = standaloneArenas; + } + + public List getAvailableArenas() { + return this.availableArenas; + } + + public void setAvailableArenas(final List availableArenas) { + this.availableArenas = availableArenas; + } + + public CustomLocation getA() { + return this.a; + } + + public void setA(final CustomLocation a) { + this.a = a; + } + + public CustomLocation getB() { + return this.b; + } + + public void setB(final CustomLocation b) { + this.b = b; + } + + public CustomLocation getMin() { + return this.min; + } + + public void setMin(final CustomLocation min) { + this.min = min; + } + + public CustomLocation getMax() { + return this.max; + } + + public void setMax(final CustomLocation max) { + this.max = max; + } + + public boolean isEnabled() { + return this.enabled; + } + + public void setEnabled(final boolean enabled) { + this.enabled = enabled; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/arena/StandaloneArena.java b/dPractice/src/main/java/me/devkevin/practice/arena/StandaloneArena.java new file mode 100644 index 0000000..0131cde --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/arena/StandaloneArena.java @@ -0,0 +1,52 @@ +package me.devkevin.practice.arena; + +import me.devkevin.practice.CustomLocation; + +public class StandaloneArena { + private CustomLocation a; + private CustomLocation b; + private CustomLocation min; + private CustomLocation max; + + public StandaloneArena(final CustomLocation a, final CustomLocation b, final CustomLocation min, final CustomLocation max) { + this.a = a; + this.b = b; + this.min = min; + this.max = max; + } + + public StandaloneArena() { + } + + public CustomLocation getA() { + return this.a; + } + + public void setA(final CustomLocation a) { + this.a = a; + } + + public CustomLocation getB() { + return this.b; + } + + public void setB(final CustomLocation b) { + this.b = b; + } + + public CustomLocation getMin() { + return this.min; + } + + public void setMin(final CustomLocation min) { + this.min = min; + } + + public CustomLocation getMax() { + return this.max; + } + + public void setMax(final CustomLocation max) { + this.max = max; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/board/PracticeBoard.java b/dPractice/src/main/java/me/devkevin/practice/board/PracticeBoard.java new file mode 100644 index 0000000..64286c4 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/board/PracticeBoard.java @@ -0,0 +1,119 @@ +package me.devkevin.practice.board; + +import com.bizarrealex.aether.scoreboard.Board; +import com.bizarrealex.aether.scoreboard.BoardAdapter; +import com.bizarrealex.aether.scoreboard.cooldown.BoardCooldown; +import lombok.Getter; +import me.devkevin.practice.Practice; +import me.devkevin.practice.cache.StatusCache; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.settings.item.ProfileOptionsItemState; +import me.devkevin.practice.util.PlayerUtil; +import me.devkevin.practice.util.TimeUtil; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.text.SimpleDateFormat; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +public class PracticeBoard implements BoardAdapter { + + @Getter + private final Practice plugin; + + public PracticeBoard() { + this.plugin = Practice.getInstance (); + } + + public String getTitle(final Player player) { + return ChatColor.WHITE.toString () + ChatColor.BOLD + "uDrop"; + } + + public List getScoreboard(final Player player , final Board board , final Set cooldowns) { + final PlayerData playerData = this.plugin.getPlayerManager ().getPlayerData ( player.getUniqueId () ); + if (playerData == null) { + this.plugin.getLogger ().warning ( player.getName () + "'s player data is null" ); + return null; + } + if (playerData.getOptions ().getScoreboard () == ProfileOptionsItemState.DISABLED) { + return null; + } + switch (playerData.getPlayerState ()) { + case LOADING: + case EDITING: + case FFA: + case SPAWN: + case EVENT: + case SPECTATING: + return this.getLobbyBoard ( player , false ); + case QUEUE: + return this.getLobbyBoard ( player , true ); + case FIGHTING: + return this.getGameBoard ( player ); + default: + return null; + } + } + + + private List getLobbyBoard(final Player player , final boolean queuing) { + final List strings = new LinkedList (); + strings.add ( ChatColor.GRAY.toString () + ChatColor.STRIKETHROUGH + "-------------------" ); + final Party party = this.plugin.getPartyManager ().getParty ( player.getUniqueId () ); + PracticeEvent event = this.plugin.getEventManager ().getEventPlaying ( player ); + if (this.plugin.getEventManager ().getSpectators ().containsKey ( player.getUniqueId () )) { + event = this.plugin.getEventManager ().getSpectators ().get ( player.getUniqueId () ); + } + final PlayerData playerData = this.plugin.getPlayerManager ().getPlayerData ( player.getUniqueId () ); + if (event == null) { + strings.add ( ChatColor.GREEN.toString () + "Online§f: " + ChatColor.WHITE + this.plugin.getServer ().getOnlinePlayers ().size () ); + strings.add ( ChatColor.GREEN.toString () + "In Fights§f: " + ChatColor.WHITE + StatusCache.getInstance ().getFighting () ); + strings.add ( ChatColor.GREEN.toString () + "In Queues§f: " + ChatColor.WHITE + StatusCache.getInstance ().getQueueing () ); + strings.add (""); + strings.add ( ChatColor.WHITE.toString () + "eu.udrop.club"); + } + strings.add(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "-------------------"); + return strings; + } + + private List getGameBoard(final Player player) { + final List strings = new LinkedList(); + strings.add(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "-------------------"); + final Match match = this.plugin.getMatchManager().getMatch(player.getUniqueId()); + Player opponentPlayer = null; + if (!match.isPartyMatch() && !match.isFFA()) { + opponentPlayer = ((match.getTeams().get(0).getPlayers().get(0) == player.getUniqueId()) ? this.plugin.getServer().getPlayer(match.getTeams().get(1).getPlayers().get(0)) : this.plugin.getServer().getPlayer(match.getTeams().get(0).getPlayers().get(0))); + if (opponentPlayer == null) { + return this.getLobbyBoard(player, false); + } + strings.add(ChatColor.GREEN.toString() + "Opponent§f: " + ChatColor.WHITE + opponentPlayer.getName()); + strings.add(ChatColor.GREEN.toString() + "Ping§f: " + ChatColor.WHITE + PlayerUtil.getPing(player) + " ms" + ChatColor.GRAY + " - " + ChatColor.WHITE + PlayerUtil.getPing(opponentPlayer) + " ms"); + } else if (match.isPartyMatch() && !match.isFFA()) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final MatchTeam opposingTeam = match.isFFA() ? match.getTeams().get(0) : ((playerData.getTeamID() == 0) ? match.getTeams().get(1) : match.getTeams().get(0)); + final MatchTeam playerTeam = match.getTeams().get(playerData.getTeamID()); + } else if (match.isFFA()) { + final int alive = match.getTeams().get(0).getAlivePlayers().size() - 1; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData != null && playerData.getOptions().getScoreboard() == ProfileOptionsItemState.SHOW_PING) { + strings.add(""); + if (opponentPlayer != null && !match.isPartyMatch() && !match.isFFA()) { + final PlayerData opponentData = this.plugin.getPlayerManager().getPlayerData(opponentPlayer.getUniqueId()); + if (opponentData != null) { + } + } + } + strings.add ( ChatColor.WHITE.toString () + "eu.udrop.club"); + strings.add(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "-------------------"); + return strings; + } +} + + diff --git a/dPractice/src/main/java/me/devkevin/practice/cache/StatusCache.java b/dPractice/src/main/java/me/devkevin/practice/cache/StatusCache.java new file mode 100644 index 0000000..44f8d5d --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/cache/StatusCache.java @@ -0,0 +1,88 @@ +package me.devkevin.practice.cache; + +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +public class StatusCache extends Thread { + private static StatusCache instance; + private int fighting; + private int queueing; + + public StatusCache() { + StatusCache.instance = this; + } + + public static StatusCache getInstance() { + return StatusCache.instance; + } + + @Override + public void run() { + while (true) { + int fighting = 0; + int queueing = 0; + for (final PlayerData playerData : Practice.getInstance().getPlayerManager().getAllData()) { + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + ++fighting; + } + if (playerData.getPlayerState() == PlayerState.QUEUE) { + ++queueing; + } + } + this.fighting = fighting; + this.queueing = queueing; + try { + Thread.sleep(500L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + public int getFighting() { + return this.fighting; + } + + public void setFighting(final int fighting) { + this.fighting = fighting; + } + + public int getQueueing() { + return this.queueing; + } + + public void setQueueing(final int queueing) { + this.queueing = queueing; + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof StatusCache)) { + return false; + } + final StatusCache other = (StatusCache) o; + return other.canEqual(this) && this.getFighting() == other.getFighting() && this.getQueueing() == other.getQueueing(); + } + + protected boolean canEqual(final Object other) { + return other instanceof StatusCache; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * 59 + this.getFighting(); + result = result * 59 + this.getQueueing(); + return result; + } + + @Override + public String toString() { + return "StatusCache(fighting=" + this.getFighting() + ", queueing=" + this.getQueueing() + ")"; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/FlyCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/FlyCommand.java new file mode 100644 index 0000000..5ff28c1 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/FlyCommand.java @@ -0,0 +1,46 @@ +package me.devkevin.practice.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +import java.util.Arrays; + +public class FlyCommand extends Command { + private final Practice plugin; + + public FlyCommand() { + super("fly"); + this.plugin = Practice.getInstance(); + this.setDescription("Toggles flight."); + this.setUsage(ChatColor.RED + "Usage: /fly"); + this.setAliases(Arrays.asList("flight")); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (!player.hasPermission("practice.fly")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + player.setAllowFlight(!player.getAllowFlight()); + if (player.getAllowFlight()) { + player.sendMessage(ChatColor.YELLOW + "Your flight has been enabled."); + } else { + player.sendMessage(ChatColor.YELLOW + "Your flight has been disabled."); + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/InvCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/InvCommand.java new file mode 100644 index 0000000..b3881ac --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/InvCommand.java @@ -0,0 +1,48 @@ +package me.devkevin.practice.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.inventory.InventorySnapshot; + +import java.util.UUID; +import java.util.regex.Pattern; + +public class InvCommand extends Command { + private static final Pattern UUID_PATTERN; + private static final String INVENTORY_NOT_FOUND; + + static { + UUID_PATTERN = Pattern.compile("[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"); + INVENTORY_NOT_FOUND = ChatColor.RED + "Cannot find the requested inventory. Maybe it expired?"; + } + + private final Practice plugin; + + public InvCommand() { + super("inventory"); + this.plugin = Practice.getInstance(); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + if (args.length == 0) { + return true; + } + if (!args[0].matches(InvCommand.UUID_PATTERN.pattern())) { + sender.sendMessage(InvCommand.INVENTORY_NOT_FOUND); + return true; + } + final InventorySnapshot snapshot = this.plugin.getInventoryManager().getSnapshot(UUID.fromString(args[0])); + if (snapshot == null) { + sender.sendMessage(InvCommand.INVENTORY_NOT_FOUND); + } else { + ((Player) sender).openInventory(snapshot.getInventoryUI().getCurrentPage()); + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/PartyCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/PartyCommand.java new file mode 100644 index 0000000..f6e7122 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/PartyCommand.java @@ -0,0 +1,327 @@ +package me.devkevin.practice.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.Clickable; +import me.devkevin.practice.util.StringUtil; + +import java.util.*; + +public class PartyCommand extends Command { + private static final String NOT_LEADER; + private static final String[] HELP_MESSAGE; + + static { + NOT_LEADER = ChatColor.RED + "You are not the leader of the party!"; + HELP_MESSAGE = new String[]{ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------", ChatColor.RED + "Party Commands:", ChatColor.GOLD + "(*) /party help " + ChatColor.GRAY + "- Displays the help menu", ChatColor.GOLD + "(*) /party create " + ChatColor.GRAY + "- Creates a party instance", ChatColor.GOLD + "(*) /party leave " + ChatColor.GRAY + "- Leave your current party", ChatColor.GOLD + "(*) /party info " + ChatColor.GRAY + "- Displays your party information", ChatColor.GOLD + "(*) /party join (player) " + ChatColor.GRAY + "- Join a party (invited or unlocked)", "", ChatColor.RED + "Leader Commands:", ChatColor.GOLD + "(*) /party open " + ChatColor.GRAY + "- Open your party for others to join", ChatColor.GOLD + "(*) /party lock " + ChatColor.GRAY + "- Lock your party for others to join", ChatColor.GOLD + "(*) /party setlimit (amount) " + ChatColor.GRAY + "- Set a limit to your party", ChatColor.GOLD + "(*) /party invite (player) " + ChatColor.GRAY + "- Invites a player to your party", ChatColor.GOLD + "(*) /party kick (player) " + ChatColor.GRAY + "- Kicks a player from your party", ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"}; + } + + private final Practice plugin; + + public PartyCommand() { + super("party"); + this.plugin = Practice.getInstance(); + this.setDescription("Party Command."); + this.setUsage(ChatColor.RED + "Usage: /party [player]"); + this.setAliases(Collections.singletonList("p")); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + final String subCommand = (args.length < 1) ? "help" : args[0]; + final String lowerCase = subCommand.toLowerCase(); + int n = -1; + switch (lowerCase.hashCode()) { + case -1352294148: + if (lowerCase.equals("create")) { + n = 0; + break; + } + break; + case 102846135: + if (lowerCase.equals("leave")) { + n = 1; + break; + } + break; + case 104433: + if (lowerCase.equals("inv")) { + n = 2; + break; + } + break; + case -1183699191: + if (lowerCase.equals("invite")) { + n = 3; + break; + } + break; + case -1423461112: + if (lowerCase.equals("accept")) { + n = 4; + break; + } + break; + case 3267882: + if (lowerCase.equals("join")) { + n = 5; + break; + } + break; + case 3291718: + if (lowerCase.equals("kick")) { + n = 6; + break; + } + break; + case 1427242137: + if (lowerCase.equals("setlimit")) { + n = 7; + break; + } + break; + case 3417674: + if (lowerCase.equals("open")) { + n = 8; + break; + } + break; + case 3327275: + if (lowerCase.equals("lock")) { + n = 9; + break; + } + break; + case 3237038: + if (lowerCase.equals("info")) { + n = 10; + break; + } + break; + } + switch (n) { + case 0: + if (party != null) { + player.sendMessage(ChatColor.RED + "You are already in a party."); + break; + } + if (playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + break; + } + this.plugin.getPartyManager().createParty(player); + break; + case 1: + if (party == null) { + player.sendMessage(ChatColor.RED + "You are not in a party."); + break; + } + if (playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + break; + } + this.plugin.getPartyManager().leaveParty(player); + break; + case 2: + case 3: { + if (party == null) { + player.sendMessage(ChatColor.RED + "You are not in a party."); + break; + } + if (!this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are not the leader of the party."); + break; + } + if (this.plugin.getTournamentManager().getTournament(player.getUniqueId()) != null) { + player.sendMessage(ChatColor.RED + "You are currently in a tournament."); + break; + } + if (args.length < 2) { + player.sendMessage(ChatColor.RED + "Usage: /party invite (player)"); + break; + } + if (party.isOpen()) { + player.sendMessage(ChatColor.RED + "This party is open, so anyone can join."); + break; + } + if (party.getMembers().size() >= party.getLimit()) { + player.sendMessage(ChatColor.RED + "Party size has reached it's limit"); + break; + } + if (party.getLeader() != player.getUniqueId()) { + player.sendMessage(PartyCommand.NOT_LEADER); + return true; + } + final Player target = this.plugin.getServer().getPlayer(args[1]); + if (target == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, args[1])); + return true; + } + final PlayerData targetData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (target.getUniqueId() == player.getUniqueId()) { + player.sendMessage(ChatColor.RED + "You can't invite yourself."); + } else if (this.plugin.getPartyManager().getParty(target.getUniqueId()) != null) { + player.sendMessage(ChatColor.RED + "That player is already in a party."); + } else if (targetData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "That player is currently busy."); + } else if (this.plugin.getPartyManager().hasPartyInvite(target.getUniqueId(), player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You have already sent a party invitation to this player, please wait."); + } else { + this.plugin.getPartyManager().createPartyInvite(player.getUniqueId(), target.getUniqueId()); + final Clickable partyInvite = new Clickable(ChatColor.GREEN + sender.getName() + ChatColor.YELLOW + " has invited you to their party! " + ChatColor.GRAY + "[Click to Accept]", ChatColor.GRAY + "Click to accept", "/party accept " + sender.getName()); + partyInvite.sendToPlayer(target); + party.broadcast(ChatColor.GREEN.toString() + ChatColor.BOLD + "[*] " + ChatColor.YELLOW + target.getName() + " has been invited to the party."); + } + break; + } + case 4: { + if (party != null) { + player.sendMessage(ChatColor.RED + "You are already in a party."); + break; + } + if (args.length < 2) { + player.sendMessage(ChatColor.RED + "Usage: /party accept ."); + break; + } + if (playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + break; + } + final Player target = this.plugin.getServer().getPlayer(args[1]); + if (target == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, args[1])); + return true; + } + final Party targetParty = this.plugin.getPartyManager().getParty(target.getUniqueId()); + if (targetParty == null) { + player.sendMessage(ChatColor.RED + "That player is not in a party."); + } else if (targetParty.getMembers().size() >= targetParty.getLimit()) { + player.sendMessage(ChatColor.RED + "Party size has reached it's limit"); + } else if (!this.plugin.getPartyManager().hasPartyInvite(player.getUniqueId(), targetParty.getLeader())) { + player.sendMessage(ChatColor.RED + "You do not have any pending requests."); + } else { + this.plugin.getPartyManager().joinParty(targetParty.getLeader(), player); + } + break; + } + case 5: { + if (party != null) { + player.sendMessage(ChatColor.RED + "You are already in a party."); + break; + } + if (args.length < 2) { + player.sendMessage(ChatColor.RED + "Usage: /party join ."); + break; + } + if (playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + break; + } + final Player target = this.plugin.getServer().getPlayer(args[1]); + if (target == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, args[1])); + return true; + } + final Party targetParty = this.plugin.getPartyManager().getParty(target.getUniqueId()); + if (targetParty == null || !targetParty.isOpen() || targetParty.getMembers().size() >= targetParty.getLimit()) { + player.sendMessage(ChatColor.RED + "You can't join this party."); + } else { + this.plugin.getPartyManager().joinParty(targetParty.getLeader(), player); + } + break; + } + case 6: { + if (party == null) { + player.sendMessage(ChatColor.RED + "You are not in a party."); + break; + } + if (args.length < 2) { + player.sendMessage(ChatColor.RED + "Usage: /party kick ."); + break; + } + if (party.getLeader() != player.getUniqueId()) { + player.sendMessage(PartyCommand.NOT_LEADER); + return true; + } + final Player target = this.plugin.getServer().getPlayer(args[1]); + if (target == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, args[1])); + return true; + } + final Party targetParty = this.plugin.getPartyManager().getParty(target.getUniqueId()); + if (targetParty == null || targetParty.getLeader() != party.getLeader()) { + player.sendMessage(ChatColor.RED + "That player is not in your party."); + } else { + this.plugin.getPartyManager().leaveParty(target); + } + break; + } + case 7: + if (party == null) { + player.sendMessage(ChatColor.RED + "You are not in a party."); + break; + } + if (args.length < 2) { + player.sendMessage(ChatColor.RED + "Usage: /party setlimit ."); + break; + } + if (party.getLeader() != player.getUniqueId()) { + player.sendMessage(PartyCommand.NOT_LEADER); + return true; + } + try { + final int limit = Integer.parseInt(args[1]); + if (limit < 2 || limit > 50) { + player.sendMessage(ChatColor.RED + "That is not a valid limit."); + } else { + party.setLimit(limit); + player.sendMessage(ChatColor.GREEN + "You have set the party player limit to " + ChatColor.YELLOW + limit + " players."); + } + } catch (NumberFormatException e) { + player.sendMessage(ChatColor.RED + "That is not a number."); + } + break; + case 8: + case 9: + if (party == null) { + player.sendMessage(ChatColor.RED + "You are not in a party."); + break; + } + if (party.getLeader() != player.getUniqueId()) { + player.sendMessage(PartyCommand.NOT_LEADER); + return true; + } + party.setOpen(!party.isOpen()); + party.broadcast(ChatColor.GREEN.toString() + ChatColor.BOLD + "[*] " + ChatColor.YELLOW + "Your party is now " + ChatColor.BOLD + (party.isOpen() ? "OPEN" : "LOCKED")); + break; + case 10: { + if (party == null) { + player.sendMessage(ChatColor.RED + "You are not in a party."); + break; + } + final List members = new ArrayList<>(party.getMembers()); + members.remove(party.getLeader()); + final StringBuilder builder = new StringBuilder(ChatColor.GOLD + "Members (" + party.getMembers().size() + "): "); + members.stream().map(this.plugin.getServer()::getPlayer).filter(Objects::nonNull).forEach(member -> builder.append(ChatColor.GRAY).append(member.getName()).append(",")); + final String[] information = {ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------", ChatColor.RED + "Party Information:", ChatColor.GOLD + "Leader: " + ChatColor.GRAY + this.plugin.getServer().getPlayer(party.getLeader()).getName(), ChatColor.GOLD + builder.toString(), ChatColor.GOLD + "Party State: " + ChatColor.GRAY + (party.isOpen() ? "Open" : "Locked"), ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"}; + player.sendMessage(information); + break; + } + default: + player.sendMessage(PartyCommand.HELP_MESSAGE); + break; + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/duel/AcceptCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/duel/AcceptCommand.java new file mode 100644 index 0000000..0bb3668 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/duel/AcceptCommand.java @@ -0,0 +1,105 @@ +package me.devkevin.practice.commands.duel; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.managers.PartyManager; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchRequest; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.queue.QueueType; +import me.devkevin.practice.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class AcceptCommand extends Command { + private final Practice plugin; + + public AcceptCommand() { + super("accept"); + this.plugin = Practice.getInstance(); + this.setDescription("Accept a player's duel."); + this.setUsage(ChatColor.RED + "Usage: /accept "); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (args.length < 1) { + player.sendMessage(this.usageMessage); + return true; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Unable to accept a duel within your duel."); + return true; + } + final Player target = this.plugin.getServer().getPlayer(args[0]); + if (target == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, args[0])); + return true; + } + if (player.getName().equals(target.getName())) { + player.sendMessage(ChatColor.RED + "You can't duel yourself."); + return true; + } + final PlayerData targetData = this.plugin.getPlayerManager().getPlayerData(target.getUniqueId()); + if (targetData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "That player is currently busy."); + return true; + } + MatchRequest request = this.plugin.getMatchManager().getMatchRequest(target.getUniqueId(), player.getUniqueId()); + if (args.length > 1) { + final Kit kit = this.plugin.getKitManager().getKit(args[1]); + if (kit != null) { + request = this.plugin.getMatchManager().getMatchRequest(target.getUniqueId(), player.getUniqueId(), kit.getName()); + } + } + if (request == null) { + player.sendMessage(ChatColor.RED + "You do not have any pending requests."); + return true; + } + if (request.getRequester().equals(target.getUniqueId())) { + final List playersA = new ArrayList(); + final List playersB = new ArrayList(); + final PartyManager partyManager = this.plugin.getPartyManager(); + final Party party = partyManager.getParty(player.getUniqueId()); + final Party targetParty = partyManager.getParty(target.getUniqueId()); + if (request.isParty()) { + if (party == null || targetParty == null || !partyManager.isLeader(target.getUniqueId()) || !partyManager.isLeader(target.getUniqueId())) { + player.sendMessage(ChatColor.RED + "That player is not a party leader."); + return true; + } + playersA.addAll(party.getMembers()); + playersB.addAll(targetParty.getMembers()); + } else { + if (party != null || targetParty != null) { + player.sendMessage(ChatColor.RED + "That player is already in a party."); + return true; + } + playersA.add(player.getUniqueId()); + playersB.add(target.getUniqueId()); + } + final Kit kit2 = this.plugin.getKitManager().getKit(request.getKitName()); + final MatchTeam teamA = new MatchTeam(target.getUniqueId(), playersB, 0); + final MatchTeam teamB = new MatchTeam(player.getUniqueId(), playersA, 1); + final Match match = new Match(request.getArena(), kit2, QueueType.UNRANKED, teamA, teamB); + final Player leaderA = this.plugin.getServer().getPlayer(teamA.getLeader()); + final Player leaderB = this.plugin.getServer().getPlayer(teamB.getLeader()); + final String teamMatch = match.isPartyMatch() ? "'s Party" : ""; + match.broadcast(ChatColor.YELLOW + "Starting duel match. " + ChatColor.GREEN + "(" + leaderA.getName() + teamMatch + " vs " + leaderB.getName() + teamMatch + ")"); + this.plugin.getMatchManager().createMatch(match); + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/duel/DuelCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/duel/DuelCommand.java new file mode 100644 index 0000000..8d07ff7 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/duel/DuelCommand.java @@ -0,0 +1,85 @@ +package me.devkevin.practice.commands.duel; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.StringUtil; + +public class DuelCommand extends Command { + private final Practice plugin; + + public DuelCommand() { + super("duel"); + this.plugin = Practice.getInstance(); + this.setDescription("Duel a player."); + this.setUsage(ChatColor.RED + "Usage: /duel "); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (args.length < 1) { + player.sendMessage(this.usageMessage); + return true; + } + if (this.plugin.getTournamentManager().getTournament(player.getUniqueId()) != null) { + player.sendMessage(ChatColor.RED + "You are currently in a tournament."); + return true; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + final Player target = this.plugin.getServer().getPlayer(args[0]); + if (target == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, args[0])); + return true; + } + if (this.plugin.getTournamentManager().getTournament(target.getUniqueId()) != null) { + player.sendMessage(ChatColor.RED + "That player is currently in a tournament."); + return true; + } + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + final Party targetParty = this.plugin.getPartyManager().getParty(target.getUniqueId()); + if (player.getName().equals(target.getName())) { + player.sendMessage(ChatColor.RED + "You can't duel yourself."); + return true; + } + if (party != null && targetParty != null && party == targetParty) { + player.sendMessage(ChatColor.RED + "You can't duel yourself."); + return true; + } + if (party != null && !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are not the leader fo the party."); + return true; + } + final PlayerData targetData = this.plugin.getPlayerManager().getPlayerData(target.getUniqueId()); + if (targetData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "That player is currently busy."); + return true; + } + if (!targetData.getOptions().isDuelRequests()) { + player.sendMessage(ChatColor.RED + "That player has ignored duel requests."); + return true; + } + if (party == null && targetParty != null) { + player.sendMessage(ChatColor.RED + "That player is currently in a party."); + return true; + } + if (party != null && targetParty == null) { + player.sendMessage(ChatColor.RED + "You are currently in a party."); + return true; + } + playerData.setDuelSelecting(target.getUniqueId()); + player.openInventory(this.plugin.getInventoryManager().getDuelInventory().getCurrentPage()); + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/duel/SpectateCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/duel/SpectateCommand.java new file mode 100644 index 0000000..9971652 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/duel/SpectateCommand.java @@ -0,0 +1,102 @@ +package me.devkevin.practice.commands.duel; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.events.oitc.OITCEvent; +import me.devkevin.practice.events.parkour.ParkourEvent; +import me.devkevin.practice.events.redrover.RedroverEvent; +import me.devkevin.practice.events.sumo.SumoEvent; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.StringUtil; + +import java.util.Arrays; + +public class SpectateCommand extends Command { + private final Practice plugin; + + public SpectateCommand() { + super("spectate"); + this.plugin = Practice.getInstance(); + this.setDescription("Spectate a player's match."); + this.setUsage(ChatColor.RED + "Usage: /spectate "); + this.setAliases(Arrays.asList("spec")); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (args.length < 1) { + player.sendMessage(this.usageMessage); + return true; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Party party = this.plugin.getPartyManager().getParty(playerData.getUniqueId()); + if (party != null || (playerData.getPlayerState() != PlayerState.SPAWN && playerData.getPlayerState() != PlayerState.SPECTATING)) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + final Player target = this.plugin.getServer().getPlayer(args[0]); + if (target == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, args[0])); + return true; + } + final PlayerData targetData = this.plugin.getPlayerManager().getPlayerData(target.getUniqueId()); + if (targetData.getPlayerState() == PlayerState.EVENT) { + final PracticeEvent event = this.plugin.getEventManager().getEventPlaying(target); + if (event == null) { + player.sendMessage(ChatColor.RED + "That player is currently not in an event."); + return true; + } + if (event instanceof SumoEvent) { + player.performCommand("eventspectate Sumo"); + } else if (event instanceof OITCEvent) { + player.performCommand("eventspectate OITC"); + } else if (event instanceof ParkourEvent) { + player.performCommand("eventspectate Parkour"); + } else if (event instanceof RedroverEvent) { + player.performCommand("eventspectate Redrover"); + } + return true; + } else { + if (targetData.getPlayerState() != PlayerState.FIGHTING) { + player.sendMessage(ChatColor.RED + "That player is currently not in a fight."); + return true; + } + final Match targetMatch = this.plugin.getMatchManager().getMatch(targetData); + if (!targetMatch.isParty()) { + if (!targetData.getOptions().isSpectators() && !player.hasPermission("practice.staff")) { + player.sendMessage(ChatColor.RED + "That player has ignored spectators."); + return true; + } + final MatchTeam team = targetMatch.getTeams().get(0); + final MatchTeam team2 = targetMatch.getTeams().get(1); + final PlayerData otherPlayerData = this.plugin.getPlayerManager().getPlayerData((team.getPlayers().get(0) == target.getUniqueId()) ? team2.getPlayers().get(0) : team.getPlayers().get(0)); + if (otherPlayerData != null && !otherPlayerData.getOptions().isSpectators() && !player.hasPermission("practice.staff")) { + player.sendMessage(ChatColor.RED + "That player has ignored spectators."); + return true; + } + } + if (playerData.getPlayerState() == PlayerState.SPECTATING) { + final Match match = this.plugin.getMatchManager().getSpectatingMatch(player.getUniqueId()); + if (match.equals(targetMatch)) { + player.sendMessage(ChatColor.RED + "You are already spectating this player."); + return true; + } + match.removeSpectator(player.getUniqueId()); + } + player.sendMessage(ChatColor.GREEN + "You are now spectating " + ChatColor.GRAY + target.getName() + ChatColor.GREEN + "."); + this.plugin.getMatchManager().addSpectator(player, playerData, target, targetMatch); + return true; + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/event/EventManagerCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/event/EventManagerCommand.java new file mode 100644 index 0000000..314407c --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/event/EventManagerCommand.java @@ -0,0 +1,58 @@ +package me.devkevin.practice.commands.event; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.EventState; +import me.devkevin.practice.events.PracticeEvent; + +public class EventManagerCommand extends Command { + private final Practice plugin; + + public EventManagerCommand() { + super("eventmanager"); + this.plugin = Practice.getInstance(); + this.setDescription("Manage an event."); + this.setUsage(ChatColor.RED + "Usage: /eventmanager "); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (!player.hasPermission("practice.admin")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + if (args.length < 2) { + player.sendMessage(this.usageMessage); + return true; + } + final String action = args[0]; + final String eventName = args[1]; + if (this.plugin.getEventManager().getByName(eventName) == null) { + player.sendMessage(ChatColor.RED + "That event doesn't exist."); + return true; + } + final PracticeEvent event = this.plugin.getEventManager().getByName(eventName); + if (action.toUpperCase().equalsIgnoreCase("START") && event.getState() == EventState.WAITING) { + event.getCountdownTask().setTimeUntilStart(5); + player.sendMessage(ChatColor.RED + "Event was force started."); + } else if (action.toUpperCase().equalsIgnoreCase("END") && event.getState() == EventState.STARTED) { + event.end(); + player.sendMessage(ChatColor.RED + "Event was cancelled."); + } else if (action.toUpperCase().equalsIgnoreCase("STATUS")) { + final String[] message = {ChatColor.YELLOW + "Event: " + ChatColor.WHITE + event.getName(), ChatColor.YELLOW + "Host: " + ChatColor.WHITE + ((event.getHost() == null) ? "Player Left" : event.getHost().getName()), ChatColor.YELLOW + "Players: " + ChatColor.WHITE + event.getPlayers().size() + "/" + event.getLimit(), ChatColor.YELLOW + "State: " + ChatColor.WHITE + event.getState().name()}; + player.sendMessage(message); + } else if (action.toUpperCase().equalsIgnoreCase("COOLDOWN")) { + this.plugin.getEventManager().setCooldown(0L); + player.sendMessage(ChatColor.RED + "Event cooldown was cancelled."); + } else { + player.sendMessage(this.usageMessage); + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/event/HostCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/event/HostCommand.java new file mode 100644 index 0000000..eca2cce --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/event/HostCommand.java @@ -0,0 +1,77 @@ +package me.devkevin.practice.commands.event; + +import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.EventState; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.util.Clickable; + +public class HostCommand extends Command { + private final Practice plugin; + + public HostCommand() { + super("host"); + this.plugin = Practice.getInstance(); + this.setDescription("Host an event."); + this.setUsage(ChatColor.RED + "Usage: /host "); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (!player.hasPermission("practice.host")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + if (args.length < 1) { + player.sendMessage(this.usageMessage); + return true; + } + final String eventName = args[0]; + if (eventName == null) { + return true; + } + if (this.plugin.getEventManager().getByName(eventName) == null) { + player.sendMessage(ChatColor.RED + "That event doesn't exist."); + player.sendMessage(ChatColor.RED + "Available events: Sumo, OITC, Parkour, Redrover"); + return true; + } + if (eventName.toUpperCase().equalsIgnoreCase("REDROVER")) { + player.sendMessage(ChatColor.RED + "This event is currently disabled."); + return true; + } + if (System.currentTimeMillis() < this.plugin.getEventManager().getCooldown()) { + player.sendMessage(ChatColor.RED + "There is a cooldown. Event can't start at this moment."); + return true; + } + final PracticeEvent event = this.plugin.getEventManager().getByName(eventName); + if (event.getState() != EventState.UNANNOUNCED) { + player.sendMessage(ChatColor.RED + "There is currently an active event."); + return true; + } + final boolean eventBeingHosted = this.plugin.getEventManager().getEvents().values().stream().anyMatch(e -> e.getState() != EventState.UNANNOUNCED); + if (eventBeingHosted) { + player.sendMessage(ChatColor.RED + "There is currently an active event."); + return true; + } + final String toSend = ChatColor.YELLOW.toString() + ChatColor.BOLD + "(Event) " + ChatColor.GREEN + "" + event.getName() + " is starting soon. " + ChatColor.GRAY + "[Join]"; + final Clickable message = new Clickable(toSend, ChatColor.GRAY + "Click to join this event.", "/join " + event.getName()); + this.plugin.getServer().getOnlinePlayers().forEach(message::sendToPlayer); + event.setLimit(50); + if (args.length == 2 && player.hasPermission("practice.host.unlimited")) { + if (!NumberUtils.isNumber(args[1])) { + player.sendMessage(ChatColor.RED + "That's not a correct amount."); + return true; + } + event.setLimit(Integer.parseInt(args[1])); + } + Practice.getInstance().getEventManager().hostEvent(event, player); + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/event/JoinEventCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/event/JoinEventCommand.java new file mode 100644 index 0000000..e47f35a --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/event/JoinEventCommand.java @@ -0,0 +1,101 @@ +package me.devkevin.practice.commands.event; + +import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.EventState; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.tournament.Tournament; +import me.devkevin.practice.tournament.TournamentState; + +public class JoinEventCommand extends Command { + private final Practice plugin; + + public JoinEventCommand() { + super("join"); + this.plugin = Practice.getInstance(); + this.setDescription("Join an event or tournament."); + this.setUsage(ChatColor.RED + "Usage: /join "); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (args.length < 1) { + player.sendMessage(this.usageMessage); + return true; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (this.plugin.getPartyManager().getParty(playerData.getUniqueId()) != null || playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + final boolean inTournament = this.plugin.getTournamentManager().isInTournament(player.getUniqueId()); + final boolean inEvent = this.plugin.getEventManager().getEventPlaying(player) != null; + final String eventId = args[0].toLowerCase(); + if (!NumberUtils.isNumber(eventId)) { + final PracticeEvent event = this.plugin.getEventManager().getByName(eventId); + if (inTournament) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + if (event == null) { + player.sendMessage(ChatColor.RED + "That event doesn't exist."); + return true; + } + if (event.getState() != EventState.WAITING) { + player.sendMessage(ChatColor.RED + "That event is currently not available."); + return true; + } + if (event.getPlayers().containsKey(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are already in this event."); + return true; + } + if (event.getPlayers().size() >= event.getLimit() && !player.hasPermission("practice.joinevent.bypass")) { + player.sendMessage(ChatColor.RED + "Sorry! The event is already full."); + } + event.join(player); + return true; + } else { + if (inEvent) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + if (this.plugin.getTournamentManager().isInTournament(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are currently in a tournament."); + return true; + } + final int id = Integer.parseInt(eventId); + final Tournament tournament = this.plugin.getTournamentManager().getTournament(Integer.valueOf(id)); + if (tournament != null) { + if (tournament.getTeamSize() > 1) { + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party != null && party.getMembers().size() != tournament.getTeamSize()) { + player.sendMessage(ChatColor.RED + "The party size must be of " + tournament.getTeamSize() + " players."); + return true; + } + } + if (tournament.getSize() > tournament.getPlayers().size()) { + if ((tournament.getTournamentState() == TournamentState.WAITING || tournament.getTournamentState() == TournamentState.STARTING) && tournament.getCurrentRound() == 1) { + this.plugin.getTournamentManager().joinTournament(id, player); + } else { + player.sendMessage(ChatColor.RED + "Sorry! The tournament already started."); + } + } else { + player.sendMessage(ChatColor.RED + "Sorry! The tournament is already full."); + } + } else { + player.sendMessage(ChatColor.RED + "That tournament doesn't exist."); + } + return true; + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/event/LeaveEventCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/event/LeaveEventCommand.java new file mode 100644 index 0000000..63f1100 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/event/LeaveEventCommand.java @@ -0,0 +1,57 @@ +package me.devkevin.practice.commands.event; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.tournament.Tournament; + +public class LeaveEventCommand extends Command { + private final Practice plugin; + + public LeaveEventCommand() { + super("leave"); + this.plugin = Practice.getInstance(); + this.setDescription("Leave an event or tournament."); + this.setUsage(ChatColor.RED + "Usage: /leave"); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + final boolean inTournament = this.plugin.getTournamentManager().isInTournament(player.getUniqueId()); + final boolean inEvent = this.plugin.getEventManager().getEventPlaying(player) != null; + if (inEvent) { + this.leaveEvent(player); + } else if (inTournament) { + this.leaveTournament(player); + } else { + player.sendMessage(ChatColor.RED + "There is nothing to leave."); + } + return true; + } + + private void leaveTournament(final Player player) { + final Tournament tournament = this.plugin.getTournamentManager().getTournament(player.getUniqueId()); + if (tournament != null) { + this.plugin.getTournamentManager().leaveTournament(player); + } + } + + private void leaveEvent(final Player player) { + final PracticeEvent event = this.plugin.getEventManager().getEventPlaying(player); + if (event == null) { + player.sendMessage(ChatColor.RED + "That event doesn't exist."); + return; + } + if (!this.plugin.getEventManager().isPlaying(player, event)) { + player.sendMessage(ChatColor.RED + "You are not in an event."); + return; + } + event.leave(player); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/event/SpectateEventCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/event/SpectateEventCommand.java new file mode 100644 index 0000000..88afdf1 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/event/SpectateEventCommand.java @@ -0,0 +1,74 @@ +package me.devkevin.practice.commands.event; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.EventState; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.events.oitc.OITCEvent; +import me.devkevin.practice.events.parkour.ParkourEvent; +import me.devkevin.practice.events.redrover.RedroverEvent; +import me.devkevin.practice.events.sumo.SumoEvent; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +import java.util.Arrays; + +public class SpectateEventCommand extends Command { + private final Practice plugin; + + public SpectateEventCommand() { + super("eventspectate"); + this.plugin = Practice.getInstance(); + this.setDescription("Spectate an event."); + this.setUsage(ChatColor.RED + "Usage: /eventspectate "); + this.setAliases(Arrays.asList("eventspec", "specevent")); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (args.length < 1) { + player.sendMessage(this.usageMessage); + return true; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Party party = this.plugin.getPartyManager().getParty(playerData.getUniqueId()); + if (party != null || (playerData.getPlayerState() != PlayerState.SPAWN && playerData.getPlayerState() != PlayerState.SPECTATING)) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + final PracticeEvent event = this.plugin.getEventManager().getByName(args[0]); + if (event == null) { + player.sendMessage(ChatColor.RED + "That player is currently not in an event."); + return true; + } + if (event.getState() != EventState.STARTED) { + player.sendMessage(ChatColor.RED + "That event hasn't started, please wait."); + return true; + } + if (playerData.getPlayerState() == PlayerState.SPECTATING) { + if (this.plugin.getEventManager().getSpectators().containsKey(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are already spectating this event."); + return true; + } + this.plugin.getEventManager().removeSpectator(player); + } + player.sendMessage(ChatColor.GREEN + "You are now spectating " + ChatColor.GRAY + event.getName() + " Event" + ChatColor.GREEN + "."); + if (event instanceof SumoEvent) { + this.plugin.getEventManager().addSpectatorSumo(player, playerData, (SumoEvent) event); + } else if (event instanceof OITCEvent) { + this.plugin.getEventManager().addSpectatorOITC(player, playerData, (OITCEvent) event); + } else if (event instanceof ParkourEvent) { + this.plugin.getEventManager().addSpectatorParkour(player, playerData, (ParkourEvent) event); + } else if (event instanceof RedroverEvent) { + this.plugin.getEventManager().addSpectatorRedrover(player, playerData, (RedroverEvent) event); + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/event/StatusEventCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/event/StatusEventCommand.java new file mode 100644 index 0000000..831ab89 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/event/StatusEventCommand.java @@ -0,0 +1,69 @@ +package me.devkevin.practice.commands.event; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.tournament.Tournament; +import me.devkevin.practice.util.Clickable; + +import java.util.UUID; + +public class StatusEventCommand extends Command { + private final Practice plugin; + + public StatusEventCommand() { + super("status"); + this.plugin = Practice.getInstance(); + this.setDescription("Show an event or tournament status."); + this.setUsage(ChatColor.RED + "Usage: /status"); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + if (this.plugin.getTournamentManager().getTournaments().size() == 0) { + player.sendMessage(ChatColor.RED + "There is no available tournaments."); + return true; + } + for (final Tournament tournament : this.plugin.getTournamentManager().getTournaments().values()) { + if (tournament == null) { + player.sendMessage(ChatColor.RED + "This tournament doesn't exist."); + return true; + } + player.sendMessage(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"); + player.sendMessage(" "); + player.sendMessage(ChatColor.YELLOW.toString() + "Tournament (" + tournament.getTeamSize() + "v" + tournament.getTeamSize() + ") " + ChatColor.GOLD.toString() + tournament.getKitName()); + if (tournament.getMatches().size() == 0) { + player.sendMessage(ChatColor.RED + "There is no available matches."); + player.sendMessage(" "); + player.sendMessage(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"); + return true; + } + for (final UUID matchUUID : tournament.getMatches()) { + final Match match = this.plugin.getMatchManager().getMatchFromUUID(matchUUID); + final MatchTeam teamA = match.getTeams().get(0); + final MatchTeam teamB = match.getTeams().get(1); + final String teamANames = (tournament.getTeamSize() > 1) ? (teamA.getLeaderName() + "'s Party") : teamA.getLeaderName(); + final String teamBNames = (tournament.getTeamSize() > 1) ? (teamB.getLeaderName() + "'s Party") : teamB.getLeaderName(); + final Clickable clickable = new Clickable(ChatColor.WHITE.toString() + ChatColor.BOLD + "* " + ChatColor.GOLD.toString() + teamANames + " vs " + teamBNames + ChatColor.DARK_GRAY + " | " + ChatColor.GRAY + "[Click to Spectate]", ChatColor.GRAY + "Click to spectate", "/spectate " + teamA.getLeaderName()); + clickable.sendToPlayer(player); + } + player.sendMessage(" "); + player.sendMessage(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"); + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/management/ArenaCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/management/ArenaCommand.java new file mode 100644 index 0000000..03531ff --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/management/ArenaCommand.java @@ -0,0 +1,228 @@ +package me.devkevin.practice.commands.management; + +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.runnable.ArenaCommandRunnable; + +public class ArenaCommand extends Command { + private static final String NO_ARENA; + + static { + NO_ARENA = ChatColor.RED + "That arena doesn't exist!"; + } + + private final Practice plugin; + + public ArenaCommand() { + super("arena"); + this.plugin = Practice.getInstance(); + this.setDescription("Arenas command."); + this.setUsage(ChatColor.RED + "Usage: /arena [args]"); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (!player.hasPermission("practice.admin")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + if (args.length < 2) { + sender.sendMessage(this.usageMessage); + return true; + } + final Arena arena = this.plugin.getArenaManager().getArena(args[1]); + final String lowerCase = args[0].toLowerCase(); + int n = -1; + switch (lowerCase.hashCode()) { + case -1352294148: + if (lowerCase.equals("create")) { + n = 0; + break; + } + break; + case -1335458389: + if (lowerCase.equals("delete")) { + n = 1; + break; + } + break; + case 97: + if (lowerCase.equals("a")) { + n = 2; + break; + } + break; + case 98: + if (lowerCase.equals("b")) { + n = 3; + break; + } + break; + case 108114: + if (lowerCase.equals("min")) { + n = 4; + break; + } + break; + case 107876: + if (lowerCase.equals("max")) { + n = 5; + break; + } + break; + case 1671308008: + if (lowerCase.equals("disable")) { + n = 6; + break; + } + break; + case -1298848381: + if (lowerCase.equals("enable")) { + n = 7; + break; + } + break; + case 1810371957: + if (lowerCase.equals("generate")) { + n = 8; + break; + } + break; + case 3522941: + if (lowerCase.equals("save")) { + n = 9; + break; + } + break; + case -1081434779: + if (lowerCase.equals("manage")) { + n = 10; + break; + } + break; + case 3198785: + if (lowerCase.equals("help")) { + n = 11; + break; + } + break; + } + switch (n) { + case 0: + if (arena == null) { + this.plugin.getArenaManager().createArena(args[1]); + sender.sendMessage(ChatColor.GREEN + "Successfully created arena " + args[1] + "."); + break; + } + sender.sendMessage(ChatColor.RED + "That arena already exists!"); + break; + case 1: + if (arena != null) { + this.plugin.getArenaManager().deleteArena(args[1]); + sender.sendMessage(ChatColor.GREEN + "Successfully deleted arena " + args[1] + "."); + break; + } + sender.sendMessage(ArenaCommand.NO_ARENA); + break; + case 2: + if (arena != null) { + final Location location = player.getLocation(); + if (args.length < 3 || !args[2].equalsIgnoreCase("-e")) { + location.setX((double) location.getBlockX() + 0.5); + location.setY((double) location.getBlockY() + 3.0); + location.setZ((double) location.getBlockZ() + 0.5); + } + arena.setA(CustomLocation.fromBukkitLocation(location)); + sender.sendMessage(ChatColor.GREEN + "Successfully set position A for arena " + args[1] + "."); + break; + } + sender.sendMessage(ArenaCommand.NO_ARENA); + break; + case 3: + if (arena != null) { + final Location location = player.getLocation(); + if (args.length < 3 || !args[2].equalsIgnoreCase("-e")) { + location.setX((double) location.getBlockX() + 0.5); + location.setY((double) location.getBlockY() + 3.0); + location.setZ((double) location.getBlockZ() + 0.5); + } + arena.setB(CustomLocation.fromBukkitLocation(location)); + sender.sendMessage(ChatColor.GREEN + "Successfully set position B for arena " + args[1] + "."); + break; + } + sender.sendMessage(ArenaCommand.NO_ARENA); + break; + case 4: + if (arena != null) { + arena.setMin(CustomLocation.fromBukkitLocation(player.getLocation())); + sender.sendMessage(ChatColor.GREEN + "Successfully set minimum position for arena " + args[1] + "."); + break; + } + sender.sendMessage(ArenaCommand.NO_ARENA); + break; + case 5: + if (arena != null) { + arena.setMax(CustomLocation.fromBukkitLocation(player.getLocation())); + sender.sendMessage(ChatColor.GREEN + "Successfully set maximum position for arena " + args[1] + "."); + break; + } + sender.sendMessage(ArenaCommand.NO_ARENA); + break; + case 6: + case 7: + if (arena != null) { + arena.setEnabled(!arena.isEnabled()); + sender.sendMessage(arena.isEnabled() ? (ChatColor.GREEN + "Successfully enabled arena " + args[1] + ".") : (ChatColor.RED + "Successfully disabled arena " + args[1] + ".")); + break; + } + sender.sendMessage(ArenaCommand.NO_ARENA); + break; + case 8: + if (args.length == 3) { + final int arenas = Integer.parseInt(args[2]); + this.plugin.getServer().getScheduler().runTask(this.plugin, new ArenaCommandRunnable(this.plugin, arena, arenas)); + this.plugin.getArenaManager().setGeneratingArenaRunnables(this.plugin.getArenaManager().getGeneratingArenaRunnables() + 1); + break; + } + sender.sendMessage(ChatColor.RED + "Usage: /arena generate "); + break; + case 9: + this.plugin.getArenaManager().reloadArenas(); + sender.sendMessage(ChatColor.GREEN + "Successfully reloaded the arenas."); + break; + case 10: + this.plugin.getArenaManager().openArenaSystemUI(player); + break; + case 11: + sender.sendMessage(""); + sender.sendMessage(ChatColor.RED + "Arena Help"); + sender.sendMessage(""); + sender.sendMessage(ChatColor.RED + "/arena create - Create Arena"); + sender.sendMessage(ChatColor.RED + "/arena delete - Delete Arena"); + sender.sendMessage(ChatColor.RED + "/arena a - Set A position for Arena"); + sender.sendMessage(ChatColor.RED + "/arena b - Set B position for Arena"); + sender.sendMessage(ChatColor.RED + "/arena min - Set bottom corner location"); + sender.sendMessage(ChatColor.RED + "/arena max - Set top corner location"); + sender.sendMessage(ChatColor.RED + "/arena enable - Enable Arena"); + sender.sendMessage(ChatColor.RED + "/arena disable - Disable Arena"); + sender.sendMessage(ChatColor.RED + "/arena generate - Generate Arena"); + sender.sendMessage(ChatColor.RED + "/arena save - Save Arena"); + sender.sendMessage(ChatColor.RED + "/arena manage - Open Arena GUI"); + sender.sendMessage(""); + break; + default: + sender.sendMessage(this.usageMessage); + break; + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/management/KitCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/management/KitCommand.java new file mode 100644 index 0000000..8fb16e3 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/management/KitCommand.java @@ -0,0 +1,379 @@ +package me.devkevin.practice.commands.management; + +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.managers.PlayerManager; +import me.devkevin.practice.util.ItemUtil; + +public class KitCommand extends Command { + private static final String NO_KIT; + private static final String NO_ARENA; + + static { + NO_KIT = ChatColor.RED + "That kit doesn't exist!"; + NO_ARENA = ChatColor.RED + "That arena doesn't exist!"; + } + + private final Practice plugin; + private PlayerManager playerManager; + + public KitCommand() { + super("kit"); + this.plugin = Practice.getInstance(); + this.setDescription("Kit command."); + this.setUsage(ChatColor.RED + "Usage: /kit [args]"); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (!player.hasPermission("practice.admin")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + if (args.length < 2) { + sender.sendMessage(this.usageMessage); + return true; + } + final Kit kit = this.plugin.getKitManager().getKit(args[1]); + final String lowerCase = args[0].toLowerCase(); + int n = -1; + switch (lowerCase.hashCode()) { + case -1352294148: + if (lowerCase.equals("create")) { + n = 0; + break; + } + break; + case -1335458389: + if (lowerCase.equals("delete")) { + n = 1; + break; + } + break; + case 1671308008: + if (lowerCase.equals("disable")) { + n = 2; + break; + } + break; + case -1298848381: + if (lowerCase.equals("enable")) { + n = 3; + break; + } + break; + case 94843278: + if (lowerCase.equals("combo")) { + n = 4; + break; + } + break; + case 3541892: + if (lowerCase.equals("sumo")) { + n = 5; + break; + } + break; + case 94094958: + if (lowerCase.equals("build")) { + n = 6; + break; + } + break; + case -895862857: + if (lowerCase.equals("spleef")) { + n = 7; + break; + } + break; + case -793195742: + if (lowerCase.equals("parkour")) { + n = 8; + break; + } + break; + case -938279477: + if (lowerCase.equals("ranked")) { + n = 9; + break; + } + break; + case 885730842: + if (lowerCase.equals("excludearenafromallkitsbut")) { + n = 10; + break; + } + break; + case -1353843347: + if (lowerCase.equals("excludearena")) { + n = 11; + break; + } + break; + case -1695541472: + if (lowerCase.equals("whitelistarena")) { + n = 12; + break; + } + break; + case 3226745: + if (lowerCase.equals("icon")) { + n = 13; + break; + } + break; + case -905779121: + if (lowerCase.equals("setinv")) { + n = 14; + break; + } + break; + case -1249328933: + if (lowerCase.equals("getinv")) { + n = 15; + break; + } + break; + case -578951419: + if (lowerCase.equals("seteditinv")) { + n = 16; + break; + } + break; + case 1779210641: + if (lowerCase.equals("geteditinv")) { + n = 17; + break; + } + break; + case 3198785: + if (lowerCase.equals("help")) { + n = 18; + break; + } + break; + } + switch (n) { + case 0: + if (kit == null) { + this.plugin.getKitManager().createKit(args[1]); + sender.sendMessage(ChatColor.GREEN + "Successfully created kit " + args[1] + "."); + break; + } + sender.sendMessage(ChatColor.RED + "That kit already exists!"); + break; + case 1: + if (kit != null) { + this.plugin.getKitManager().deleteKit(args[1]); + sender.sendMessage(ChatColor.GREEN + "Successfully deleted kit " + args[1] + "."); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 2: + case 3: + if (kit != null) { + kit.setEnabled(!kit.isEnabled()); + sender.sendMessage(kit.isEnabled() ? (ChatColor.GREEN + "Successfully enabled kit " + args[1] + ".") : (ChatColor.RED + "Successfully disabled kit " + args[1] + ".")); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 4: + if (kit != null) { + kit.setCombo(!kit.isCombo()); + sender.sendMessage(kit.isCombo() ? (ChatColor.GREEN + "Successfully enabled combo mode for kit " + args[1] + ".") : (ChatColor.RED + "Successfully disabled combo mode for kit " + args[1] + ".")); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 5: + if (kit != null) { + kit.setSumo(!kit.isSumo()); + sender.sendMessage(kit.isSumo() ? (ChatColor.GREEN + "Successfully enabled sumo mode for kit " + args[1] + ".") : (ChatColor.RED + "Successfully disabled sumo mode for kit " + args[1] + ".")); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 6: + if (kit != null) { + kit.setBuild(!kit.isBuild()); + sender.sendMessage(kit.isBuild() ? (ChatColor.GREEN + "Successfully enabled build mode for kit " + args[1] + ".") : (ChatColor.RED + "Successfully disabled build mode for kit " + args[1] + ".")); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 7: + if (kit != null) { + kit.setSpleef(!kit.isSpleef()); + sender.sendMessage(kit.isSpleef() ? (ChatColor.GREEN + "Successfully enabled spleef mode for kit " + args[1] + ".") : (ChatColor.RED + "Successfully disabled spleef mode for kit " + args[1] + ".")); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 8: + if (kit != null) { + kit.setParkour(!kit.isParkour()); + sender.sendMessage(kit.isParkour() ? (ChatColor.GREEN + "Successfully enabled parkour mode for kit " + args[1] + ".") : (ChatColor.RED + "Successfully disabled parkour mode for kit " + args[1] + ".")); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 9: + if (kit != null) { + kit.setRanked(!kit.isRanked()); + sender.sendMessage(kit.isRanked() ? (ChatColor.GREEN + "Successfully enabled ranked mode for kit " + args[1] + ".") : (ChatColor.RED + "Successfully disabled ranked mode for kit " + args[1] + ".")); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 10: + if (args.length < 2) { + sender.sendMessage(this.usageMessage); + return true; + } + if (kit != null) { + final Arena arena = this.plugin.getArenaManager().getArena(args[2]); + if (arena != null) { + for (final Kit loopKit : this.plugin.getKitManager().getKits()) { + if (!loopKit.equals(kit)) { + player.performCommand("kit excludearena " + loopKit.getName() + " " + arena.getName()); + } + } + } else { + sender.sendMessage(KitCommand.NO_ARENA); + } + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 11: + if (args.length < 3) { + sender.sendMessage(this.usageMessage); + return true; + } + if (kit != null) { + final Arena arena = this.plugin.getArenaManager().getArena(args[2]); + if (arena != null) { + kit.excludeArena(arena.getName()); + sender.sendMessage(kit.getExcludedArenas().contains(arena.getName()) ? (ChatColor.GREEN + "Arena " + arena.getName() + " is now excluded from kit " + args[1] + ".") : (ChatColor.GREEN + "Arena " + arena.getName() + " is no longer excluded from kit " + args[1] + ".")); + } else { + sender.sendMessage(KitCommand.NO_ARENA); + } + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 12: + if (args.length < 3) { + sender.sendMessage(this.usageMessage); + return true; + } + if (kit != null) { + final Arena arena = this.plugin.getArenaManager().getArena(args[2]); + if (arena != null) { + kit.whitelistArena(arena.getName()); + sender.sendMessage(kit.getArenaWhiteList().contains(arena.getName()) ? (ChatColor.GREEN + "Arena " + arena.getName() + " is now whitelisted to kit " + args[1] + ".") : (ChatColor.GREEN + "Arena " + arena.getName() + " is no longer whitelisted to kit " + args[1] + ".")); + } else { + sender.sendMessage(KitCommand.NO_ARENA); + } + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 13: + if (kit == null) { + sender.sendMessage(KitCommand.NO_KIT); + break; + } + if (player.getItemInHand().getType() != Material.AIR) { + final ItemStack icon = ItemUtil.renameItem(player.getItemInHand().clone(), ChatColor.GREEN + kit.getName()); + kit.setIcon(icon); + sender.sendMessage(ChatColor.GREEN + "Successfully set icon for kit " + args[1] + "."); + break; + } + player.sendMessage(ChatColor.RED + "You must be holding an item to set the kit icon!"); + break; + case 14: + if (kit == null) { + sender.sendMessage(KitCommand.NO_KIT); + break; + } + if (player.getGameMode() == GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "You can't set item contents in creative mode!"); + break; + } + player.updateInventory(); + kit.setContents(player.getInventory().getContents()); + kit.setArmor(player.getInventory().getArmorContents()); + sender.sendMessage(ChatColor.GREEN + "Successfully set kit contents for " + args[1] + "."); + break; + case 15: + if (kit != null) { + player.getInventory().setContents(kit.getContents()); + player.getInventory().setArmorContents(kit.getArmor()); + player.updateInventory(); + sender.sendMessage(ChatColor.GREEN + "Successfully retrieved kit contents from " + args[1] + "."); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 16: + if (kit == null) { + sender.sendMessage(KitCommand.NO_KIT); + break; + } + if (player.getGameMode() == GameMode.CREATIVE) { + sender.sendMessage(ChatColor.RED + "You can't set item contents in creative mode!"); + break; + } + player.updateInventory(); + kit.setKitEditContents(player.getInventory().getContents()); + sender.sendMessage(ChatColor.GREEN + "Successfully set edit kit contents for " + args[1] + "."); + break; + case 17: + if (kit != null) { + player.getInventory().setContents(kit.getKitEditContents()); + player.updateInventory(); + sender.sendMessage(ChatColor.GREEN + "Successfully retrieved edit kit contents from " + args[1] + "."); + break; + } + sender.sendMessage(KitCommand.NO_KIT); + break; + case 18: + sender.sendMessage(""); + sender.sendMessage(ChatColor.RED + "Kit Help"); + sender.sendMessage(""); + sender.sendMessage(ChatColor.RED + "/kit create - Create Kit"); + sender.sendMessage(ChatColor.RED + "/kit delete - Delete Kit"); + sender.sendMessage(ChatColor.RED + "/kit enable - Enable Kit"); + sender.sendMessage(ChatColor.RED + "/kit disable - Disable Kit"); + sender.sendMessage(ChatColor.RED + "/kit combo - Combo Mode Kit"); + sender.sendMessage(ChatColor.RED + "/kit build - Build Mode Kit"); + sender.sendMessage(ChatColor.RED + "/kit sumo - Sumo Mode Kit"); + sender.sendMessage(ChatColor.RED + "/kit spleef - Spleef Mode Kit"); + sender.sendMessage(ChatColor.RED + "/kit parkour - Parkour Mode Kit"); + sender.sendMessage(ChatColor.RED + "/kit ranked - Enable ranked matchs for Kit"); + sender.sendMessage(ChatColor.RED + "/kit whitelistarena - Whitelist arena for Kit"); + sender.sendMessage(ChatColor.RED + "/kit icon - Set Icon for Kit"); + sender.sendMessage(ChatColor.RED + "/kit setinv - Set Inventory for Kit"); + sender.sendMessage(""); + break; + default: + sender.sendMessage(this.usageMessage); + break; + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/management/ResetStatsCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/management/ResetStatsCommand.java new file mode 100644 index 0000000..d84d1e5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/management/ResetStatsCommand.java @@ -0,0 +1,47 @@ +package me.devkevin.practice.commands.management; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.util.StringUtil; + +public class ResetStatsCommand extends Command { + private final Practice plugin; + + public ResetStatsCommand() { + super("reset"); + this.plugin = Practice.getInstance(); + this.setUsage(ChatColor.RED + "Usage: /reset [player]"); + } + + public boolean execute(final CommandSender commandSender, final String s, final String[] args) { + if (commandSender instanceof Player) { + final Player player = (Player) commandSender; + if (!player.hasPermission("practice.admin")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + } + if (args.length == 0) { + commandSender.sendMessage(ChatColor.RED + "Usage: /reset "); + return true; + } + final Player target = this.plugin.getServer().getPlayer(args[0]); + if (target == null) { + commandSender.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, args[0])); + return true; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(target.getUniqueId()); + for (final Kit kit : this.plugin.getKitManager().getKits()) { + playerData.setElo(kit.getName(), 1000); + playerData.setLosses(kit.getName(), 0); + playerData.setWins(kit.getName(), 0); + } + commandSender.sendMessage(ChatColor.GREEN + target.getName() + "'s stats have been wiped."); + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/management/SpawnsCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/management/SpawnsCommand.java new file mode 100644 index 0000000..b646ec1 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/management/SpawnsCommand.java @@ -0,0 +1,281 @@ +package me.devkevin.practice.commands.management; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; + +public class SpawnsCommand extends Command { + private final Practice plugin; + + public SpawnsCommand() { + super("setspawn"); + this.plugin = Practice.getInstance(); + this.setDescription("Spawn command."); + this.setUsage(ChatColor.RED + "Usage: /setspawn "); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (!player.hasPermission("practice.admin")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + if (args.length < 1) { + sender.sendMessage(this.usageMessage); + return true; + } + final String lowerCase = args[0].toLowerCase(); + int n = -1; + switch (lowerCase.hashCode()) { + case -1575557072: + if (lowerCase.equals("spawnlocation")) { + n = 0; + break; + } + break; + case 2066201847: + if (lowerCase.equals("spawnmin")) { + n = 1; + break; + } + break; + case 2066201609: + if (lowerCase.equals("spawnmax")) { + n = 2; + break; + } + break; + case 1255015458: + if (lowerCase.equals("editorlocation")) { + n = 3; + break; + } + break; + case -1851297339: + if (lowerCase.equals("editormin")) { + n = 4; + break; + } + break; + case -1851297577: + if (lowerCase.equals("editormax")) { + n = 5; + break; + } + break; + case 1066657593: + if (lowerCase.equals("sumolocation")) { + n = 6; + break; + } + break; + case 1575442860: + if (lowerCase.equals("sumofirst")) { + n = 7; + break; + } + break; + case 1962122488: + if (lowerCase.equals("sumosecond")) { + n = 8; + break; + } + break; + case -1857569714: + if (lowerCase.equals("sumomin")) { + n = 9; + break; + } + break; + case -1857569952: + if (lowerCase.equals("sumomax")) { + n = 10; + break; + } + break; + case -522070914: + if (lowerCase.equals("oitclocation")) { + n = 11; + break; + } + break; + case -1450059799: + if (lowerCase.equals("oitcmin")) { + n = 12; + break; + } + break; + case -1450060037: + if (lowerCase.equals("oitcmax")) { + n = 13; + break; + } + break; + case 1644049077: + if (lowerCase.equals("oitcspawnpoints")) { + n = 14; + break; + } + break; + case -14407465: + if (lowerCase.equals("parkourlocation")) { + n = 15; + break; + } + break; + case -2030239287: + if (lowerCase.equals("parkourgamelocation")) { + n = 16; + break; + } + break; + case 815820546: + if (lowerCase.equals("parkourmax")) { + n = 17; + break; + } + break; + case 815820784: + if (lowerCase.equals("parkourmin")) { + n = 18; + break; + } + break; + case 666183946: + if (lowerCase.equals("redroverlocation")) { + n = 19; + break; + } + break; + case 68997499: + if (lowerCase.equals("redroverfirst")) { + n = 20; + break; + } + break; + case -1788010743: + if (lowerCase.equals("redroversecond")) { + n = 21; + break; + } + break; + case -1698243619: + if (lowerCase.equals("redrovermin")) { + n = 22; + break; + } + break; + case -1698243857: + if (lowerCase.equals("redrovermax")) { + n = 23; + break; + } + break; + } + switch (n) { + case 0: + this.plugin.getSpawnManager().setSpawnLocation(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the spawn location."); + break; + case 1: + this.plugin.getSpawnManager().setSpawnMin(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the spawn min."); + break; + case 2: + this.plugin.getSpawnManager().setSpawnMax(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the spawn max."); + break; + case 3: + this.plugin.getSpawnManager().setEditorLocation(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the editor location."); + break; + case 4: + this.plugin.getSpawnManager().setEditorMin(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the editor min."); + break; + case 5: + this.plugin.getSpawnManager().setEditorMax(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the editor max."); + break; + case 6: + this.plugin.getSpawnManager().setSumoLocation(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the sumo location."); + break; + case 7: + this.plugin.getSpawnManager().setSumoFirst(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the sumo location A."); + break; + case 8: + this.plugin.getSpawnManager().setSumoSecond(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the sumo location B."); + break; + case 9: + this.plugin.getSpawnManager().setSumoMin(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the sumo min."); + break; + case 10: + this.plugin.getSpawnManager().setSumoMax(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the sumo max."); + break; + case 11: + this.plugin.getSpawnManager().setOitcLocation(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the OITC location."); + break; + case 12: + this.plugin.getSpawnManager().setOitcMin(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the OITC min."); + break; + case 13: + this.plugin.getSpawnManager().setOitcMax(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the OITC max."); + break; + case 14: + this.plugin.getSpawnManager().getOitcSpawnpoints().add(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the OITC spawn-point #" + this.plugin.getSpawnManager().getOitcSpawnpoints().size() + "."); + break; + case 15: + this.plugin.getSpawnManager().setParkourLocation(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the parkour location."); + break; + case 16: + this.plugin.getSpawnManager().setParkourGameLocation(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the parkour Game location."); + break; + case 17: + this.plugin.getSpawnManager().setParkourMax(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the parkour max location."); + break; + case 18: + this.plugin.getSpawnManager().setParkourMin(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the parkour min location."); + break; + case 19: + this.plugin.getSpawnManager().setRedroverLocation(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the redrover location."); + break; + case 20: + this.plugin.getSpawnManager().setRedroverFirst(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the redrover location A."); + break; + case 21: + this.plugin.getSpawnManager().setRedroverSecond(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the redrover location B."); + break; + case 22: + this.plugin.getSpawnManager().setRedroverMin(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the redrover min."); + break; + case 23: + this.plugin.getSpawnManager().setRedroverMax(CustomLocation.fromBukkitLocation(player.getLocation())); + player.sendMessage(ChatColor.GREEN + "Successfully set the redrover max."); + break; + } + return false; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/management/TournamentCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/management/TournamentCommand.java new file mode 100644 index 0000000..a00141f --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/management/TournamentCommand.java @@ -0,0 +1,127 @@ +package me.devkevin.practice.commands.management; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.tournament.Tournament; +import me.devkevin.practice.util.Clickable; + +public class TournamentCommand extends Command { + private static final String[] HELP_ADMIN_MESSAGE; + private static final String[] HELP_REGULAR_MESSAGE; + + static { + HELP_ADMIN_MESSAGE = new String[]{ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------", ChatColor.RED + "Tournament Commands:", ChatColor.GOLD + "(*) /tournament start " + ChatColor.GRAY + "- Start a Tournament", ChatColor.GOLD + "(*) /tournament stop " + ChatColor.GRAY + "- Stop a Tournament", ChatColor.GOLD + "(*) /tournament alert " + ChatColor.GRAY + "- Alert a Tournament", ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"}; + HELP_REGULAR_MESSAGE = new String[]{ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------", ChatColor.RED + "Tournament Commands:", ChatColor.GOLD + "(*) /join " + ChatColor.GRAY + "- Join a Tournament", ChatColor.GOLD + "(*) /leave " + ChatColor.GRAY + "- Leave a Tournament", ChatColor.GOLD + "(*) /status " + ChatColor.GRAY + "- Status of a Tournament", ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"}; + } + + private final Practice plugin; + + public TournamentCommand() { + super("tournament"); + this.plugin = Practice.getInstance(); + this.setUsage(ChatColor.RED + "Usage: /tournament [args]"); + } + + public boolean execute(final CommandSender commandSender, final String s, final String[] args) { + if (!(commandSender instanceof Player)) { + return true; + } + final Player player = (Player) commandSender; + if (args.length == 0) { + commandSender.sendMessage(player.hasPermission("practice.admin") ? TournamentCommand.HELP_ADMIN_MESSAGE : TournamentCommand.HELP_REGULAR_MESSAGE); + return true; + } + if (!player.hasPermission("practice.admin")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + final String lowerCase = args[0].toLowerCase(); + int n = -1; + switch (lowerCase.hashCode()) { + case 109757538: + if (lowerCase.equals("start")) { + n = 0; + break; + } + break; + case 3540994: + if (lowerCase.equals("stop")) { + n = 1; + break; + } + break; + case 92899676: + if (lowerCase.equals("alert")) { + n = 2; + break; + } + break; + } + switch (n) { + case 0: + if (args.length == 5) { + try { + final int id = Integer.parseInt(args[1]); + final int teamSize = Integer.parseInt(args[3]); + final int size = Integer.parseInt(args[4]); + final String kitName = args[2]; + if (size % teamSize != 0) { + commandSender.sendMessage(ChatColor.RED + "Tournament size & team sizes are invalid. Please try again."); + return true; + } + if (this.plugin.getTournamentManager().getTournament(Integer.valueOf(id)) != null) { + commandSender.sendMessage(ChatColor.RED + "This tournament already exists."); + return true; + } + final Kit kit = this.plugin.getKitManager().getKit(kitName); + if (kit == null) { + commandSender.sendMessage(ChatColor.RED + "That kit does not exist."); + return true; + } + this.plugin.getTournamentManager().createTournament(commandSender, id, teamSize, size, kitName); + } catch (NumberFormatException e) { + commandSender.sendMessage(ChatColor.RED + "Usage: /tournament start "); + } + break; + } + commandSender.sendMessage(ChatColor.RED + "Usage: /tournament start "); + break; + case 1: + if (args.length == 2) { + final int id = Integer.parseInt(args[1]); + final Tournament tournament = this.plugin.getTournamentManager().getTournament(Integer.valueOf(id)); + if (tournament != null) { + this.plugin.getTournamentManager().removeTournament(id, true); + commandSender.sendMessage(ChatColor.RED + "Successfully removed tournament " + id + "."); + } else { + commandSender.sendMessage(ChatColor.RED + "This tournament does not exist."); + } + break; + } + commandSender.sendMessage(ChatColor.RED + "Usage: /tournament stop "); + break; + case 2: + if (args.length == 2) { + final int id = Integer.parseInt(args[1]); + final Tournament tournament = this.plugin.getTournamentManager().getTournament(Integer.valueOf(id)); + if (tournament != null) { + final String toSend = ChatColor.YELLOW.toString() + "(Tournament) " + ChatColor.GREEN + " " + tournament.getKitName() + " (" + tournament.getTeamSize() + "v" + tournament.getTeamSize() + ") is starting soon. " + ChatColor.GRAY + "[Click to Join]"; + final Clickable message = new Clickable(toSend, ChatColor.GRAY + "Click to join this tournament.", "/join " + id); + Bukkit.getServer().getOnlinePlayers().forEach(message::sendToPlayer); + } + break; + } + commandSender.sendMessage(ChatColor.RED + "Usage: /tournament alert "); + break; + default: + commandSender.sendMessage(player.hasPermission("practice.admin") ? TournamentCommand.HELP_ADMIN_MESSAGE : TournamentCommand.HELP_REGULAR_MESSAGE); + break; + } + return false; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/time/DayCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/time/DayCommand.java new file mode 100644 index 0000000..dafe260 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/time/DayCommand.java @@ -0,0 +1,27 @@ +package me.devkevin.practice.commands.time; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.settings.item.ProfileOptionsItemState; + +public class DayCommand extends Command { + public DayCommand() { + super("day"); + this.setDescription("Set player time to day."); + this.setUsage(ChatColor.RED + "Usage: /day"); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + ((Player) sender).setPlayerTime(6000L, true); + final PlayerData playerData = Practice.getInstance().getPlayerManager().getPlayerData(((Player) sender).getUniqueId()); + playerData.getOptions().setTime(ProfileOptionsItemState.DAY); + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/time/NightCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/time/NightCommand.java new file mode 100644 index 0000000..5da07a5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/time/NightCommand.java @@ -0,0 +1,27 @@ +package me.devkevin.practice.commands.time; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.settings.item.ProfileOptionsItemState; + +public class NightCommand extends Command { + public NightCommand() { + super("night"); + this.setDescription("Set player time to night."); + this.setUsage(ChatColor.RED + "Usage: /night"); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + ((Player) sender).setPlayerTime(18000L, true); + final PlayerData playerData = Practice.getInstance().getPlayerManager().getPlayerData(((Player) sender).getUniqueId()); + playerData.getOptions().setTime(ProfileOptionsItemState.NIGHT); + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/time/SunsetCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/time/SunsetCommand.java new file mode 100644 index 0000000..17b6610 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/time/SunsetCommand.java @@ -0,0 +1,27 @@ +package me.devkevin.practice.commands.time; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.settings.item.ProfileOptionsItemState; + +public class SunsetCommand extends Command { + public SunsetCommand() { + super("sunset"); + this.setDescription("Set player time to sunset."); + this.setUsage(ChatColor.RED + "Usage: /sunset"); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + ((Player) sender).setPlayerTime(12000L, true); + final PlayerData playerData = Practice.getInstance().getPlayerManager().getPlayerData(((Player) sender).getUniqueId()); + playerData.getOptions().setTime(ProfileOptionsItemState.SUNSET); + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/toggle/SettingsCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/toggle/SettingsCommand.java new file mode 100644 index 0000000..35082b1 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/toggle/SettingsCommand.java @@ -0,0 +1,32 @@ +package me.devkevin.practice.commands.toggle; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; + +import java.util.Arrays; + +public class SettingsCommand extends Command { + private final Practice plugin; + + public SettingsCommand() { + super("settings"); + this.plugin = Practice.getInstance(); + this.setDescription("Toggles multiple settings."); + this.setUsage(ChatColor.RED + "Usage: /settings"); + this.setAliases(Arrays.asList("options", "toggle")); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + player.openInventory(playerData.getOptions().getInventory()); + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/commands/warp/WarpCommand.java b/dPractice/src/main/java/me/devkevin/practice/commands/warp/WarpCommand.java new file mode 100644 index 0000000..2909acf --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/commands/warp/WarpCommand.java @@ -0,0 +1,41 @@ +package me.devkevin.practice.commands.warp; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +public class WarpCommand extends Command { + private final Practice plugin; + + public WarpCommand() { + super("spawn"); + this.plugin = Practice.getInstance(); + this.setDescription("Spawn command."); + this.setUsage(ChatColor.RED + "Usage: /spawn [args]"); + } + + public boolean execute(final CommandSender sender, final String alias, final String[] args) { + if (!(sender instanceof Player)) { + return true; + } + final Player player = (Player) sender; + if (!player.hasPermission("practice.admin")) { + player.sendMessage(ChatColor.RED + "You do not have permission to use that command."); + return true; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() != PlayerState.SPAWN && playerData.getPlayerState() != PlayerState.FFA) { + player.sendMessage(ChatColor.RED + "Cannot execute this command in your current state."); + return true; + } + if (args.length == 0) { + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + return true; + } + return true; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/event/BaseEvent.java b/dPractice/src/main/java/me/devkevin/practice/event/BaseEvent.java new file mode 100644 index 0000000..1b8a4f8 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/event/BaseEvent.java @@ -0,0 +1,27 @@ +package me.devkevin.practice.event; + +import org.bukkit.Bukkit; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class BaseEvent extends Event { + private static final HandlerList handlers; + + static { + handlers = new HandlerList(); + } + + public static HandlerList getHandlerList() { + return BaseEvent.handlers; + } + + public HandlerList getHandlers() { + return BaseEvent.handlers; + } + + public boolean call() { + Bukkit.getServer().getPluginManager().callEvent(this); + return this instanceof Cancellable && ((Cancellable) this).isCancelled(); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/event/EventStartEvent.java b/dPractice/src/main/java/me/devkevin/practice/event/EventStartEvent.java new file mode 100644 index 0000000..a139c73 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/event/EventStartEvent.java @@ -0,0 +1,15 @@ +package me.devkevin.practice.event; + +import me.devkevin.practice.events.PracticeEvent; + +public class EventStartEvent extends BaseEvent { + private final PracticeEvent event; + + public EventStartEvent(final PracticeEvent event) { + this.event = event; + } + + public PracticeEvent getEvent() { + return this.event; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/event/PlayerDataRetrieveEvent.java b/dPractice/src/main/java/me/devkevin/practice/event/PlayerDataRetrieveEvent.java new file mode 100644 index 0000000..310ce54 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/event/PlayerDataRetrieveEvent.java @@ -0,0 +1,31 @@ +package me.devkevin.practice.event; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import me.devkevin.practice.player.PlayerData; + +public class PlayerDataRetrieveEvent extends Event { + private static final HandlerList HANDLERS; + + static { + HANDLERS = new HandlerList(); + } + + private final PlayerData playerData; + + public PlayerDataRetrieveEvent(final PlayerData playerData) { + this.playerData = playerData; + } + + public static HandlerList getHandlerList() { + return PlayerDataRetrieveEvent.HANDLERS; + } + + public HandlerList getHandlers() { + return PlayerDataRetrieveEvent.HANDLERS; + } + + public PlayerData getPlayerData() { + return this.playerData; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/event/match/MatchEndEvent.java b/dPractice/src/main/java/me/devkevin/practice/event/match/MatchEndEvent.java new file mode 100644 index 0000000..fdaf12e --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/event/match/MatchEndEvent.java @@ -0,0 +1,23 @@ +package me.devkevin.practice.event.match; + +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchTeam; + +public class MatchEndEvent extends MatchEvent { + private final MatchTeam winningTeam; + private final MatchTeam losingTeam; + + public MatchEndEvent(final Match match, final MatchTeam winningTeam, final MatchTeam losingTeam) { + super(match); + this.winningTeam = winningTeam; + this.losingTeam = losingTeam; + } + + public MatchTeam getWinningTeam() { + return this.winningTeam; + } + + public MatchTeam getLosingTeam() { + return this.losingTeam; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/event/match/MatchEvent.java b/dPractice/src/main/java/me/devkevin/practice/event/match/MatchEvent.java new file mode 100644 index 0000000..554c223 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/event/match/MatchEvent.java @@ -0,0 +1,31 @@ +package me.devkevin.practice.event.match; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import me.devkevin.practice.match.Match; + +public class MatchEvent extends Event { + private static final HandlerList HANDLERS; + + static { + HANDLERS = new HandlerList(); + } + + private final Match match; + + public MatchEvent(final Match match) { + this.match = match; + } + + public static HandlerList getHandlerList() { + return MatchEvent.HANDLERS; + } + + public HandlerList getHandlers() { + return MatchEvent.HANDLERS; + } + + public Match getMatch() { + return this.match; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/event/match/MatchStartEvent.java b/dPractice/src/main/java/me/devkevin/practice/event/match/MatchStartEvent.java new file mode 100644 index 0000000..bf5b887 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/event/match/MatchStartEvent.java @@ -0,0 +1,9 @@ +package me.devkevin.practice.event.match; + +import me.devkevin.practice.match.Match; + +public class MatchStartEvent extends MatchEvent { + public MatchStartEvent(final Match match) { + super(match); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/EventCountdownTask.java b/dPractice/src/main/java/me/devkevin/practice/events/EventCountdownTask.java new file mode 100644 index 0000000..dd78dc7 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/EventCountdownTask.java @@ -0,0 +1,92 @@ +package me.devkevin.practice.events; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.Practice; +import me.devkevin.practice.util.Clickable; + +public abstract class EventCountdownTask extends BukkitRunnable { + private final PracticeEvent event; + private final int countdownTime; + private int timeUntilStart; + private boolean ended; + + public EventCountdownTask(final PracticeEvent event, final int countdownTime) { + this.event = event; + this.countdownTime = countdownTime; + this.timeUntilStart = countdownTime; + } + + public void run() { + if (this.isEnded()) { + return; + } + if (this.timeUntilStart <= 0) { + if (this.canStart()) { + Practice.getInstance().getServer().getScheduler().runTask(Practice.getInstance(), () -> this.event.start()); + } else { + Practice.getInstance().getServer().getScheduler().runTask(Practice.getInstance(), () -> this.onCancel()); + } + this.ended = true; + return; + } + if (this.shouldAnnounce(this.timeUntilStart)) { + final String toSend = ChatColor.YELLOW.toString() + ChatColor.BOLD + "[*] " + ChatColor.GREEN + "" + this.event.getName() + " is starting soon. " + ChatColor.GRAY + "[Join]"; + final Clickable message = new Clickable(toSend, ChatColor.GRAY + "Click to join this event.", "/join " + this.event.getName()); + Bukkit.getServer().getOnlinePlayers().forEach(message::sendToPlayer); + } + --this.timeUntilStart; + } + + public abstract boolean shouldAnnounce(final int p0); + + public abstract boolean canStart(); + + public abstract void onCancel(); + + private String getTime(int time) { + final StringBuilder timeStr = new StringBuilder(); + int minutes = 0; + if (time % 60 == 0) { + minutes = time / 60; + time = 0; + } else { + while (time - 60 > 0) { + ++minutes; + time -= 60; + } + } + if (minutes > 0) { + timeStr.append(minutes).append("m"); + } + if (time > 0) { + timeStr.append((minutes > 0) ? " " : "").append(time).append("s"); + } + return timeStr.toString(); + } + + public PracticeEvent getEvent() { + return this.event; + } + + public int getCountdownTime() { + return this.countdownTime; + } + + public int getTimeUntilStart() { + return this.timeUntilStart; + } + + public void setTimeUntilStart(final int timeUntilStart) { + this.timeUntilStart = timeUntilStart; + } + + public boolean isEnded() { + return this.ended; + } + + public void setEnded(final boolean ended) { + this.ended = ended; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/EventPlayer.java b/dPractice/src/main/java/me/devkevin/practice/events/EventPlayer.java new file mode 100644 index 0000000..d9ad9f5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/EventPlayer.java @@ -0,0 +1,21 @@ +package me.devkevin.practice.events; + +import java.util.UUID; + +public class EventPlayer { + private final UUID uuid; + private final PracticeEvent event; + + public EventPlayer(final UUID uuid, final PracticeEvent event) { + this.uuid = uuid; + this.event = event; + } + + public UUID getUuid() { + return this.uuid; + } + + public PracticeEvent getEvent() { + return this.event; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/EventState.java b/dPractice/src/main/java/me/devkevin/practice/events/EventState.java new file mode 100644 index 0000000..9ef978c --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/EventState.java @@ -0,0 +1,7 @@ +package me.devkevin.practice.events; + +public enum EventState { + UNANNOUNCED, + WAITING, + STARTED +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/PracticeEvent.java b/dPractice/src/main/java/me/devkevin/practice/events/PracticeEvent.java new file mode 100644 index 0000000..c91fd58 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/PracticeEvent.java @@ -0,0 +1,203 @@ +package me.devkevin.practice.events; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.event.EventStartEvent; +import me.devkevin.practice.events.oitc.OITCEvent; +import me.devkevin.practice.events.oitc.OITCPlayer; +import me.devkevin.practice.events.parkour.ParkourEvent; +import me.devkevin.practice.events.redrover.RedroverEvent; +import me.devkevin.practice.events.redrover.RedroverPlayer; +import me.devkevin.practice.events.sumo.SumoEvent; +import me.devkevin.practice.events.sumo.SumoPlayer; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public abstract class PracticeEvent { + private final Practice plugin; + private final String name; + private int limit; + private Player host; + private EventState state; + + public PracticeEvent(final String name) { + this.plugin = Practice.getInstance(); + this.limit = 30; + this.state = EventState.UNANNOUNCED; + this.name = name; + } + + public void startCountdown() { + if (this.getCountdownTask().isEnded()) { + this.getCountdownTask().setTimeUntilStart(this.getCountdownTask().getCountdownTime()); + this.getCountdownTask().setEnded(false); + } else { + this.getCountdownTask().runTaskTimerAsynchronously(this.plugin, 20L, 20L); + } + } + + public void sendMessage(final String message) { + this.getBukkitPlayers().forEach(player -> player.sendMessage(message)); + } + + public Set getBukkitPlayers() { + return this.getPlayers().keySet().stream().filter(uuid -> this.plugin.getServer().getPlayer(uuid) != null).map(this.plugin.getServer()::getPlayer).collect(Collectors.toSet()); + } + + public void join(final Player player) { + if (this.getPlayers().size() >= this.limit) { + return; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + playerData.setPlayerState(PlayerState.EVENT); + PlayerUtil.clearPlayer(player); + if (this.onJoin() != null) { + this.onJoin().accept(player); + } + if (this.getSpawnLocations().size() == 1) { + player.teleport(this.getSpawnLocations().get(0).toBukkitLocation()); + } else { + final List spawnLocations = new ArrayList(this.getSpawnLocations()); + player.teleport(spawnLocations.remove(ThreadLocalRandom.current().nextInt(spawnLocations.size())).toBukkitLocation()); + } + this.plugin.getPlayerManager().giveLobbyItems(player); + for (final Player other : this.getBukkitPlayers()) { + other.showPlayer(player); + player.showPlayer(other); + } + this.sendMessage(ChatColor.YELLOW + player.getName() + " has joined the event. (" + this.getPlayers().size() + " player" + ((this.getPlayers().size() == 1) ? "" : "s") + ")"); + } + + public void leave(final Player player) { + if (this instanceof OITCEvent) { + final OITCEvent oitcEvent = (OITCEvent) this; + final OITCPlayer oitcPlayer = oitcEvent.getPlayer(player); + oitcPlayer.setState(OITCPlayer.OITCState.ELIMINATED); + } + if (this.onDeath() != null) { + this.onDeath().accept(player); + } + this.getPlayers().remove(player.getUniqueId()); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + } + + public void start() { + new EventStartEvent(this).call(); + this.setState(EventState.STARTED); + this.onStart(); + this.plugin.getEventManager().setCooldown(0L); + } + + public void end() { + this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> this.plugin.getEventManager().getEventWorld().getPlayers().forEach(player -> this.plugin.getPlayerManager().sendToSpawnAndReset(player)), 2L); + this.plugin.getEventManager().setCooldown(System.currentTimeMillis() + 300000L); + if (this instanceof SumoEvent) { + final SumoEvent sumoEvent = (SumoEvent) this; + for (final SumoPlayer sumoPlayer : sumoEvent.getPlayers().values()) { + if (sumoPlayer.getFightTask() != null) { + sumoPlayer.getFightTask().cancel(); + } + } + if (sumoEvent.getWaterCheckTask() != null) { + sumoEvent.getWaterCheckTask().cancel(); + } + } else if (this instanceof OITCEvent) { + final OITCEvent oitcEvent = (OITCEvent) this; + if (oitcEvent.getGameTask() != null) { + oitcEvent.getGameTask().cancel(); + } + } else if (this instanceof RedroverEvent) { + final RedroverEvent redroverEvent = (RedroverEvent) this; + for (final RedroverPlayer redroverPlayer : redroverEvent.getPlayers().values()) { + if (redroverPlayer.getFightTask() != null) { + redroverPlayer.getFightTask().cancel(); + } + } + if (redroverEvent.getGameTask() != null) { + redroverEvent.getGameTask().cancel(); + } + } else if (this instanceof ParkourEvent) { + final ParkourEvent parkourEvent = (ParkourEvent) this; + if (parkourEvent.getGameTask() != null) { + parkourEvent.getGameTask().cancel(); + } + if (parkourEvent.getWaterCheckTask() != null) { + parkourEvent.getWaterCheckTask().cancel(); + } + } + this.getPlayers().clear(); + this.setState(EventState.UNANNOUNCED); + final Iterator iterator = this.plugin.getEventManager().getSpectators().keySet().iterator(); + while (iterator.hasNext()) { + final UUID spectatorUUID = iterator.next(); + final Player spectator = Bukkit.getPlayer(spectatorUUID); + if (spectator != null) { + this.plugin.getServer().getScheduler().runTask(this.plugin, () -> this.plugin.getPlayerManager().sendToSpawnAndReset(spectator)); + iterator.remove(); + } + } + this.plugin.getEventManager().getSpectators().clear(); + this.getCountdownTask().setEnded(true); + } + + public K getPlayer(final Player player) { + return this.getPlayer(player.getUniqueId()); + } + + public K getPlayer(final UUID uuid) { + return this.getPlayers().get(uuid); + } + + public abstract Map getPlayers(); + + public abstract EventCountdownTask getCountdownTask(); + + public abstract List getSpawnLocations(); + + public abstract void onStart(); + + public abstract Consumer onJoin(); + + public abstract Consumer onDeath(); + + public Practice getPlugin() { + return this.plugin; + } + + public String getName() { + return this.name; + } + + public int getLimit() { + return this.limit; + } + + public void setLimit(final int limit) { + this.limit = limit; + } + + public Player getHost() { + return this.host; + } + + public void setHost(final Player host) { + this.host = host; + } + + public EventState getState() { + return this.state; + } + + public void setState(final EventState state) { + this.state = state; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCCountdownTask.java b/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCCountdownTask.java new file mode 100644 index 0000000..5b0f1e8 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCCountdownTask.java @@ -0,0 +1,30 @@ +package me.devkevin.practice.events.oitc; + +import org.bukkit.ChatColor; +import me.devkevin.practice.events.EventCountdownTask; +import me.devkevin.practice.events.PracticeEvent; + +import java.util.Arrays; + +public class OITCCountdownTask extends EventCountdownTask { + public OITCCountdownTask(final PracticeEvent event) { + super(event, 60); + } + + @Override + public boolean shouldAnnounce(final int timeUntilStart) { + return Arrays.asList(45, 30, 15, 10, 5).contains(timeUntilStart); + } + + @Override + public boolean canStart() { + return this.getEvent().getPlayers().size() >= 2; + } + + @Override + public void onCancel() { + this.getEvent().sendMessage(ChatColor.RED + "Not enough players. Event has been cancelled"); + this.getEvent().end(); + this.getEvent().getPlugin().getEventManager().setCooldown(0L); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCEvent.java b/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCEvent.java new file mode 100644 index 0000000..417e8cd --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCEvent.java @@ -0,0 +1,307 @@ +package me.devkevin.practice.events.oitc; + +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.EventCountdownTask; +import me.devkevin.practice.events.EventPlayer; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.util.ItemUtil; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public class OITCEvent extends PracticeEvent { + private final Map players; + private final OITCCountdownTask countdownTask; + private OITCGameTask gameTask; + private List respawnLocations; + + public OITCEvent() { + super("OITC"); + this.players = new HashMap(); + this.gameTask = null; + this.countdownTask = new OITCCountdownTask(this); + } + + @Override + public Map getPlayers() { + return this.players; + } + + @Override + public EventCountdownTask getCountdownTask() { + return this.countdownTask; + } + + @Override + public List getSpawnLocations() { + return Collections.singletonList(this.getPlugin().getSpawnManager().getOitcLocation()); + } + + @Override + public void onStart() { + this.respawnLocations = new ArrayList<>(); + (this.gameTask = new OITCGameTask()).runTaskTimerAsynchronously(this.getPlugin(), 0L, 20L); + } + + @Override + public Consumer onJoin() { + return player -> this.players.put(player.getUniqueId(), new OITCPlayer(player.getUniqueId(), this)); + } + + @Override + public Consumer onDeath() { + return (player) -> { + OITCPlayer data = this.getPlayer(player); + if(data != null) { + if(data.getState() != OITCPlayer.OITCState.WAITING) { + if(data.getState() == OITCPlayer.OITCState.FIGHTING || data.getState() == OITCPlayer.OITCState.PREPARING || data.getState() == OITCPlayer.OITCState.RESPAWNING) { + String deathMessage = ChatColor.YELLOW + "(Event) " + ChatColor.RED + player.getName() + "(" + data.getScore() + ")" + ChatColor.GRAY + " has been eliminated from the game."; + if(data.getLastKiller() != null) { + OITCPlayer playerData = data.getLastKiller(); + Player respawnTask = this.getPlugin().getServer().getPlayer(playerData.getUuid()); + int count = playerData.getScore() + 1; + playerData.setScore(count); + respawnTask.getInventory().setItem(6, ItemUtil.createItem(Material.GLOWSTONE_DUST, ChatColor.YELLOW.toString() + ChatColor.BOLD + "Kills", playerData.getScore() == 0?1:playerData.getScore())); + if(respawnTask.getInventory().contains(Material.ARROW)) { + respawnTask.getInventory().getItem(8).setAmount(respawnTask.getInventory().getItem(8).getAmount() + 2); + } else { + respawnTask.getInventory().setItem(8, new ItemStack(Material.ARROW, 2)); + } + + respawnTask.updateInventory(); + respawnTask.playSound(respawnTask.getLocation(), Sound.NOTE_PLING, 1.0F, 1.0F); + FireworkEffect fireworkEffect = FireworkEffect.builder().withColor(Color.fromRGB(127, 56, 56)).withFade(Color.fromRGB(127, 56, 56)).with(FireworkEffect.Type.BALL).build(); + PlayerUtil.sendFirework(fireworkEffect, player.getLocation().add(0.0D, 1.5D, 0.0D)); + PlayerData playerData1 = this.getPlugin().getPlayerManager().getPlayerData(respawnTask.getUniqueId()); + playerData1.setOitcEventKills(playerData1.getOitcEventKills() + 1); + data.setLastKiller(null); + deathMessage = ChatColor.YELLOW + "(Event) " + ChatColor.RED + player.getName() + "(" + data.getScore() + ")" + ChatColor.GRAY + " has been killed" + (respawnTask == null?".":" by " + ChatColor.GREEN + respawnTask.getName() + "(" + count + ")"); + if(count == 25) { + PlayerData winnerData = Practice.getInstance().getPlayerManager().getPlayerData(respawnTask.getUniqueId()); + winnerData.setOitcEventWins(winnerData.getOitcEventWins() + 1); + + for(int i = 0; i <= 2; ++i) { + String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + respawnTask.getName(); + Bukkit.broadcastMessage(announce); + } + + this.gameTask.cancel(); + this.end(); + } + } + + if(data.getLastKiller() == null) { + data.setLives(data.getLives() - 1); + PlayerData var12 = this.getPlugin().getPlayerManager().getPlayerData(player.getUniqueId()); + var12.setOitcEventDeaths(var12.getOitcEventDeaths() + 1); + if(data.getLives() == 0) { + var12.setOitcEventLosses(var12.getOitcEventLosses() + 1); + this.getPlayers().remove(player.getUniqueId()); + player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY + "You have been eliminated from the game."); + this.getPlugin().getServer().getScheduler().runTask(this.getPlugin(), () -> { + this.getPlugin().getPlayerManager().sendToSpawnAndReset(player); + if(this.getPlayers().size() >= 2) { + this.getPlugin().getEventManager().addSpectatorOITC(player, this.getPlugin().getPlayerManager().getPlayerData(player.getUniqueId()), this); + } + + }); + } else { + BukkitTask respawnTask = new RespawnTask(player, data).runTaskTimerAsynchronously(this.getPlugin(), 0L, 20L); + data.setRespawnTask(respawnTask); + } + } + + this.sendMessage(deathMessage); + } + + } + } + }; + } + + public void teleportNextLocation(final Player player) { + player.teleport(this.getGameLocations().remove(ThreadLocalRandom.current().nextInt(this.getGameLocations().size())).toBukkitLocation()); + } + + private List getGameLocations() { + if (this.respawnLocations != null && this.respawnLocations.size() == 0) { + this.respawnLocations.addAll(this.getPlugin().getSpawnManager().getOitcSpawnpoints()); + } + return this.respawnLocations; + } + + private void giveRespawnItems(final Player player, final OITCPlayer oitcPlayer) { + this.getPlugin().getServer().getScheduler().runTask(this.getPlugin(), () -> { + PlayerUtil.clearPlayer(player); + player.getInventory().setItem(0, ItemUtil.createItem(Material.WOOD_SWORD, ChatColor.GREEN + "Wood Sword")); + player.getInventory().setItem(1, ItemUtil.createItem(Material.BOW, ChatColor.GREEN + "Bow")); + player.getInventory().setItem(6, ItemUtil.createItem(Material.GLOWSTONE_DUST, ChatColor.YELLOW.toString() + ChatColor.BOLD + "Kills", (oitcPlayer.getScore() == 0) ? 1 : oitcPlayer.getScore())); + player.getInventory().setItem(7, ItemUtil.createItem(Material.REDSTONE, ChatColor.RED.toString() + ChatColor.BOLD + "Lives", oitcPlayer.getLives())); + player.getInventory().setItem(8, new ItemStack(Material.ARROW)); + player.updateInventory(); + }); + } + + private Player getWinnerPlayer() { + if (this.getByState(OITCPlayer.OITCState.FIGHTING).size() == 0) { + return null; + } + final List fighting = this.sortedScores(); + return this.getPlugin().getServer().getPlayer(fighting.get(0).getUuid()); + } + + private List getByState(final OITCPlayer.OITCState state) { + return this.players.values().stream().filter(player -> player.getState() == state).map(EventPlayer::getUuid).collect(Collectors.toList()); + } + + public List sortedScores() { + final List list = new ArrayList(this.players.values()); + list.sort(new SortComparator().reversed()); + return list; + } + + public OITCGameTask getGameTask() { + return this.gameTask; + } + + public class RespawnTask extends BukkitRunnable { + private final Player player; + private final OITCPlayer oitcPlayer; + private int time; + + public RespawnTask(final Player player, final OITCPlayer oitcPlayer) { + this.time = 5; + this.player = player; + this.oitcPlayer = oitcPlayer; + } + + public void run() { + if (this.oitcPlayer.getLives() == 0) { + this.cancel(); + return; + } + if (this.time > 0) { + this.player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY + "Respawning in " + this.time + "..."); + } + if (this.time == 5) { + OITCEvent.this.getPlugin().getServer().getScheduler().runTask(OITCEvent.this.getPlugin(), () -> { + PlayerUtil.clearPlayer(this.player); + OITCEvent.this.getBukkitPlayers().forEach(member -> member.hidePlayer(this.player)); + OITCEvent.this.getBukkitPlayers().forEach(this.player::hidePlayer); + this.player.setGameMode(GameMode.SPECTATOR); + return; + }); + this.oitcPlayer.setState(OITCPlayer.OITCState.RESPAWNING); + } else if (this.time <= 0) { + this.player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY + "Respawning..."); + this.player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.RED.toString() + ChatColor.BOLD + this.oitcPlayer.getLives() + " " + ((this.oitcPlayer.getLives() == 1) ? "LIFE" : "LIVES") + " REMAINING"); + OITCEvent.this.getPlugin().getServer().getScheduler().runTaskLater(OITCEvent.this.getPlugin(), () -> { + OITCEvent.this.giveRespawnItems(this.player, this.oitcPlayer); + this.player.teleport(OITCEvent.this.getGameLocations().remove(ThreadLocalRandom.current().nextInt(OITCEvent.this.getGameLocations().size())).toBukkitLocation()); + OITCEvent.this.getBukkitPlayers().forEach(member -> member.showPlayer(this.player)); + OITCEvent.this.getBukkitPlayers().forEach(this.player::showPlayer); + return; + }, 2L); + this.oitcPlayer.setState(OITCPlayer.OITCState.FIGHTING); + this.cancel(); + } + --this.time; + } + + public Player getPlayer() { + return this.player; + } + + public OITCPlayer getOitcPlayer() { + return this.oitcPlayer; + } + + public int getTime() { + return this.time; + } + } + + public class OITCGameTask extends BukkitRunnable { + private int time; + + public OITCGameTask() { + this.time = 303; + } + + public void run() { + if (this.time == 303) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game starts in " + ChatColor.GREEN + 3 + ChatColor.YELLOW + "...", OITCEvent.this.getBukkitPlayers()); + } else if (this.time == 302) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game starts in " + ChatColor.GREEN + 2 + ChatColor.YELLOW + "...", OITCEvent.this.getBukkitPlayers()); + } else if (this.time == 301) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game starts in " + ChatColor.GREEN + 1 + ChatColor.YELLOW + "...", OITCEvent.this.getBukkitPlayers()); + } else if (this.time == 300) { + PlayerUtil.sendMessage(ChatColor.GREEN + "The game has started, good luck!", OITCEvent.this.getBukkitPlayers()); + for (final OITCPlayer player : OITCEvent.this.getPlayers().values()) { + player.setScore(0); + player.setLives(5); + player.setState(OITCPlayer.OITCState.FIGHTING); + } + for (final Player player2 : OITCEvent.this.getBukkitPlayers()) { + final OITCPlayer oitcPlayer = OITCEvent.this.getPlayer(player2.getUniqueId()); + if (oitcPlayer != null) { + OITCEvent.this.teleportNextLocation(player2); + OITCEvent.this.giveRespawnItems(player2, oitcPlayer); + } + } + } else if (this.time <= 0) { + final Player winner = OITCEvent.this.getWinnerPlayer(); + if (winner != null) { + final PlayerData winnerData = Practice.getInstance().getPlayerManager().getPlayerData(winner.getUniqueId()); + winnerData.setOitcEventWins(winnerData.getOitcEventWins() + 1); + for (int i = 0; i <= 2; ++i) { + final String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + winner.getName(); + Bukkit.broadcastMessage(announce); + } + } + OITCEvent.this.gameTask.cancel(); + OITCEvent.this.end(); + this.cancel(); + return; + } + if (OITCEvent.this.getByState(OITCPlayer.OITCState.FIGHTING).size() == 1 || OITCEvent.this.getPlayers().size() == 1) { + final Player winner = Bukkit.getPlayer(OITCEvent.this.getByState(OITCPlayer.OITCState.FIGHTING).get(0)); + final PlayerData winnerData = Practice.getInstance().getPlayerManager().getPlayerData(winner.getUniqueId()); + winnerData.setOitcEventWins(winnerData.getOitcEventWins() + 1); + for (int i = 0; i <= 2; ++i) { + final String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + winner.getName(); + Bukkit.broadcastMessage(announce); + } + this.cancel(); + OITCEvent.this.end(); + } + if (Arrays.asList(60, 50, 40, 30, 25, 20, 15, 10).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game ends in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", OITCEvent.this.getBukkitPlayers()); + } else if (Arrays.asList(5, 4, 3, 2, 1).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game is ending in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", OITCEvent.this.getBukkitPlayers()); + } + --this.time; + } + + public int getTime() { + return this.time; + } + } + + private class SortComparator implements Comparator { + @Override + public int compare(final OITCPlayer p1, final OITCPlayer p2) { + return Integer.compare(p1.getScore(), p2.getScore()); + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCPlayer.java b/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCPlayer.java new file mode 100644 index 0000000..e5949c5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/oitc/OITCPlayer.java @@ -0,0 +1,70 @@ +package me.devkevin.practice.events.oitc; + +import org.bukkit.scheduler.BukkitTask; +import me.devkevin.practice.events.EventPlayer; +import me.devkevin.practice.events.PracticeEvent; + +import java.util.UUID; + +public class OITCPlayer extends EventPlayer { + private OITCState state; + private int score; + private int lives; + private BukkitTask respawnTask; + private OITCPlayer lastKiller; + + public OITCPlayer(final UUID uuid, final PracticeEvent event) { + super(uuid, event); + this.state = OITCState.WAITING; + this.score = 0; + this.lives = 5; + } + + public OITCState getState() { + return this.state; + } + + public void setState(final OITCState state) { + this.state = state; + } + + public int getScore() { + return this.score; + } + + public void setScore(final int score) { + this.score = score; + } + + public int getLives() { + return this.lives; + } + + public void setLives(final int lives) { + this.lives = lives; + } + + public BukkitTask getRespawnTask() { + return this.respawnTask; + } + + public void setRespawnTask(final BukkitTask respawnTask) { + this.respawnTask = respawnTask; + } + + public OITCPlayer getLastKiller() { + return this.lastKiller; + } + + public void setLastKiller(final OITCPlayer lastKiller) { + this.lastKiller = lastKiller; + } + + public enum OITCState { + WAITING, + PREPARING, + FIGHTING, + RESPAWNING, + ELIMINATED + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourCountdownTask.java b/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourCountdownTask.java new file mode 100644 index 0000000..f460f5c --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourCountdownTask.java @@ -0,0 +1,30 @@ +package me.devkevin.practice.events.parkour; + +import org.bukkit.ChatColor; +import me.devkevin.practice.events.EventCountdownTask; +import me.devkevin.practice.events.PracticeEvent; + +import java.util.Arrays; + +public class ParkourCountdownTask extends EventCountdownTask { + public ParkourCountdownTask(final PracticeEvent event) { + super(event, 60); + } + + @Override + public boolean shouldAnnounce(final int timeUntilStart) { + return Arrays.asList(45, 30, 15, 10, 5).contains(timeUntilStart); + } + + @Override + public boolean canStart() { + return this.getEvent().getPlayers().size() >= 2; + } + + @Override + public void onCancel() { + this.getEvent().sendMessage(ChatColor.RED + "Not enough players. Event has been cancelled"); + this.getEvent().end(); + this.getEvent().getPlugin().getEventManager().setCooldown(0L); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourEvent.java b/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourEvent.java new file mode 100644 index 0000000..982d1e0 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourEvent.java @@ -0,0 +1,235 @@ +package me.devkevin.practice.events.parkour; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.EventCountdownTask; +import me.devkevin.practice.events.EventPlayer; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.util.BlockUtil; +import me.devkevin.practice.util.ItemUtil; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public class ParkourEvent extends PracticeEvent { + private final Map players; + private final ParkourCountdownTask countdownTask; + private ParkourGameTask gameTask; + private WaterCheckTask waterCheckTask; + private List visibility; + + public ParkourEvent() { + super("Parkour"); + this.players = new HashMap(); + this.gameTask = null; + this.countdownTask = new ParkourCountdownTask(this); + } + + @Override + public Map getPlayers() { + return this.players; + } + + @Override + public EventCountdownTask getCountdownTask() { + return this.countdownTask; + } + + @Override + public List getSpawnLocations() { + return Collections.singletonList(this.getPlugin().getSpawnManager().getParkourLocation()); + } + + @Override + public void onStart() { + (this.gameTask = new ParkourGameTask()).runTaskTimerAsynchronously(this.getPlugin(), 0L, 20L); + (this.waterCheckTask = new WaterCheckTask()).runTaskTimer(this.getPlugin(), 0L, 10L); + this.visibility = new ArrayList<>(); + } + + @Override + public Consumer onJoin() { + return player ->this.players.put(player.getUniqueId(), new ParkourPlayer(player.getUniqueId(), this)); + } + + @Override + public Consumer onDeath() { + return player -> { + String message = ChatColor.YELLOW + "(Event) " + ChatColor.RED + player.getName() + ChatColor.GRAY + " has left the game."; + this.sendMessage(message); + PlayerData playerData = Practice.getInstance().getPlayerManager().getPlayerData(player.getUniqueId()); + playerData.setParkourEventLosses(playerData.getParkourEventLosses() + 1); + }; + } + + public void toggleVisibility(final Player player) { + if (this.visibility.contains(player.getUniqueId())) { + for (final Player playing : this.getBukkitPlayers()) { + player.showPlayer(playing); + } + this.visibility.remove(player.getUniqueId()); + player.sendMessage(ChatColor.GREEN + "You are now showing players."); + return; + } + for (final Player playing : this.getBukkitPlayers()) { + player.hidePlayer(playing); + } + this.visibility.add(player.getUniqueId()); + player.sendMessage(ChatColor.GREEN + "You are now hiding players."); + } + + private void teleportToSpawnOrCheckpoint(final Player player) { + final ParkourPlayer parkourPlayer = this.getPlayer(player.getUniqueId()); + if (parkourPlayer != null && parkourPlayer.getLastCheckpoint() != null) { + player.teleport(parkourPlayer.getLastCheckpoint().toBukkitLocation()); + player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY + "Teleporting back to last checkpoint."); + return; + } + player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY + "Teleporting back to the beginning."); + player.teleport(this.getPlugin().getSpawnManager().getParkourGameLocation().toBukkitLocation()); + } + + private void giveItems(final Player player) { + this.getPlugin().getServer().getScheduler().runTask(this.getPlugin(), () -> { + PlayerUtil.clearPlayer(player); + player.getInventory().setItem(0, ItemUtil.createItem(Material.FIREBALL, ChatColor.GREEN.toString() + ChatColor.BOLD + "Toggle Visibility")); + player.getInventory().setItem(4, ItemUtil.createItem(Material.NETHER_STAR, ChatColor.RED.toString() + ChatColor.BOLD + "Leave Event")); + player.updateInventory(); + }); + } + + private Player getRandomPlayer() { + if (this.getByState(ParkourPlayer.ParkourState.INGAME).size() == 0) { + return null; + } + final List fighting = this.getByState(ParkourPlayer.ParkourState.INGAME); + Collections.shuffle(fighting); + final UUID uuid = fighting.get(ThreadLocalRandom.current().nextInt(fighting.size())); + return this.getPlugin().getServer().getPlayer(uuid); + } + + public List getByState(final ParkourPlayer.ParkourState state) { + return this.players.values().stream().filter(player -> player.getState() == state).map(EventPlayer::getUuid).collect(Collectors.toList()); + } + + public ParkourGameTask getGameTask() { + return this.gameTask; + } + + public WaterCheckTask getWaterCheckTask() { + return this.waterCheckTask; + } + + public class ParkourGameTask extends BukkitRunnable { + private int time; + + public ParkourGameTask() { + this.time = 303; + } + + public void run() { + if (this.time == 303) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game starts in " + ChatColor.GREEN + 3 + ChatColor.YELLOW + "...", ParkourEvent.this.getBukkitPlayers()); + } else if (this.time == 302) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game starts in " + ChatColor.GREEN + 2 + ChatColor.YELLOW + "...", ParkourEvent.this.getBukkitPlayers()); + } else if (this.time == 301) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game starts in " + ChatColor.GREEN + 1 + ChatColor.YELLOW + "...", ParkourEvent.this.getBukkitPlayers()); + } else if (this.time == 300) { + PlayerUtil.sendMessage(ChatColor.GREEN + "The game has started, good luck!", ParkourEvent.this.getBukkitPlayers()); + for (final ParkourPlayer player : ParkourEvent.this.getPlayers().values()) { + player.setLastCheckpoint(null); + player.setState(ParkourPlayer.ParkourState.INGAME); + player.setCheckpointId(0); + } + for (final Player player2 : ParkourEvent.this.getBukkitPlayers()) { + ParkourEvent.this.teleportToSpawnOrCheckpoint(player2); + ParkourEvent.this.giveItems(player2); + } + } else if (this.time <= 0) { + final Player winner = ParkourEvent.this.getRandomPlayer(); + if (winner != null) { + final PlayerData winnerData = Practice.getInstance().getPlayerManager().getPlayerData(winner.getUniqueId()); + winnerData.setParkourEventWins(winnerData.getParkourEventWins() + 1); + for (int i = 0; i <= 2; ++i) { + final String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + winner.getName(); + Bukkit.broadcastMessage(announce); + } + } + ParkourEvent.this.end(); + this.cancel(); + return; + } + if (ParkourEvent.this.getPlayers().size() == 1) { + final Player winner = Bukkit.getPlayer(ParkourEvent.this.getByState(ParkourPlayer.ParkourState.INGAME).get(0)); + if (winner != null) { + final PlayerData winnerData = Practice.getInstance().getPlayerManager().getPlayerData(winner.getUniqueId()); + winnerData.setParkourEventWins(winnerData.getParkourEventWins() + 1); + for (int i = 0; i <= 2; ++i) { + final String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + winner.getName(); + Bukkit.broadcastMessage(announce); + } + } + ParkourEvent.this.end(); + this.cancel(); + return; + } + if (Arrays.asList(60, 50, 40, 30, 25, 20, 15, 10).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game ends in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", ParkourEvent.this.getBukkitPlayers()); + } else if (Arrays.asList(5, 4, 3, 2, 1).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game is ending in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", ParkourEvent.this.getBukkitPlayers()); + } + --this.time; + } + + public int getTime() { + return this.time; + } + } + + public class WaterCheckTask extends BukkitRunnable { + public void run() { + if (ParkourEvent.this.getPlayers().size() <= 1) { + return; + } + ParkourEvent.this.getBukkitPlayers().forEach(player -> { + if (ParkourEvent.this.getPlayer(player) == null || ParkourEvent.this.getPlayer(player).getState() == ParkourPlayer.ParkourState.INGAME) { + if (BlockUtil.isStandingOn(player, Material.WATER) || BlockUtil.isStandingOn(player, Material.STATIONARY_WATER)) { + ParkourEvent.this.teleportToSpawnOrCheckpoint(player); + } else if (BlockUtil.isStandingOn(player, Material.STONE_PLATE) || BlockUtil.isStandingOn(player, Material.IRON_PLATE) || BlockUtil.isStandingOn(player, Material.WOOD_PLATE)) { + ParkourPlayer parkourPlayer = ParkourEvent.this.getPlayer(player.getUniqueId()); + if (parkourPlayer != null) { + boolean checkpoint = false; + if (parkourPlayer.getLastCheckpoint() == null) { + checkpoint = true; + parkourPlayer.setLastCheckpoint(CustomLocation.fromBukkitLocation(player.getLocation())); + } else if (parkourPlayer.getLastCheckpoint() != null && !BlockUtil.isSameLocation(player.getLocation(), parkourPlayer.getLastCheckpoint().toBukkitLocation())) { + checkpoint = true; + parkourPlayer.setLastCheckpoint(CustomLocation.fromBukkitLocation(player.getLocation())); + } + if (checkpoint) { + parkourPlayer.setCheckpointId(parkourPlayer.getCheckpointId() + 1); + player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY + "Checkpoint #" + parkourPlayer.getCheckpointId() + " has been set."); + } + } + } else if (BlockUtil.isStandingOn(player, Material.GOLD_PLATE)) { + for (int i = 0; i <= 2; ++i) { + String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + player.getName(); + Bukkit.broadcastMessage(announce); + } + ParkourEvent.this.end(); + this.cancel(); + } + } + }); + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourPlayer.java b/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourPlayer.java new file mode 100644 index 0000000..6bb8d64 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/parkour/ParkourPlayer.java @@ -0,0 +1,47 @@ +package me.devkevin.practice.events.parkour; + +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.events.EventPlayer; +import me.devkevin.practice.events.PracticeEvent; + +import java.util.UUID; + +public class ParkourPlayer extends EventPlayer { + private ParkourState state; + private CustomLocation lastCheckpoint; + private int checkpointId; + + public ParkourPlayer(final UUID uuid, final PracticeEvent event) { + super(uuid, event); + this.state = ParkourState.WAITING; + } + + public ParkourState getState() { + return this.state; + } + + public void setState(final ParkourState state) { + this.state = state; + } + + public CustomLocation getLastCheckpoint() { + return this.lastCheckpoint; + } + + public void setLastCheckpoint(final CustomLocation lastCheckpoint) { + this.lastCheckpoint = lastCheckpoint; + } + + public int getCheckpointId() { + return this.checkpointId; + } + + public void setCheckpointId(final int checkpointId) { + this.checkpointId = checkpointId; + } + + public enum ParkourState { + WAITING, + INGAME + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverCountdownTask.java b/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverCountdownTask.java new file mode 100644 index 0000000..996888b --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverCountdownTask.java @@ -0,0 +1,30 @@ +package me.devkevin.practice.events.redrover; + +import org.bukkit.ChatColor; +import me.devkevin.practice.events.EventCountdownTask; +import me.devkevin.practice.events.PracticeEvent; + +import java.util.Arrays; + +public class RedroverCountdownTask extends EventCountdownTask { + public RedroverCountdownTask(final PracticeEvent event) { + super(event, 60); + } + + @Override + public boolean shouldAnnounce(final int timeUntilStart) { + return Arrays.asList(45, 30, 15, 10, 5).contains(timeUntilStart); + } + + @Override + public boolean canStart() { + return this.getEvent().getPlayers().size() >= 2; + } + + @Override + public void onCancel() { + this.getEvent().sendMessage(ChatColor.RED + "Not enough players. Event has been cancelled"); + this.getEvent().end(); + this.getEvent().getPlugin().getEventManager().setCooldown(0L); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverEvent.java b/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverEvent.java new file mode 100644 index 0000000..bc64356 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverEvent.java @@ -0,0 +1,318 @@ +package me.devkevin.practice.events.redrover; + +import com.google.common.collect.Lists; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.events.EventCountdownTask; +import me.devkevin.practice.events.EventPlayer; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public class RedroverEvent extends PracticeEvent { + final List fighting; + private final Map players; + private final List blueTeam; + private final List redTeam; + private final RedroverCountdownTask countdownTask; + UUID streakPlayer; + private RedroverGameTask gameTask; + + public RedroverEvent() { + super("Redrover"); + this.players = new HashMap(); + this.blueTeam = new ArrayList(); + this.redTeam = new ArrayList(); + this.streakPlayer = null; + this.fighting = new ArrayList(); + this.gameTask = null; + this.countdownTask = new RedroverCountdownTask(this); + } + + @Override + public Map getPlayers() { + return this.players; + } + + @Override + public EventCountdownTask getCountdownTask() { + return this.countdownTask; + } + + @Override + public List getSpawnLocations() { + return Collections.singletonList(this.getPlugin().getSpawnManager().getRedroverLocation()); + } + + @Override + public void onStart() { + (this.gameTask = new RedroverGameTask()).runTaskTimerAsynchronously(this.getPlugin(), 0L, 20L); + this.fighting.clear(); + this.redTeam.clear(); + this.blueTeam.clear(); + this.generateTeams(); + } + + @Override + public Consumer onJoin() { + return player -> this.players.put(player.getUniqueId(), new RedroverPlayer(player.getUniqueId(), this)); + } + + @Override + public Consumer onDeath() { + return (player) -> { + RedroverPlayer data = this.getPlayer(player); + if(data != null) { + if(data.getState() == RedroverPlayer.RedroverState.FIGHTING || data.getState() == RedroverPlayer.RedroverState.PREPARING) { + if(data.getFightTask() != null) { + data.getFightTask().cancel(); + } + + if(data.getFightPlayer() != null && data.getFightPlayer().getFightTask() != null) { + data.getFightPlayer().getFightTask().cancel(); + } + + this.getPlayers().remove(player.getUniqueId()); + this.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.RED + player.getName() + ChatColor.GRAY + " has been eliminated" + (Bukkit.getPlayer(data.getFightPlayer().getUuid()) == null?".":" by " + ChatColor.GREEN + Bukkit.getPlayer(data.getFightPlayer().getUuid()).getName())); + this.getPlugin().getServer().getScheduler().runTask(this.getPlugin(), () -> { + this.getPlugin().getPlayerManager().sendToSpawnAndReset(player); + if(this.getPlayers().size() >= 2) { + this.getPlugin().getEventManager().addSpectatorRedrover(player, this.getPlugin().getPlayerManager().getPlayerData(player.getUniqueId()), this); + } + + }); + this.fighting.remove(player.getUniqueId()); + this.redTeam.remove(player.getUniqueId()); + this.blueTeam.remove(player.getUniqueId()); + this.prepareNextMatch(); + } + + } + }; + } + + private CustomLocation[] getGameLocations() { + final CustomLocation[] array = {this.getPlugin().getSpawnManager().getRedroverFirst(), this.getPlugin().getSpawnManager().getRedroverSecond()}; + return array; + } + + private void prepareNextMatch() { + if (this.blueTeam.size() == 0 || this.redTeam.size() == 0) { + final List winnerTeam = this.getWinningTeam(); + String winnerTeamName = ChatColor.WHITE.toString() + ChatColor.BOLD + "Tie"; + if (this.redTeam.size() > this.blueTeam.size()) { + winnerTeamName = ChatColor.RED.toString() + ChatColor.BOLD + "RED"; + } else if (this.blueTeam.size() > this.redTeam.size()) { + winnerTeamName = ChatColor.BLUE.toString() + ChatColor.BOLD + "BLUE"; + } + final StringJoiner winnerJoiner = new StringJoiner(", "); + if (winnerTeam != null && winnerTeam.size() > 0) { + for (final UUID winner : winnerTeam) { + final Player player = this.getPlugin().getServer().getPlayer(winner); + if (player != null) { + winnerJoiner.add(player.getName()); + this.fighting.remove(player.getUniqueId()); + } + } + } + for (int i = 0; i <= 2; ++i) { + final String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + winnerTeamName + ((winnerJoiner.length() == 0) ? "" : ("\n" + ChatColor.YELLOW + "(Event) " + ChatColor.GRAY + winnerJoiner.toString())); + Bukkit.broadcastMessage(announce); + } + this.gameTask.cancel(); + this.end(); + return; + } + RedroverPlayer redPlayer = this.getPlayer(this.redTeam.get(ThreadLocalRandom.current().nextInt(this.redTeam.size()))); + RedroverPlayer bluePlayer = this.getPlayer(this.blueTeam.get(ThreadLocalRandom.current().nextInt(this.blueTeam.size()))); + if (this.fighting.size() == 1 && this.redTeam.contains(this.fighting.get(0))) { + redPlayer = this.getPlayer(this.fighting.get(0)); + this.streakPlayer = redPlayer.getUuid(); + } else if (this.fighting.size() == 1 && this.blueTeam.contains(this.fighting.get(0))) { + bluePlayer = this.getPlayer(this.fighting.get(0)); + this.streakPlayer = bluePlayer.getUuid(); + } + this.fighting.clear(); + this.fighting.addAll(Arrays.asList(redPlayer.getUuid(), bluePlayer.getUuid())); + final Player picked1 = this.getPlugin().getServer().getPlayer(redPlayer.getUuid()); + final Player picked2 = this.getPlugin().getServer().getPlayer(bluePlayer.getUuid()); + redPlayer.setState(RedroverPlayer.RedroverState.PREPARING); + bluePlayer.setState(RedroverPlayer.RedroverState.PREPARING); + final BukkitTask task = new RedroverFightTask(picked1, picked2, redPlayer, bluePlayer).runTaskTimer(this.getPlugin(), 0L, 20L); + redPlayer.setFightPlayer(bluePlayer); + bluePlayer.setFightPlayer(redPlayer); + redPlayer.setFightTask(task); + bluePlayer.setFightTask(task); + this.getPlugin().getServer().getScheduler().runTask(this.getPlugin(), new Runnable() { + @Override + public void run() { + final Player[] array; + final Player[] players = array = new Player[]{picked1, picked2}; + for (final Player player : array) { + if (RedroverEvent.this.streakPlayer == null || RedroverEvent.this.streakPlayer != player.getUniqueId()) { + PlayerUtil.clearPlayer(player); + RedroverEvent.this.getPlugin().getKitManager().getKit("NoDebuff").applyToPlayer(player); + player.updateInventory(); + } + } + picked1.teleport(RedroverEvent.this.getGameLocations()[0].toBukkitLocation()); + picked2.teleport(RedroverEvent.this.getGameLocations()[1].toBukkitLocation()); + } + }); + this.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY.toString() + "Upcoming Match: " + ChatColor.RED + picked1.getName() + ChatColor.GRAY + " vs. " + ChatColor.BLUE + picked2.getName() + ChatColor.GRAY + "."); + } + + private void generateTeams() { + final ArrayList players = Lists.newArrayList(this.players.keySet()); + this.redTeam.addAll(players.subList(0, players.size() / 2 + players.size() % 2)); + this.blueTeam.addAll(players.subList(players.size() / 2 + players.size() % 2, players.size())); + for (final UUID uuid : this.blueTeam) { + final Player player = Bukkit.getPlayer(uuid); + if (player != null) { + player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY.toString() + "You have been added to the " + ChatColor.BLUE.toString() + ChatColor.BOLD + "BLUE" + ChatColor.GRAY + " Team."); + } + } + for (final UUID uuid : this.redTeam) { + final Player player = Bukkit.getPlayer(uuid); + if (player != null) { + player.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY.toString() + "You have been added to the " + ChatColor.RED.toString() + ChatColor.BOLD + "RED" + ChatColor.GRAY + " Team."); + } + } + } + + private List getWinningTeam() { + if (this.redTeam.size() > this.blueTeam.size()) { + return this.redTeam; + } + if (this.blueTeam.size() > this.redTeam.size()) { + return this.blueTeam; + } + return null; + } + + public List getByState(final RedroverPlayer.RedroverState state) { + return this.players.values().stream().filter(player -> player.getState() == state).map(EventPlayer::getUuid).collect(Collectors.toList()); + } + + public List getBlueTeam() { + return this.blueTeam; + } + + public List getRedTeam() { + return this.redTeam; + } + + public UUID getStreakPlayer() { + return this.streakPlayer; + } + + public List getFighting() { + return this.fighting; + } + + public RedroverGameTask getGameTask() { + return this.gameTask; + } + + public class RedroverFightTask extends BukkitRunnable { + private final Player player; + private final Player other; + private final RedroverPlayer redroverPlayer; + private final RedroverPlayer redroverOther; + private int time; + + public RedroverFightTask(final Player player, final Player other, final RedroverPlayer redroverPlayer, final RedroverPlayer redroverOther) { + this.time = 180; + this.player = player; + this.other = other; + this.redroverPlayer = redroverPlayer; + this.redroverOther = redroverOther; + } + + public void run() { + if (this.player == null || this.other == null || !this.player.isOnline() || !this.other.isOnline()) { + this.cancel(); + return; + } + if (this.time == 180) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match starts in " + ChatColor.GREEN + 3 + ChatColor.YELLOW + "...", this.player, this.other); + } else if (this.time == 179) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match starts in " + ChatColor.GREEN + 2 + ChatColor.YELLOW + "...", this.player, this.other); + } else if (this.time == 178) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match starts in " + ChatColor.GREEN + 1 + ChatColor.YELLOW + "...", this.player, this.other); + } else if (this.time == 177) { + PlayerUtil.sendMessage(ChatColor.GREEN + "The match has started, good luck!", this.player, this.other); + this.redroverOther.setState(RedroverPlayer.RedroverState.FIGHTING); + this.redroverPlayer.setState(RedroverPlayer.RedroverState.FIGHTING); + } else if (this.time <= 0) { + final List players = Arrays.asList(this.player, this.other); + final Player winner = players.get(ThreadLocalRandom.current().nextInt(players.size())); + players.stream().filter(pl -> !pl.equals(winner)).forEach(pl -> RedroverEvent.this.onDeath().accept(pl)); + this.cancel(); + return; + } + if (Arrays.asList(30, 25, 20, 15, 10).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match ends in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", this.player, this.other); + } else if (Arrays.asList(5, 4, 3, 2, 1).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match is ending in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", this.player, this.other); + } + --this.time; + } + + public Player getPlayer() { + return this.player; + } + + public Player getOther() { + return this.other; + } + + public RedroverPlayer getRedroverPlayer() { + return this.redroverPlayer; + } + + public RedroverPlayer getRedroverOther() { + return this.redroverOther; + } + + public int getTime() { + return this.time; + } + } + + public class RedroverGameTask extends BukkitRunnable { + private int time; + + public RedroverGameTask() { + this.time = 1200; + } + + public void run() { + if (this.time == 1200) { + RedroverEvent.this.prepareNextMatch(); + } + if (Arrays.asList(60, 50, 40, 30, 25, 20, 15, 10).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game ends in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", RedroverEvent.this.getBukkitPlayers()); + } else if (Arrays.asList(5, 4, 3, 2, 1).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The game is ending in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", RedroverEvent.this.getBukkitPlayers()); + } + --this.time; + } + + public int getTime() { + return this.time; + } + + public void setTime(final int time) { + this.time = time; + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverPlayer.java b/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverPlayer.java new file mode 100644 index 0000000..c67eb76 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/redrover/RedroverPlayer.java @@ -0,0 +1,48 @@ +package me.devkevin.practice.events.redrover; + +import org.bukkit.scheduler.BukkitTask; +import me.devkevin.practice.events.EventPlayer; +import me.devkevin.practice.events.PracticeEvent; + +import java.util.UUID; + +public class RedroverPlayer extends EventPlayer { + private RedroverState state; + private RedroverPlayer fightPlayer; + private BukkitTask fightTask; + + public RedroverPlayer(final UUID uuid, final PracticeEvent event) { + super(uuid, event); + this.state = RedroverState.WAITING; + } + + public RedroverState getState() { + return this.state; + } + + public void setState(final RedroverState state) { + this.state = state; + } + + public RedroverPlayer getFightPlayer() { + return this.fightPlayer; + } + + public void setFightPlayer(final RedroverPlayer fightPlayer) { + this.fightPlayer = fightPlayer; + } + + public BukkitTask getFightTask() { + return this.fightTask; + } + + public void setFightTask(final BukkitTask fightTask) { + this.fightTask = fightTask; + } + + public enum RedroverState { + WAITING, + PREPARING, + FIGHTING + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoCountdownTask.java b/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoCountdownTask.java new file mode 100644 index 0000000..3cb7e71 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoCountdownTask.java @@ -0,0 +1,30 @@ +package me.devkevin.practice.events.sumo; + +import org.bukkit.ChatColor; +import me.devkevin.practice.events.EventCountdownTask; +import me.devkevin.practice.events.PracticeEvent; + +import java.util.Arrays; + +public class SumoCountdownTask extends EventCountdownTask { + public SumoCountdownTask(final PracticeEvent event) { + super(event, 60); + } + + @Override + public boolean shouldAnnounce(final int timeUntilStart) { + return Arrays.asList(45, 30, 15, 10, 5).contains(timeUntilStart); + } + + @Override + public boolean canStart() { + return this.getEvent().getPlayers().size() >= 2; + } + + @Override + public void onCancel() { + this.getEvent().sendMessage(ChatColor.RED + "Not enough players. Event has been cancelled"); + this.getEvent().end(); + this.getEvent().getPlugin().getEventManager().setCooldown(0L); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoEvent.java b/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoEvent.java new file mode 100644 index 0000000..a376f2a --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoEvent.java @@ -0,0 +1,274 @@ +package me.devkevin.practice.events.sumo; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.EventCountdownTask; +import me.devkevin.practice.events.EventPlayer; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public class SumoEvent extends PracticeEvent { + final HashSet fighting; + private final Map players; + private final SumoCountdownTask countdownTask; + private WaterCheckTask waterCheckTask; + + public SumoEvent() { + super("Sumo"); + this.players = new HashMap<>(); + this.fighting = new HashSet<>(); + this.countdownTask = new SumoCountdownTask(this); + } + + @Override + public Map getPlayers() { + return this.players; + } + + @Override + public EventCountdownTask getCountdownTask() { + return this.countdownTask; + } + + @Override + public List getSpawnLocations() { + return Collections.singletonList(this.getPlugin().getSpawnManager().getSumoLocation()); + } + + @Override + public void onStart() { + (this.waterCheckTask = new WaterCheckTask()).runTaskTimer(this.getPlugin(), 0L, 10L); + this.selectPlayers(); + } + + @Override + public Consumer onJoin() { + return player -> this.players.put(player.getUniqueId(), new SumoPlayer(player.getUniqueId(), this)); + } + + @Override + public Consumer onDeath() { + return player -> { + SumoPlayer data = this.getPlayer(player); + if (data != null && data.getFighting() != null) { + if (data.getState() == SumoPlayer.SumoState.FIGHTING || data.getState() == SumoPlayer.SumoState.PREPARING) { + SumoPlayer killerData = data.getFighting(); + Player killer = this.getPlugin().getServer().getPlayer(killerData.getUuid()); + data.getFightTask().cancel(); + killerData.getFightTask().cancel(); + PlayerData playerData = this.getPlugin().getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData != null) { + playerData.setSumoEventLosses(playerData.getSumoEventLosses() + 1); + } + + data.setState(SumoPlayer.SumoState.ELIMINATED); + killerData.setState(SumoPlayer.SumoState.WAITING); + PlayerUtil.clearPlayer(player); + this.getPlugin().getPlayerManager().giveLobbyItems(player); + PlayerUtil.clearPlayer(killer); + this.getPlugin().getPlayerManager().giveLobbyItems(killer); + if (this.getSpawnLocations().size() == 1) { + player.teleport(this.getSpawnLocations().get(0).toBukkitLocation()); + killer.teleport(this.getSpawnLocations().get(0).toBukkitLocation()); + } + + this.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.RED + player.getName() + ChatColor.GRAY + " has been eliminated" + (killer == null ? "." : " by " + ChatColor.GREEN + killer.getName())); + if (this.getByState(SumoPlayer.SumoState.WAITING).size() == 1) { + Player winner = Bukkit.getPlayer(this.getByState(SumoPlayer.SumoState.WAITING).get(0)); + PlayerData winnerData = Practice.getInstance().getPlayerManager().getPlayerData(winner.getUniqueId()); + winnerData.setSumoEventWins(winnerData.getSumoEventWins() + 1); + + for (int i = 0; i <= 2; ++i) { + String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + winner.getName(); + Bukkit.broadcastMessage(announce); + } + + this.fighting.clear(); + this.end(); + } else { + this.getPlugin().getServer().getScheduler().runTaskLater(this.getPlugin(), this::selectPlayers, 60L); + } + } + + } + }; + } + + + private CustomLocation[] getSumoLocations() { + final CustomLocation[] array = {this.getPlugin().getSpawnManager().getSumoFirst(), this.getPlugin().getSpawnManager().getSumoSecond()}; + return array; + } + + private void selectPlayers() { + if (this.getByState(SumoPlayer.SumoState.WAITING).size() == 1) { + final Player winner = Bukkit.getPlayer(this.getByState(SumoPlayer.SumoState.WAITING).get(0)); + final PlayerData winnerData = Practice.getInstance().getPlayerManager().getPlayerData(winner.getUniqueId()); + winnerData.setSumoEventWins(winnerData.getSumoEventWins() + 1); + for (int i = 0; i <= 2; ++i) { + final String announce = ChatColor.YELLOW + "(Event) " + ChatColor.GREEN.toString() + "Winner: " + winner.getName(); + Bukkit.broadcastMessage(announce); + } + this.fighting.clear(); + this.end(); + return; + } + final Player picked1 = this.getRandomPlayer(); + final Player picked2 = this.getRandomPlayer(); + if (picked1 == null || picked2 == null) { + this.selectPlayers(); + return; + } + this.sendMessage(ChatColor.YELLOW + "(Event) " + ChatColor.GRAY + "Selecting random players..."); + this.fighting.clear(); + final SumoPlayer picked1Data = this.getPlayer(picked1); + final SumoPlayer picked2Data = this.getPlayer(picked2); + picked1Data.setFighting(picked2Data); + picked2Data.setFighting(picked1Data); + this.fighting.add(picked1.getName()); + this.fighting.add(picked2.getName()); + PlayerUtil.clearPlayer(picked1); + PlayerUtil.clearPlayer(picked2); + picked1.teleport(this.getSumoLocations()[0].toBukkitLocation()); + picked2.teleport(this.getSumoLocations()[1].toBukkitLocation()); + for (final Player other : this.getBukkitPlayers()) { + if (other != null) { + other.showPlayer(picked1); + other.showPlayer(picked2); + } + } + for (final UUID spectatorUUID : this.getPlugin().getEventManager().getSpectators().keySet()) { + final Player spectator = Bukkit.getPlayer(spectatorUUID); + if (spectatorUUID != null) { + spectator.showPlayer(picked1); + spectator.showPlayer(picked2); + } + } + picked1.showPlayer(picked2); + picked2.showPlayer(picked1); + this.sendMessage(ChatColor.YELLOW + "Starting event match. " + ChatColor.GREEN + "(" + picked1.getName() + " vs " + picked2.getName() + ")"); + final BukkitTask task = new SumoFightTask(picked1, picked2, picked1Data, picked2Data).runTaskTimer(this.getPlugin(), 0L, 20L); + picked1Data.setFightTask(task); + picked2Data.setFightTask(task); + } + + private Player getRandomPlayer() { + if (this.getByState(SumoPlayer.SumoState.WAITING).size() == 0) { + return null; + } + final List waiting = this.getByState(SumoPlayer.SumoState.WAITING); + Collections.shuffle(waiting); + final UUID uuid = waiting.get(ThreadLocalRandom.current().nextInt(waiting.size())); + this.getPlayer(uuid).setState(SumoPlayer.SumoState.PREPARING); + return this.getPlugin().getServer().getPlayer(uuid); + } + + public List getByState(final SumoPlayer.SumoState state) { + return this.players.values().stream().filter(player -> player.getState() == state).map(EventPlayer::getUuid).collect(Collectors.toList()); + } + + public HashSet getFighting() { + return this.fighting; + } + + public WaterCheckTask getWaterCheckTask() { + return this.waterCheckTask; + } + + public class SumoFightTask extends BukkitRunnable { + private final Player player; + private final Player other; + private final SumoPlayer playerSumo; + private final SumoPlayer otherSumo; + private int time; + + public SumoFightTask(final Player player, final Player other, final SumoPlayer playerSumo, final SumoPlayer otherSumo) { + this.time = 90; + this.player = player; + this.other = other; + this.playerSumo = playerSumo; + this.otherSumo = otherSumo; + } + + public void run() { + if (this.player == null || this.other == null || !this.player.isOnline() || !this.other.isOnline()) { + this.cancel(); + return; + } + if (this.time == 90) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match starts in " + ChatColor.GREEN + 3 + ChatColor.YELLOW + "...", this.player, this.other); + } else if (this.time == 89) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match starts in " + ChatColor.GREEN + 2 + ChatColor.YELLOW + "...", this.player, this.other); + } else if (this.time == 88) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match starts in " + ChatColor.GREEN + 1 + ChatColor.YELLOW + "...", this.player, this.other); + } else if (this.time == 87) { + PlayerUtil.sendMessage(ChatColor.GREEN + "The match has started, good luck!", this.player, this.other); + this.otherSumo.setState(SumoPlayer.SumoState.FIGHTING); + this.playerSumo.setState(SumoPlayer.SumoState.FIGHTING); + } else if (this.time <= 0) { + final List players = Arrays.asList(this.player, this.other); + final Player winner = players.get(ThreadLocalRandom.current().nextInt(players.size())); + players.stream().filter(pl -> !pl.equals(winner)).forEach(pl -> SumoEvent.this.onDeath().accept(pl)); + this.cancel(); + return; + } + if (Arrays.asList(30, 25, 20, 15, 10).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match ends in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", this.player, this.other); + } else if (Arrays.asList(5, 4, 3, 2, 1).contains(this.time)) { + PlayerUtil.sendMessage(ChatColor.YELLOW + "The match is ending in " + ChatColor.GREEN + this.time + ChatColor.YELLOW + "...", this.player, this.other); + } + --this.time; + } + + public Player getPlayer() { + return this.player; + } + + public Player getOther() { + return this.other; + } + + public SumoPlayer getPlayerSumo() { + return this.playerSumo; + } + + public SumoPlayer getOtherSumo() { + return this.otherSumo; + } + + public int getTime() { + return this.time; + } + } + + public class WaterCheckTask extends BukkitRunnable { + public void run() { + if (SumoEvent.this.getPlayers().size() <= 1) { + return; + } + SumoEvent.this.getBukkitPlayers().forEach(player -> { + if (SumoEvent.this.getPlayer(player) == null || (SumoEvent.this.getPlayer(player)).getState() == SumoPlayer.SumoState.FIGHTING) { + Block legs = player.getLocation().getBlock(); + Block head = legs.getRelative(BlockFace.UP); + if (legs.getType() == Material.WATER || legs.getType() == Material.STATIONARY_WATER || head.getType() == Material.WATER || head.getType() == Material.STATIONARY_WATER) { + SumoEvent.this.onDeath().accept(player); + } + } + }); + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoPlayer.java b/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoPlayer.java new file mode 100644 index 0000000..50dc25e --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/events/sumo/SumoPlayer.java @@ -0,0 +1,49 @@ +package me.devkevin.practice.events.sumo; + +import org.bukkit.scheduler.BukkitTask; +import me.devkevin.practice.events.EventPlayer; +import me.devkevin.practice.events.PracticeEvent; + +import java.util.UUID; + +public class SumoPlayer extends EventPlayer { + private SumoState state; + private BukkitTask fightTask; + private SumoPlayer fighting; + + public SumoPlayer(final UUID uuid, final PracticeEvent event) { + super(uuid, event); + this.state = SumoState.WAITING; + } + + public SumoState getState() { + return this.state; + } + + public void setState(final SumoState state) { + this.state = state; + } + + public BukkitTask getFightTask() { + return this.fightTask; + } + + public void setFightTask(final BukkitTask fightTask) { + this.fightTask = fightTask; + } + + public SumoPlayer getFighting() { + return this.fighting; + } + + public void setFighting(final SumoPlayer fighting) { + this.fighting = fighting; + } + + public enum SumoState { + WAITING, + PREPARING, + FIGHTING, + ELIMINATED + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/ffa/FFAManager.java b/dPractice/src/main/java/me/devkevin/practice/ffa/FFAManager.java new file mode 100644 index 0000000..9dbbfff --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/ffa/FFAManager.java @@ -0,0 +1,92 @@ +package me.devkevin.practice.ffa; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.ffa.killstreak.KillStreak; +import me.devkevin.practice.ffa.killstreak.impl.DebuffKillStreak; +import me.devkevin.practice.ffa.killstreak.impl.GappleKillStreak; +import me.devkevin.practice.ffa.killstreak.impl.GodAppleKillStreak; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +import java.util.*; + +public class FFAManager { + private final Map itemTracker; + private final Map killStreakTracker; + private final Set killStreaks; + private final Practice plugin; + private final CustomLocation spawnPoint; + private final Kit kit; + + public FFAManager(final CustomLocation spawnPoint, final Kit kit) { + this.itemTracker = new HashMap(); + this.killStreakTracker = new HashMap(); + this.killStreaks = new HashSet(); + this.plugin = Practice.getInstance(); + this.spawnPoint = spawnPoint; + this.kit = kit; + } + + public void addPlayer(final Player player) { + if (this.killStreaks.isEmpty()) { + this.killStreaks.add(new GappleKillStreak()); + this.killStreaks.add(new DebuffKillStreak()); + this.killStreaks.add(new GodAppleKillStreak()); + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + playerData.setPlayerState(PlayerState.FFA); + player.teleport(this.spawnPoint.toBukkitLocation()); + player.sendMessage(ChatColor.GREEN + "You have been sent to the FFA arena."); + this.kit.applyToPlayer(player); + for (int i = 0; i < player.getInventory().getContents().length; ++i) { + final ItemStack itemStack = player.getInventory().getContents()[i]; + if (itemStack != null && itemStack.getType() == Material.POTION) { + player.getInventory().setItem(i, new ItemStack(Material.MUSHROOM_SOUP)); + } + } + player.getActivePotionEffects().forEach(potionEffect -> player.removePotionEffect(potionEffect.getType())); + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 1)); + for (final PlayerData data : this.plugin.getPlayerManager().getAllData()) { + final Player player2 = this.plugin.getServer().getPlayer(data.getUniqueId()); + if (data.getPlayerState() == PlayerState.FFA) { + player.showPlayer(player2); + player2.showPlayer(player); + } else { + player.hidePlayer(player2); + player2.hidePlayer(player); + } + } + } + + public void removePlayer(final Player player) { + for (final PlayerData data : this.plugin.getPlayerManager().getAllData()) { + final Player player2 = this.plugin.getServer().getPlayer(data.getUniqueId()); + if (data.getPlayerState() == PlayerState.FFA) { + player.hidePlayer(player2); + player2.hidePlayer(player); + } + } + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + } + + public Map getItemTracker() { + return this.itemTracker; + } + + public Map getKillStreakTracker() { + return this.killStreakTracker; + } + + public Set getKillStreaks() { + return this.killStreaks; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/KillStreak.java b/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/KillStreak.java new file mode 100644 index 0000000..7243f24 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/KillStreak.java @@ -0,0 +1,11 @@ +package me.devkevin.practice.ffa.killstreak; + +import org.bukkit.entity.Player; + +import java.util.List; + +public interface KillStreak { + void giveKillStreak(final Player p0); + + List getStreaks(); +} diff --git a/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/DebuffKillStreak.java b/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/DebuffKillStreak.java new file mode 100644 index 0000000..21ae9fe --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/DebuffKillStreak.java @@ -0,0 +1,31 @@ +package me.devkevin.practice.ffa.killstreak.impl; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.ffa.killstreak.KillStreak; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.Arrays; +import java.util.List; + +public class DebuffKillStreak implements KillStreak { + private static final ItemStack SLOWNESS; + private static final ItemStack POISON; + + static { + SLOWNESS = new ItemStack(Material.POTION, 1, (short) 16394); + POISON = new ItemStack(Material.POTION, 1, (short) 16388); + } + + @Override + public void giveKillStreak(final Player player) { + PlayerUtil.setFirstSlotOfType(player, Material.MUSHROOM_SOUP, DebuffKillStreak.SLOWNESS.clone()); + PlayerUtil.setFirstSlotOfType(player, Material.MUSHROOM_SOUP, DebuffKillStreak.POISON.clone()); + } + + @Override + public List getStreaks() { + return Arrays.asList(7, 25); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/GappleKillStreak.java b/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/GappleKillStreak.java new file mode 100644 index 0000000..f871300 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/GappleKillStreak.java @@ -0,0 +1,22 @@ +package me.devkevin.practice.ffa.killstreak.impl; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.ffa.killstreak.KillStreak; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.Arrays; +import java.util.List; + +public class GappleKillStreak implements KillStreak { + @Override + public void giveKillStreak(final Player player) { + PlayerUtil.setFirstSlotOfType(player, Material.MUSHROOM_SOUP, new ItemStack(Material.GOLDEN_APPLE, 3)); + } + + @Override + public List getStreaks() { + return Arrays.asList(3, 15); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/GodAppleKillStreak.java b/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/GodAppleKillStreak.java new file mode 100644 index 0000000..4816b00 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/ffa/killstreak/impl/GodAppleKillStreak.java @@ -0,0 +1,22 @@ +package me.devkevin.practice.ffa.killstreak.impl; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.ffa.killstreak.KillStreak; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.Arrays; +import java.util.List; + +public class GodAppleKillStreak implements KillStreak { + @Override + public void giveKillStreak(final Player player) { + PlayerUtil.setFirstSlotOfType(player, Material.MUSHROOM_SOUP, new ItemStack(Material.GOLDEN_APPLE, 1, (short) 1)); + } + + @Override + public List getStreaks() { + return Arrays.asList(30, 40, 60, 75, 100); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/file/Config.java b/dPractice/src/main/java/me/devkevin/practice/file/Config.java new file mode 100644 index 0000000..036022c --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/file/Config.java @@ -0,0 +1,48 @@ +package me.devkevin.practice.file; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.io.IOException; + +public class Config { + private final FileConfiguration config; + private final File configFile; + protected boolean wasCreated; + + public Config(final String name, final JavaPlugin plugin) { + this.configFile = new File(plugin.getDataFolder() + "/" + name + ".yml"); + if (!this.configFile.exists()) { + try { + this.configFile.getParentFile().mkdirs(); + this.configFile.createNewFile(); + this.wasCreated = true; + } catch (IOException e) { + e.printStackTrace(); + } + } + this.config = YamlConfiguration.loadConfiguration(this.configFile); + } + + public void save() { + try { + this.config.save(this.configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public FileConfiguration getConfig() { + return this.config; + } + + public File getConfigFile() { + return this.configFile; + } + + public boolean isWasCreated() { + return this.wasCreated; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/file/ConfigFile.java b/dPractice/src/main/java/me/devkevin/practice/file/ConfigFile.java new file mode 100644 index 0000000..5eaaa0e --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/file/ConfigFile.java @@ -0,0 +1,102 @@ +package me.devkevin.practice.file; + +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ConfigFile { + private File file; + private YamlConfiguration configuration; + + public ConfigFile(final JavaPlugin plugin, final String name) { + this.file = new File(plugin.getDataFolder(), name + ".yml"); + if (!this.file.getParentFile().exists()) { + this.file.getParentFile().mkdir(); + } + plugin.saveResource(name + ".yml", false); + this.configuration = YamlConfiguration.loadConfiguration(this.file); + } + + public double getDouble(final String path) { + if (this.configuration.contains(path)) { + return this.configuration.getDouble(path); + } + return 0.0; + } + + public int getInt(final String path) { + if (this.configuration.contains(path)) { + return this.configuration.getInt(path); + } + return 0; + } + + public boolean getBoolean(final String path) { + return this.configuration.contains(path) && this.configuration.getBoolean(path); + } + + public String getString(final String path) { + if (this.configuration.contains(path)) { + return ChatColor.translateAlternateColorCodes('&', this.configuration.getString(path)); + } + return "ERROR: STRING NOT FOUND"; + } + + public String getString(final String path, final String callback, final boolean colorize) { + if (!this.configuration.contains(path)) { + return callback; + } + if (colorize) { + return ChatColor.translateAlternateColorCodes('&', this.configuration.getString(path)); + } + return this.configuration.getString(path); + } + + public List getReversedStringList(final String path) { + final List list = this.getStringList(path); + if (list != null) { + final int size = list.size(); + final List toReturn = new ArrayList(); + for (int i = size - 1; i >= 0; --i) { + toReturn.add(list.get(i)); + } + return toReturn; + } + return Arrays.asList("ERROR: STRING LIST NOT FOUND!"); + } + + public List getStringList(final String path) { + if (this.configuration.contains(path)) { + final ArrayList strings = new ArrayList(); + for (final String string : this.configuration.getStringList(path)) { + strings.add(ChatColor.translateAlternateColorCodes('&', string)); + } + return strings; + } + return Arrays.asList("ERROR: STRING LIST NOT FOUND!"); + } + + public List getStringListOrDefault(final String path, final List toReturn) { + if (this.configuration.contains(path)) { + final ArrayList strings = new ArrayList(); + for (final String string : this.configuration.getStringList(path)) { + strings.add(ChatColor.translateAlternateColorCodes('&', string)); + } + return strings; + } + return toReturn; + } + + public File getFile() { + return this.file; + } + + public YamlConfiguration getConfiguration() { + return this.configuration; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/handler/CustomMovementHandler.java b/dPractice/src/main/java/me/devkevin/practice/handler/CustomMovementHandler.java new file mode 100644 index 0000000..d9b3793 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/handler/CustomMovementHandler.java @@ -0,0 +1,144 @@ +package me.devkevin.practice.handler; + +import gg.ragemc.spigot.handler.MovementHandler; +import net.minecraft.server.v1_8_R3.PacketPlayInFlying; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.events.oitc.OITCEvent; +import me.devkevin.practice.events.oitc.OITCPlayer; +import me.devkevin.practice.events.redrover.RedroverEvent; +import me.devkevin.practice.events.redrover.RedroverPlayer; +import me.devkevin.practice.events.sumo.SumoEvent; +import me.devkevin.practice.events.sumo.SumoPlayer; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchState; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.BlockUtil; + +import java.util.HashMap; +import java.util.UUID; + +public class CustomMovementHandler implements MovementHandler { + private static HashMap> parkourCheckpoints; + + static { + CustomMovementHandler.parkourCheckpoints = new HashMap<>(); + } + + private final Practice plugin; + + public CustomMovementHandler() { + this.plugin = Practice.getInstance(); + } + + public static HashMap> getParkourCheckpoints() { + return CustomMovementHandler.parkourCheckpoints; + } + + public void handleUpdateLocation(final Player player, final Location to, final Location from, final PacketPlayInFlying packetPlayInFlying) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData == null) { + this.plugin.getLogger().warning(player.getName() + "'s player data is null"); + return; + } + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + final Match match = this.plugin.getMatchManager().getMatch(player.getUniqueId()); + if (match == null) { + return; + } + if (match.getKit().isSpleef() || match.getKit().isSumo()) { + if (BlockUtil.isOnLiquid(to, 0) || BlockUtil.isOnLiquid(to, 1)) { + this.plugin.getMatchManager().removeFighter(player, playerData, true); + } + if ((to.getX() != from.getX() || to.getZ() != from.getZ()) && match.getMatchState() == MatchState.STARTING) { + player.teleport(from); + ((CraftPlayer) player).getHandle().playerConnection.checkMovement = false; + } + } + if (match.getKit().isParkour()) { + if (BlockUtil.isStandingOn(player, Material.GOLD_PLATE)) { + for (final UUID uuid : this.plugin.getMatchManager().getOpponents(match, player)) { + final Player opponent = Bukkit.getPlayer(uuid); + if (opponent != null) { + this.plugin.getMatchManager().removeFighter(opponent, this.plugin.getPlayerManager().getPlayerData(opponent.getUniqueId()), true); + } + } + CustomMovementHandler.parkourCheckpoints.remove(match); + } else if (BlockUtil.isStandingOn(player, Material.WATER) || BlockUtil.isStandingOn(player, Material.STATIONARY_WATER)) { + this.teleportToSpawnOrCheckpoint(match, player); + } else if (BlockUtil.isStandingOn(player, Material.STONE_PLATE) || BlockUtil.isStandingOn(player, Material.IRON_PLATE) || BlockUtil.isStandingOn(player, Material.WOOD_PLATE)) { + boolean checkpoint = false; + if (!CustomMovementHandler.parkourCheckpoints.containsKey(match)) { + checkpoint = true; + CustomMovementHandler.parkourCheckpoints.put(match, new HashMap()); + } + if (!CustomMovementHandler.parkourCheckpoints.get(match).containsKey(player.getUniqueId())) { + checkpoint = true; + CustomMovementHandler.parkourCheckpoints.get(match).put(player.getUniqueId(), CustomLocation.fromBukkitLocation(player.getLocation())); + } else if (CustomMovementHandler.parkourCheckpoints.get(match).containsKey(player.getUniqueId()) && !BlockUtil.isSameLocation(player.getLocation(), CustomMovementHandler.parkourCheckpoints.get(match).get(player.getUniqueId()).toBukkitLocation())) { + checkpoint = true; + CustomMovementHandler.parkourCheckpoints.get(match).put(player.getUniqueId(), CustomLocation.fromBukkitLocation(player.getLocation())); + } + if (checkpoint) { + player.sendMessage(ChatColor.GRAY + "Checkpoint has been saved."); + } + } + if ((to.getX() != from.getX() || to.getZ() != from.getZ()) && match.getMatchState() == MatchState.STARTING) { + player.teleport(from); + ((CraftPlayer) player).getHandle().playerConnection.checkMovement = false; + } + } + } + final PracticeEvent event = this.plugin.getEventManager().getEventPlaying(player); + if (event != null) { + if (event instanceof SumoEvent) { + final SumoEvent sumoEvent = (SumoEvent) event; + if (sumoEvent.getPlayer(player).getFighting() != null && sumoEvent.getPlayer(player).getState() == SumoPlayer.SumoState.PREPARING) { + player.teleport(from); + ((CraftPlayer) player).getHandle().playerConnection.checkMovement = false; + } + } else if (event instanceof OITCEvent) { + final OITCEvent oitcEvent = (OITCEvent) event; + if (oitcEvent.getPlayer(player).getState() == OITCPlayer.OITCState.RESPAWNING) { + ((CraftPlayer) player).getHandle().playerConnection.checkMovement = false; + } + if (oitcEvent.getPlayer(player).getState() == OITCPlayer.OITCState.FIGHTING && player.getLocation().getBlockY() >= 90) { + oitcEvent.teleportNextLocation(player); + player.sendMessage(ChatColor.RED + "You have been teleported back to the arena."); + } + } else if (event instanceof RedroverEvent) { + final RedroverEvent redroverEvent = (RedroverEvent) event; + if (redroverEvent.getPlayer(player).getFightTask() != null && redroverEvent.getPlayer(player).getState() == RedroverPlayer.RedroverState.PREPARING) { + player.teleport(from); + ((CraftPlayer) player).getHandle().playerConnection.checkMovement = false; + } + } + } + } + + public void handleUpdateRotation(final Player player, final Location location, final Location location1, final PacketPlayInFlying packetPlayInFlying) { + } + + private void teleportToSpawnOrCheckpoint(final Match match, final Player player) { + if (!CustomMovementHandler.parkourCheckpoints.containsKey(match)) { + player.sendMessage(ChatColor.GRAY + "Teleporting back to the beginning."); + player.teleport(match.getArena().getA().toBukkitLocation()); + return; + } + if (!CustomMovementHandler.parkourCheckpoints.get(match).containsKey(player.getUniqueId())) { + player.sendMessage(ChatColor.GRAY + "Teleporting back to the beginning."); + player.teleport(match.getArena().getA().toBukkitLocation()); + return; + } + player.teleport(CustomMovementHandler.parkourCheckpoints.get(match).get(player.getUniqueId()).toBukkitLocation()); + player.sendMessage(ChatColor.GRAY + "Teleporting back to last checkpoint."); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/inventory/InventorySnapshot.java b/dPractice/src/main/java/me/devkevin/practice/inventory/InventorySnapshot.java new file mode 100644 index 0000000..1d5c7b9 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/inventory/InventorySnapshot.java @@ -0,0 +1,144 @@ +package me.devkevin.practice.inventory; + +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.json.simple.JSONObject; +import me.devkevin.practice.Practice; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.util.CC; +import me.devkevin.practice.util.ItemUtil; +import me.devkevin.practice.util.MathUtil; +import me.devkevin.practice.util.StringUtil; +import me.devkevin.practice.util.inventory.InventoryUI; + +import java.util.*; +import java.util.function.Function; + +public class InventorySnapshot +{ + private final InventoryUI inventoryUI; + private final ItemStack[] originalInventory; + private final ItemStack[] originalArmor; + private final UUID snapshotId; + + public InventorySnapshot(final Player player, final Match match) { + this.snapshotId = UUID.randomUUID(); + final ItemStack[] contents = player.getInventory().getContents(); + final ItemStack[] armor = player.getInventory().getArmorContents(); + this.originalInventory = contents; + this.originalArmor = armor; + final PlayerData playerData = Practice.getInstance().getPlayerManager().getPlayerData(player.getUniqueId()); + final double health = player.getHealth(); + final double food = player.getFoodLevel(); + final List potionEffectStrings = new ArrayList(); + for (final PotionEffect potionEffect : player.getActivePotionEffects()) { + final String romanNumeral = MathUtil.convertToRomanNumeral(potionEffect.getAmplifier() + 1); + final String effectName = StringUtil.toNiceString(potionEffect.getType().getName().toLowerCase()); + final String duration = MathUtil.convertTicksToMinutes(potionEffect.getDuration()); + potionEffectStrings.add(CC.PRIMARY + effectName + " " + romanNumeral + CC.SECONDARY + " (" + duration + ")"); + } + this.inventoryUI = new InventoryUI(player.getName(), true, 6); + for (int i = 0; i < 9; ++i) { + this.inventoryUI.setItem(i + 27, new InventoryUI.EmptyClickableItem(contents[i])); + this.inventoryUI.setItem(i + 18, new InventoryUI.EmptyClickableItem(contents[i + 27])); + this.inventoryUI.setItem(i + 9, new InventoryUI.EmptyClickableItem(contents[i + 18])); + this.inventoryUI.setItem(i, new InventoryUI.EmptyClickableItem(contents[i + 9])); + } + boolean potionMatch = false; + boolean soupMatch = false; + for (final ItemStack item : match.getKit().getContents()) { + if (item != null) { + if (item.getType() == Material.MUSHROOM_SOUP) { + soupMatch = true; + break; + } + if (item.getType() == Material.POTION && item.getDurability() == 16421) { + potionMatch = true; + break; + } + } + } + if (potionMatch) { + int potCount = (int) Arrays.stream(contents).filter(Objects::nonNull).map(ItemStack::getDurability).filter(d -> d == 16421).count(); + this.inventoryUI.setItem(47, new InventoryUI.EmptyClickableItem(ItemUtil.reloreItem(ItemUtil.createItem(Material.POTION, CC.PRIMARY + "Health Potions: " + CC.SECONDARY + potCount, potCount, (short)16421), CC.PRIMARY + "Missed Potions: " + CC.SECONDARY + playerData.getMissedPots()))); + } + else if (soupMatch) { + final int soupCount = (int)Arrays.stream(contents).filter(Objects::nonNull).map((Function)ItemStack::getType).filter(d -> d == Material.MUSHROOM_SOUP).count(); + this.inventoryUI.setItem(47, new InventoryUI.EmptyClickableItem(ItemUtil.createItem(Material.MUSHROOM_SOUP, CC.PRIMARY + "Remaining Soups: " + CC.SECONDARY + soupCount, soupCount, (short)16421))); + } + this.inventoryUI.setItem(48, new InventoryUI.EmptyClickableItem(ItemUtil.createItem(Material.SKULL_ITEM, CC.PRIMARY + "Hearts: " + CC.SECONDARY + MathUtil.roundToHalves(health / 2.0) + " / 10 \u2764", (int)Math.round(health / 2.0)))); + this.inventoryUI.setItem(49, new InventoryUI.EmptyClickableItem(ItemUtil.createItem(Material.COOKED_BEEF, CC.PRIMARY + "Hunger: " + CC.SECONDARY + MathUtil.roundToHalves(food / 2.0) + " / 10 \u2764", (int)Math.round(food / 2.0)))); + this.inventoryUI.setItem(50, new InventoryUI.EmptyClickableItem(ItemUtil.reloreItem(ItemUtil.createItem(Material.BREWING_STAND_ITEM, CC.PRIMARY + "Potion Effects", potionEffectStrings.size()), (String[])potionEffectStrings.toArray(new String[0])))); + this.inventoryUI.setItem(51, new InventoryUI.EmptyClickableItem(ItemUtil.reloreItem(ItemUtil.createItem(Material.DIAMOND_SWORD, CC.PRIMARY + "Statistics"), CC.PRIMARY + "Longest Combo: " + CC.SECONDARY + playerData.getLongestCombo() + " Hit" + ((playerData.getLongestCombo() > 1) ? "s" : ""), CC.PRIMARY + "Total Hits: " + CC.SECONDARY + playerData.getHits() + " Hit" + ((playerData.getHits() > 1) ? "s" : "")))); + if (!match.isParty()) { + for (int j = 0; j < 2; ++j) { + this.inventoryUI.setItem((j == 0) ? 53 : 45, new InventoryUI.AbstractClickableItem(ItemUtil.reloreItem(ItemUtil.createItem(Material.PAPER, CC.PRIMARY + "View Other Inventory"), CC.PRIMARY + "Click to view the other inventory")) { + @Override + public void onClick(final InventoryClickEvent inventoryClickEvent) { + final Player clicker = (Player)inventoryClickEvent.getWhoClicked(); + if (Practice.getInstance().getMatchManager().isRematching(player.getUniqueId())) { + clicker.closeInventory(); + Practice.getInstance().getServer().dispatchCommand((CommandSender)clicker, "inventory " + Practice.getInstance().getMatchManager().getRematcherInventory(player.getUniqueId())); + } + } + }); + } + } + for (int j = 36; j < 40; ++j) { + this.inventoryUI.setItem(j, new InventoryUI.EmptyClickableItem(armor[39 - j])); + } + } + + public JSONObject toJson() { + final JSONObject object = new JSONObject(); + final JSONObject inventoryObject = new JSONObject(); + for (int i = 0; i < this.originalInventory.length; ++i) { + inventoryObject.put((Object)i, (Object)this.encodeItem(this.originalInventory[i])); + } + object.put((Object)"inventory", (Object)inventoryObject); + final JSONObject armourObject = new JSONObject(); + for (int j = 0; j < this.originalArmor.length; ++j) { + armourObject.put((Object)j, (Object)this.encodeItem(this.originalArmor[j])); + } + object.put((Object)"armour", (Object)armourObject); + return object; + } + + private JSONObject encodeItem(final ItemStack itemStack) { + if (itemStack == null || itemStack.getType() == Material.AIR) { + return null; + } + final JSONObject object = new JSONObject(); + object.put((Object)"material", (Object)itemStack.getType().name()); + object.put((Object)"durability", (Object)itemStack.getDurability()); + object.put((Object)"amount", (Object)itemStack.getAmount()); + final JSONObject enchants = new JSONObject(); + for (final Enchantment enchantment : itemStack.getEnchantments().keySet()) { + enchants.put((Object)enchantment.getName(), itemStack.getEnchantments().get(enchantment)); + } + object.put((Object)"enchants", (Object)enchants); + return object; + } + + public InventoryUI getInventoryUI() { + return this.inventoryUI; + } + + public ItemStack[] getOriginalInventory() { + return this.originalInventory; + } + + public ItemStack[] getOriginalArmor() { + return this.originalArmor; + } + + public UUID getSnapshotId() { + return this.snapshotId; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/kit/Kit.java b/dPractice/src/main/java/me/devkevin/practice/kit/Kit.java new file mode 100644 index 0000000..a5f5ed1 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/kit/Kit.java @@ -0,0 +1,181 @@ +package me.devkevin.practice.kit; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class Kit { + private final String name; + private ItemStack[] contents; + private ItemStack[] armor; + private ItemStack[] kitEditContents; + private ItemStack icon; + private List excludedArenas; + private List arenaWhiteList; + private boolean enabled; + private boolean ranked; + private boolean combo; + private boolean sumo; + private boolean build; + private boolean spleef; + private boolean parkour; + + public Kit(final String name, final ItemStack[] contents, final ItemStack[] armor, final ItemStack[] kitEditContents, final ItemStack icon, final List excludedArenas, final List arenaWhiteList, final boolean enabled, final boolean ranked, final boolean combo, final boolean sumo, final boolean build, final boolean spleef, final boolean parkour) { + this.contents = new ItemStack[36]; + this.armor = new ItemStack[4]; + this.kitEditContents = new ItemStack[36]; + this.excludedArenas = new ArrayList(); + this.arenaWhiteList = new ArrayList(); + this.name = name; + this.contents = contents; + this.armor = armor; + this.kitEditContents = kitEditContents; + this.icon = icon; + this.excludedArenas = excludedArenas; + this.arenaWhiteList = arenaWhiteList; + this.enabled = enabled; + this.ranked = ranked; + this.combo = combo; + this.sumo = sumo; + this.build = build; + this.spleef = spleef; + this.parkour = parkour; + } + + public Kit(final String name) { + this.contents = new ItemStack[36]; + this.armor = new ItemStack[4]; + this.kitEditContents = new ItemStack[36]; + this.excludedArenas = new ArrayList(); + this.arenaWhiteList = new ArrayList(); + this.name = name; + } + + public void applyToPlayer(final Player player) { + player.getInventory().setContents(this.contents); + player.getInventory().setArmorContents(this.armor); + player.updateInventory(); + } + + public void whitelistArena(final String arena) { + if (!this.arenaWhiteList.remove(arena)) { + this.arenaWhiteList.add(arena); + } + } + + public void excludeArena(final String arena) { + if (!this.excludedArenas.remove(arena)) { + this.excludedArenas.add(arena); + } + } + + public String getName() { + return this.name; + } + + public ItemStack[] getContents() { + return this.contents; + } + + public void setContents(final ItemStack[] contents) { + this.contents = contents; + } + + public ItemStack[] getArmor() { + return this.armor; + } + + public void setArmor(final ItemStack[] armor) { + this.armor = armor; + } + + public ItemStack[] getKitEditContents() { + return this.kitEditContents; + } + + public void setKitEditContents(final ItemStack[] kitEditContents) { + this.kitEditContents = kitEditContents; + } + + public ItemStack getIcon() { + return this.icon; + } + + public void setIcon(final ItemStack icon) { + this.icon = icon; + } + + public List getExcludedArenas() { + return this.excludedArenas; + } + + public void setExcludedArenas(final List excludedArenas) { + this.excludedArenas = excludedArenas; + } + + public List getArenaWhiteList() { + return this.arenaWhiteList; + } + + public void setArenaWhiteList(final List arenaWhiteList) { + this.arenaWhiteList = arenaWhiteList; + } + + public boolean isEnabled() { + return this.enabled; + } + + public void setEnabled(final boolean enabled) { + this.enabled = enabled; + } + + public boolean isRanked() { + return this.ranked; + } + + public void setRanked(final boolean ranked) { + this.ranked = ranked; + } + + public boolean isCombo() { + return this.combo; + } + + public void setCombo(final boolean combo) { + this.combo = combo; + } + + public boolean isSumo() { + return this.sumo; + } + + public void setSumo(final boolean sumo) { + this.sumo = sumo; + } + + public boolean isBuild() { + return this.build; + } + + public void setBuild(final boolean build) { + this.build = build; + } + + public boolean isSpleef() { + return this.spleef; + } + + public void setSpleef(final boolean spleef) { + this.spleef = spleef; + } + + public boolean isParkour() { + return this.parkour; + } + + public void setParkour(final boolean parkour) { + this.parkour = parkour; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/kit/PlayerKit.java b/dPractice/src/main/java/me/devkevin/practice/kit/PlayerKit.java new file mode 100644 index 0000000..45248e5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/kit/PlayerKit.java @@ -0,0 +1,54 @@ +package me.devkevin.practice.kit; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.Practice; + +public class PlayerKit { + private final String name; + private final int index; + private ItemStack[] contents; + private String displayName; + + public PlayerKit(final String name, final int index, final ItemStack[] contents, final String displayName) { + this.name = name; + this.index = index; + this.contents = contents; + this.displayName = displayName; + } + + public void applyToPlayer(final Player player) { + for (final ItemStack itemStack : this.contents) { + if (itemStack != null && itemStack.getAmount() <= 0) { + itemStack.setAmount(1); + } + } + player.getInventory().setContents(this.contents); + player.getInventory().setArmorContents(Practice.getInstance().getKitManager().getKit(this.name).getArmor()); + player.updateInventory(); + } + + public String getName() { + return this.name; + } + + public int getIndex() { + return this.index; + } + + public ItemStack[] getContents() { + return this.contents; + } + + public void setContents(final ItemStack[] contents) { + this.contents = contents; + } + + public String getDisplayName() { + return this.displayName; + } + + public void setDisplayName(final String displayName) { + this.displayName = displayName; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/leaderboards/LeaderBoardsManager.java b/dPractice/src/main/java/me/devkevin/practice/leaderboards/LeaderBoardsManager.java new file mode 100644 index 0000000..c3139af --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/leaderboards/LeaderBoardsManager.java @@ -0,0 +1,235 @@ +package me.devkevin.practice.leaderboards; + +import lombok.Getter; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.plugin.java.JavaPlugin; +import me.devkevin.practice.file.Config; +import java.util.Iterator; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.Inventory; +import me.devkevin.practice.kit.Kit; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.inventory.ItemStack; +import org.bukkit.entity.Player; +import org.bukkit.Material; +import org.bukkit.event.player.PlayerInteractEvent; +import java.util.Objects; +import org.bukkit.OfflinePlayer; +import java.util.Collection; +import java.util.Arrays; +import org.bukkit.plugin.Plugin; +import org.bukkit.Bukkit; +import com.google.common.collect.Lists; +import me.devkevin.practice.Practice; +import com.google.common.collect.Maps; +import me.devkevin.practice.player.OfflinePlayerData; +import java.util.List; +import java.util.Map; +import org.bukkit.event.Listener; + +public class LeaderBoardsManager implements Listener { + + @Getter + private Map> topsElo = Maps.newHashMap(); + + public LeaderBoardsManager(){ + + Practice.getInstance().getKitManager().getKits().forEach(kit -> { + topsElo.put(kit.getName(), Lists.newArrayList()); + }); + + topsElo.put("Global", Lists.newArrayList()); + + Bukkit.getPluginManager().registerEvents(this, Practice.getInstance ()); + + initOrderList(); + } + + public void initOrderList(){ + + List offLines = Lists.newArrayList(); + + offLines.addAll(Arrays.asList(Bukkit.getOfflinePlayers())); + + offLines.forEach(offlinePlayer -> { + topsElo.get("Global").add(getOfflinePlayerData(offlinePlayer)); + Practice.getInstance().getKitManager().getKits().forEach(kit -> + topsElo.get(kit.getName()).add(getOfflinePlayerData(offlinePlayer))); + }); + } + + public void updateList(){ + + topsElo.get("Global").sort( (playerdata1, playerdata2) -> { + + Integer elo1 = playerdata1.getGlobalStats("ELO"); + Integer elo2 = playerdata2.getGlobalStats("ELO"); + + Integer losses1 = playerdata1.getGlobalStats("LOSSES"); + Integer losses2 = playerdata2.getGlobalStats("LOSSES"); + + if( Objects.equals ( elo1 , elo2 ) && losses1 < losses2 ){ + return -1; + }else if( Objects.equals ( elo1 , elo2 ) && losses1 > losses2 ){ + return 1; + }else if ( elo1 < elo2 ) { + return 1; + }else if ( elo1 > elo2 ) { + return - 1; + } + + return 0; + + } ); + + Practice.getInstance().getKitManager().getKits().forEach( kit -> { + topsElo.get(kit.getName()).sort( (playerdata1, playerdata2) -> { + + Integer elo1 = playerdata1.getElo(kit.getName()); + Integer elo2 = playerdata2.getElo(kit.getName()); + + Integer losses1 = playerdata1.getLosses(kit.getName()); + Integer losses2 = playerdata2.getLosses(kit.getName()); + + if( Objects.equals ( elo1 , elo2 ) && losses1 < losses2 ){ + return -1; + }else if( Objects.equals ( elo1 , elo2 ) && losses1 > losses2 ){ + return 1; + }else if ( elo1 < elo2 ) { + return 1; + }else if ( elo1 > elo2 ) { + return - 1; + } + + return 0; + + } ); + }); + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + Player player = event.getPlayer(); + + if (event.getAction().name().startsWith("RIGHT_")) { + + if(event.getItem() != null){ + + ItemStack itemStack = event.getItem(); + + if(itemStack.getType() == Material.EMERALD){ + openInventory(player); + } + } + } + } + + public void openInventory(Player player){ + + updateList(); + player.getInventory (); + + Inventory inventory = Bukkit.createInventory(null, 18, ChatColor.GREEN + "Viewing LeaderBoard"); + + + ItemStack global = new ItemStack(Material.SUGAR); + + ItemMeta globalitemMeta = global.getItemMeta(); + + List globallore = Lists.newArrayList(); + + List globalplayerDataList = topsElo.get("Global"); + + globalitemMeta.setDisplayName (ChatColor.GREEN + "Top Global"); + + + for (int i = 0; i < 10; ++i) { + final int index = i + 1; + if (globalplayerDataList.get(i) == null) { + if (globalplayerDataList.size() < 10) { + return; + } + continue; + } + OfflinePlayerData playerData = globalplayerDataList.get(i); + OfflinePlayer player2 = Bukkit.getOfflinePlayer(playerData.getUniqueId()); + globallore.add(transltate("&f#" + index + " &a" + player2.getName() + " &f(" + playerData.getGlobalStats("ELO") + ")")); + } + globalitemMeta.setLore(globallore); + global.setItemMeta(globalitemMeta); + inventory.addItem(global); + + + for (Kit kit : Practice.getInstance().getKitManager().getKits()){ + + ItemStack itemStack = kit.getIcon().clone(); + + ItemMeta itemMeta = itemStack.getItemMeta(); + + List lore = Lists.newArrayList(); + + List playerDataList = topsElo.get(kit.getName()); + + for (int j = 0; j < 10; ++j) { + final int index2 = j + 1; + if (playerDataList.get(j) == null) { + if (globalplayerDataList.size() < 10) { + return; + } + continue; + } + OfflinePlayerData playerData = playerDataList.get(j); + OfflinePlayer player2 = Bukkit.getOfflinePlayer(playerData.getUniqueId()); + lore.add(transltate("&f#" + index2 + " &a" + player2.getName() + " &f(" + playerData.getElo(kit.getName()) + ")")); + } + itemMeta.setLore(lore); + itemStack.setItemMeta(itemMeta); + inventory.addItem(itemStack); + } + + player.openInventory(inventory); + } + + public String transltate(String msg){ + return ChatColor.translateAlternateColorCodes('&', msg); + } + + public OfflinePlayerData getOfflinePlayerData(OfflinePlayer offlinePlayer){ + + OfflinePlayerData playerData = new OfflinePlayerData(offlinePlayer.getUniqueId()); + + Config config = new Config("/players/" + playerData.getUniqueId().toString(), Practice.getInstance ()); + FileConfiguration fileConfig = config.getConfig(); + + ConfigurationSection playerDataSelection = fileConfig.getConfigurationSection("playerdata"); + if (playerDataSelection != null) { + if (playerDataSelection.getConfigurationSection("elo") != null) { + playerDataSelection.getConfigurationSection("elo").getKeys(true).forEach((kit) -> { + int elo = playerDataSelection.getInt("elo." + kit); + playerData.setElo(kit, elo); + }); + } + + if (playerDataSelection.getConfigurationSection("losses") != null) { + playerDataSelection.getConfigurationSection("losses").getKeys(true).forEach((kit) -> { + int elo = playerDataSelection.getInt("losses." + kit); + playerData.setLosses(kit, elo); + }); + } + + if (playerDataSelection.getConfigurationSection("wins") != null) { + playerDataSelection.getConfigurationSection("wins").getKeys(false).forEach((kit) -> { + int elo = playerDataSelection.getInt("wins." + kit); + playerData.setWins(kit, elo); + }); + } + + } + + return playerData; + } + +} diff --git a/dPractice/src/main/java/me/devkevin/practice/listeners/EnderpearlListener.java b/dPractice/src/main/java/me/devkevin/practice/listeners/EnderpearlListener.java new file mode 100644 index 0000000..0638118 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/listeners/EnderpearlListener.java @@ -0,0 +1,88 @@ +package me.devkevin.practice.listeners; + +import net.minecraft.server.v1_8_R3.EntityEnderPearl; +import net.minecraft.server.v1_8_R3.World; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEnderPearl; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.Practice; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class EnderpearlListener implements Listener { + private Map validLocations; + private Practice plugin; + + public EnderpearlListener(final Practice plugin) { + this.plugin = plugin; + this.validLocations = new HashMap(); + this.runCheck(); + this.plugin.getServer().getPluginManager().registerEvents(this, this.plugin); + } + + @EventHandler + public void onLaunch(final ProjectileLaunchEvent event) { + if (event.getEntity() instanceof EnderPearl) { + this.validLocations.put((EnderPearl) event.getEntity(), event.getEntity().getLocation()); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerTeleport(final PlayerTeleportEvent event) { + if (event.getCause() == PlayerTeleportEvent.TeleportCause.ENDER_PEARL) { + final EnderPearl pearl = this.lookupPearl(event.getPlayer(), event.getTo()); + if (pearl != null) { + final Location validLocation = this.validLocations.get(pearl); + if (validLocation != null) { + validLocation.setPitch(event.getPlayer().getLocation().getPitch()); + validLocation.setYaw(event.getPlayer().getLocation().getYaw()); + event.setTo(validLocation); + } + } + } + } + + private void runCheck() { + new BukkitRunnable() { + public void run() { + final Iterator> iterator = EnderpearlListener.this.validLocations.entrySet().iterator(); + while (iterator.hasNext()) { + final Map.Entry entry = iterator.next(); + final EnderPearl pearlEntity = entry.getKey(); + if (pearlEntity.isDead()) { + iterator.remove(); + } else { + final EntityEnderPearl entityEnderPearl = ((CraftEnderPearl) pearlEntity).getHandle(); + final World worldServer = entityEnderPearl.world; + if (!worldServer.getCubes(entityEnderPearl, entityEnderPearl.getBoundingBox().grow(0.25, 0.25, 0.25)).isEmpty()) { + continue; + } + entry.setValue(pearlEntity.getLocation()); + } + } + } + }.runTaskTimerAsynchronously(this.plugin, 1L, 1L); + } + + private EnderPearl lookupPearl(final Player player, final Location to) { + double distance = Double.MAX_VALUE; + EnderPearl canidate = null; + for (final EnderPearl enderpearl : this.validLocations.keySet()) { + final double sqrt = to.distanceSquared(enderpearl.getLocation()); + if (enderpearl.getShooter() == player && sqrt < distance) { + distance = sqrt; + canidate = enderpearl; + } + } + return canidate; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/listeners/EntityListener.java b/dPractice/src/main/java/me/devkevin/practice/listeners/EntityListener.java new file mode 100644 index 0000000..51288b2 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/listeners/EntityListener.java @@ -0,0 +1,131 @@ +package me.devkevin.practice.listeners; + +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import me.devkevin.practice.Practice; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchState; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.CC; + +public class EntityListener implements Listener { + private final Practice plugin = Practice.getInstance(); + + @EventHandler + public void onEntityDamage(EntityDamageEvent e) { + if (e.getEntity() instanceof Player) { + Player player = (Player) e.getEntity(); + PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + + switch (playerData.getPlayerState()) { + case FIGHTING: + Match match = this.plugin.getMatchManager().getMatch(playerData); + if (match.getMatchState() != MatchState.FIGHTING) { + e.setCancelled(true); + } + if (e.getCause() == EntityDamageEvent.DamageCause.VOID) { + this.plugin.getMatchManager().removeFighter(player, playerData, true); + } + break; + default: + if (e.getCause() == EntityDamageEvent.DamageCause.VOID) { + e.getEntity().teleport(this.plugin.getSpawnManager().getSpawnLocation().toBukkitLocation()); + } + e.setCancelled(true); + break; + } + } + } + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { + Player entity = (Player) e.getEntity(); + + Player damager; + + if (e.getDamager() instanceof Player) { + damager = (Player) e.getDamager(); + } else if (e.getDamager() instanceof Projectile) { + damager = (Player) ((Projectile) e.getDamager()).getShooter(); + } else { + return; + } + + PlayerData entityData = this.plugin.getPlayerManager().getPlayerData(entity.getUniqueId()); + PlayerData damagerData = this.plugin.getPlayerManager().getPlayerData(damager.getUniqueId()); + + if (damagerData.getPlayerState() != PlayerState.FIGHTING || + entityData.getPlayerState() != PlayerState.FIGHTING) { + e.setCancelled(true); + return; + } + + Match match = this.plugin.getMatchManager().getMatch(entityData); + + if (damagerData.getTeamID() == entityData.getTeamID() && !match.isFFA()) { + e.setCancelled(false); + return; + } + + if (match.getKit().isSpleef() || match.getKit().isSumo()) { + e.setDamage(0.0D); + } + + if (e.getDamager() instanceof Player) { + damagerData.setCombo(damagerData.getCombo() + 1); + damagerData.setHits(damagerData.getHits() + 1); + if (damagerData.getCombo() > damagerData.getLongestCombo()) { + damagerData.setLongestCombo(damagerData.getCombo()); + } + entityData.setCombo(0); + if (match.getKit().isSpleef()) { + e.setCancelled(true); + } + } else if (e.getDamager() instanceof Arrow) { + Arrow arrow = (Arrow) e.getDamager(); + + if (arrow.getShooter() instanceof Player) { + Player shooter = (Player) arrow.getShooter(); + + if (!entity.getName().equals(shooter.getName())) { + double health = Math.ceil(entity.getHealth() - e.getFinalDamage()) / 2.0D; + + if (health > 0.0D) { + shooter.sendMessage(CC.SECONDARY + entity.getName() + CC.PRIMARY + " is now at " + + CC.SECONDARY + health + "❤" + CC.PRIMARY + "."); + } + } + } + } + } + + @EventHandler + public void onPotionSplash(PotionSplashEvent e) { + if (!(e.getEntity().getShooter() instanceof Player)) { + return; + } + for (PotionEffect effect : e.getEntity().getEffects()) { + if (effect.getType().equals(PotionEffectType.HEAL)) { + Player shooter = (Player) e.getEntity().getShooter(); + + if (e.getIntensity(shooter) <= 0.5D) { + PlayerData shooterData = this.plugin.getPlayerManager().getPlayerData(shooter.getUniqueId()); + + if (shooterData != null) { + shooterData.setMissedPots(shooterData.getMissedPots() + 1); + } + } + break; + } + } + } +} \ No newline at end of file diff --git a/dPractice/src/main/java/me/devkevin/practice/listeners/InventoryListener.java b/dPractice/src/main/java/me/devkevin/practice/listeners/InventoryListener.java new file mode 100644 index 0000000..80c5695 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/listeners/InventoryListener.java @@ -0,0 +1,30 @@ +package me.devkevin.practice.listeners; + +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +public class InventoryListener implements Listener { + private final Practice plugin; + + public InventoryListener() { + this.plugin = Practice.getInstance(); + } + + @EventHandler + public void onInventoryClick(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + if (!player.getGameMode().equals(GameMode.CREATIVE)) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() == PlayerState.SPAWN || (playerData.getPlayerState() == PlayerState.EVENT && player.getItemInHand() != null && player.getItemInHand().getType() == Material.COMPASS)) { + event.setCancelled(true); + } + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/listeners/MatchListener.java b/dPractice/src/main/java/me/devkevin/practice/listeners/MatchListener.java new file mode 100644 index 0000000..0d44335 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/listeners/MatchListener.java @@ -0,0 +1,234 @@ +package me.devkevin.practice.listeners; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.event.match.MatchEndEvent; +import me.devkevin.practice.event.match.MatchStartEvent; +import me.devkevin.practice.inventory.InventorySnapshot; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchState; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.queue.QueueType; +import me.devkevin.practice.runnable.MatchRunnable; +import me.devkevin.practice.util.CC; +import me.devkevin.practice.util.Clickable; +import me.devkevin.practice.util.EloUtil; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.*; + +public class MatchListener implements Listener { + private final Practice plugin; + + public MatchListener() { + this.plugin = Practice.getInstance(); + } + + @EventHandler + public void onMatchStart(final MatchStartEvent event) { + final Match match = event.getMatch(); + final Kit kit = match.getKit(); + if (!kit.isEnabled()) { + match.broadcast(ChatColor.RED + "This kit is currently disabled."); + this.plugin.getMatchManager().removeMatch(match); + return; + } + if (kit.isBuild() || kit.isSpleef()) { + if (match.getArena().getAvailableArenas().size() <= 0) { + match.broadcast(ChatColor.RED + "There are no arenas available."); + this.plugin.getMatchManager().removeMatch(match); + return; + } + match.setStandaloneArena(match.getArena().getAvailableArena()); + this.plugin.getArenaManager().setArenaMatchUUID(match.getStandaloneArena(), match.getMatchId()); + } + final Set matchPlayers = new HashSet<>(); + match.getTeams().forEach(team -> team.alivePlayers().forEach(player -> { + matchPlayers.add(player); + this.plugin.getMatchManager().removeMatchRequests(player.getUniqueId()); + PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + player.setAllowFlight(false); + player.setFlying(false); + playerData.setCurrentMatchID(match.getMatchId()); + playerData.setTeamID(team.getTeamID()); + playerData.setMissedPots(0); + playerData.setLongestCombo(0); + playerData.setCombo(0); + playerData.setHits(0); + PlayerUtil.clearPlayer(player); + CustomLocation locationA = ((match.getStandaloneArena() != null) ? match.getStandaloneArena().getA() : match.getArena().getA()); + CustomLocation locationB = ((match.getStandaloneArena() != null) ? match.getStandaloneArena().getB() : match.getArena().getB()); + player.teleport((team.getTeamID() == 1) ? locationA.toBukkitLocation() : locationB.toBukkitLocation()); + if (kit.isBuild()) { + } + if (kit.isCombo()) { + player.setMaximumNoDamageTicks(3); + } + if (!match.isRedrover()) { + this.plugin.getMatchManager().giveKits(player, kit); + playerData.setPlayerState(PlayerState.FIGHTING); + } else { + this.plugin.getMatchManager().addRedroverSpectator(player, match); + } + })); + for (final Player player2 : matchPlayers) { + for (final Player online : this.plugin.getServer().getOnlinePlayers()) { + online.hidePlayer(player2); + player2.hidePlayer(online); + } + } + for (final Player player2 : matchPlayers) { + for (final Player other : matchPlayers) { + player2.showPlayer(other); + } + } + new MatchRunnable(match).runTaskTimer(this.plugin, 20L, 20L); + } + + @EventHandler + public void onMatchEnd(MatchEndEvent event) { + Match match = event.getMatch(); + Clickable inventories = new Clickable(CC.GOLD + "Inventories (click to view): "); + + match.setMatchState(MatchState.ENDING); + match.setWinningTeamId(event.getWinningTeam().getTeamID()); + match.setCountdown(4); + + if (match.isFFA()) { + Player winner = this.plugin.getServer().getPlayer(event.getWinningTeam().getAlivePlayers().get(0)); + String winnerMessage = CC.PRIMARY + "Winner: " + CC.SECONDARY + winner.getName(); + + event.getWinningTeam().players().forEach(player -> { + if (!match.hasSnapshot(player.getUniqueId())) { + match.addSnapshot(player); + } + inventories.add((player.getUniqueId() == winner.getUniqueId() ? CC.YELLOW : CC.YELLOW) + + player.getName() + " ", + CC.PRIMARY + "View Inventory", + "/inventory " + match.getSnapshot(player.getUniqueId()).getSnapshotId()); + }); + for (InventorySnapshot snapshot : match.getSnapshots().values()) { + this.plugin.getInventoryManager().addSnapshot(snapshot); + } + + match.broadcast(winnerMessage); + match.broadcast(inventories); + } else if (match.isRedrover()) { + match.broadcast(CC.SECONDARY + event.getWinningTeam().getLeaderName() + CC.PRIMARY + " has won the redrover!"); + } else { + Map inventorySnapshotMap = new LinkedHashMap<>(); + match.getTeams().forEach(team -> team.players().forEach(player -> { + if (!match.hasSnapshot(player.getUniqueId())) { + match.addSnapshot(player); + } + + inventorySnapshotMap + .put(player.getUniqueId(), match.getSnapshot(player.getUniqueId())); + + boolean onWinningTeam = + this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()).getTeamID() == + event.getWinningTeam().getTeamID(); + inventories.add((onWinningTeam ? CC.YELLOW : CC.YELLOW) + + player.getName() + " ", + CC.PRIMARY + "View inventory", + "/inventory " + match.getSnapshot(player.getUniqueId()).getSnapshotId()); + })); + for (InventorySnapshot snapshot : match.getSnapshots().values()) { + this.plugin.getInventoryManager().addSnapshot(snapshot); + } + + String winnerMessage = CC.PRIMARY + (match.isParty() ? "Winning Team: " : "Winner: ") + + CC.SECONDARY + event.getWinningTeam().getLeaderName(); + + match.broadcast(winnerMessage); + match.broadcast(inventories); + + if (match.getType().isRanked()) { + String kitName = match.getKit().getName(); + + Player winnerLeader = this.plugin.getServer().getPlayer(event.getWinningTeam().getPlayers().get(0)); + PlayerData winnerLeaderData = this.plugin.getPlayerManager() + .getPlayerData(winnerLeader.getUniqueId()); + Player loserLeader = this.plugin.getServer().getPlayer(event.getLosingTeam().getPlayers().get(0)); + PlayerData loserLeaderData = this.plugin.getPlayerManager() + .getPlayerData(loserLeader.getUniqueId()); + + String eloMessage; + + int[] preElo = new int[2]; + int[] newElo = new int[2]; + int winnerElo = 0; + int loserElo = 0;; + int newWinnerElo; + int newLoserElo; + + if (event.getWinningTeam().getPlayers().size() == 2) { + Player winnerMember = this.plugin.getServer().getPlayer(event.getWinningTeam().getPlayers().get(1)); + PlayerData winnerMemberData = this.plugin.getPlayerManager().getPlayerData(winnerMember.getUniqueId()); + + Player loserMember = this.plugin.getServer().getPlayer(event.getLosingTeam().getPlayers().get(1)); + PlayerData loserMemberData = this.plugin.getPlayerManager().getPlayerData(loserMember.getUniqueId()); + + winnerElo = winnerLeaderData.getPartyElo(kitName); + loserElo = loserLeaderData.getPartyElo(kitName); + + preElo[0] = winnerElo; + preElo[1] = loserElo; + + newWinnerElo = EloUtil.getNewRating(winnerElo, loserElo, true); + newLoserElo = EloUtil.getNewRating(loserElo, winnerElo, false); + + newElo[0] = newWinnerElo; + newElo[1] = newLoserElo; + + winnerMemberData.setPartyElo(kitName, newWinnerElo); + loserMemberData.setPartyElo(kitName, newLoserElo); + + eloMessage = CC.YELLOW + "Elo Change: " + CC.GREEN + winnerLeader.getName() + ", " + + winnerMember.getName() + " " + newWinnerElo + + " (+" + (newWinnerElo - winnerElo) + ") " + CC.RED + loserLeader.getName() + "," + + " " + + loserMember.getName() + " " + + newLoserElo + " (" + (newLoserElo - loserElo) + ")"; + } else { + if (match.getType() == QueueType.RANKED) { + winnerElo = winnerLeaderData.getElo(kitName); + loserElo = loserLeaderData.getElo(kitName); + + } + + preElo[0] = winnerElo; + preElo[1] = loserElo; + + newWinnerElo = EloUtil.getNewRating(winnerElo, loserElo, true); + newLoserElo = EloUtil.getNewRating(loserElo, winnerElo, false); + + newElo[0] = newWinnerElo; + newElo[1] = newLoserElo; + + eloMessage = CC.YELLOW + "Elo Changes: " + CC.GREEN + winnerLeader.getName() + " " + newWinnerElo + + " (+" + (newWinnerElo - winnerElo) + ") " + + CC.RED + loserLeader.getName() + " " + newLoserElo + " (" + + (newLoserElo - loserElo) + ")"; + + if (match.getType() == QueueType.RANKED) { + winnerLeaderData.setElo(kitName, newWinnerElo); + loserLeaderData.setElo(kitName, newLoserElo); + + winnerLeaderData.setWins(kitName, winnerLeaderData.getWins(kitName) + 1); + loserLeaderData.setLosses(kitName, loserLeaderData.getLosses(kitName) + 1); + } + } + + match.broadcast(eloMessage); + } + this.plugin.getMatchManager().saveRematches(match); + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/listeners/PlayerListener.java b/dPractice/src/main/java/me/devkevin/practice/listeners/PlayerListener.java new file mode 100644 index 0000000..82c58ed --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/listeners/PlayerListener.java @@ -0,0 +1,632 @@ +package me.devkevin.practice.listeners; + +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.block.Sign; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.*; +import org.bukkit.event.player.*; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.events.oitc.OITCEvent; +import me.devkevin.practice.events.oitc.OITCPlayer; +import me.devkevin.practice.events.parkour.ParkourEvent; +import me.devkevin.practice.ffa.killstreak.KillStreak; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.kit.PlayerKit; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchState; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.Map; +import java.util.UUID; + +public class PlayerListener implements Listener { + private final Practice plugin; + + public PlayerListener() { + this.plugin = Practice.getInstance(); + } + + @EventHandler + public void onPlayerInteractSoup(final PlayerInteractEvent event) { + final Player player = event.getPlayer(); + if (!player.isDead() && player.getItemInHand().getType() == Material.MUSHROOM_SOUP && player.getHealth() < 19.0) { + final double newHealth = (player.getHealth() + 7.0 > 20.0) ? 20.0 : (player.getHealth() + 7.0); + player.setHealth(newHealth); + player.getItemInHand().setType(Material.BOWL); + player.updateInventory(); + } + } + + @EventHandler + public void onPlayerItemConsume(final PlayerItemConsumeEvent event) { + if (event.getItem().getType() == Material.GOLDEN_APPLE) { + if (!event.getItem().hasItemMeta() || !event.getItem().getItemMeta().getDisplayName().contains("Golden Head")) { + return; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(event.getPlayer().getUniqueId()); + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + final Player player = event.getPlayer(); + event.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 200, 1)); + event.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION, 2400, 0)); + player.setFoodLevel(Math.min(player.getFoodLevel() + 6, 20)); + } + } + } + + @EventHandler + public void onRegenerate(final EntityRegainHealthEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + if (event.getRegainReason() != EntityRegainHealthEvent.RegainReason.SATIATED) { + return; + } + final Player player = (Player) event.getEntity(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + final Match match = this.plugin.getMatchManager().getMatch(player.getUniqueId()); + if (match.getKit().isBuild()) { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onPlayerJoin(final PlayerJoinEvent event) { + final Player player = event.getPlayer(); + this.plugin.getPlayerManager().createPlayerData(player); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + } + + @EventHandler + public void onPlayerQuit(final PlayerQuitEvent event) { + final Player player = event.getPlayer(); + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData == null) { + return; + } + switch (playerData.getPlayerState()) { + case FIGHTING: + this.plugin.getMatchManager().removeFighter(player, playerData, false); + break; + case SPECTATING: + if (this.plugin.getEventManager().getSpectators().containsKey(player.getUniqueId())) { + this.plugin.getEventManager().removeSpectator(player); + break; + } + this.plugin.getMatchManager().removeSpectator(player); + break; + case EDITING: + this.plugin.getEditorManager().removeEditor(player.getUniqueId()); + break; + case QUEUE: + if (party == null) { + this.plugin.getQueueManager().removePlayerFromQueue(player); + break; + } + if (this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + this.plugin.getQueueManager().removePartyFromQueue(party); + break; + } + break; + case FFA: + this.plugin.getFfaManager().removePlayer(player); + break; + case EVENT: { + final PracticeEvent practiceEvent = this.plugin.getEventManager().getEventPlaying(player); + if (practiceEvent != null) { + practiceEvent.leave(player); + break; + } + break; + } + } + this.plugin.getTournamentManager().leaveTournament(player); + this.plugin.getPartyManager().leaveParty(player); + this.plugin.getMatchManager().removeMatchRequests(player.getUniqueId()); + this.plugin.getPartyManager().removePartyInvites(player.getUniqueId()); + this.plugin.getPlayerManager().removePlayerData(player.getUniqueId()); + } + + @EventHandler + public void onPlayerKick(final PlayerKickEvent event) { + final Player player = event.getPlayer(); + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData == null) { + return; + } + switch (playerData.getPlayerState()) { + case FIGHTING: + this.plugin.getMatchManager().removeFighter(player, playerData, false); + break; + case SPECTATING: + if (this.plugin.getEventManager().getSpectators().containsKey(player.getUniqueId())) { + this.plugin.getEventManager().removeSpectator(player); + break; + } + this.plugin.getMatchManager().removeSpectator(player); + break; + case EDITING: + this.plugin.getEditorManager().removeEditor(player.getUniqueId()); + break; + case QUEUE: + if (party == null) { + this.plugin.getQueueManager().removePlayerFromQueue(player); + break; + } + if (this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + this.plugin.getQueueManager().removePartyFromQueue(party); + break; + } + break; + case FFA: + this.plugin.getFfaManager().removePlayer(player); + break; + case EVENT: { + final PracticeEvent practiceEvent = this.plugin.getEventManager().getEventPlaying(player); + if (practiceEvent != null) { + practiceEvent.leave(player); + break; + } + break; + } + } + this.plugin.getTournamentManager().leaveTournament(player); + this.plugin.getPartyManager().leaveParty(player); + this.plugin.getMatchManager().removeMatchRequests(player.getUniqueId()); + this.plugin.getPartyManager().removePartyInvites(player.getUniqueId()); + this.plugin.getPlayerManager().removePlayerData(player.getUniqueId()); + } + + @EventHandler + public void onPlayerInteract(final PlayerInteractEvent event) { + final Player player = event.getPlayer(); + if (player.getGameMode() == GameMode.CREATIVE) { + return; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() == PlayerState.SPECTATING) { + event.setCancelled(true); + } + if (event.getAction().name().endsWith("_BLOCK")) { + if (event.getClickedBlock().getType().name().contains("SIGN") && event.getClickedBlock().getState() instanceof Sign) { + final Sign sign = (Sign) event.getClickedBlock().getState(); + if (ChatColor.stripColor(sign.getLine(1)).equals("[Soup]")) { + event.setCancelled(true); + final Inventory inventory = this.plugin.getServer().createInventory(null, 54, ChatColor.DARK_GRAY + "Soup Refill"); + for (int i = 0; i < 54; ++i) { + inventory.setItem(i, new ItemStack(Material.MUSHROOM_SOUP)); + } + event.getPlayer().openInventory(inventory); + } + } + if (event.getClickedBlock().getType() == Material.CHEST || event.getClickedBlock().getType() == Material.ENDER_CHEST) { + event.setCancelled(true); + } + } + Label_1649: + { + if (event.getAction().name().startsWith("RIGHT_")) { + final ItemStack item = event.getItem(); + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + Label_1447: + { + switch (playerData.getPlayerState()) { + case LOADING: + player.sendMessage(ChatColor.RED + "Please wait until your player data is loaded."); + break; + case FIGHTING: { + if (item == null) { + return; + } + final Match match = this.plugin.getMatchManager().getMatch(playerData); + switch (item.getType()) { + case ENDER_PEARL: + if (match.getMatchState() == MatchState.STARTING) { + event.setCancelled(true); + player.sendMessage(ChatColor.RED + "You can't throw enderpearls in your current state!"); + player.updateInventory(); + break; + } + break; + case ENCHANTED_BOOK: { + final Kit kit = match.getKit(); + final PlayerInventory inventory2 = player.getInventory(); + final int kitIndex = inventory2.getHeldItemSlot(); + if (kitIndex == 8) { + kit.applyToPlayer(player); + break; + } + final Map kits = playerData.getPlayerKits(kit.getName()); + final PlayerKit playerKit = kits.get(kitIndex + 1); + if (playerKit != null) { + playerKit.applyToPlayer(player); + break; + } + break; + } + } + break; + } + case SPAWN: + if (item == null) { + return; + } + switch (item.getType()) { + case DIAMOND_SWORD: + if (party != null && !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are not the leader of this party."); + return; + } + player.openInventory(this.plugin.getInventoryManager().getRankedInventory().getCurrentPage()); + break; + case IRON_SWORD: + if (party != null && !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are not the leader of this party."); + return; + } + player.openInventory(this.plugin.getInventoryManager().getUnrankedInventory().getCurrentPage()); + break; + case BLAZE_POWDER: { + final UUID rematching = this.plugin.getMatchManager().getRematcher(player.getUniqueId()); + final Player rematcher = this.plugin.getServer().getPlayer(rematching); + if (rematcher == null) { + player.sendMessage(ChatColor.RED + "That player is not online."); + return; + } + if (this.plugin.getMatchManager().getMatchRequest(rematcher.getUniqueId(), player.getUniqueId()) != null) { + this.plugin.getServer().dispatchCommand(player, "accept " + rematcher.getName()); + break; + } + this.plugin.getServer().dispatchCommand(player, "duel " + rematcher.getName()); + break; + } + case IRON_AXE: + this.plugin.getFfaManager().addPlayer(player); + break; + case NAME_TAG: + this.plugin.getPartyManager().createParty(player); + break; + case BOOK: + player.openInventory(this.plugin.getInventoryManager().getEditorInventory().getCurrentPage()); + break; + case SKULL_ITEM: + player.performCommand("party info"); + break; + case WATCH: + player.performCommand("settings"); + break; + case GOLD_AXE: + if (party != null && !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are not the leader of this party."); + return; + } + player.openInventory(this.plugin.getInventoryManager().getPartyEventInventory().getCurrentPage()); + break; + case PAPER: + if (party != null && !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + player.sendMessage(ChatColor.RED + "You are not the leader of this party."); + return; + } + player.openInventory(this.plugin.getInventoryManager().getPartyInventory().getCurrentPage()); + break; + case NETHER_STAR: + this.plugin.getPartyManager().leaveParty(player); + this.plugin.getTournamentManager().leaveTournament(player); + break; + } + break; + case QUEUE: + if (item == null) { + return; + } + if (item.getType() != Material.REDSTONE) { + break; + } + if (party == null) { + this.plugin.getQueueManager().removePlayerFromQueue(player); + break; + } + this.plugin.getQueueManager().removePartyFromQueue(party); + break; + case EVENT: { + if (item == null) { + return; + } + final PracticeEvent practiceEvent = this.plugin.getEventManager().getEventPlaying(player); + if (item.getType() == Material.NETHER_STAR) { + if (practiceEvent != null) { + practiceEvent.leave(player); + break; + } + break; + } else { + if (item.getType() == Material.FIREBALL && practiceEvent != null && practiceEvent instanceof ParkourEvent) { + ((ParkourEvent) practiceEvent).toggleVisibility(player); + break; + } + break; + } + } + case SPECTATING: + if (item == null) { + return; + } + if (item.getType() != Material.NETHER_STAR) { + break Label_1447; + } + if (this.plugin.getEventManager().getSpectators().containsKey(player.getUniqueId())) { + this.plugin.getEventManager().removeSpectator(player); + break Label_1447; + } + if (party == null) { + this.plugin.getMatchManager().removeSpectator(player); + break Label_1447; + } + this.plugin.getPartyManager().leaveParty(player); + break Label_1447; + case EDITING: + if (event.getClickedBlock() == null) { + return; + } + switch (event.getClickedBlock().getType()) { + case WALL_SIGN: + case SIGN: + case SIGN_POST: + this.plugin.getEditorManager().removeEditor(player.getUniqueId()); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + break Label_1649; + case CHEST: { + final Kit kit2 = this.plugin.getKitManager().getKit(this.plugin.getEditorManager().getEditingKit(player.getUniqueId())); + if (kit2.getKitEditContents()[0] != null) { + final Inventory editorInventory = this.plugin.getServer().createInventory(null, 36); + editorInventory.setContents(kit2.getKitEditContents()); + player.openInventory(editorInventory); + event.setCancelled(true); + break Label_1649; + } + break Label_1649; + } + case ANVIL: + player.openInventory(this.plugin.getInventoryManager().getEditingKitInventory(player.getUniqueId()).getCurrentPage()); + event.setCancelled(true); + break Label_1649; + } + break; + } + } + } + } + } + + @EventHandler + public void onPlayerDropItem(final PlayerDropItemEvent event) { + final Player player = event.getPlayer(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Material drop = event.getItemDrop().getItemStack().getType(); + switch (playerData.getPlayerState()) { + case FFA: + if (drop != Material.BOWL) { + event.setCancelled(true); + break; + } + event.getItemDrop().remove(); + break; + case FIGHTING: { + if (drop == Material.ENCHANTED_BOOK) { + event.setCancelled(true); + break; + } + if (drop == Material.GLASS_BOTTLE) { + event.getItemDrop().remove(); + break; + } + if (drop == Material.DIAMOND_SWORD || drop == Material.IRON_AXE || drop == Material.DIAMOND_SPADE || drop == Material.BOW) { + event.setCancelled(true); + break; + } + final Match match = this.plugin.getMatchManager().getMatch(event.getPlayer().getUniqueId()); + this.plugin.getMatchManager().addDroppedItem(match, event.getItemDrop()); + break; + } + default: + event.setCancelled(true); + break; + } + } + + @EventHandler + public void onPlayerConsumeItem(final PlayerItemConsumeEvent event) { + final Player player = event.getPlayer(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Material drop = event.getItem().getType(); + switch (playerData.getPlayerState()) { + case FIGHTING: + case EVENT: + if (drop.getId() == 373) { + this.plugin.getServer().getScheduler().runTaskLaterAsynchronously(this.plugin, () -> { + player.setItemInHand(new ItemStack(Material.AIR)); + player.updateInventory(); + }, 1L); + break; + } + break; + } + } + + @EventHandler + public void onPlayerPickupItem(final PlayerPickupItemEvent event) { + final Player player = event.getPlayer(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + final Match match = this.plugin.getMatchManager().getMatch(player.getUniqueId()); + if (match.getEntitiesToRemove().contains(event.getItem())) { + match.removeEntityToRemove(event.getItem()); + } else { + event.setCancelled(true); + } + } else if (playerData.getPlayerState() != PlayerState.FFA) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true) + public void onAsyncPlayerChat(final AsyncPlayerChatEvent event) { + final Player player = event.getPlayer(); + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + final String chatMessage = event.getMessage(); + if (party != null) { + if (chatMessage.startsWith("!") || chatMessage.startsWith("@")) { + event.setCancelled(true); + final String message = ChatColor.GOLD + "(Party) " + ChatColor.WHITE + player.getName() + ChatColor.GRAY + ": " + chatMessage.replaceFirst("!", "").replaceFirst("@", ""); + party.broadcast(message); + } + } else { + final PlayerKit kitRenaming = this.plugin.getEditorManager().getRenamingKit(player.getUniqueId()); + if (kitRenaming != null) { + kitRenaming.setDisplayName(ChatColor.translateAlternateColorCodes('&', chatMessage)); + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColor.GREEN + "Successfully set kit " + ChatColor.YELLOW + kitRenaming.getIndex() + ChatColor.GREEN + "'s name to " + ChatColor.YELLOW + kitRenaming.getDisplayName()); + this.plugin.getEditorManager().removeRenamingKit(event.getPlayer().getUniqueId()); + } + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerRespawn(final PlayerRespawnEvent event) { + final Player player = event.getPlayer(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + switch (playerData.getPlayerState()) { + case EVENT: { + final PracticeEvent currentEvent = this.plugin.getEventManager().getEventPlaying(player); + if (currentEvent != null && currentEvent instanceof OITCEvent) { + event.setRespawnLocation(player.getLocation()); + currentEvent.onDeath().accept(player); + break; + } + break; + } + } + } + + @EventHandler + public void onPlayerDeath(final PlayerDeathEvent event) { + final Player player = event.getEntity(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + switch (playerData.getPlayerState()) { + case FIGHTING: + this.plugin.getMatchManager().removeFighter(player, playerData, true); + break; + case EVENT: { + final PracticeEvent currentEvent = this.plugin.getEventManager().getEventPlaying(player); + if (currentEvent == null) { + break; + } + if (currentEvent instanceof OITCEvent) { + final OITCEvent oitcEvent = (OITCEvent) currentEvent; + final OITCPlayer oitcKiller = oitcEvent.getPlayer(player.getKiller()); + final OITCPlayer oitcPlayer = oitcEvent.getPlayer(player); + oitcPlayer.setLastKiller(oitcKiller); + PlayerUtil.respawnPlayer(event); + break; + } + currentEvent.onDeath().accept(player); + break; + } + case FFA: { + for (final ItemStack item : player.getInventory().getContents()) { + if (item != null && item.getType() == Material.MUSHROOM_SOUP) { + this.plugin.getFfaManager().getItemTracker().put(player.getWorld().dropItemNaturally(player.getLocation(), item), System.currentTimeMillis()); + } + } + this.plugin.getFfaManager().getKillStreakTracker().put(player.getUniqueId(), 0); + String deathMessage; + if (player.getKiller() == null) { + deathMessage = ChatColor.RED + player.getName() + ChatColor.RED + " has been eliminated."; + } else { + deathMessage = ChatColor.RED + player.getName() + ChatColor.RED + " has been eliminated by " + ChatColor.GREEN + player.getKiller().getName(); + final int ks = this.plugin.getFfaManager().getKillStreakTracker().compute(player.getKiller().getUniqueId(), (k, v) -> ((v == null) ? 0 : v) + 1); + for (final KillStreak killStreak : this.plugin.getFfaManager().getKillStreaks()) { + if (killStreak.getStreaks().contains(ks)) { + killStreak.giveKillStreak(player.getKiller()); + for (final PlayerData data : this.plugin.getPlayerManager().getAllData()) { + if (data.getPlayerState() == PlayerState.FFA) { + deathMessage = deathMessage + "\n" + ChatColor.WHITE.toString() + ChatColor.BOLD + "* " + ChatColor.GREEN + player.getKiller().getName() + ChatColor.GRAY + " is on a " + ChatColor.RED.toString() + ChatColor.BOLD + ks + ChatColor.GRAY + " kill streak."; + } + } + break; + } + } + } + for (final PlayerData data2 : this.plugin.getPlayerManager().getAllData()) { + if (data2.getPlayerState() == PlayerState.FFA) { + final Player ffaPlayer = this.plugin.getServer().getPlayer(data2.getUniqueId()); + ffaPlayer.sendMessage(deathMessage); + } + } + this.plugin.getServer().getScheduler().runTask(this.plugin, () -> this.plugin.getFfaManager().removePlayer(event.getEntity())); + break; + } + } + event.setDroppedExp(0); + event.setDeathMessage(null); + } + + @EventHandler + public void onFoodLevelChange(final FoodLevelChangeEvent event) { + final Player player = (Player) event.getEntity(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + final Match match = this.plugin.getMatchManager().getMatch(player.getUniqueId()); + if (match.getKit().isParkour() || match.getKit().isSumo() || this.plugin.getEventManager().getEventPlaying(player) != null) { + event.setCancelled(true); + } + } else { + event.setCancelled(true); + } + } + + @EventHandler + public void onProjectileLaunch(final ProjectileLaunchEvent event) { + if (event.getEntity().getShooter() instanceof Player) { + final Player shooter = (Player) event.getEntity().getShooter(); + final PlayerData shooterData = this.plugin.getPlayerManager().getPlayerData(shooter.getUniqueId()); + if (shooterData.getPlayerState() == PlayerState.FIGHTING) { + final Match match = this.plugin.getMatchManager().getMatch(shooter.getUniqueId()); + match.addEntityToRemove(event.getEntity()); + } + } + } + + @EventHandler + public void onProjectileHit(final ProjectileHitEvent event) { + if (event.getEntity().getShooter() instanceof Player) { + final Player shooter = (Player) event.getEntity().getShooter(); + final PlayerData shooterData = this.plugin.getPlayerManager().getPlayerData(shooter.getUniqueId()); + if (shooterData != null && shooterData.getPlayerState() == PlayerState.FIGHTING) { + final Match match = this.plugin.getMatchManager().getMatch(shooter.getUniqueId()); + match.removeEntityToRemove(event.getEntity()); + if (event.getEntityType() == EntityType.ARROW) { + event.getEntity().remove(); + } + } + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/listeners/WorldListener.java b/dPractice/src/main/java/me/devkevin/practice/listeners/WorldListener.java new file mode 100644 index 0000000..48265c5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/listeners/WorldListener.java @@ -0,0 +1,242 @@ +package me.devkevin.practice.listeners; + +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; +import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.weather.WeatherChangeEvent; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.StandaloneArena; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchState; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class WorldListener implements Listener { + private final Practice plugin; + + public WorldListener() { + this.plugin = Practice.getInstance(); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onBlockBreak(final BlockBreakEvent event) { + final Player player = event.getPlayer(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData == null) { + this.plugin.getLogger().warning(player.getName() + "'s player data is null"); + event.setCancelled(true); + return; + } + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + final Match match = this.plugin.getMatchManager().getMatch(player.getUniqueId()); + if (match.getKit().isBuild()) { + if (!match.getPlacedBlockLocations().contains(event.getBlock().getLocation())) { + event.setCancelled(true); + } else { + } + } else if (match.getKit().isSpleef()) { + double minX = match.getStandaloneArena().getMin().getX(); + double minZ = match.getStandaloneArena().getMin().getZ(); + double maxX = match.getStandaloneArena().getMax().getX(); + double maxZ = match.getStandaloneArena().getMax().getZ(); + if (minX > maxX) { + final double lastMinX = minX; + minX = maxX; + maxX = lastMinX; + } + if (minZ > maxZ) { + final double lastMinZ = minZ; + minZ = maxZ; + maxZ = lastMinZ; + } + if (match.getMatchState() == MatchState.STARTING) { + event.setCancelled(true); + return; + } + if (player.getLocation().getX() >= minX && player.getLocation().getX() <= maxX && player.getLocation().getZ() >= minZ && player.getLocation().getZ() <= maxZ) { + if (event.getBlock().getType() == Material.SNOW_BLOCK && player.getItemInHand().getType() == Material.DIAMOND_SPADE) { + final Location blockLocation = event.getBlock().getLocation(); + event.setCancelled(true); + match.addOriginalBlockChange(event.getBlock().getState()); + final Set items = new HashSet(); + event.getBlock().getDrops().forEach(itemStack -> items.add(player.getWorld().dropItemNaturally(blockLocation.add(0.0, 0.25, 0.0), itemStack))); + this.plugin.getMatchManager().addDroppedItems(match, items); + event.getBlock().setType(Material.AIR); + } else { + event.setCancelled(true); + } + } else { + event.setCancelled(true); + } + } else { + event.setCancelled(true); + } + } else if (!player.isOp() || player.getGameMode() != GameMode.CREATIVE) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onBlockPlace(final BlockPlaceEvent event) { + final Player player = event.getPlayer(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData == null) { + this.plugin.getLogger().warning(player.getName() + "'s player data is null"); + event.setCancelled(true); + return; + } + if (playerData.getPlayerState() != PlayerState.FIGHTING) { + if (!player.isOp() || player.getGameMode() != GameMode.CREATIVE) { + event.setCancelled(true); + } + return; + } + final Match match = this.plugin.getMatchManager().getMatch(player.getUniqueId()); + if (match == null) { + event.setCancelled(true); + return; + } + if (!match.getKit().isBuild()) { + event.setCancelled(true); + } else { + double minX = match.getStandaloneArena().getMin().getX(); + double minZ = match.getStandaloneArena().getMin().getZ(); + double maxX = match.getStandaloneArena().getMax().getX(); + double maxZ = match.getStandaloneArena().getMax().getZ(); + if (minX > maxX) { + final double lastMinX = minX; + minX = maxX; + maxX = lastMinX; + } + if (minZ > maxZ) { + final double lastMinZ = minZ; + minZ = maxZ; + maxZ = lastMinZ; + } + if (player.getLocation().getX() >= minX && player.getLocation().getX() <= maxX && player.getLocation().getZ() >= minZ && player.getLocation().getZ() <= maxZ) { + if (player.getLocation().getY() - match.getStandaloneArena().getA().getY() < 5.0 && event.getBlockPlaced() != null) { + match.addPlacedBlockLocation(event.getBlockPlaced().getLocation()); + } else { + event.setCancelled(true); + } + } else { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onBucketEmpty(final PlayerBucketEmptyEvent event) { + final Player player = event.getPlayer(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData == null) { + this.plugin.getLogger().warning(player.getName() + "'s player data is null"); + event.setCancelled(true); + return; + } + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + final Match match = this.plugin.getMatchManager().getMatch(player.getUniqueId()); + if (!match.getKit().isBuild()) { + event.setCancelled(true); + } else { + double minX = match.getStandaloneArena().getMin().getX(); + double minZ = match.getStandaloneArena().getMin().getZ(); + double maxX = match.getStandaloneArena().getMax().getX(); + double maxZ = match.getStandaloneArena().getMax().getZ(); + if (minX > maxX) { + final double lastMinX = minX; + minX = maxX; + maxX = lastMinX; + } + if (minZ > maxZ) { + final double lastMinZ = minZ; + minZ = maxZ; + maxZ = lastMinZ; + } + if (player.getLocation().getX() >= minX && player.getLocation().getX() <= maxX && player.getLocation().getZ() >= minZ && player.getLocation().getZ() <= maxZ) { + if (player.getLocation().getY() - match.getStandaloneArena().getA().getY() < 5.0) { + final Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + match.addPlacedBlockLocation(block.getLocation()); + } else { + event.setCancelled(true); + } + } else { + event.setCancelled(true); + } + } + return; + } + if (!player.isOp() || player.getGameMode() != GameMode.CREATIVE) { + event.setCancelled(true); + } + } + + @EventHandler + public void onBlockFromTo(final BlockFromToEvent event) { + if (event.getToBlock() == null) { + return; + } + for (final StandaloneArena arena : this.plugin.getArenaManager().getArenaMatchUUIDs().keySet()) { + double minX = arena.getMin().getX(); + double minZ = arena.getMin().getZ(); + double maxX = arena.getMax().getX(); + double maxZ = arena.getMax().getZ(); + if (minX > maxX) { + final double lastMinX = minX; + minX = maxX; + maxX = lastMinX; + } + if (minZ > maxZ) { + final double lastMinZ = minZ; + minZ = maxZ; + maxZ = lastMinZ; + } + if (event.getToBlock().getX() >= minX && event.getToBlock().getZ() >= minZ && event.getToBlock().getX() <= maxX && event.getToBlock().getZ() <= maxZ) { + final UUID matchUUID = this.plugin.getArenaManager().getArenaMatchUUID(arena); + final Match match = this.plugin.getMatchManager().getMatchFromUUID(matchUUID); + match.addPlacedBlockLocation(event.getToBlock().getLocation()); + break; + } + } + } + + @EventHandler + public void onWeatherChange(final WeatherChangeEvent event) { + if (event.toWeatherState()) { + event.setCancelled(true); + } + } + + @EventHandler + public void onLeavesDecay(final LeavesDecayEvent event) { + event.setCancelled(true); + } + + @EventHandler + public void onHangingBreak(final HangingBreakEvent event) { + event.setCancelled(true); + } + + @EventHandler + public void onBlockBurn(final BlockBurnEvent event) { + event.setCancelled(true); + } + + @EventHandler + public void onBlockSpread(final BlockSpreadEvent event) { + event.setCancelled(true); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/ArenaManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/ArenaManager.java new file mode 100644 index 0000000..590ca02 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/ArenaManager.java @@ -0,0 +1,214 @@ +package me.devkevin.practice.managers; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.arena.StandaloneArena; +import me.devkevin.practice.file.Config; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.util.ItemUtil; +import me.devkevin.practice.util.inventory.InventoryUI; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class ArenaManager { + private final Practice plugin; + private final Config config; + private final Map arenas; + private final Map arenaMatchUUIDs; + private int generatingArenaRunnables; + + public ArenaManager() { + this.plugin = Practice.getInstance(); + this.config = new Config("arenas", this.plugin); + this.arenas = new HashMap<>(); + this.arenaMatchUUIDs = new HashMap<>(); + this.loadArenas(); + } + + private void loadArenas() { + FileConfiguration fileConfig = this.config.getConfig(); + ConfigurationSection arenaSection = fileConfig.getConfigurationSection("arenas"); + if (arenaSection != null) { + arenaSection.getKeys(false).forEach((name) -> { + String a = arenaSection.getString(name + ".a"); + String b = arenaSection.getString(name + ".b"); + String min = arenaSection.getString(name + ".min"); + String max = arenaSection.getString(name + ".max"); + CustomLocation locA = CustomLocation.stringToLocation(a); + CustomLocation locB = CustomLocation.stringToLocation(b); + CustomLocation locMin = CustomLocation.stringToLocation(min); + CustomLocation locMax = CustomLocation.stringToLocation(max); + ArrayList standaloneArenas = new ArrayList<>(); + ConfigurationSection saSection = arenaSection.getConfigurationSection(name + ".standaloneArenas"); + if (saSection != null) { + saSection.getKeys(false).forEach((id) -> { + String saA = saSection.getString(id + ".a"); + String saB = saSection.getString(id + ".b"); + String saMin = saSection.getString(id + ".min"); + String saMax = saSection.getString(id + ".max"); + CustomLocation locSaA = CustomLocation.stringToLocation(saA); + CustomLocation locSaB = CustomLocation.stringToLocation(saB); + CustomLocation locSaMin = CustomLocation.stringToLocation(saMin); + CustomLocation locSaMax = CustomLocation.stringToLocation(saMax); + standaloneArenas.add(new StandaloneArena(locSaA, locSaB, locSaMin, locSaMax)); + }); + } + + boolean enabled = arenaSection.getBoolean(name + ".enabled", false); + Arena arena = new Arena(name, standaloneArenas, standaloneArenas, locA, locB, locMin, locMax, enabled); + this.arenas.put(name, arena); + }); + } + + } + + public void saveArenas() { + FileConfiguration fileConfig = this.config.getConfig(); + fileConfig.set("arenas", null); + this.arenas.forEach((arenaName, arena) -> { + String a = CustomLocation.locationToString(arena.getA()); + String b = CustomLocation.locationToString(arena.getB()); + String min = CustomLocation.locationToString(arena.getMin()); + String max = CustomLocation.locationToString(arena.getMax()); + String arenaRoot = "arenas." + arenaName; + fileConfig.set(arenaRoot + ".a", a); + fileConfig.set(arenaRoot + ".b", b); + fileConfig.set(arenaRoot + ".min", min); + fileConfig.set(arenaRoot + ".max", max); + fileConfig.set(arenaRoot + ".enabled", arena.isEnabled()); + fileConfig.set(arenaRoot + ".standaloneArenas", null); + int i = 0; + if (arena.getStandaloneArenas() != null) { + for (Iterator var9 = arena.getStandaloneArenas().iterator(); var9.hasNext(); ++i) { + StandaloneArena saArena = (StandaloneArena) var9.next(); + String saA = CustomLocation.locationToString(saArena.getA()); + String saB = CustomLocation.locationToString(saArena.getB()); + String saMin = CustomLocation.locationToString(saArena.getMin()); + String saMax = CustomLocation.locationToString(saArena.getMax()); + String standAloneRoot = arenaRoot + ".standaloneArenas." + i; + fileConfig.set(standAloneRoot + ".a", saA); + fileConfig.set(standAloneRoot + ".b", saB); + fileConfig.set(standAloneRoot + ".min", saMin); + fileConfig.set(standAloneRoot + ".max", saMax); + } + } + + }); + this.config.save(); + + } + + public void reloadArenas() { + this.saveArenas(); + this.arenas.clear(); + this.loadArenas(); + } + + public void openArenaSystemUI(final Player player) { + if (this.arenas.size() == 0) { + player.sendMessage(ChatColor.RED + "There's no arenas."); + return; + } + final InventoryUI inventory = new InventoryUI("Arena System", true, 6); + for (final Arena arena : this.arenas.values()) { + final ItemStack item = ItemUtil.createItem(Material.PAPER, ChatColor.YELLOW + arena.getName() + ChatColor.GRAY + " (" + (arena.isEnabled() ? (ChatColor.GREEN.toString() + ChatColor.BOLD + "ENABLED") : (ChatColor.RED.toString() + ChatColor.BOLD + "DISABLED")) + ChatColor.GRAY + ")"); + ItemUtil.reloreItem(item, ChatColor.GRAY + "Arenas: " + ChatColor.GREEN + ((arena.getStandaloneArenas().size() == 0) ? "Single Arena (Invisible Players)" : (arena.getStandaloneArenas().size() + " Arenas")), ChatColor.GRAY + "Standalone Arenas: " + ChatColor.GREEN + ((arena.getAvailableArenas().size() == 0) ? "None" : (arena.getAvailableArenas().size() + " Arenas Available")), "", ChatColor.YELLOW.toString() + ChatColor.BOLD + "LEFT CLICK " + ChatColor.GRAY + "Teleport to Arena", ChatColor.YELLOW.toString() + ChatColor.BOLD + "RIGHT CLICK " + ChatColor.GRAY + "Generate Standalone Arenas"); + inventory.addItem(new InventoryUI.AbstractClickableItem(item) { + @Override + public void onClick(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + if (event.getClick() == ClickType.LEFT) { + player.teleport(arena.getA().toBukkitLocation()); + } else { + final InventoryUI generateInventory = new InventoryUI("Generate Arenas", true, 1); + final int[] array = new int[]{10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150}; + for (final int batch : array) { + final ItemStack item = ItemUtil.createItem(Material.PAPER, ChatColor.RED.toString() + ChatColor.BOLD + batch + " ARENAS"); + generateInventory.addItem(new InventoryUI.AbstractClickableItem(item) { + @Override + public void onClick(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + player.performCommand("arena generate " + arena.getName() + " " + batch); + player.sendMessage(ChatColor.GREEN + "Generating " + batch + " arenas, please check console for progress."); + player.closeInventory(); + } + }); + } + player.openInventory(generateInventory.getCurrentPage()); + } + } + }); + } + player.openInventory(inventory.getCurrentPage()); + } + + public void createArena(final String name) { + this.arenas.put(name, new Arena(name)); + } + + public void deleteArena(final String name) { + this.arenas.remove(name); + } + + public Arena getArena(final String name) { + return this.arenas.get(name); + } + + public Arena getRandomArena(final Kit kit) { + final List enabledArenas = new ArrayList<>(); + for (final Arena arena : this.arenas.values()) { + if (!arena.isEnabled()) { + continue; + } + if (kit.getExcludedArenas().contains(arena.getName())) { + continue; + } + if (kit.getArenaWhiteList().size() > 0 && !kit.getArenaWhiteList().contains(arena.getName())) { + continue; + } + enabledArenas.add(arena); + } + if (enabledArenas.size() == 0) { + return null; + } + return enabledArenas.get(ThreadLocalRandom.current().nextInt(enabledArenas.size())); + } + + public void removeArenaMatchUUID(final StandaloneArena arena) { + this.arenaMatchUUIDs.remove(arena); + } + + public UUID getArenaMatchUUID(final StandaloneArena arena) { + return this.arenaMatchUUIDs.get(arena); + } + + public void setArenaMatchUUID(final StandaloneArena arena, final UUID matchUUID) { + this.arenaMatchUUIDs.put(arena, matchUUID); + } + + public Map getArenas() { + return this.arenas; + } + + public Map getArenaMatchUUIDs() { + return this.arenaMatchUUIDs; + } + + public int getGeneratingArenaRunnables() { + return this.generatingArenaRunnables; + } + + public void setGeneratingArenaRunnables(final int generatingArenaRunnables) { + this.generatingArenaRunnables = generatingArenaRunnables; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/ChunkManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/ChunkManager.java new file mode 100644 index 0000000..4038d3a --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/ChunkManager.java @@ -0,0 +1,208 @@ +package me.devkevin.practice.managers; + +import org.bukkit.Chunk; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.arena.StandaloneArena; + +public class ChunkManager { + private final Practice plugin; + private boolean chunksLoaded; + + public ChunkManager() { + this.plugin = Practice.getInstance(); + this.plugin.getServer().getScheduler().runTaskLater(this.plugin, this::loadChunks, 1L); + } + + private void loadChunks() { + this.plugin.getLogger().info("Started loading all the chunks..."); + final CustomLocation spawnMin = this.plugin.getSpawnManager().getSpawnMin(); + final CustomLocation spawnMax = this.plugin.getSpawnManager().getSpawnMax(); + if (spawnMin != null && spawnMax != null) { + int spawnMinX = spawnMin.toBukkitLocation().getBlockX() >> 4; + int spawnMinZ = spawnMin.toBukkitLocation().getBlockZ() >> 4; + int spawnMaxX = spawnMax.toBukkitLocation().getBlockX() >> 4; + int spawnMaxZ = spawnMax.toBukkitLocation().getBlockZ() >> 4; + if (spawnMinX > spawnMaxX) { + final int lastSpawnMinX = spawnMinX; + spawnMinX = spawnMaxX; + spawnMaxX = lastSpawnMinX; + } + if (spawnMinZ > spawnMaxZ) { + final int lastSpawnMinZ = spawnMinZ; + spawnMinZ = spawnMaxZ; + spawnMaxZ = lastSpawnMinZ; + } + for (int x = spawnMinX; x <= spawnMaxX; ++x) { + for (int z = spawnMinZ; z <= spawnMaxZ; ++z) { + final Chunk chunk = spawnMin.toBukkitWorld().getChunkAt(x, z); + if (!chunk.isLoaded()) { + chunk.load(); + } + } + } + } + final CustomLocation editorMin = this.plugin.getSpawnManager().getEditorMin(); + final CustomLocation editorMax = this.plugin.getSpawnManager().getEditorMax(); + if (editorMin != null && editorMax != null) { + int editorMinX = editorMin.toBukkitLocation().getBlockX() >> 4; + int editorMinZ = editorMin.toBukkitLocation().getBlockZ() >> 4; + int editorMaxX = editorMax.toBukkitLocation().getBlockX() >> 4; + int editorMaxZ = editorMax.toBukkitLocation().getBlockZ() >> 4; + if (editorMinX > editorMaxX) { + final int lastEditorMinX = editorMinX; + editorMinX = editorMaxX; + editorMaxX = lastEditorMinX; + } + if (editorMinZ > editorMaxZ) { + final int lastEditorMinZ = editorMinZ; + editorMinZ = editorMaxZ; + editorMaxZ = lastEditorMinZ; + } + for (int x2 = editorMinX; x2 <= editorMaxX; ++x2) { + for (int z2 = editorMinZ; z2 <= editorMaxZ; ++z2) { + final Chunk chunk2 = editorMin.toBukkitWorld().getChunkAt(x2, z2); + if (!chunk2.isLoaded()) { + chunk2.load(); + } + } + } + } + final CustomLocation sumoMin = this.plugin.getSpawnManager().getSumoMin(); + final CustomLocation sumoMax = this.plugin.getSpawnManager().getSumoMax(); + if (sumoMin != null && sumoMax != null) { + int sumoMinX = sumoMin.toBukkitLocation().getBlockX() >> 4; + int sumoMinZ = sumoMin.toBukkitLocation().getBlockZ() >> 4; + int sumoMaxX = sumoMax.toBukkitLocation().getBlockX() >> 4; + int sumoMaxZ = sumoMax.toBukkitLocation().getBlockZ() >> 4; + if (sumoMinX > sumoMaxX) { + final int lastSumoMinX = sumoMinX; + sumoMinX = sumoMaxX; + sumoMaxX = lastSumoMinX; + } + if (sumoMinZ > sumoMaxZ) { + final int lastSumoMaxZ = sumoMinZ; + sumoMinZ = sumoMaxZ; + sumoMaxZ = lastSumoMaxZ; + } + for (int x3 = sumoMinX; x3 <= sumoMaxX; ++x3) { + for (int z3 = sumoMinZ; z3 <= sumoMaxZ; ++z3) { + final Chunk chunk3 = sumoMin.toBukkitWorld().getChunkAt(x3, z3); + if (!chunk3.isLoaded()) { + chunk3.load(); + } + } + } + } + final CustomLocation oitcMin = this.plugin.getSpawnManager().getOitcMin(); + final CustomLocation oitcMax = this.plugin.getSpawnManager().getOitcMax(); + if (oitcMin != null && oitcMax != null) { + int oitcMinX = oitcMin.toBukkitLocation().getBlockX() >> 4; + int oitcMinZ = oitcMin.toBukkitLocation().getBlockZ() >> 4; + int oitcMaxX = oitcMax.toBukkitLocation().getBlockX() >> 4; + int oitcMaxZ = oitcMax.toBukkitLocation().getBlockZ() >> 4; + if (oitcMinX > oitcMaxX) { + final int lastOitcMinX = oitcMinX; + oitcMinX = oitcMaxX; + oitcMaxX = lastOitcMinX; + } + if (oitcMinZ > oitcMaxZ) { + final int lastOitcMaxZ = oitcMinZ; + oitcMinZ = oitcMaxZ; + oitcMaxZ = lastOitcMaxZ; + } + for (int x4 = oitcMinX; x4 <= oitcMaxX; ++x4) { + for (int z4 = oitcMinZ; z4 <= oitcMaxZ; ++z4) { + final Chunk chunk4 = oitcMin.toBukkitWorld().getChunkAt(x4, z4); + if (!chunk4.isLoaded()) { + chunk4.load(); + } + } + } + } + final CustomLocation parkourMin = this.plugin.getSpawnManager().getParkourMin(); + final CustomLocation parkourMax = this.plugin.getSpawnManager().getParkourMax(); + if (parkourMin != null && parkourMax != null) { + int parkourMinX = parkourMin.toBukkitLocation().getBlockX() >> 4; + int parkourMinZ = parkourMin.toBukkitLocation().getBlockZ() >> 4; + int parkourMaxX = parkourMax.toBukkitLocation().getBlockX() >> 4; + int parkourMaxZ = parkourMax.toBukkitLocation().getBlockZ() >> 4; + if (parkourMinX > parkourMaxX) { + final int lastParkourMinX = parkourMinX; + parkourMinX = parkourMaxX; + parkourMaxX = lastParkourMinX; + } + if (parkourMinZ > parkourMaxZ) { + final int lastParkourMaxZ = parkourMinZ; + parkourMinZ = parkourMaxZ; + parkourMaxZ = lastParkourMaxZ; + } + for (int x5 = parkourMinX; x5 <= parkourMaxX; ++x5) { + for (int z5 = parkourMinZ; z5 <= parkourMaxZ; ++z5) { + final Chunk chunk5 = parkourMin.toBukkitWorld().getChunkAt(x5, z5); + if (!chunk5.isLoaded()) { + chunk5.load(); + } + } + } + } + for (final Arena arena : this.plugin.getArenaManager().getArenas().values()) { + if (!arena.isEnabled()) { + continue; + } + int arenaMinX = arena.getMin().toBukkitLocation().getBlockX() >> 4; + int arenaMinZ = arena.getMin().toBukkitLocation().getBlockZ() >> 4; + int arenaMaxX = arena.getMax().toBukkitLocation().getBlockX() >> 4; + int arenaMaxZ = arena.getMax().toBukkitLocation().getBlockZ() >> 4; + if (arenaMinX > arenaMaxX) { + final int lastArenaMinX = arenaMinX; + arenaMinX = arenaMaxX; + arenaMaxX = lastArenaMinX; + } + if (arenaMinZ > arenaMaxZ) { + final int lastArenaMinZ = arenaMinZ; + arenaMinZ = arenaMaxZ; + arenaMaxZ = lastArenaMinZ; + } + for (int x6 = arenaMinX; x6 <= arenaMaxX; ++x6) { + for (int z6 = arenaMinZ; z6 <= arenaMaxZ; ++z6) { + final Chunk chunk6 = arena.getMin().toBukkitWorld().getChunkAt(x6, z6); + if (!chunk6.isLoaded()) { + chunk6.load(); + } + } + } + for (final StandaloneArena saArena : arena.getStandaloneArenas()) { + arenaMinX = saArena.getMin().toBukkitLocation().getBlockX() >> 4; + arenaMinZ = saArena.getMin().toBukkitLocation().getBlockZ() >> 4; + arenaMaxX = saArena.getMax().toBukkitLocation().getBlockX() >> 4; + arenaMaxZ = saArena.getMax().toBukkitLocation().getBlockZ() >> 4; + if (arenaMinX > arenaMaxX) { + final int lastArenaMinX2 = arenaMinX; + arenaMinX = arenaMaxX; + arenaMaxX = lastArenaMinX2; + } + if (arenaMinZ > arenaMaxZ) { + final int lastArenaMinZ2 = arenaMinZ; + arenaMinZ = arenaMaxZ; + arenaMaxZ = lastArenaMinZ2; + } + for (int x7 = arenaMinX; x7 <= arenaMaxX; ++x7) { + for (int z7 = arenaMinZ; z7 <= arenaMaxZ; ++z7) { + final Chunk chunk7 = saArena.getMin().toBukkitWorld().getChunkAt(x7, z7); + if (!chunk7.isLoaded()) { + chunk7.load(); + } + } + } + } + } + this.plugin.getLogger().info("Finished loading all the chunks!"); + this.chunksLoaded = true; + } + + public boolean isChunksLoaded() { + return this.chunksLoaded; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/EditorManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/EditorManager.java new file mode 100644 index 0000000..e018e48 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/EditorManager.java @@ -0,0 +1,55 @@ +package me.devkevin.practice.managers; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.kit.PlayerKit; +import me.devkevin.practice.util.PlayerUtil; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class EditorManager { + private final Practice plugin; + private final Map editing; + private final Map renaming; + + public EditorManager() { + this.plugin = Practice.getInstance(); + this.editing = new HashMap<>(); + this.renaming = new HashMap<>(); + } + + public void addEditor(final Player player, final Kit kit) { + this.editing.put(player.getUniqueId(), kit.getName()); + this.plugin.getInventoryManager().addEditingKitInventory(player, kit); + PlayerUtil.clearPlayer(player); + player.teleport(this.plugin.getSpawnManager().getEditorLocation().toBukkitLocation()); + player.getInventory().setContents(kit.getContents()); + player.sendMessage(ChatColor.GREEN + "You are editing kit " + ChatColor.YELLOW + kit.getName() + ChatColor.GREEN + "."); + } + + public void removeEditor(final UUID editor) { + this.renaming.remove(editor); + this.editing.remove(editor); + this.plugin.getInventoryManager().removeEditingKitInventory(editor); + } + + public String getEditingKit(final UUID editor) { + return this.editing.get(editor); + } + + public void addRenamingKit(final UUID uuid, final PlayerKit playerKit) { + this.renaming.put(uuid, playerKit); + } + + public void removeRenamingKit(final UUID uuid) { + this.renaming.remove(uuid); + } + + public PlayerKit getRenamingKit(final UUID uuid) { + return this.renaming.get(uuid); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/EventManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/EventManager.java new file mode 100644 index 0000000..3c5b7c8 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/EventManager.java @@ -0,0 +1,187 @@ +package me.devkevin.practice.managers; + +import org.bukkit.GameMode; +import org.bukkit.World; +import org.bukkit.WorldCreator; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.EventState; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.events.oitc.OITCEvent; +import me.devkevin.practice.events.parkour.ParkourEvent; +import me.devkevin.practice.events.redrover.RedroverEvent; +import me.devkevin.practice.events.sumo.SumoEvent; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class EventManager { + private final Map, PracticeEvent> events; + private final Practice plugin; + private final World eventWorld; + private HashMap spectators; + private long cooldown; + + public EventManager() { + this.events = new HashMap<>(); + this.plugin = Practice.getInstance(); + Arrays.asList(SumoEvent.class, OITCEvent.class, ParkourEvent.class, RedroverEvent.class).forEach(this::addEvent); + boolean newWorld; + if (this.plugin.getServer().getWorld("event") == null) { + this.eventWorld = this.plugin.getServer().createWorld(new WorldCreator("event")); + newWorld = true; + } else { + this.eventWorld = this.plugin.getServer().getWorld("event"); + newWorld = false; + } + this.spectators = new HashMap(); + this.cooldown = 0L; + if (this.eventWorld != null) { + if (newWorld) { + this.plugin.getServer().getWorlds().add(this.eventWorld); + } + this.eventWorld.setTime(2000L); + this.eventWorld.setGameRuleValue("doDaylightCycle", "false"); + this.eventWorld.setGameRuleValue("doMobSpawning", "false"); + this.eventWorld.setStorm(false); + this.eventWorld.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(Entity::remove); + } + } + + public PracticeEvent getByName(final String name) { + return this.events.values().stream().filter(event -> event.getName().toLowerCase().equalsIgnoreCase(name.toLowerCase())).findFirst().orElse(null); + } + + public void hostEvent(final PracticeEvent event, final Player host) { + event.setState(EventState.WAITING); + event.setHost(host); + event.startCountdown(); + } + + private void addEvent(final Class clazz) { + PracticeEvent event = null; + try { + event = clazz.newInstance(); + } catch (InstantiationException | IllegalAccessException ex2) { + final ReflectiveOperationException e = ex2; + e.printStackTrace(); + } + this.events.put(clazz, event); + } + + public void addSpectatorRedrover(final Player player, final PlayerData playerData, final RedroverEvent event) { + this.addSpectator(player, playerData, event); + if (event.getSpawnLocations().size() == 1) { + player.teleport(event.getSpawnLocations().get(0).toBukkitLocation()); + } else { + final List spawnLocations = new ArrayList<>(event.getSpawnLocations()); + player.teleport(spawnLocations.remove(ThreadLocalRandom.current().nextInt(spawnLocations.size())).toBukkitLocation()); + } + for (final Player eventPlayer : event.getBukkitPlayers()) { + player.showPlayer(eventPlayer); + } + player.setGameMode(GameMode.SPECTATOR); + player.setAllowFlight(true); + player.setFlying(true); + } + + public void addSpectatorSumo(final Player player, final PlayerData playerData, final SumoEvent event) { + this.addSpectator(player, playerData, event); + if (event.getSpawnLocations().size() == 1) { + player.teleport(event.getSpawnLocations().get(0).toBukkitLocation()); + } else { + final List spawnLocations = new ArrayList<>(event.getSpawnLocations()); + player.teleport(spawnLocations.remove(ThreadLocalRandom.current().nextInt(spawnLocations.size())).toBukkitLocation()); + } + for (final Player eventPlayer : event.getBukkitPlayers()) { + player.showPlayer(eventPlayer); + } + player.setGameMode(GameMode.SPECTATOR); + player.setAllowFlight(true); + player.setFlying(true); + } + + public void addSpectatorOITC(final Player player, final PlayerData playerData, final OITCEvent event) { + this.addSpectator(player, playerData, event); + if (event.getSpawnLocations().size() == 1) { + player.teleport(event.getSpawnLocations().get(0).toBukkitLocation()); + } else { + final List spawnLocations = new ArrayList<>(event.getSpawnLocations()); + player.teleport(spawnLocations.remove(ThreadLocalRandom.current().nextInt(spawnLocations.size())).toBukkitLocation()); + } + for (final Player eventPlayer : event.getBukkitPlayers()) { + player.showPlayer(eventPlayer); + } + player.setGameMode(GameMode.SPECTATOR); + player.setAllowFlight(true); + player.setFlying(true); + } + + public void addSpectatorParkour(final Player player, final PlayerData playerData, final ParkourEvent event) { + this.addSpectator(player, playerData, event); + if (event.getSpawnLocations().size() == 1) { + player.teleport(event.getSpawnLocations().get(0).toBukkitLocation()); + } else { + final List spawnLocations = new ArrayList<>(event.getSpawnLocations()); + player.teleport(spawnLocations.remove(ThreadLocalRandom.current().nextInt(spawnLocations.size())).toBukkitLocation()); + } + for (final Player eventPlayer : event.getBukkitPlayers()) { + player.showPlayer(eventPlayer); + } + player.setGameMode(GameMode.SPECTATOR); + player.setAllowFlight(true); + player.setFlying(true); + } + + private void addSpectator(final Player player, final PlayerData playerData, final PracticeEvent event) { + playerData.setPlayerState(PlayerState.SPECTATING); + this.spectators.put(player.getUniqueId(), event); + player.getInventory().setContents(this.plugin.getItemManager().getSpecItems()); + player.updateInventory(); + this.plugin.getServer().getOnlinePlayers().forEach(online -> { + online.hidePlayer(player); + player.hidePlayer(online); + }); + } + + public void removeSpectator(final Player player) { + this.getSpectators().remove(player.getUniqueId()); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + } + + public boolean isPlaying(final Player player, final PracticeEvent event) { + return event.getPlayers().containsKey(player.getUniqueId()); + } + + public PracticeEvent getEventPlaying(final Player player) { + return this.events.values().stream().filter(event -> this.isPlaying(player, event)).findFirst().orElse(null); + } + + public Map, PracticeEvent> getEvents() { + return this.events; + } + + public Practice getPlugin() { + return this.plugin; + } + + public HashMap getSpectators() { + return this.spectators; + } + + public long getCooldown() { + return this.cooldown; + } + + public void setCooldown(final long cooldown) { + this.cooldown = cooldown; + } + + public World getEventWorld() { + return this.eventWorld; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/InventoryManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/InventoryManager.java new file mode 100644 index 0000000..d5d252e --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/InventoryManager.java @@ -0,0 +1,596 @@ +package me.devkevin.practice.managers; + +import com.google.common.collect.Lists; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.inventory.InventorySnapshot; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.kit.PlayerKit; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.queue.QueueType; +import me.devkevin.practice.util.Clickable; +import me.devkevin.practice.util.ItemUtil; +import me.devkevin.practice.util.StringUtil; +import me.devkevin.practice.util.inventory.InventoryUI; + +import java.util.*; + +public class InventoryManager { + private static final String MORE_PLAYERS; + + static { + MORE_PLAYERS = ChatColor.RED + "There must be at least 2 players in your party to do this."; + } + + private final Practice plugin; + private final InventoryUI unrankedInventory; + private final InventoryUI rankedInventory; + private final InventoryUI editorInventory; + private final InventoryUI duelInventory; + private final InventoryUI partySplitInventory; + private final InventoryUI partyFFAInventory; + private final InventoryUI partyEventInventory; + private final InventoryUI partyInventory; + private final Map duelMapInventories; + private final Map partySplitMapInventories; + private final Map partyFFAMapInventories; + private final Map editorInventories; + private final Map snapshots; + + public InventoryManager() { + this.plugin = Practice.getInstance(); + this.unrankedInventory = new InventoryUI("Unranked Queue", true, 2); + this.rankedInventory = new InventoryUI("Ranked Queue", true, 2); + this.editorInventory = new InventoryUI("Kit Editor", true, 2); + this.duelInventory = new InventoryUI("Send Request", true, 2); + this.partySplitInventory = new InventoryUI("Split Fights", true, 2); + this.partyFFAInventory = new InventoryUI("Party FFA", true, 2); + this.partyEventInventory = new InventoryUI("Party Events", true, 1); + this.partyInventory = new InventoryUI("Fight Other Parties", true, 6); + this.duelMapInventories = new HashMap<>(); + this.partySplitMapInventories = new HashMap<>(); + this.partyFFAMapInventories = new HashMap<>(); + this.editorInventories = new HashMap(); + this.snapshots = new HashMap(); + this.setupInventories(); + this.plugin.getServer().getScheduler().runTaskTimerAsynchronously(this.plugin, this::updateInventories, 20L, 20L); + } + + private void setupInventories() { + final Collection kits = this.plugin.getKitManager().getKits(); + for (final Kit kit : kits) { + if (kit.isEnabled()) { + this.unrankedInventory.addItem(new InventoryUI.AbstractClickableItem(kit.getIcon()) { + @Override + public void onClick(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + InventoryManager.this.addToQueue(player, InventoryManager.this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()), kit, InventoryManager.this.plugin.getPartyManager().getParty(player.getUniqueId()), QueueType.UNRANKED); + } + }); + if (kit.isRanked()) { + this.rankedInventory.addItem(new InventoryUI.AbstractClickableItem(kit.getIcon()) { + @Override + public void onClick(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + InventoryManager.this.addToQueue(player, InventoryManager.this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()), kit, InventoryManager.this.plugin.getPartyManager().getParty(player.getUniqueId()), QueueType.RANKED); + } + }); + } + this.editorInventory.addItem(new InventoryUI.AbstractClickableItem(ItemUtil.createItem(kit.getIcon().getType(), ChatColor.GREEN + kit.getName(), 1, kit.getIcon().getDurability())) { + @Override + public void onClick(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + if (kit.getKitEditContents()[0] == null) { + player.sendMessage(ChatColor.RED + "This kit is not editable."); + player.closeInventory(); + return; + } + InventoryManager.this.plugin.getEditorManager().addEditor(player, kit); + InventoryManager.this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()).setPlayerState(PlayerState.EDITING); + } + }); + this.duelInventory.addItem(new InventoryUI.AbstractClickableItem(ItemUtil.createItem(kit.getIcon().getType(), ChatColor.GREEN + kit.getName(), 1, kit.getIcon().getDurability())) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleDuelClick((Player) event.getWhoClicked(), kit); + } + }); + this.partySplitInventory.addItem(new InventoryUI.AbstractClickableItem(ItemUtil.createItem(kit.getIcon().getType(), ChatColor.GREEN + kit.getName(), 1, kit.getIcon().getDurability())) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handlePartySplitClick((Player) event.getWhoClicked(), kit); + } + }); + this.partyFFAInventory.addItem(new InventoryUI.AbstractClickableItem(ItemUtil.createItem(kit.getIcon().getType(), ChatColor.GREEN + kit.getName(), 1, kit.getIcon().getDurability())) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleFFAClick((Player) event.getWhoClicked(), kit); + } + }); + } + } + this.partyEventInventory.setItem(3, new InventoryUI.AbstractClickableItem(ItemUtil.createItem(Material.FIREWORK_CHARGE, ChatColor.RED + "Split Fights")) { + @Override + public void onClick(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + player.closeInventory(); + player.openInventory(InventoryManager.this.getPartySplitInventory().getCurrentPage()); + } + }); + this.partyEventInventory.setItem(5, new InventoryUI.AbstractClickableItem(ItemUtil.createItem(Material.SLIME_BALL, ChatColor.AQUA + "Party FFA")) { + @Override + public void onClick(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + player.closeInventory(); + player.openInventory(InventoryManager.this.getPartyFFAInventory().getCurrentPage()); + } + }); + for (final Kit kit : this.plugin.getKitManager().getKits()) { + final InventoryUI duelInventory = new InventoryUI("Select Arena", true, 6); + final InventoryUI partySplitInventory = new InventoryUI("Select Arena", true, 6); + final InventoryUI partyFFAInventory = new InventoryUI("Select Arena", true, 6); + for (final Arena arena : this.plugin.getArenaManager().getArenas().values()) { + if (!arena.isEnabled()) { + continue; + } + if (kit.getExcludedArenas().contains(arena.getName())) { + continue; + } + if (kit.getArenaWhiteList().size() > 0 && !kit.getArenaWhiteList().contains(arena.getName())) { + continue; + } + final ItemStack book = ItemUtil.createItem(Material.PAPER, ChatColor.YELLOW + arena.getName()); + duelInventory.addItem(new InventoryUI.AbstractClickableItem(book) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleDuelMapClick((Player) event.getWhoClicked(), arena, kit); + } + }); + partySplitInventory.addItem(new InventoryUI.AbstractClickableItem(book) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handlePartySplitMapClick((Player) event.getWhoClicked(), arena, kit); + } + }); + partyFFAInventory.addItem(new InventoryUI.AbstractClickableItem(book) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handlePartyFFAMapClick((Player) event.getWhoClicked(), arena, kit); + } + }); + } + this.duelMapInventories.put(kit.getName(), duelInventory); + this.partySplitMapInventories.put(kit.getName(), partySplitInventory); + this.partyFFAMapInventories.put(kit.getName(), partyFFAInventory); + } + } + + private void updateInventories() { + for (int i = 0; i < 18; ++i) { + final InventoryUI.ClickableItem unrankedItem = this.unrankedInventory.getItem(i); + if (unrankedItem != null) { + unrankedItem.setItemStack(this.updateQueueLore(unrankedItem.getItemStack(), QueueType.UNRANKED)); + this.unrankedInventory.setItem(i, unrankedItem); + } + final InventoryUI.ClickableItem rankedItem = this.rankedInventory.getItem(i); + if (rankedItem != null) { + rankedItem.setItemStack(this.updateQueueLore(rankedItem.getItemStack(), QueueType.RANKED)); + this.rankedInventory.setItem(i, rankedItem); + } + } + } + + private ItemStack updateQueueLore(final ItemStack itemStack, final QueueType type) { + if (itemStack == null) { + return null; + } + if (itemStack.hasItemMeta() && itemStack.getItemMeta().hasDisplayName()) { + final String ladder = ChatColor.stripColor(itemStack.getItemMeta().getDisplayName()); + final int queueSize = this.plugin.getQueueManager().getQueueSize(ladder, type); + final int inGameSize = this.plugin.getMatchManager().getFighters(ladder, type); + return ItemUtil.reloreItem(itemStack, ChatColor.YELLOW + "In Queue: " + ChatColor.GREEN + queueSize, ChatColor.YELLOW + "In Game: " + ChatColor.GREEN + inGameSize); + } + return null; + } + + private void addToQueue(final Player player, final PlayerData playerData, final Kit kit, final Party party, final QueueType queueType) { + if (kit != null) { + if (party == null) { + this.plugin.getQueueManager().addPlayerToQueue(player, playerData, kit.getName(), queueType); + } else if (this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + this.plugin.getQueueManager().addPartyToQueue(player, party, kit.getName(), queueType); + } + } + } + + public void addSnapshot(final InventorySnapshot snapshot) { + this.snapshots.put(snapshot.getSnapshotId(), snapshot); + this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> this.removeSnapshot(snapshot.getSnapshotId()), 600L); + } + + public void removeSnapshot(final UUID snapshotId) { + final InventorySnapshot snapshot = this.snapshots.get(snapshotId); + if (snapshot != null) { + this.snapshots.remove(snapshotId); + } + } + + public InventorySnapshot getSnapshot(final UUID snapshotId) { + return this.snapshots.get(snapshotId); + } + + public void addParty(final Player player) { + final ItemStack skull = ItemUtil.createItem(Material.SKULL_ITEM, ChatColor.GOLD + player.getName() + " (" + ChatColor.GREEN + "1" + ChatColor.GOLD + ")"); + this.partyInventory.addItem(new InventoryUI.AbstractClickableItem(skull) { + @Override + public void onClick(final InventoryClickEvent inventoryClickEvent) { + player.closeInventory(); + if (inventoryClickEvent.getWhoClicked() instanceof Player) { + final Player sender = (Player) inventoryClickEvent.getWhoClicked(); + sender.performCommand("duel " + player.getName()); + } + } + }); + } + + public void updateParty(final Party party) { + final Player player = this.plugin.getServer().getPlayer(party.getLeader()); + for (int i = 0; i < this.partyInventory.getSize(); ++i) { + final InventoryUI.ClickableItem item = this.partyInventory.getItem(i); + if (item != null) { + final ItemStack stack = item.getItemStack(); + if (stack.getItemMeta().hasDisplayName() && stack.getItemMeta().getDisplayName().contains(player.getName())) { + final List lores = new ArrayList(); + party.members().forEach(member -> lores.add(ChatColor.RED + member.getName())); + ItemUtil.reloreItem(stack, (String[]) lores.toArray(new String[0])); + ItemUtil.renameItem(stack, ChatColor.GOLD + player.getName() + " (" + ChatColor.GREEN + party.getMembers().size() + ChatColor.GOLD + ")"); + item.setItemStack(stack); + break; + } + } + } + } + + public void removeParty(final Party party) { + final Player player = this.plugin.getServer().getPlayer(party.getLeader()); + for (int i = 0; i < this.partyInventory.getSize(); ++i) { + final InventoryUI.ClickableItem item = this.partyInventory.getItem(i); + if (item != null) { + final ItemStack stack = item.getItemStack(); + if (stack.getItemMeta().hasDisplayName() && stack.getItemMeta().getDisplayName().contains(player.getName())) { + this.partyInventory.removeItem(i); + break; + } + } + } + } + + public void addEditingKitInventory(final Player player, final Kit kit) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Map kitMap = playerData.getPlayerKits(kit.getName()); + final InventoryUI inventory = new InventoryUI("Managing Kit Layout", true, 4); + for (int i = 1; i <= 7; ++i) { + final ItemStack save = ItemUtil.createItem(Material.CHEST, ChatColor.YELLOW + "Save Kit " + ChatColor.GREEN + kit.getName() + " #" + i); + final ItemStack load = ItemUtil.createItem(Material.BOOK, ChatColor.YELLOW + "Load Kit " + ChatColor.GREEN + kit.getName() + " #" + i); + final ItemStack rename = ItemUtil.createItem(Material.NAME_TAG, ChatColor.YELLOW + "Rename Kit " + ChatColor.GREEN + kit.getName() + " #" + i); + final ItemStack delete = ItemUtil.createItem(Material.FLINT, ChatColor.YELLOW + "Delete Kit " + ChatColor.GREEN + kit.getName() + " #" + i); + inventory.setItem(i, new InventoryUI.AbstractClickableItem(save) { + @Override + public void onClick(final InventoryClickEvent event) { + final int kitIndex = event.getSlot(); + InventoryManager.this.handleSavingKit(player, playerData, kit, kitMap, kitIndex); + inventory.setItem(kitIndex + 1, 2, new InventoryUI.AbstractClickableItem(load) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleLoadKit(player, kitIndex, kitMap); + } + }); + inventory.setItem(kitIndex + 1, 3, new InventoryUI.AbstractClickableItem(rename) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleRenamingKit(player, kitIndex, kitMap); + } + }); + inventory.setItem(kitIndex + 1, 4, new InventoryUI.AbstractClickableItem(delete) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleDeleteKit(player, kitIndex, kitMap, inventory); + } + }); + } + }); + final int kitIndex = i; + if (kitMap != null && kitMap.containsKey(kitIndex)) { + inventory.setItem(kitIndex + 1, 2, new InventoryUI.AbstractClickableItem(load) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleLoadKit(player, kitIndex, kitMap); + } + }); + inventory.setItem(kitIndex + 1, 3, new InventoryUI.AbstractClickableItem(rename) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleRenamingKit(player, kitIndex, kitMap); + } + }); + inventory.setItem(kitIndex + 1, 4, new InventoryUI.AbstractClickableItem(delete) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryManager.this.handleDeleteKit(player, kitIndex, kitMap, inventory); + } + }); + } + } + this.editorInventories.put(player.getUniqueId(), inventory); + } + + public void removeEditingKitInventory(final UUID uuid) { + final InventoryUI inventoryUI = this.editorInventories.get(uuid); + if (inventoryUI != null) { + this.editorInventories.remove(uuid); + } + } + + public InventoryUI getEditingKitInventory(final UUID uuid) { + return this.editorInventories.get(uuid); + } + + private void handleSavingKit(final Player player, final PlayerData playerData, final Kit kit, final Map kitMap, final int kitIndex) { + if (kitMap != null && kitMap.containsKey(kitIndex)) { + kitMap.get(kitIndex).setContents(player.getInventory().getContents().clone()); + player.sendMessage(ChatColor.GREEN + "Successfully saved kit #" + ChatColor.RED + kitIndex + ChatColor.RED + "."); + return; + } + final PlayerKit playerKit = new PlayerKit(kit.getName(), kitIndex, player.getInventory().getContents().clone(), kit.getName() + " Kit " + kitIndex); + playerData.addPlayerKit(kitIndex, playerKit); + player.sendMessage(ChatColor.GREEN + "Successfully saved kit #" + ChatColor.RED + kitIndex + ChatColor.RED + "."); + } + + private void handleLoadKit(final Player player, final int kitIndex, final Map kitMap) { + if (kitMap != null && kitMap.containsKey(kitIndex)) { + final ItemStack[] contents2; + final ItemStack[] contents = contents2 = kitMap.get(kitIndex).getContents(); + for (final ItemStack itemStack : contents2) { + if (itemStack != null && itemStack.getAmount() <= 0) { + itemStack.setAmount(1); + } + } + player.getInventory().setContents(contents); + player.updateInventory(); + } + } + + private void handleRenamingKit(final Player player, final int kitIndex, final Map kitMap) { + if (kitMap != null && kitMap.containsKey(kitIndex)) { + this.plugin.getEditorManager().addRenamingKit(player.getUniqueId(), kitMap.get(kitIndex)); + player.closeInventory(); + player.sendMessage(ChatColor.GREEN + "Enter the name you want this kit to be (You can enter chat colors)."); + } + } + + private void handleDeleteKit(final Player player, final int kitIndex, final Map kitMap, final InventoryUI inventory) { + if (kitMap != null && kitMap.containsKey(kitIndex)) { + this.plugin.getEditorManager().removeRenamingKit(player.getUniqueId()); + kitMap.remove(kitIndex); + player.sendMessage(ChatColor.GREEN + "Successfully removed kit " + ChatColor.RED + kitIndex + ChatColor.RED + "."); + inventory.setItem(kitIndex + 1, 2, null); + inventory.setItem(kitIndex + 1, 3, null); + inventory.setItem(kitIndex + 1, 4, null); + } + } + + private void handleDuelClick(final Player player, final Kit kit) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Player selected = this.plugin.getServer().getPlayer(playerData.getDuelSelecting()); + if (selected == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, playerData.getDuelSelecting())); + return; + } + final PlayerData targetData = this.plugin.getPlayerManager().getPlayerData(selected.getUniqueId()); + if (targetData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "That player is currently busy."); + return; + } + final Party targetParty = this.plugin.getPartyManager().getParty(selected.getUniqueId()); + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + final boolean partyDuel = party != null; + if (partyDuel && targetParty == null) { + player.sendMessage(ChatColor.RED + "That player is not in a party."); + return; + } + player.closeInventory(); + player.openInventory(this.duelMapInventories.get(kit.getName()).getCurrentPage()); + } + + private void handlePartySplitClick(final Player player, final Kit kit) { + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party == null || kit == null || !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + return; + } + player.closeInventory(); + if (party.getMembers().size() < 2) { + player.sendMessage(InventoryManager.MORE_PLAYERS); + } else { + player.closeInventory(); + player.openInventory(this.partySplitMapInventories.get(kit.getName()).getCurrentPage()); + } + } + + private void handleFFAClick(final Player player, final Kit kit) { + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party == null || kit == null || !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + return; + } + player.closeInventory(); + if (party.getMembers().size() < 2) { + player.sendMessage(InventoryManager.MORE_PLAYERS); + } else { + player.closeInventory(); + player.openInventory(this.partyFFAMapInventories.get(kit.getName()).getCurrentPage()); + } + } + + private void handleRedroverClick(final Player player, final Kit kit) { + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party == null || kit == null || !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + return; + } + player.closeInventory(); + if (party.getMembers().size() < 4) { + player.sendMessage(ChatColor.RED + "There must be at least 4 players in your party to do this."); + } else { + final Arena arena = this.plugin.getArenaManager().getRandomArena(kit); + if (arena == null) { + player.sendMessage(ChatColor.RED + "There are no arenas available at this moment."); + return; + } + this.createRedroverMatch(party, arena, kit); + } + } + + private void handleDuelMapClick(final Player player, final Arena arena, final Kit kit) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Player selected = this.plugin.getServer().getPlayer(playerData.getDuelSelecting()); + if (selected == null) { + player.sendMessage(String.format(StringUtil.PLAYER_NOT_FOUND, playerData.getDuelSelecting())); + return; + } + final PlayerData targetData = this.plugin.getPlayerManager().getPlayerData(selected.getUniqueId()); + if (targetData.getPlayerState() != PlayerState.SPAWN) { + player.sendMessage(ChatColor.RED + "That player is currently busy."); + return; + } + final Party targetParty = this.plugin.getPartyManager().getParty(selected.getUniqueId()); + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + final boolean partyDuel = party != null; + if (partyDuel && targetParty == null) { + player.sendMessage(ChatColor.RED + "That player is not in a party."); + return; + } + if (this.plugin.getMatchManager().getMatchRequest(player.getUniqueId(), selected.getUniqueId()) != null) { + player.sendMessage(ChatColor.RED + "You have already sent a duel request to this player, please wait."); + return; + } + this.sendDuel(player, selected, kit, partyDuel, party, targetParty, arena); + } + + private void handleRedroverMapClick(final Player player, final Arena arena, final Kit kit) { + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party == null || !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + return; + } + player.closeInventory(); + if (party.getMembers().size() < 4) { + player.sendMessage(InventoryManager.MORE_PLAYERS); + } else { + this.createRedroverMatch(party, arena, kit); + } + } + + private void handlePartyFFAMapClick(final Player player, final Arena arena, final Kit kit) { + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party == null || !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + return; + } + player.closeInventory(); + if (party.getMembers().size() < 2) { + player.sendMessage(InventoryManager.MORE_PLAYERS); + } else { + this.createFFAMatch(party, arena, kit); + } + } + + private void handlePartySplitMapClick(final Player player, final Arena arena, final Kit kit) { + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party == null || !this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + return; + } + player.closeInventory(); + if (party.getMembers().size() < 2) { + player.sendMessage(InventoryManager.MORE_PLAYERS); + } else { + this.createPartySplitMatch(party, arena, kit); + } + } + + private void sendDuel(final Player player, final Player selected, final Kit kit, final boolean partyDuel, final Party party, final Party targetParty, final Arena arena) { + this.plugin.getMatchManager().createMatchRequest(player, selected, arena, kit.getName(), partyDuel); + player.closeInventory(); + final String requestGetString = player.getName() + (partyDuel ? (ChatColor.YELLOW + "'s party " + ChatColor.GREEN + "(" + party.getMembers().size() + ")") : "") + ChatColor.YELLOW + " has requested a duel with the kit " + ChatColor.DARK_GREEN + kit.getName() + ChatColor.YELLOW + ". " + ChatColor.GRAY + "[Click to Accept]"; + final String requestSendString = ChatColor.YELLOW + "Sent a duel request to " + ChatColor.GREEN + selected.getName() + (partyDuel ? (ChatColor.YELLOW + "'s party " + ChatColor.GREEN + "(" + party.getMembers().size() + ")") : "") + ChatColor.YELLOW + " with the kit " + ChatColor.DARK_GREEN + kit.getName() + ChatColor.YELLOW + "."; + final Clickable requestMessage = new Clickable(requestGetString, ChatColor.GRAY + "Click to accept duel", "/accept " + player.getName() + " " + kit.getName()); + if (partyDuel) { + targetParty.members().forEach(requestMessage::sendToPlayer); + party.broadcast(requestSendString); + } else { + requestMessage.sendToPlayer(selected); + player.sendMessage(requestSendString); + } + } + + private void createPartySplitMatch(final Party party, final Arena arena, final Kit kit) { + final MatchTeam[] teams = party.split(); + final Match match = new Match(arena, kit, QueueType.UNRANKED, teams); + final Player leaderA = this.plugin.getServer().getPlayer(teams[0].getLeader()); + final Player leaderB = this.plugin.getServer().getPlayer(teams[1].getLeader()); + match.broadcast(ChatColor.YELLOW + "Starting a Split Party match with kit " + ChatColor.GREEN + kit.getName() + "."); + this.plugin.getMatchManager().createMatch(match); + } + + private void createFFAMatch(final Party party, final Arena arena, final Kit kit) { + final MatchTeam team = new MatchTeam(party.getLeader(), Lists.newArrayList((Iterable) party.getMembers()), 0); + final Match match = new Match(arena, kit, QueueType.UNRANKED, team); + match.broadcast(ChatColor.YELLOW + "Starting a Party FFA match with kit " + ChatColor.GREEN + kit.getName() + "."); + this.plugin.getMatchManager().createMatch(match); + } + + private void createRedroverMatch(final Party party, final Arena arena, final Kit kit) { + final MatchTeam[] teams = party.split(); + final Match match = new Match(arena, kit, QueueType.UNRANKED, true, teams); + final Player leaderA = this.plugin.getServer().getPlayer(teams[0].getLeader()); + final Player leaderB = this.plugin.getServer().getPlayer(teams[1].getLeader()); + match.broadcast(ChatColor.YELLOW + "Starting a Redrover match with kit " + ChatColor.GREEN + kit.getName() + "."); + this.plugin.getMatchManager().createMatch(match); + } + + public InventoryUI getUnrankedInventory() { + return this.unrankedInventory; + } + + public InventoryUI getRankedInventory() { + return this.rankedInventory; + } + + public InventoryUI getEditorInventory() { + return this.editorInventory; + } + + public InventoryUI getDuelInventory() { + return this.duelInventory; + } + + public InventoryUI getPartySplitInventory() { + return this.partySplitInventory; + } + + public InventoryUI getPartyFFAInventory() { + return this.partyFFAInventory; + } + + public InventoryUI getPartyEventInventory() { + return this.partyEventInventory; + } + + public InventoryUI getPartyInventory() { + return this.partyInventory; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/ItemManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/ItemManager.java new file mode 100644 index 0000000..943d20a --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/ItemManager.java @@ -0,0 +1,71 @@ +package me.devkevin.practice.managers; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.util.ItemUtil; + +public class ItemManager +{ + private final ItemStack[] spawnItems; + private final ItemStack[] queueItems; + private final ItemStack[] partyItems; + private final ItemStack[] tournamentItems; + private final ItemStack[] eventItems; + private final ItemStack[] specItems; + private final ItemStack[] partySpecItems; + private final ItemStack defaultBook; + + public ItemManager() + { + this.spawnItems = new ItemStack[] { ItemUtil.createItem(Material.BOOK, ChatColor.RED + "Edit Kit"), ItemUtil.createItem (Material.EMERALD, ChatColor.GREEN + "View LeaderBoards"), null, null, ItemUtil.createItem(Material.NAME_TAG, ChatColor.YELLOW + "Create a party"), null, null, ItemUtil.createItem(Material.IRON_SWORD, ChatColor.BLUE + "Unranked Queue"), ItemUtil.createItem(Material.DIAMOND_SWORD, ChatColor.GREEN + "Ranked Queue") }; + this.queueItems = new ItemStack[] { null, null, null, null, null, null, null, null, ItemUtil.createItem(Material.REDSTONE, ChatColor.RED.toString() + "Leave Queue") }; + this.specItems = new ItemStack[] { null, null, null, null, ItemUtil.createItem(Material.NETHER_STAR, ChatColor.RED.toString() + "Leave Spectator Mode"), null, null, null, null }; + this.partySpecItems = new ItemStack[] { null, null, null, null, null, null, null, null, ItemUtil.createItem(Material.NETHER_STAR, ChatColor.RED.toString() + "Leave Party") }; + this.tournamentItems = new ItemStack[] { null, null, null, null, null, null, null, null, ItemUtil.createItem(Material.NETHER_STAR, ChatColor.RED.toString() + "Leave Tournament") }; + this.eventItems = new ItemStack[] { null, null, null, null, null, null, null, null, ItemUtil.createItem(Material.NETHER_STAR, ChatColor.RED.toString() + "Leave Event") }; + this.partyItems = new ItemStack[] { ItemUtil.createItem(Material.IRON_SWORD, ChatColor.GREEN.toString() + "Join 2v2 Unranked Queue"), ItemUtil.createItem(Material.DIAMOND_SWORD, ChatColor.YELLOW.toString() + "Join 2v2 Ranked Queue"), null, ItemUtil.createItem(Material.GOLD_AXE, ChatColor.AQUA.toString() + "Start Party Events"), ItemUtil.createItem(Material.DIAMOND_AXE, ChatColor.DARK_AQUA.toString() + "Fight Other Party"), null, ItemUtil.createItem(Material.SKULL_ITEM, ChatColor.AQUA.toString() + "View Party Members"), ItemUtil.createItem(Material.BOOK, ChatColor.GOLD.toString() + "Edit Kits"), ItemUtil.createItem(Material.NETHER_STAR, ChatColor.RED.toString() + "Leave Party") }; + this.defaultBook = ItemUtil.createItem(Material.ENCHANTED_BOOK, ChatColor.YELLOW.toString() + "Default Kit"); + } + + public ItemStack[] getSpawnItems() + { + return this.spawnItems; + } + + public ItemStack[] getQueueItems() + { + return this.queueItems; + } + + public ItemStack[] getPartyItems() + { + return this.partyItems; + } + + public ItemStack[] getTournamentItems() + { + return this.tournamentItems; + } + + public ItemStack[] getEventItems() + { + return this.eventItems; + } + + public ItemStack[] getSpecItems() + { + return this.specItems; + } + + public ItemStack[] getPartySpecItems() + { + return this.partySpecItems; + } + + public ItemStack getDefaultBook() + { + return this.defaultBook; + } +} + diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/KitManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/KitManager.java new file mode 100644 index 0000000..f8331a2 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/KitManager.java @@ -0,0 +1,94 @@ +package me.devkevin.practice.managers; + +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.Practice; +import me.devkevin.practice.file.Config; +import me.devkevin.practice.kit.Kit; + +import java.util.*; + +public class KitManager { + private final Practice plugin; + private final Map kits; + private final List rankedKits; + private final Config config; + + public KitManager() { + this.plugin = Practice.getInstance(); + this.kits = new HashMap<>(); + this.rankedKits = new ArrayList<>(); + this.config = new Config("kits", this.plugin); + this.loadKits(); + this.kits.entrySet().stream().filter(kit -> kit.getValue().isEnabled()).filter(kit -> kit.getValue().isRanked()).forEach(kit -> this.rankedKits.add(kit.getKey())); + } + + private void loadKits() { + FileConfiguration fileConfig = this.config.getConfig(); + ConfigurationSection kitSection = fileConfig.getConfigurationSection("kits"); + if(kitSection != null) { + kitSection.getKeys(false).forEach((name) -> { + ItemStack[] contents = (ItemStack[])((List)kitSection.get(name + ".contents")).toArray(new ItemStack[0]); + ItemStack[] armor = (ItemStack[])((List)kitSection.get(name + ".armor")).toArray(new ItemStack[0]); + ItemStack[] kitEditContents = (ItemStack[])((List)kitSection.get(name + ".kitEditContents")).toArray(new ItemStack[0]); + List excludedArenas = kitSection.getStringList(name + ".excludedArenas"); + List arenaWhiteList = kitSection.getStringList(name + ".arenaWhitelist"); + ItemStack icon = (ItemStack)kitSection.get(name + ".icon"); + boolean enabled = kitSection.getBoolean(name + ".enabled"); + boolean ranked = kitSection.getBoolean(name + ".ranked"); + boolean combo = kitSection.getBoolean(name + ".combo"); + boolean sumo = kitSection.getBoolean(name + ".sumo"); + boolean build = kitSection.getBoolean(name + ".build"); + boolean spleef = kitSection.getBoolean(name + ".spleef"); + boolean parkour = kitSection.getBoolean(name + ".parkour"); + Kit kit = new Kit(name, contents, armor, kitEditContents, icon, excludedArenas, arenaWhiteList, enabled, ranked, combo, sumo, build, spleef, parkour); + this.kits.put(name, kit); + }); + } + } + + public void saveKits() { + FileConfiguration fileConfig = this.config.getConfig(); + fileConfig.set("kits", null); + this.kits.forEach((kitName, kit) -> { + if(kit.getIcon() != null && kit.getContents() != null && kit.getArmor() != null) { + fileConfig.set("kits." + kitName + ".contents", kit.getContents()); + fileConfig.set("kits." + kitName + ".armor", kit.getArmor()); + fileConfig.set("kits." + kitName + ".kitEditContents", kit.getKitEditContents()); + fileConfig.set("kits." + kitName + ".icon", kit.getIcon()); + fileConfig.set("kits." + kitName + ".excludedArenas", kit.getExcludedArenas()); + fileConfig.set("kits." + kitName + ".arenaWhitelist", kit.getArenaWhiteList()); + fileConfig.set("kits." + kitName + ".enabled", kit.isEnabled()); + fileConfig.set("kits." + kitName + ".ranked", kit.isRanked()); + fileConfig.set("kits." + kitName + ".combo", kit.isCombo()); + fileConfig.set("kits." + kitName + ".sumo", kit.isSumo()); + fileConfig.set("kits." + kitName + ".build", kit.isBuild()); + fileConfig.set("kits." + kitName + ".spleef", kit.isSpleef()); + fileConfig.set("kits." + kitName + ".parkour", kit.isParkour()); + } + + }); + this.config.save(); + } + + public void deleteKit(final String name) { + this.kits.remove(name); + } + + public void createKit(final String name) { + this.kits.put(name, new Kit(name)); + } + + public Collection getKits() { + return this.kits.values(); + } + + public Kit getKit(final String name) { + return this.kits.get(name); + } + + public List getRankedKits() { + return this.rankedKits; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/MatchManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/MatchManager.java new file mode 100644 index 0000000..c286996 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/MatchManager.java @@ -0,0 +1,379 @@ +package me.devkevin.practice.managers; + +import net.minecraft.server.v1_8_R3.EntityPlayer; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.event.match.MatchEndEvent; +import me.devkevin.practice.event.match.MatchStartEvent; +import me.devkevin.practice.handler.CustomMovementHandler; +import me.devkevin.practice.inventory.InventorySnapshot; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.kit.PlayerKit; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchRequest; +import me.devkevin.practice.match.MatchState; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.queue.QueueType; +import me.devkevin.practice.runnable.RematchRunnable; +import me.devkevin.practice.util.ItemUtil; +import me.devkevin.practice.util.PlayerUtil; +import me.devkevin.practice.util.TtlHashMap; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +public class MatchManager { + private final Map> matchRequests; + private final Map rematchUUIDs; + private final Map rematchInventories; + private final Map spectators; + private final Map matches; + private final Practice plugin; + + public MatchManager() { + this.matchRequests = new TtlHashMap>(TimeUnit.SECONDS, 30L); + this.rematchUUIDs = new TtlHashMap(TimeUnit.SECONDS, 30L); + this.rematchInventories = new TtlHashMap(TimeUnit.SECONDS, 30L); + this.spectators = new ConcurrentHashMap(); + this.matches = new ConcurrentHashMap(); + this.plugin = Practice.getInstance(); + } + + public int getFighters() { + int i = 0; + for (final Match match : this.matches.values()) { + for (final MatchTeam matchTeam : match.getTeams()) { + i += matchTeam.getAlivePlayers().size(); + } + } + return i; + } + + public int getFighters(final String ladder, final QueueType type) { + return (int) this.matches.entrySet().stream().filter(match -> match.getValue().getType() == type).filter(match -> match.getValue().getKit().getName().equals(ladder)).count(); + } + + public void createMatchRequest(final Player requester, final Player requested, final Arena arena, final String kitName, final boolean party) { + final MatchRequest request = new MatchRequest(requester.getUniqueId(), requested.getUniqueId(), arena, kitName, party); + this.matchRequests.computeIfAbsent(requested.getUniqueId(), k -> new HashSet()).add(request); + } + + public MatchRequest getMatchRequest(final UUID requester, final UUID requested) { + final Set requests = this.matchRequests.get(requested); + if (requests == null) { + return null; + } + return requests.stream().filter(req -> req.getRequester().equals(requester)).findAny().orElse(null); + } + + public MatchRequest getMatchRequest(final UUID requester, final UUID requested, final String kitName) { + final Set requests = this.matchRequests.get(requested); + if (requests == null) { + return null; + } + return requests.stream().filter(req -> req.getRequester().equals(requester) && req.getKitName().equals(kitName)).findAny().orElse(null); + } + + public Match getMatch(final PlayerData playerData) { + return this.matches.get(playerData.getCurrentMatchID()); + } + + public Match getMatch(final UUID uuid) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(uuid); + return this.getMatch(playerData); + } + + public Match getMatchFromUUID(final UUID uuid) { + return this.matches.get(uuid); + } + + public Match getSpectatingMatch(final UUID uuid) { + return this.matches.get(this.spectators.get(uuid)); + } + + public void removeMatchRequests(final UUID uuid) { + this.matchRequests.remove(uuid); + } + + public void createMatch(final Match match) { + this.matches.put(match.getMatchId(), match); + this.plugin.getServer().getPluginManager().callEvent(new MatchStartEvent(match)); + } + + public void removeFighter(final Player player, final PlayerData playerData, final boolean spectateDeath) { + final Match match = this.matches.get(playerData.getCurrentMatchID()); + final Player killer = player.getKiller(); + final MatchTeam entityTeam = match.getTeams().get(playerData.getTeamID()); + final MatchTeam winningTeam = match.isFFA() ? entityTeam : match.getTeams().get((entityTeam.getTeamID() == 0) ? 1 : 0); + if (match.getMatchState() == MatchState.ENDING) { + return; + } + if (match.isRedrover()) { + if (match.getMatchState() != MatchState.SWITCHING) { + match.setMatchState(MatchState.SWITCHING); + match.setCountdown(4); + } + } else { + match.addSnapshot(player); + } + entityTeam.killPlayer(player.getUniqueId()); + final int remaining = entityTeam.getAlivePlayers().size(); + if (remaining != 0) { + final Set items = new HashSet(); + for (final ItemStack item : player.getInventory().getContents()) { + if (item != null && item.getType() != Material.AIR) { + items.add(player.getWorld().dropItemNaturally(player.getLocation(), item, player)); + } + } + for (final ItemStack item : player.getInventory().getArmorContents()) { + if (item != null && item.getType() != Material.AIR) { + items.add(player.getWorld().dropItemNaturally(player.getLocation(), item, player)); + } + } + this.plugin.getMatchManager().addDroppedItems(match, items); + } + if (spectateDeath) { + this.addDeathSpectator(player, playerData, match); + } + if ((match.isFFA() && remaining == 1) || remaining == 0) { + this.plugin.getServer().getPluginManager().callEvent(new MatchEndEvent(match, winningTeam, entityTeam)); + } + } + + public void removeMatch(final Match match) { + this.matches.remove(match.getMatchId()); + CustomMovementHandler.getParkourCheckpoints().remove(match); + } + + public void giveKits(final Player player, final Kit kit) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + final Collection playerKits = playerData.getPlayerKits(kit.getName()).values(); + if (playerKits.size() == 0) { + kit.applyToPlayer(player); + } else { + player.getInventory().setItem(8, this.plugin.getItemManager().getDefaultBook()); + int slot = -1; + for (final PlayerKit playerKit : playerKits) { + player.getInventory().setItem(++slot, ItemUtil.createItem(Material.ENCHANTED_BOOK, ChatColor.YELLOW.toString() + playerKit.getDisplayName())); + } + player.updateInventory(); + } + } + + private void addDeathSpectator(final Player player, final PlayerData playerData, final Match match) { + this.spectators.put(player.getUniqueId(), match.getMatchId()); + playerData.setPlayerState(PlayerState.SPECTATING); + PlayerUtil.clearPlayer(player); + final CraftPlayer playerCp = (CraftPlayer) player; + final EntityPlayer playerEp = playerCp.getHandle(); + playerEp.getDataWatcher().watch(6, 0.0f); + playerEp.setFakingDeath(true); + match.addSpectator(player.getUniqueId()); + match.addRunnable(this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, () -> { + match.getTeams().forEach(team -> team.alivePlayers().forEach(member -> member.hidePlayer(player))); + match.spectatorPlayers().forEach(member -> member.hidePlayer(player)); + player.getActivePotionEffects().stream().map(PotionEffect::getType).forEach(player::removePotionEffect); + player.setWalkSpeed(0.2f); + player.setAllowFlight(true); + return; + }, 20L)); + if (match.isRedrover()) { + for (final MatchTeam team2 : match.getTeams()) { + for (final UUID alivePlayerUUID : team2.getAlivePlayers()) { + final Player alivePlayer = this.plugin.getServer().getPlayer(alivePlayerUUID); + if (alivePlayer != null) { + player.showPlayer(alivePlayer); + } + } + } + } + player.setWalkSpeed(0.0f); + player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 10000, -5)); + if (match.isParty() || match.isFFA()) { + this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> player.getInventory().setContents(this.plugin.getItemManager().getPartySpecItems()), 1L); + } + player.updateInventory(); + } + + public void addRedroverSpectator(final Player player, final Match match) { + this.spectators.put(player.getUniqueId(), match.getMatchId()); + player.setAllowFlight(true); + player.setFlying(true); + player.getInventory().setContents(this.plugin.getItemManager().getPartySpecItems()); + player.updateInventory(); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + playerData.setPlayerState(PlayerState.SPECTATING); + } + + public void addSpectator(final Player player, final PlayerData playerData, final Player target, final Match targetMatch) { + this.spectators.put(player.getUniqueId(), targetMatch.getMatchId()); + if (targetMatch.getMatchState() != MatchState.ENDING && !targetMatch.haveSpectated(player.getUniqueId())) { + final String spectatorMessage = ChatColor.GREEN + player.getName() + ChatColor.GRAY + " is spectating your match."; + if (!player.hasPermission("practice.staff")) { + targetMatch.broadcast(spectatorMessage); + } + } + targetMatch.addSpectator(player.getUniqueId()); + playerData.setPlayerState(PlayerState.SPECTATING); + player.teleport(target); + player.setAllowFlight(true); + player.setFlying(true); + player.getInventory().setContents(this.plugin.getItemManager().getSpecItems()); + player.updateInventory(); + this.plugin.getServer().getOnlinePlayers().forEach(online -> { + online.hidePlayer(player); + player.hidePlayer(online); + return; + }); + targetMatch.getTeams().forEach(team -> team.alivePlayers().forEach(player::showPlayer)); + } + + public void addDroppedItem(final Match match, final Item item) { + match.addEntityToRemove(item); + match.addRunnable(this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> { + match.removeEntityToRemove(item); + item.remove(); + }, 100L).getTaskId()); + } + + public void addDroppedItems(final Match match, final Set items) { + for (Item item : items) { + match.addEntityToRemove(item); + } + match.addRunnable(this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> { + for (Item item : items) { + match.removeEntityToRemove(item); + item.remove(); + } + } + , 100L).getTaskId()); + } + + public void removeSpectator(final Player player) { + final Match match = this.matches.get(this.spectators.get(player.getUniqueId())); + match.removeSpectator(player.getUniqueId()); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (match.getTeams().size() > playerData.getTeamID() && playerData.getTeamID() >= 0) { + final MatchTeam entityTeam = match.getTeams().get(playerData.getTeamID()); + if (entityTeam != null) { + entityTeam.killPlayer(player.getUniqueId()); + } + } + if (match.getMatchState() != MatchState.ENDING && !match.haveSpectated(player.getUniqueId())) { + match.addHaveSpectated(player.getUniqueId()); + } + this.spectators.remove(player.getUniqueId()); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + } + + public void pickPlayer(final Match match) { + final Player playerA = this.plugin.getServer().getPlayer(match.getTeams().get(0).getAlivePlayers().get(0)); + final PlayerData playerDataA = this.plugin.getPlayerManager().getPlayerData(playerA.getUniqueId()); + if (playerDataA.getPlayerState() != PlayerState.FIGHTING) { + playerA.teleport(match.getArena().getA().toBukkitLocation()); + PlayerUtil.clearPlayer(playerA); + if (match.getKit().isCombo()) { + playerA.setMaximumNoDamageTicks(3); + } + this.plugin.getMatchManager().giveKits(playerA, match.getKit()); + playerDataA.setPlayerState(PlayerState.FIGHTING); + } + final Player playerB = this.plugin.getServer().getPlayer(match.getTeams().get(1).getAlivePlayers().get(0)); + final PlayerData playerDataB = this.plugin.getPlayerManager().getPlayerData(playerB.getUniqueId()); + if (playerDataB.getPlayerState() != PlayerState.FIGHTING) { + playerB.teleport(match.getArena().getB().toBukkitLocation()); + PlayerUtil.clearPlayer(playerB); + if (match.getKit().isCombo()) { + playerB.setMaximumNoDamageTicks(3); + } + this.plugin.getMatchManager().giveKits(playerB, match.getKit()); + playerDataB.setPlayerState(PlayerState.FIGHTING); + } + for (final MatchTeam team : match.getTeams()) { + for (final UUID uuid : team.getAlivePlayers()) { + final Player player = this.plugin.getServer().getPlayer(uuid); + if (player != null && !playerA.equals(player) && !playerB.equals(player)) { + playerA.hidePlayer(player); + playerB.hidePlayer(player); + } + } + } + playerA.showPlayer(playerB); + playerB.showPlayer(playerA); + match.broadcast(ChatColor.YELLOW + "Starting duel match. " + ChatColor.GREEN + "(" + playerA.getName() + " vs " + playerB.getName() + ")"); + } + + public void saveRematches(final Match match) { + if (match.isParty() || match.isFFA()) { + return; + } + final UUID playerOne = match.getTeams().get(0).getLeader(); + final UUID playerTwo = match.getTeams().get(1).getLeader(); + final PlayerData dataOne = this.plugin.getPlayerManager().getPlayerData(playerOne); + final PlayerData dataTwo = this.plugin.getPlayerManager().getPlayerData(playerTwo); + if (dataOne != null) { + this.rematchUUIDs.put(playerOne, playerTwo); + final InventorySnapshot snapshot = match.getSnapshot(playerTwo); + if (snapshot != null) { + this.rematchInventories.put(playerOne, snapshot.getSnapshotId()); + } + if (dataOne.getRematchID() > -1) { + this.plugin.getServer().getScheduler().cancelTask(dataOne.getRematchID()); + } + dataOne.setRematchID(this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new RematchRunnable(playerOne), 600L)); + } + if (dataTwo != null) { + this.rematchUUIDs.put(playerTwo, playerOne); + final InventorySnapshot snapshot = match.getSnapshot(playerOne); + if (snapshot != null) { + this.rematchInventories.put(playerTwo, snapshot.getSnapshotId()); + } + if (dataTwo.getRematchID() > -1) { + this.plugin.getServer().getScheduler().cancelTask(dataTwo.getRematchID()); + } + dataTwo.setRematchID(this.plugin.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new RematchRunnable(playerTwo), 600L)); + } + } + + public void removeRematch(final UUID uuid) { + this.rematchUUIDs.remove(uuid); + this.rematchInventories.remove(uuid); + } + + public List getOpponents(final Match match, final Player player) { + for (final MatchTeam team : match.getTeams()) { + if (team.getPlayers().contains(player.getUniqueId())) { + continue; + } + return team.getPlayers(); + } + return null; + } + + public UUID getRematcher(final UUID uuid) { + return this.rematchUUIDs.get(uuid); + } + + public UUID getRematcherInventory(final UUID uuid) { + return this.rematchInventories.get(uuid); + } + + public boolean isRematching(final UUID uuid) { + return this.rematchUUIDs.containsKey(uuid); + } + + public Map getMatches() { + return this.matches; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/PartyManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/PartyManager.java new file mode 100644 index 0000000..2e1e9c0 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/PartyManager.java @@ -0,0 +1,125 @@ +package me.devkevin.practice.managers; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.TtlHashMap; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class PartyManager { + private final Practice plugin; + private Map> partyInvites; + private Map parties; + private Map partyLeaders; + + public PartyManager() { + this.plugin = Practice.getInstance(); + this.partyInvites = new TtlHashMap>(TimeUnit.SECONDS, 15L); + this.parties = new HashMap(); + this.partyLeaders = new HashMap(); + } + + public boolean isLeader(final UUID uuid) { + return this.parties.containsKey(uuid); + } + + public void removePartyInvites(final UUID uuid) { + this.partyInvites.remove(uuid); + } + + public boolean hasPartyInvite(final UUID player, final UUID other) { + return this.partyInvites.get(player) != null && this.partyInvites.get(player).contains(other); + } + + public void createPartyInvite(final UUID requester, final UUID requested) { + this.partyInvites.computeIfAbsent(requested, k -> new ArrayList()).add(requester); + } + + public boolean isInParty(final UUID player, final Party party) { + final Party targetParty = this.getParty(player); + return targetParty != null && targetParty.getLeader() == party.getLeader(); + } + + public Party getParty(final UUID player) { + if (this.parties.containsKey(player)) { + return this.parties.get(player); + } + if (this.partyLeaders.containsKey(player)) { + final UUID leader = this.partyLeaders.get(player); + return this.parties.get(leader); + } + return null; + } + + public void createParty(final Player player) { + final Party party = new Party(player.getUniqueId()); + this.parties.put(player.getUniqueId(), party); + this.plugin.getInventoryManager().addParty(player); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + player.sendMessage(ChatColor.YELLOW + "You have created a party."); + } + + private void disbandParty(final Party party, final boolean tournament) { + this.plugin.getInventoryManager().removeParty(party); + this.parties.remove(party.getLeader()); + party.broadcast(ChatColor.YELLOW + "Your party has been disbanded."); + party.members().forEach(member -> { + PlayerData memberData = this.plugin.getPlayerManager().getPlayerData(member.getUniqueId()); + if (this.partyLeaders.get(memberData.getUniqueId()) != null) { + this.partyLeaders.remove(memberData.getUniqueId()); + } + if (memberData.getPlayerState() == PlayerState.SPAWN) { + this.plugin.getPlayerManager().sendToSpawnAndReset(member); + } + }); + } + + public void leaveParty(final Player player) { + final Party party = this.getParty(player.getUniqueId()); + if (party == null) { + return; + } + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (this.parties.containsKey(player.getUniqueId())) { + this.disbandParty(party, false); + } else if (this.plugin.getTournamentManager().getTournament(player.getUniqueId()) != null) { + this.disbandParty(party, true); + } else { + party.broadcast(ChatColor.RED.toString() + ChatColor.BOLD + "[-] " + ChatColor.YELLOW + player.getName() + " left the party."); + party.removeMember(player.getUniqueId()); + this.partyLeaders.remove(player.getUniqueId()); + this.plugin.getInventoryManager().updateParty(party); + } + switch (playerData.getPlayerState()) { + case FIGHTING: + this.plugin.getMatchManager().removeFighter(player, playerData, false); + break; + case SPECTATING: + if (this.plugin.getEventManager().getSpectators().containsKey(player.getUniqueId())) { + this.plugin.getEventManager().removeSpectator(player); + break; + } + this.plugin.getMatchManager().removeSpectator(player); + break; + } + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + } + + public void joinParty(final UUID leader, final Player player) { + final Party party = this.getParty(leader); + if (this.plugin.getTournamentManager().getTournament(leader) != null) { + player.sendMessage(ChatColor.RED + "That player is in a tournament."); + return; + } + this.partyLeaders.put(player.getUniqueId(), leader); + party.addMember(player.getUniqueId()); + this.plugin.getInventoryManager().updateParty(party); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + party.broadcast(ChatColor.GREEN.toString() + ChatColor.BOLD + "[+] " + ChatColor.YELLOW + player.getName() + " joined the party."); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/PlayerManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/PlayerManager.java new file mode 100644 index 0000000..79eb926 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/PlayerManager.java @@ -0,0 +1,193 @@ +package me.devkevin.practice.managers; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.Practice; +import me.devkevin.practice.file.Config; +import me.devkevin.practice.kit.PlayerKit; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.util.ItemUtil; +import me.devkevin.practice.util.PlayerUtil; +import me.devkevin.practice.util.timer.impl.EnderpearlTimer; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class PlayerManager { + private final Practice plugin; + private final Map playerData; + + public PlayerManager() { + this.plugin = Practice.getInstance(); + this.playerData = new ConcurrentHashMap<>(); + } + + public void createPlayerData(final Player player) { + final PlayerData data = new PlayerData(player.getUniqueId()); + this.playerData.put(data.getUniqueId(), data); + this.loadData(data); + } + + private void loadData(final PlayerData playerData) { + Config config = new Config("/players/" + playerData.getUniqueId().toString(), this.plugin); + FileConfiguration fileConfig = config.getConfig(); + ConfigurationSection playerKitsSection = config.getConfig().getConfigurationSection("playerkits"); + if (playerKitsSection != null) { + this.plugin.getKitManager().getKits().forEach((kit) -> { + ConfigurationSection kitSection = playerKitsSection.getConfigurationSection(kit.getName()); + if (kitSection != null) { + kitSection.getKeys(false).forEach((kitKey) -> { + Integer kitIndex = Integer.parseInt(kitKey); + String displayName = kitSection.getString(kitKey + ".displayName"); + ItemStack[] contents = (ItemStack[]) ((List) kitSection.get(kitKey + ".contents")).toArray(new ItemStack[0]); + PlayerKit playerKit = new PlayerKit(kit.getName(), kitIndex, contents, displayName); + playerData.addPlayerKit(kitIndex, playerKit); + }); + } + + }); + } + + ConfigurationSection playerDataSelection = fileConfig.getConfigurationSection("playerdata"); + + + if(playerDataSelection != null){ + + + if(playerDataSelection.getConfigurationSection("elo") != null){ + playerDataSelection.getConfigurationSection("elo").getKeys(false).forEach(kit -> { + Integer elo = playerDataSelection.getInt("elo." + kit); + playerData.setElo(kit, elo); + }); + } + + if(playerDataSelection.getConfigurationSection("losses") != null){ + playerDataSelection.getConfigurationSection("losses").getKeys(false).forEach(kit -> { + Integer elo = playerDataSelection.getInt("losses." + kit); + playerData.setLosses(kit, elo); + }); + } + + if(playerDataSelection.getConfigurationSection("wins") != null){ + playerDataSelection.getConfigurationSection("wins").getKeys(false).forEach(kit -> { + Integer elo = playerDataSelection.getInt("wins." + kit); + playerData.setWins(kit, elo); + }); + } + + if(playerDataSelection.getConfigurationSection("partyelo") != null){ + playerDataSelection.getConfigurationSection("partyelo").getKeys(false).forEach(kit -> { + Integer elo = playerDataSelection.getInt("partyelo." + kit); + playerData.setPartyElo(kit, elo); + }); + } + + playerData.setOitcEventDeaths(playerDataSelection.getInt("oitcEventDeaths")); + playerData.setOitcEventWins(playerDataSelection.getInt("oitcEventWins")); + playerData.setOitcEventDeaths(playerDataSelection.getInt("oitcEventLosses")); + playerData.setSumoEventWins(playerDataSelection.getInt("sumoEventWins")); + playerData.setSumoEventLosses(playerDataSelection.getInt("sumoEventLosses")); + playerData.setParkourEventWins(playerDataSelection.getInt("parkourEventWins")); + playerData.setParkourEventLosses(playerDataSelection.getInt("parkourEventLosses")); + playerData.setRedroverEventWins(playerDataSelection.getInt("redroverEventWins")); + playerData.setRedroverEventLosses(playerDataSelection.getInt("redroverEventLosses")); + playerData.setRematchID(playerDataSelection.getInt("rematchID")); + } + + playerData.setPlayerState(PlayerState.SPAWN); + } + + public void removePlayerData(final UUID uuid) { + this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> { + this.saveData(this.playerData.get(uuid)); + this.playerData.remove(uuid); + }); + } + + public void saveData(final PlayerData playerData) { + if(playerData != null) { + Config config = new Config("/players/" + playerData.getUniqueId().toString(), this.plugin); + this.plugin.getKitManager().getKits().forEach((kit) -> { + Map playerKits = playerData.getPlayerKits(kit.getName()); + if(playerKits != null) { + playerKits.forEach((key, value) -> { + config.getConfig().set("playerkits." + kit.getName() + "." + key + ".displayName", value.getDisplayName()); + config.getConfig().set("playerkits." + kit.getName() + "." + key + ".contents", value.getContents()); + }); + } + config.getConfig().set("playerdata.elo." + kit.getName() , playerData.getElo(kit.getName())); + config.getConfig().set("playerdata.losses." + kit.getName() , playerData.getLosses(kit.getName())); + config.getConfig().set("playerdata.wins." + kit.getName() , playerData.getWins(kit.getName())); + config.getConfig().set("playerdata.partyelo." + kit.getName() , playerData.getPartyElo(kit.getName())); + }); + config.getConfig().set("playerdata.oitcEventDeaths", playerData.getOitcEventDeaths()); + config.getConfig().set("playerdata.oitcEventWins", playerData.getOitcEventWins()); + config.getConfig().set("playerdata.oitcEventLosses", playerData.getOitcEventWins()); + config.getConfig().set("playerdata.sumoEventWins", playerData.getOitcEventWins()); + config.getConfig().set("playerdata.sumoEventLosses", playerData.getOitcEventWins()); + config.getConfig().set("playerdata.parkourEventWins", playerData.getOitcEventWins()); + config.getConfig().set("playerdata.parkourEventLosses", playerData.getOitcEventWins()); + config.getConfig().set("playerdata.redroverEventWins", playerData.getOitcEventWins()); + config.getConfig().set("playerdata.redroverEventLosses", playerData.getOitcEventWins()); + + config.save(); + } + } + + public Collection getAllData() { + return this.playerData.values(); + } + + public PlayerData getPlayerData(final UUID uuid) { + return this.playerData.get(uuid); + } + + public void giveLobbyItems(final Player player) { + final boolean inParty = this.plugin.getPartyManager().getParty(player.getUniqueId()) != null; + final boolean inTournament = this.plugin.getTournamentManager().getTournament(player.getUniqueId()) != null; + final boolean inEvent = this.plugin.getEventManager().getEventPlaying(player) != null; + final boolean isRematching = this.plugin.getMatchManager().isRematching(player.getUniqueId()); + ItemStack[] items = this.plugin.getItemManager().getSpawnItems(); + if (inTournament) { + items = this.plugin.getItemManager().getTournamentItems(); + } else if (inEvent) { + items = this.plugin.getItemManager().getEventItems(); + } else if (inParty) { + items = this.plugin.getItemManager().getPartyItems(); + } + player.getInventory().setContents(items); + if (isRematching && !inParty && !inTournament && !inEvent) { + player.getInventory().setItem(6, ItemUtil.createItem(Material.BLAZE_POWDER, ChatColor.DARK_GREEN.toString() + "Rematch")); + } + player.updateInventory(); + } + + public void sendToSpawnAndReset(final Player player) { + final PlayerData playerData = this.getPlayerData(player.getUniqueId()); + playerData.setPlayerState(PlayerState.SPAWN); + PlayerUtil.clearPlayer(player); + this.plugin.getTimerManager().getTimer(EnderpearlTimer.class).clearCooldown(player.getUniqueId()); + this.giveLobbyItems(player); + if (!player.isOnline()) { + return; + } + this.plugin.getServer().getOnlinePlayers().forEach(p -> { + player.hidePlayer(p); + p.hidePlayer(player); + return; + }); + player.teleport(this.plugin.getSpawnManager().getSpawnLocation().toBukkitLocation()); + } + + private void saveConfigPlayerData(final PlayerData playerData) { + Config config = new Config("/players/" + playerData.getUniqueId().toString(), this.plugin); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/QueueManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/QueueManager.java new file mode 100644 index 0000000..a9a8d70 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/QueueManager.java @@ -0,0 +1,301 @@ +package me.devkevin.practice.managers; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.queue.QueueEntry; +import me.devkevin.practice.queue.QueueType; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public class QueueManager { + private final Map queued; + private final Map playerQueueTime; + private final Practice plugin; + private boolean rankedEnabled; + + public QueueManager() { + this.queued = new ConcurrentHashMap(); + this.playerQueueTime = new HashMap(); + this.plugin = Practice.getInstance(); + this.rankedEnabled = true; + this.plugin.getServer().getScheduler().runTaskTimer(this.plugin, () -> this.queued.forEach((key, value) -> { + if (value.isParty()) { + this.findMatch(this.plugin.getPartyManager().getParty(key), value.getKitName(), value.getElo(), value.getQueueType()); + } else { + this.findMatch(this.plugin.getServer().getPlayer(key), value.getKitName(), value.getElo(), value.getQueueType()); + } + }), 20L, 20L); + } + + public void addPlayerToQueue(final Player player, final PlayerData playerData, final String kitName, final QueueType type) { + if (type != QueueType.UNRANKED && !this.rankedEnabled) { + player.closeInventory(); + return; + } + playerData.setPlayerState(PlayerState.QUEUE); + final int elo = (type == QueueType.RANKED) ? playerData.getElo(kitName) : 0; + final QueueEntry entry = new QueueEntry(type, kitName, elo, false); + this.queued.put(playerData.getUniqueId(), entry); + this.giveQueueItems(player); + final String unrankedMessage = ChatColor.YELLOW + "You Joined " + ChatColor.GREEN + "Unranked " + kitName + ChatColor.YELLOW + " queue."; + final String rankedMessage = ChatColor.YELLOW + "You Joined " + ChatColor.GREEN + "Ranked " + kitName + ChatColor.YELLOW + " queue. " + ChatColor.GREEN + "[" + elo + "]"; + player.sendMessage((type == QueueType.UNRANKED) ? unrankedMessage : rankedMessage); + this.playerQueueTime.put(player.getUniqueId(), System.currentTimeMillis()); + + if (!this.findMatch(player, kitName, elo, type) && type.isRanked()) { + player.sendMessage(ChatColor.YELLOW + "Searching in elo range " + ChatColor.GREEN + + (playerData.getEloRange() == -1 + ? "Unrestricted" + : "[" + Math.max(elo - playerData.getEloRange() / 2, 0) + + " -> " + Math.max(elo + playerData.getEloRange() / 2, 0) + "]")); + } + } + + private void giveQueueItems(final Player player) { + player.closeInventory(); + player.getInventory().setContents(this.plugin.getItemManager().getQueueItems()); + player.updateInventory(); + } + + public QueueEntry getQueueEntry(final UUID uuid) { + return this.queued.get(uuid); + } + + public long getPlayerQueueTime(final UUID uuid) { + return this.playerQueueTime.get(uuid); + } + + public int getQueueSize(final String ladder, final QueueType type) { + return (int) this.queued.entrySet().stream().filter(entry -> entry.getValue().getQueueType() == type).filter(entry -> entry.getValue().getKitName().equals(ladder)).count(); + } + + private boolean findMatch(final Player player, final String kitName, final int elo, final QueueType type) { + final long queueTime = System.currentTimeMillis() - this.playerQueueTime.get(player.getUniqueId()); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData == null) { + this.plugin.getLogger().warning(player.getName() + "'s player data is null"); + return false; + } + int eloRange = playerData.getEloRange(); + int pingRange = -1; + final int seconds = Math.round(queueTime / 1000L); + if (seconds > 5 && type != QueueType.UNRANKED) { + if (pingRange != -1) { + pingRange += (seconds - 5) * 25; + } + if (eloRange != -1) { + eloRange += seconds * 50; + if (eloRange >= 3000) { + eloRange = 3000; + } + } + } + if (eloRange == -1) { + eloRange = Integer.MAX_VALUE; + } + if (pingRange == -1) { + pingRange = Integer.MAX_VALUE; + } + final int ping = 0; + for (final UUID opponent : this.queued.keySet()) { + if (opponent == player.getUniqueId()) { + continue; + } + final QueueEntry queueEntry = this.queued.get(opponent); + if (!queueEntry.getKitName().equals(kitName)) { + continue; + } + if (queueEntry.getQueueType() != type) { + continue; + } + if (queueEntry.isParty()) { + continue; + } + final Player opponentPlayer = this.plugin.getServer().getPlayer(opponent); + final PlayerData opponentData = this.plugin.getPlayerManager().getPlayerData(opponent); + if (opponentData.getPlayerState() == PlayerState.FIGHTING) { + continue; + } + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + continue; + } + final int eloDiff = Math.abs(queueEntry.getElo() - elo); + if (type.isRanked()) { + if (eloDiff > eloRange) { + continue; + } + final long opponentQueueTime = System.currentTimeMillis() - this.playerQueueTime.get(opponentPlayer.getUniqueId()); + int opponentEloRange = -1; + int opponentPingRange = -1; + final int opponentSeconds = Math.round(opponentQueueTime / 1000L); + if (opponentSeconds > 5) { + if (opponentPingRange != -1) { + opponentPingRange += (opponentSeconds - 5) * 25; + } + if (opponentEloRange != -1) { + opponentEloRange += opponentSeconds * 50; + if (opponentEloRange >= 3000) { + opponentEloRange = 3000; + } + } + } + if (opponentEloRange == -1) { + opponentEloRange = Integer.MAX_VALUE; + } + if (opponentPingRange == -1) { + opponentPingRange = Integer.MAX_VALUE; + } + if (eloDiff > opponentEloRange) { + continue; + } + final int pingDiff = Math.abs(0 - ping); + if (type == QueueType.RANKED) { + if (pingDiff > opponentPingRange) { + continue; + } + if (pingDiff > pingRange) { + continue; + } + } + } + final Kit kit = this.plugin.getKitManager().getKit(kitName); + final Arena arena = this.plugin.getArenaManager().getRandomArena(kit); + String playerFoundMatchMessage; + String matchedFoundMatchMessage; + if (type.isRanked()) { + playerFoundMatchMessage = ChatColor.YELLOW + player.getName() + ChatColor.GREEN + " with " + ChatColor.YELLOW + "" + this.queued.get(player.getUniqueId()).getElo() + " elo"; + matchedFoundMatchMessage = ChatColor.YELLOW + opponentPlayer.getName() + ChatColor.GREEN + " with " + ChatColor.YELLOW + "" + this.queued.get(opponentPlayer.getUniqueId()).getElo() + " elo"; + } else { + playerFoundMatchMessage = ChatColor.YELLOW + player.getName() + "."; + matchedFoundMatchMessage = ChatColor.YELLOW + opponentPlayer.getName() + "."; + } + player.sendMessage(ChatColor.GREEN + "Starting duel against " + matchedFoundMatchMessage); + opponentPlayer.sendMessage(ChatColor.GREEN + "Starting duel against " + playerFoundMatchMessage); + final MatchTeam teamA = new MatchTeam(player.getUniqueId(), Collections.singletonList(player.getUniqueId()), 0); + final MatchTeam teamB = new MatchTeam(opponentPlayer.getUniqueId(), Collections.singletonList(opponentPlayer.getUniqueId()), 1); + final Match match = new Match(arena, kit, type, teamA, teamB); + this.plugin.getMatchManager().createMatch(match); + this.queued.remove(player.getUniqueId()); + this.queued.remove(opponentPlayer.getUniqueId()); + this.playerQueueTime.remove(player.getUniqueId()); + return true; + } + return false; + } + + public void removePlayerFromQueue(final Player player) { + final QueueEntry entry = this.queued.get(player.getUniqueId()); + this.queued.remove(player.getUniqueId()); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + player.sendMessage(ChatColor.RED + "You have left the " + entry.getQueueType().getName() + " " + entry.getKitName() + " queue."); + } + + public void addPartyToQueue(final Player leader, final Party party, final String kitName, final QueueType type) { + if (type.isRanked() && !this.rankedEnabled) { + leader.closeInventory(); + } else if (party.getMembers().size() != 2) { + leader.sendMessage(ChatColor.RED + "There must be at least 2 players in your party to do this."); + leader.closeInventory(); + } else { + party.getMembers().stream().map(this.plugin.getPlayerManager()::getPlayerData).forEach(member -> member.setPlayerState(PlayerState.QUEUE)); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(leader.getUniqueId()); + final int elo = type.isRanked() ? playerData.getPartyElo(kitName) : -1; + this.queued.put(playerData.getUniqueId(), new QueueEntry(type, kitName, elo, true)); + this.giveQueueItems(leader); + final String unrankedMessage = ChatColor.GREEN + "Your party has been added to the " + ChatColor.YELLOW + "Unranked 2v2 " + kitName + ChatColor.GREEN + " queue."; + final String rankedMessage = ChatColor.GREEN + "Your party has been added to the " + ChatColor.YELLOW + "Ranked 2v2 " + kitName + ChatColor.GREEN + " queue with " + ChatColor.YELLOW + elo + " elo" + ChatColor.YELLOW + "."; + party.broadcast(type.isRanked() ? rankedMessage : unrankedMessage); + this.playerQueueTime.put(party.getLeader(), System.currentTimeMillis()); + this.findMatch(party, kitName, elo, type); + } + } + + private void findMatch(final Party partyA, final String kitName, final int elo, final QueueType type) { + if (!this.playerQueueTime.containsKey(partyA.getLeader())) { + return; + } + final long queueTime = System.currentTimeMillis() - this.playerQueueTime.get(partyA.getLeader()); + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(partyA.getLeader()); + if (playerData == null) { + return; + } + int eloRange = playerData.getEloRange(); + final int seconds = Math.round(queueTime / 1000L); + if (seconds > 5 && type.isRanked()) { + eloRange += seconds * 50; + if (eloRange >= 1000) { + eloRange = 1000; + } + } + + int finalEloRange = eloRange; + UUID opponent = this.queued.entrySet().stream() + .filter((entry) -> entry.getKey() != partyA.getLeader()) + .filter((entry) -> this.plugin.getPlayerManager().getPlayerData(entry.getKey()).getPlayerState() == PlayerState.QUEUE) + .filter((entry) -> (entry.getValue()).isParty()).filter((entry) -> (entry.getValue()).getQueueType() == type) + .filter((entry) -> !type.isRanked() || Math.abs((entry.getValue()).getElo() - elo) < finalEloRange) + .filter((entry) -> (entry.getValue()).getKitName().equals(kitName)) + .map(Map.Entry::getKey) + .findFirst().orElse(null); + + if (opponent == null) { + return; + } + final PlayerData opponentData = this.plugin.getPlayerManager().getPlayerData(opponent); + if (opponentData.getPlayerState() == PlayerState.FIGHTING) { + return; + } + if (playerData.getPlayerState() == PlayerState.FIGHTING) { + return; + } + final Player leaderA = this.plugin.getServer().getPlayer(partyA.getLeader()); + final Player leaderB = this.plugin.getServer().getPlayer(opponent); + final Party partyB = this.plugin.getPartyManager().getParty(opponent); + final Kit kit = this.plugin.getKitManager().getKit(kitName); + final Arena arena = this.plugin.getArenaManager().getRandomArena(kit); + String partyAFoundMatchMessage; + String partyBFoundMatchMessage; + if (type.isRanked()) { + partyAFoundMatchMessage = ChatColor.YELLOW + leaderB.getName() + "'s Party" + ChatColor.GREEN + " with " + ChatColor.YELLOW + "" + this.queued.get(leaderB.getUniqueId()).getElo() + " elo"; + partyBFoundMatchMessage = ChatColor.YELLOW + leaderA.getName() + "'s Party" + ChatColor.GREEN + " with " + ChatColor.YELLOW + "" + this.queued.get(leaderA.getUniqueId()).getElo() + " elo"; + } else { + partyAFoundMatchMessage = ChatColor.YELLOW + leaderB.getName() + ChatColor.GREEN + "'s Party."; + partyBFoundMatchMessage = ChatColor.YELLOW + leaderA.getName() + ChatColor.GREEN + "'s Party."; + } + partyA.broadcast(ChatColor.GREEN + "Starting duel against " + partyAFoundMatchMessage); + partyB.broadcast(ChatColor.GREEN + "Starting duel against " + partyBFoundMatchMessage); + final List playersA = new ArrayList(partyA.getMembers()); + final List playersB = new ArrayList(partyB.getMembers()); + final MatchTeam teamA = new MatchTeam(leaderA.getUniqueId(), playersA, 0); + final MatchTeam teamB = new MatchTeam(leaderB.getUniqueId(), playersB, 1); + final Match match = new Match(arena, kit, type, teamA, teamB); + this.plugin.getMatchManager().createMatch(match); + this.queued.remove(partyA.getLeader()); + this.queued.remove(partyB.getLeader()); + } + + public void removePartyFromQueue(final Party party) { + final QueueEntry entry = this.queued.get(party.getLeader()); + this.queued.remove(party.getLeader()); + party.members().forEach(this.plugin.getPlayerManager()::sendToSpawnAndReset); + final String type = entry.getQueueType().isRanked() ? "Ranked" : "Unranked"; + party.broadcast(ChatColor.GREEN.toString() + "You party has left the " + type + " " + ChatColor.YELLOW + entry.getKitName() + " queue."); + } + + public boolean isRankedEnabled() { + return this.rankedEnabled; + } + + public void setRankedEnabled(final boolean rankedEnabled) { + this.rankedEnabled = rankedEnabled; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/SpawnManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/SpawnManager.java new file mode 100644 index 0000000..af1ec08 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/SpawnManager.java @@ -0,0 +1,341 @@ +package me.devkevin.practice.managers; + +import org.bukkit.configuration.file.FileConfiguration; +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; + +import java.util.ArrayList; +import java.util.List; + +public class SpawnManager { + private final Practice plugin; + private CustomLocation spawnLocation; + private CustomLocation spawnMin; + private CustomLocation spawnMax; + private CustomLocation editorLocation; + private CustomLocation editorMin; + private CustomLocation editorMax; + private CustomLocation sumoLocation; + private CustomLocation sumoFirst; + private CustomLocation sumoSecond; + private CustomLocation sumoMin; + private CustomLocation sumoMax; + private CustomLocation oitcLocation; + private List oitcSpawnpoints; + private CustomLocation oitcMin; + private CustomLocation oitcMax; + private CustomLocation parkourLocation; + private CustomLocation parkourGameLocation; + private CustomLocation parkourMin; + private CustomLocation parkourMax; + private CustomLocation redroverLocation; + private CustomLocation redroverFirst; + private CustomLocation redroverSecond; + private CustomLocation redroverMin; + private CustomLocation redroverMax; + + public SpawnManager() { + this.plugin = Practice.getInstance(); + this.oitcSpawnpoints = new ArrayList<>(); + this.loadConfig(); + } + + private void loadConfig() { + final FileConfiguration config = this.plugin.getMainConfig().getConfig(); + if (config.contains("spawnLocation")) { + this.spawnLocation = CustomLocation.stringToLocation(config.getString("spawnLocation")); + this.spawnMin = CustomLocation.stringToLocation(config.getString("spawnMin")); + this.spawnMax = CustomLocation.stringToLocation(config.getString("spawnMax")); + } + if (config.contains("editorLocation")) { + this.editorLocation = CustomLocation.stringToLocation(config.getString("editorLocation")); + this.editorMin = CustomLocation.stringToLocation(config.getString("editorMin")); + this.editorMax = CustomLocation.stringToLocation(config.getString("editorMax")); + } + if (config.contains("sumoLocation")) { + this.sumoLocation = CustomLocation.stringToLocation(config.getString("sumoLocation")); + this.sumoMin = CustomLocation.stringToLocation(config.getString("sumoMin")); + this.sumoMax = CustomLocation.stringToLocation(config.getString("sumoMax")); + this.sumoFirst = CustomLocation.stringToLocation(config.getString("sumoFirst")); + this.sumoSecond = CustomLocation.stringToLocation(config.getString("sumoSecond")); + } + if (config.contains("oitcLocation")) { + this.oitcLocation = CustomLocation.stringToLocation(config.getString("oitcLocation")); + this.oitcMin = CustomLocation.stringToLocation(config.getString("oitcMin")); + this.oitcMax = CustomLocation.stringToLocation(config.getString("oitcMax")); + for (final String spawnpoint : config.getStringList("oitcSpawnpoints")) { + this.oitcSpawnpoints.add(CustomLocation.stringToLocation(spawnpoint)); + } + } + if (config.contains("redroverLocation")) { + this.redroverLocation = CustomLocation.stringToLocation(config.getString("redroverLocation")); + this.redroverMin = CustomLocation.stringToLocation(config.getString("redroverMin")); + this.redroverMax = CustomLocation.stringToLocation(config.getString("redroverMax")); + this.redroverFirst = CustomLocation.stringToLocation(config.getString("redroverFirst")); + this.redroverSecond = CustomLocation.stringToLocation(config.getString("redroverSecond")); + } + if (config.contains("parkourLocation")) { + this.parkourLocation = CustomLocation.stringToLocation(config.getString("parkourLocation")); + this.parkourGameLocation = CustomLocation.stringToLocation(config.getString("parkourGameLocation")); + this.parkourMin = CustomLocation.stringToLocation(config.getString("parkourMin")); + this.parkourMax = CustomLocation.stringToLocation(config.getString("parkourMax")); + } + } + + public void saveConfig() { + final FileConfiguration config = this.plugin.getMainConfig().getConfig(); + if(spawnLocation != null) + config.set("spawnLocation", CustomLocation.locationToString(this.spawnLocation)); + if(spawnMin != null) + config.set("spawnMin", CustomLocation.locationToString(this.spawnMin)); + if(spawnMax != null) + config.set("spawnMax", CustomLocation.locationToString(this.spawnMax)); + if(editorLocation != null) + config.set("editorLocation", CustomLocation.locationToString(this.editorLocation)); + if(editorMin != null) + config.set("editorMin", CustomLocation.locationToString(this.editorMin)); + if(editorMax != null) + config.set("editorMax", CustomLocation.locationToString(this.editorMax)); + if(sumoLocation != null) + config.set("sumoLocation", CustomLocation.locationToString(this.sumoLocation)); + if(sumoMin != null) + config.set("sumoMin", CustomLocation.locationToString(this.sumoMin)); + if(sumoMax != null) + config.set("sumoMax", CustomLocation.locationToString(this.sumoMax)); + if(sumoFirst != null) + config.set("sumoFirst", CustomLocation.locationToString(this.sumoFirst)); + if(sumoSecond != null) + config.set("sumoSecond", CustomLocation.locationToString(this.sumoSecond)); + if(oitcLocation != null) + config.set("oitcLocation", CustomLocation.locationToString(this.oitcLocation)); + if(oitcMin != null) + config.set("oitcMin", CustomLocation.locationToString(this.oitcMin)); + if(oitcMax != null) + config.set("oitcMax", CustomLocation.locationToString(this.oitcMax)); + if(oitcSpawnpoints != null) + config.set("oitcSpawnpoints", this.fromLocations(this.oitcSpawnpoints)); + if(parkourLocation != null) + config.set("parkourLocation", CustomLocation.locationToString(this.parkourLocation)); + if(parkourGameLocation != null) + config.set("parkourGameLocation", CustomLocation.locationToString(this.parkourGameLocation)); + if(parkourMin != null) + config.set("parkourMin", CustomLocation.locationToString(this.parkourMin)); + if(parkourMax != null) + config.set("parkourMax", CustomLocation.locationToString(this.parkourMax)); + if(redroverLocation != null) + config.set("redroverLocation", CustomLocation.locationToString(this.redroverLocation)); + if(redroverMin != null) + config.set("redroverMin", CustomLocation.locationToString(this.redroverMin)); + if(redroverMax != null) + config.set("redroverMax", CustomLocation.locationToString(this.redroverMax)); + if(redroverFirst != null) + config.set("redroverFirst", CustomLocation.locationToString(this.redroverFirst)); + if(redroverSecond != null) + config.set("redroverSecond", CustomLocation.locationToString(this.redroverSecond)); + this.plugin.getMainConfig().save(); + } + + private List fromLocations(final List locations) { + final List toReturn = new ArrayList<>(); + for (final CustomLocation location : locations) { + toReturn.add(CustomLocation.locationToString(location)); + } + return toReturn; + } + + public Practice getPlugin() { + return this.plugin; + } + + public CustomLocation getSpawnLocation() { + return this.spawnLocation; + } + + public void setSpawnLocation(final CustomLocation spawnLocation) { + this.spawnLocation = spawnLocation; + } + + public CustomLocation getSpawnMin() { + return this.spawnMin; + } + + public void setSpawnMin(final CustomLocation spawnMin) { + this.spawnMin = spawnMin; + } + + public CustomLocation getSpawnMax() { + return this.spawnMax; + } + + public void setSpawnMax(final CustomLocation spawnMax) { + this.spawnMax = spawnMax; + } + + public CustomLocation getEditorLocation() { + return this.editorLocation; + } + + public void setEditorLocation(final CustomLocation editorLocation) { + this.editorLocation = editorLocation; + } + + public CustomLocation getEditorMin() { + return this.editorMin; + } + + public void setEditorMin(final CustomLocation editorMin) { + this.editorMin = editorMin; + } + + public CustomLocation getEditorMax() { + return this.editorMax; + } + + public void setEditorMax(final CustomLocation editorMax) { + this.editorMax = editorMax; + } + + public CustomLocation getSumoLocation() { + return this.sumoLocation; + } + + public void setSumoLocation(final CustomLocation sumoLocation) { + this.sumoLocation = sumoLocation; + } + + public CustomLocation getSumoFirst() { + return this.sumoFirst; + } + + public void setSumoFirst(final CustomLocation sumoFirst) { + this.sumoFirst = sumoFirst; + } + + public CustomLocation getSumoSecond() { + return this.sumoSecond; + } + + public void setSumoSecond(final CustomLocation sumoSecond) { + this.sumoSecond = sumoSecond; + } + + public CustomLocation getSumoMin() { + return this.sumoMin; + } + + public void setSumoMin(final CustomLocation sumoMin) { + this.sumoMin = sumoMin; + } + + public CustomLocation getSumoMax() { + return this.sumoMax; + } + + public void setSumoMax(final CustomLocation sumoMax) { + this.sumoMax = sumoMax; + } + + public CustomLocation getOitcLocation() { + return this.oitcLocation; + } + + public void setOitcLocation(final CustomLocation oitcLocation) { + this.oitcLocation = oitcLocation; + } + + public List getOitcSpawnpoints() { + return this.oitcSpawnpoints; + } + + public void setOitcSpawnpoints(final List oitcSpawnpoints) { + this.oitcSpawnpoints = oitcSpawnpoints; + } + + public CustomLocation getOitcMin() { + return this.oitcMin; + } + + public void setOitcMin(final CustomLocation oitcMin) { + this.oitcMin = oitcMin; + } + + public CustomLocation getOitcMax() { + return this.oitcMax; + } + + public void setOitcMax(final CustomLocation oitcMax) { + this.oitcMax = oitcMax; + } + + public CustomLocation getParkourLocation() { + return this.parkourLocation; + } + + public void setParkourLocation(final CustomLocation parkourLocation) { + this.parkourLocation = parkourLocation; + } + + public CustomLocation getParkourGameLocation() { + return this.parkourGameLocation; + } + + public void setParkourGameLocation(final CustomLocation parkourGameLocation) { + this.parkourGameLocation = parkourGameLocation; + } + + public CustomLocation getParkourMin() { + return this.parkourMin; + } + + public void setParkourMin(final CustomLocation parkourMin) { + this.parkourMin = parkourMin; + } + + public CustomLocation getParkourMax() { + return this.parkourMax; + } + + public void setParkourMax(final CustomLocation parkourMax) { + this.parkourMax = parkourMax; + } + + public CustomLocation getRedroverLocation() { + return this.redroverLocation; + } + + public void setRedroverLocation(final CustomLocation redroverLocation) { + this.redroverLocation = redroverLocation; + } + + public CustomLocation getRedroverFirst() { + return this.redroverFirst; + } + + public void setRedroverFirst(final CustomLocation redroverFirst) { + this.redroverFirst = redroverFirst; + } + + public CustomLocation getRedroverSecond() { + return this.redroverSecond; + } + + public void setRedroverSecond(final CustomLocation redroverSecond) { + this.redroverSecond = redroverSecond; + } + + public CustomLocation getRedroverMin() { + return this.redroverMin; + } + + public void setRedroverMin(final CustomLocation redroverMin) { + this.redroverMin = redroverMin; + } + + public CustomLocation getRedroverMax() { + return this.redroverMax; + } + + public void setRedroverMax(final CustomLocation redroverMax) { + this.redroverMax = redroverMax; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/managers/TournamentManager.java b/dPractice/src/main/java/me/devkevin/practice/managers/TournamentManager.java new file mode 100644 index 0000000..9b911a5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/managers/TournamentManager.java @@ -0,0 +1,246 @@ +package me.devkevin.practice.managers; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.Practice; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.runnable.TournamentRunnable; +import me.devkevin.practice.tournament.Tournament; +import me.devkevin.practice.tournament.TournamentState; +import me.devkevin.practice.tournament.TournamentTeam; +import me.devkevin.practice.util.TeamUtil; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.UUID; + +public class TournamentManager { + private final Practice plugin; + private final Map players; + private final Map matches; + private final Map tournaments; + private final Map runnables; + + public TournamentManager() { + this.plugin = Practice.getInstance(); + this.players = new HashMap<>(); + this.matches = new HashMap<>(); + this.tournaments = new HashMap<>(); + this.runnables = new HashMap<>(); + } + + public boolean isInTournament(final UUID uuid) { + return this.players.containsKey(uuid); + } + + public Tournament getTournament(final UUID uuid) { + final Integer id = this.players.get(uuid); + if (id == null) { + return null; + } + return this.tournaments.get(id); + } + + public Tournament getTournamentFromMatch(final UUID uuid) { + final Integer id = this.matches.get(uuid); + if (id == null) { + return null; + } + return this.tournaments.get(id); + } + + public void createTournament(final CommandSender commandSender, final int id, final int teamSize, final int size, final String kitName) { + final Tournament tournament = new Tournament(id, teamSize, size, kitName); + this.tournaments.put(id, tournament); + final BukkitRunnable bukkitRunnable = new TournamentRunnable(tournament); + bukkitRunnable.runTaskTimerAsynchronously(this.plugin, 20L, 20L); + this.runnables.put(tournament, bukkitRunnable); + commandSender.sendMessage(ChatColor.GREEN + "Successfully created tournament."); + if (commandSender instanceof Player) { + final Player player = (Player) commandSender; + player.performCommand("tournament alert " + id); + } + } + + private void playerLeft(final Tournament tournament, final Player player) { + final TournamentTeam team = tournament.getPlayerTeam(player.getUniqueId()); + tournament.removePlayer(player.getUniqueId()); + player.sendMessage(ChatColor.YELLOW.toString() + "(Tournament) " + ChatColor.GRAY + "You left the tournament."); + this.players.remove(player.getUniqueId()); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + tournament.broadcast(ChatColor.YELLOW.toString() + "(Tournament) " + ChatColor.WHITE + "" + player.getName() + " left the tournament. (" + tournament.getPlayers().size() + "/" + tournament.getSize() + ")"); + if (team != null) { + team.killPlayer(player.getUniqueId()); + if (team.getAlivePlayers().size() == 0) { + tournament.killTeam(team); + if (tournament.getAliveTeams().size() == 1) { + final TournamentTeam tournamentTeam = tournament.getAliveTeams().get(0); + final String names = TeamUtil.getNames(tournamentTeam); + for (int i = 0; i <= 2; ++i) { + final String announce = ChatColor.YELLOW + "(Tournament) " + ChatColor.GREEN.toString() + "Winner: " + names + "."; + Bukkit.broadcastMessage(announce); + } + for (final UUID playerUUID : tournamentTeam.getAlivePlayers()) { + this.players.remove(playerUUID); + final Player tournamentPlayer = this.plugin.getServer().getPlayer(playerUUID); + this.plugin.getPlayerManager().sendToSpawnAndReset(tournamentPlayer); + } + this.plugin.getTournamentManager().removeTournament(tournament.getId(), false); + } + } else if (team.getLeader().equals(player.getUniqueId())) { + team.setLeader(team.getAlivePlayers().get(0)); + } + } + } + + private void teamEliminated(final Tournament tournament, final TournamentTeam winnerTeam, final TournamentTeam losingTeam) { + for (final UUID playerUUID : losingTeam.getAlivePlayers()) { + final Player player = this.plugin.getServer().getPlayer(playerUUID); + tournament.removePlayer(player.getUniqueId()); + player.sendMessage(ChatColor.YELLOW.toString() + "(Tournament) " + ChatColor.GRAY + "You have been eliminated. " + ChatColor.GRAY); + this.players.remove(player.getUniqueId()); + } + final String word = (losingTeam.getAlivePlayers().size() > 1) ? "have" : "has"; + final boolean isParty = tournament.getTeamSize() > 1; + final String announce = ChatColor.YELLOW + "(Tournament) " + ChatColor.RED + (isParty ? (losingTeam.getLeaderName() + "'s Party") : losingTeam.getLeaderName()) + ChatColor.GRAY + " " + word + " been eliminated by " + ChatColor.GREEN + (isParty ? (winnerTeam.getLeaderName() + "'s Party") : winnerTeam.getLeaderName()) + "."; + final String alive = ChatColor.YELLOW + "(Tournament) " + ChatColor.GRAY + "Players: (" + tournament.getPlayers().size() + "/" + tournament.getSize() + ")"; + tournament.broadcast(announce); + tournament.broadcast(alive); + } + + public void leaveTournament(final Player player) { + final Tournament tournament = this.getTournament(player.getUniqueId()); + if (tournament == null) { + return; + } + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party != null && tournament.getTournamentState() != TournamentState.FIGHTING) { + if (this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + for (final UUID memberUUID : party.getMembers()) { + final Player member = this.plugin.getServer().getPlayer(memberUUID); + this.playerLeft(tournament, member); + } + } else { + player.sendMessage(ChatColor.RED + "You are not the leader of the party."); + } + } else { + this.playerLeft(tournament, player); + } + } + + private void playerJoined(final Tournament tournament, final Player player) { + tournament.addPlayer(player.getUniqueId()); + this.players.put(player.getUniqueId(), tournament.getId()); + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + tournament.broadcast(ChatColor.YELLOW.toString() + "(Tournament) " + ChatColor.WHITE + "" + player.getName() + " joined the tournament. (" + tournament.getPlayers().size() + "/" + tournament.getSize() + ")"); + } + + public void joinTournament(final Integer id, final Player player) { + final Tournament tournament = this.tournaments.get(id); + final Party party = this.plugin.getPartyManager().getParty(player.getUniqueId()); + if (party != null) { + if (this.plugin.getPartyManager().isLeader(player.getUniqueId())) { + if (party.getMembers().size() + tournament.getPlayers().size() <= tournament.getSize()) { + if (party.getMembers().size() != tournament.getTeamSize() || party.getMembers().size() == 1) { + player.sendMessage(ChatColor.RED + "The party size must be of " + tournament.getTeamSize() + " players."); + } else { + for (final UUID memberUUID : party.getMembers()) { + final Player member = this.plugin.getServer().getPlayer(memberUUID); + this.playerJoined(tournament, member); + } + } + } else { + player.sendMessage(ChatColor.RED + "Sorry! The tournament is already full."); + } + } else { + player.sendMessage(ChatColor.RED + "You are not the leader of the party."); + } + } else { + this.playerJoined(tournament, player); + } + if (tournament.getPlayers().size() == tournament.getSize()) { + tournament.setTournamentState(TournamentState.STARTING); + } + } + + public Tournament getTournament(final Integer id) { + return this.tournaments.get(id); + } + + public void removeTournament(final Integer id, final boolean force) { + final Tournament tournament = this.tournaments.get(id); + if (tournament == null) { + return; + } + if (force) { + Iterator players = this.players.keySet().iterator(); + while (players.hasNext()) { + UUID uuid = (UUID)players.next(); + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + player.sendMessage(ChatColor.RED + "The tournament has force ended."); + this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> { + if (tournament.getTournamentState() == TournamentState.FIGHTING) { + this.plugin.getMatchManager().removeFighter(player, this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()), false); + } + this.plugin.getPlayerManager().sendToSpawnAndReset(player); + } + , 2L); + } + players.remove(); + } + } + if (this.runnables.containsKey(tournament)) { + this.runnables.get(tournament).cancel(); + } + this.tournaments.remove(id); + } + + public void addTournamentMatch(final UUID matchId, final Integer tournamentId) { + this.matches.put(matchId, tournamentId); + } + + public void removeTournamentMatch(final Match match) { + final Tournament tournament = this.getTournamentFromMatch(match.getMatchId()); + if (tournament == null) { + return; + } + tournament.removeMatch(match.getMatchId()); + this.matches.remove(match.getMatchId()); + final MatchTeam losingTeam = (match.getWinningTeamId() == 0) ? match.getTeams().get(1) : match.getTeams().get(0); + final TournamentTeam losingTournamentTeam = tournament.getPlayerTeam(losingTeam.getPlayers().get(0)); + tournament.killTeam(losingTournamentTeam); + final MatchTeam winningTeam = match.getTeams().get(match.getWinningTeamId()); + final TournamentTeam winningTournamentTeam = tournament.getPlayerTeam(winningTeam.getAlivePlayers().get(0)); + this.teamEliminated(tournament, winningTournamentTeam, losingTournamentTeam); + if (tournament.getMatches().size() == 0) { + if (tournament.getAliveTeams().size() > 1) { + tournament.setTournamentState(TournamentState.STARTING); + tournament.setCurrentRound(tournament.getCurrentRound() + 1); + tournament.setCountdown(16); + } else { + final String names = TeamUtil.getNames(winningTournamentTeam); + for (int i = 0; i <= 2; ++i) { + final String announce = ChatColor.YELLOW + "(Tournament) " + ChatColor.GREEN.toString() + "Winner: " + names + "."; + Bukkit.broadcastMessage(announce); + } + for (final UUID playerUUID : winningTournamentTeam.getAlivePlayers()) { + this.players.remove(playerUUID); + final Player tournamentPlayer = this.plugin.getServer().getPlayer(playerUUID); + this.plugin.getPlayerManager().sendToSpawnAndReset(tournamentPlayer); + } + this.plugin.getTournamentManager().removeTournament(tournament.getId(), false); + } + } + } + + public Map getTournaments() { + return this.tournaments; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/match/Match.java b/dPractice/src/main/java/me/devkevin/practice/match/Match.java new file mode 100644 index 0000000..aaa1302 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/match/Match.java @@ -0,0 +1,248 @@ +package me.devkevin.practice.match; + +import com.google.common.collect.Sets; +import io.netty.util.internal.ConcurrentSet; +import lombok.Getter; +import me.devkevin.practice.util.TimeUtil; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.block.BlockState; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.arena.StandaloneArena; +import me.devkevin.practice.inventory.InventorySnapshot; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.queue.QueueType; +import me.devkevin.practice.util.Clickable; + +import java.util.*; +import java.util.stream.Stream; + +public class Match { + + @Getter private final Practice plugin; + @Getter private final Map snapshots; + @Getter private final Set entitiesToRemove; + @Getter private final Set originalBlockChanges; + @Getter private final Set placedBlockLocations; + @Getter private final Set spectators; + @Getter private final Set runnables; + @Getter private final Set haveSpectated; + @Getter private final List teams; + @Getter private final UUID matchId; + @Getter private final QueueType type; + @Getter private final Arena arena; + @Getter private final Kit kit; + @Getter private final boolean redrover; + @Getter private StandaloneArena standaloneArena; + @Getter private MatchState matchState; + @Getter private int winningTeamId; + @Getter private int countdown; + + + public Match(final Arena arena, final Kit kit, final QueueType type, final MatchTeam... teams) { + this(arena, kit, type, false, teams); + } + + public Match(final Arena arena, final Kit kit, final QueueType type, final boolean redrover, final MatchTeam... teams) { + this.plugin = Practice.getInstance(); + this.snapshots = new HashMap(); + this.entitiesToRemove = new HashSet(); + this.originalBlockChanges = Sets.newConcurrentHashSet(); + this.placedBlockLocations = Sets.newConcurrentHashSet(); + this.spectators = (Set) new ConcurrentSet(); + this.runnables = new HashSet(); + this.haveSpectated = new HashSet(); + this.matchId = UUID.randomUUID(); + this.matchState = MatchState.STARTING; + this.countdown = 6; + this.arena = arena; + this.kit = kit; + this.type = type; + this.redrover = redrover; + this.teams = Arrays.asList(teams); + } + + public void addSpectator(final UUID uuid) { + this.spectators.add(uuid); + } + + public void removeSpectator(final UUID uuid) { + this.spectators.remove(uuid); + } + + public void addHaveSpectated(final UUID uuid) { + this.haveSpectated.add(uuid); + } + + public boolean haveSpectated(final UUID uuid) { + return this.haveSpectated.contains(uuid); + } + + public void addSnapshot(final Player player) { + this.snapshots.put(player.getUniqueId(), new InventorySnapshot(player, this)); + } + + public boolean hasSnapshot(final UUID uuid) { + return this.snapshots.containsKey(uuid); + } + + public InventorySnapshot getSnapshot(final UUID uuid) { + return this.snapshots.get(uuid); + } + + public void addEntityToRemove(final Entity entity) { + this.entitiesToRemove.add(entity); + } + + public void removeEntityToRemove(final Entity entity) { + this.entitiesToRemove.remove(entity); + } + + public void clearEntitiesToRemove() { + this.entitiesToRemove.clear(); + } + + public void addRunnable(final int id) { + this.runnables.add(id); + } + + public void addOriginalBlockChange(final BlockState blockState) { + this.originalBlockChanges.add(blockState); + } + + public void removeOriginalBlockChange(final BlockState blockState) { + this.originalBlockChanges.remove(blockState); + } + + public void addPlacedBlockLocation(final Location location) { + this.placedBlockLocations.add(location); + } + + public void removePlacedBlockLocation(final Location location) { + this.placedBlockLocations.remove(location); + } + + public void broadcastWithSound(final String message, final Sound sound) { + this.teams.forEach(team -> team.alivePlayers().forEach(player -> { + player.sendMessage(message); + player.playSound(player.getLocation(), sound, 10.0f, 1.0f); + })); + this.spectatorPlayers().forEach(spectator -> { + spectator.sendMessage(message); + spectator.playSound(spectator.getLocation(), sound, 10.0f, 1.0f); + }); + } + + public void broadcast(final String message) { + this.teams.forEach(team -> team.alivePlayers().forEach(player -> player.sendMessage(message))); + this.spectatorPlayers().forEach(spectator -> spectator.sendMessage(message)); + } + + public void broadcast(final Clickable message) { + this.teams.forEach(team -> team.alivePlayers().forEach(message::sendToPlayer)); + this.spectatorPlayers().forEach(message::sendToPlayer); + } + + public Stream spectatorPlayers() { + return this.spectators.stream().map(this.plugin.getServer()::getPlayer).filter(Objects::nonNull); + } + + public int decrementCountdown() { + return --this.countdown; + } + + public boolean isParty() { + return this.isFFA() || (this.teams.get(0).getPlayers().size() != 1 && this.teams.get(1).getPlayers().size() != 1); + } + + public boolean isPartyMatch() { + return this.isFFA() || this.teams.get(0).getPlayers().size() >= 2 || this.teams.get(1).getPlayers().size() >= 2; + } + + public boolean isFFA() { + return this.teams.size() == 1; + } + + public Map getSnapshots() { + return this.snapshots; + } + + public Set getEntitiesToRemove() { + return this.entitiesToRemove; + } + + public Set getOriginalBlockChanges() { + return this.originalBlockChanges; + } + + public Set getPlacedBlockLocations() { + return this.placedBlockLocations; + } + + public Set getSpectators() { + return this.spectators; + } + + public Set getRunnables() { + return this.runnables; + } + + public List getTeams() { + return this.teams; + } + + public UUID getMatchId() { + return this.matchId; + } + + public QueueType getType() { + return this.type; + } + + public Arena getArena() { + return this.arena; + } + + public Kit getKit() { + return this.kit; + } + + public boolean isRedrover() { + return this.redrover; + } + + public StandaloneArena getStandaloneArena() { + return this.standaloneArena; + } + + public void setStandaloneArena(final StandaloneArena standaloneArena) { + this.standaloneArena = standaloneArena; + } + + public MatchState getMatchState() { + return this.matchState; + } + + public void setMatchState(final MatchState matchState) { + this.matchState = matchState; + } + + public int getWinningTeamId() { + return this.winningTeamId; + } + + public void setWinningTeamId(final int winningTeamId) { + this.winningTeamId = winningTeamId; + } + + public int getCountdown() { + return this.countdown; + } + + public void setCountdown(final int countdown) { + this.countdown = countdown; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/match/MatchRequest.java b/dPractice/src/main/java/me/devkevin/practice/match/MatchRequest.java new file mode 100644 index 0000000..dbe2e10 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/match/MatchRequest.java @@ -0,0 +1,41 @@ +package me.devkevin.practice.match; + +import me.devkevin.practice.arena.Arena; + +import java.util.UUID; + +public class MatchRequest { + private final UUID requester; + private final UUID requested; + private final Arena arena; + private final String kitName; + private final boolean party; + + public MatchRequest(final UUID requester, final UUID requested, final Arena arena, final String kitName, final boolean party) { + this.requester = requester; + this.requested = requested; + this.arena = arena; + this.kitName = kitName; + this.party = party; + } + + public UUID getRequester() { + return this.requester; + } + + public UUID getRequested() { + return this.requested; + } + + public Arena getArena() { + return this.arena; + } + + public String getKitName() { + return this.kitName; + } + + public boolean isParty() { + return this.party; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/match/MatchState.java b/dPractice/src/main/java/me/devkevin/practice/match/MatchState.java new file mode 100644 index 0000000..59d10de --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/match/MatchState.java @@ -0,0 +1,8 @@ +package me.devkevin.practice.match; + +public enum MatchState { + STARTING, + FIGHTING, + SWITCHING, + ENDING +} diff --git a/dPractice/src/main/java/me/devkevin/practice/match/MatchTeam.java b/dPractice/src/main/java/me/devkevin/practice/match/MatchTeam.java new file mode 100644 index 0000000..63a1f9a --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/match/MatchTeam.java @@ -0,0 +1,19 @@ +package me.devkevin.practice.match; + +import me.devkevin.practice.team.KillableTeam; + +import java.util.List; +import java.util.UUID; + +public class MatchTeam extends KillableTeam { + private final int teamID; + + public MatchTeam(final UUID leader, final List players, final int teamID) { + super(leader, players); + this.teamID = teamID; + } + + public int getTeamID() { + return this.teamID; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/party/Party.java b/dPractice/src/main/java/me/devkevin/practice/party/Party.java new file mode 100644 index 0000000..d7955b8 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/party/Party.java @@ -0,0 +1,81 @@ +package me.devkevin.practice.party; + +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.match.MatchTeam; + +import java.util.*; +import java.util.stream.Stream; + +public class Party { + private final Practice plugin; + private final UUID leader; + private final Set members; + private int limit; + private boolean open; + + public Party(final UUID leader) { + this.plugin = Practice.getInstance(); + this.members = new HashSet(); + this.limit = 50; + this.leader = leader; + this.members.add(leader); + } + + public void addMember(final UUID uuid) { + this.members.add(uuid); + } + + public void removeMember(final UUID uuid) { + this.members.remove(uuid); + } + + public void broadcast(final String message) { + this.members().forEach(member -> member.sendMessage(message)); + } + + public MatchTeam[] split() { + final List teamA = new ArrayList(); + final List teamB = new ArrayList(); + for (final UUID member : this.members) { + if (teamA.size() == teamB.size()) { + teamA.add(member); + } else { + teamB.add(member); + } + } + return new MatchTeam[]{new MatchTeam(teamA.get(0), teamA, 0), new MatchTeam(teamB.get(0), teamB, 1)}; + } + + public Stream members() { + return this.members.stream().map(this.plugin.getServer()::getPlayer).filter(Objects::nonNull); + } + + public Practice getPlugin() { + return this.plugin; + } + + public UUID getLeader() { + return this.leader; + } + + public Set getMembers() { + return this.members; + } + + public int getLimit() { + return this.limit; + } + + public void setLimit(final int limit) { + this.limit = limit; + } + + public boolean isOpen() { + return this.open; + } + + public void setOpen(final boolean open) { + this.open = open; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/player/OfflinePlayerData.java b/dPractice/src/main/java/me/devkevin/practice/player/OfflinePlayerData.java new file mode 100644 index 0000000..219d13b --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/player/OfflinePlayerData.java @@ -0,0 +1,81 @@ +package me.devkevin.practice.player; + +import me.devkevin.practice.Practice; +import me.devkevin.practice.kit.Kit; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class OfflinePlayerData +{ + private final UUID uniqueId; + private final Map rankedLosses; + private final Map rankedWins; + private final Map rankedElo; + + public OfflinePlayerData(final UUID uniqueId) { + this.rankedLosses = new HashMap(); + this.rankedWins = new HashMap(); + this.rankedElo = new HashMap(); + this.uniqueId = uniqueId; + } + + public int getWins(final String kitName) { + return this.rankedWins.computeIfAbsent(kitName, k -> 0); + } + + public void setWins(final String kitName, final int wins) { + this.rankedWins.put(kitName, wins); + } + + public int getLosses(final String kitName) { + return this.rankedLosses.computeIfAbsent(kitName, k -> 0); + } + + public void setLosses(final String kitName, final int losses) { + this.rankedLosses.put(kitName, losses); + } + + public int getElo(final String kitName) { + return this.rankedElo.computeIfAbsent(kitName, k -> 1000); + } + + public void setElo(final String kitName, final int elo) { + this.rankedElo.put(kitName, elo); + } + + public int getGlobalStats(final String type) { + int i = 0; + int count = 0; + for (final Kit kit : Practice.getInstance().getKitManager().getKits()) { + final String upperCase = type.toUpperCase(); + switch (upperCase) { + case "ELO": { + i += this.getElo(kit.getName()); + break; + } + case "WINS": { + i += this.getWins(kit.getName()); + break; + } + case "LOSSES": { + i += this.getLosses(kit.getName()); + break; + } + } + ++count; + } + if (i == 0) { + i = 1; + } + if (count == 0) { + count = 1; + } + return type.toUpperCase().equalsIgnoreCase("ELO") ? Math.round(i / count) : i; + } + + public UUID getUniqueId() { + return this.uniqueId; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/player/PlayerData.java b/dPractice/src/main/java/me/devkevin/practice/player/PlayerData.java new file mode 100644 index 0000000..1d29357 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/player/PlayerData.java @@ -0,0 +1,325 @@ +package me.devkevin.practice.player; + +import me.devkevin.practice.Practice; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.kit.PlayerKit; +import me.devkevin.practice.settings.ProfileOptions; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class PlayerData { + public static final int DEFAULT_ELO = 1000; + private final Map> playerKits; + private final Map rankedLosses; + private final Map rankedWins; + private final Map rankedElo; + private final Map partyElo; + private final UUID uniqueId; + private PlayerState playerState; + private UUID currentMatchID; + private UUID duelSelecting; + private ProfileOptions options; + private int eloRange; + private int pingRange; + private int teamID; + private int rematchID; + private int missedPots; + private int longestCombo; + private int combo; + private int hits; + private int oitcEventKills; + private int oitcEventDeaths; + private int oitcEventWins; + private int oitcEventLosses; + private int sumoEventWins; + private int sumoEventLosses; + private int parkourEventWins; + private int parkourEventLosses; + private int redroverEventWins; + private int redroverEventLosses; + + public PlayerData(final UUID uniqueId) { + this.playerKits = new HashMap<>(); + this.rankedLosses = new HashMap<>(); + this.rankedWins = new HashMap<>(); + this.rankedElo = new HashMap<>(); + this.partyElo = new HashMap<>(); + this.playerState = PlayerState.LOADING; + this.options = new ProfileOptions(); + this.eloRange = 250; + this.pingRange = 50; + this.teamID = -1; + this.rematchID = -1; + this.uniqueId = uniqueId; + } + + public int getWins(final String kitName) { + return this.rankedWins.computeIfAbsent(kitName, k -> 0); + } + + public void setWins(final String kitName, final int wins) { + this.rankedWins.put(kitName, wins); + } + + public int getLosses(final String kitName) { + return this.rankedLosses.computeIfAbsent(kitName, k -> 0); + } + + public void setLosses(final String kitName, final int losses) { + this.rankedLosses.put(kitName, losses); + } + + public int getElo(final String kitName) { + return this.rankedElo.computeIfAbsent(kitName, k -> 1000); + } + + public void setElo(final String kitName, final int elo) { + this.rankedElo.put(kitName, elo); + } + + public int getPartyElo(final String kitName) { + return this.partyElo.computeIfAbsent(kitName, k -> 1000); + } + + public void setPartyElo(final String kitName, final int elo) { + this.partyElo.put(kitName, elo); + } + + public void addPlayerKit(final int index, final PlayerKit playerKit) { + this.getPlayerKits(playerKit.getName()).put(index, playerKit); + } + + public Map getPlayerKits(final String kitName) { + return this.playerKits.computeIfAbsent(kitName, k -> new HashMap<>()); + } + + public int getGlobalStats(final String type) { + int i = 0; + int count = 0; + for (final Kit kit : Practice.getInstance().getKitManager().getKits()) { + final String upperCase = type.toUpperCase(); + int n = -1; + switch (upperCase.hashCode()) { + case 68744: + if (upperCase.equals("ELO")) { + n = 0; + break; + } + break; + case 2664471: + if (upperCase.equals("WINS")) { + n = 1; + break; + } + break; + case -2043639023: + if (upperCase.equals("LOSSES")) { + n = 2; + break; + } + break; + } + switch (n) { + case 0: + i += this.getElo(kit.getName()); + break; + case 1: + i += this.getWins(kit.getName()); + break; + case 2: + i += this.getLosses(kit.getName()); + break; + } + ++count; + } + if (i == 0) { + i = 1; + } + if (count == 0) { + count = 1; + } + return type.toUpperCase().equalsIgnoreCase("ELO") ? Math.round(i / count) : i; + } + + public UUID getUniqueId() { + return this.uniqueId; + } + + public PlayerState getPlayerState() { + return this.playerState; + } + + public void setPlayerState(final PlayerState playerState) { + this.playerState = playerState; + } + + public UUID getCurrentMatchID() { + return this.currentMatchID; + } + + public void setCurrentMatchID(final UUID currentMatchID) { + this.currentMatchID = currentMatchID; + } + + public UUID getDuelSelecting() { + return this.duelSelecting; + } + + public void setDuelSelecting(final UUID duelSelecting) { + this.duelSelecting = duelSelecting; + } + + public ProfileOptions getOptions() { + return this.options; + } + + public void setOptions(final ProfileOptions options) { + this.options = options; + } + + public int getEloRange() { + return this.eloRange; + } + + public void setEloRange(final int eloRange) { + this.eloRange = eloRange; + } + + public int getPingRange() { + return this.pingRange; + } + + public void setPingRange(final int pingRange) { + this.pingRange = pingRange; + } + + public int getTeamID() { + return this.teamID; + } + + public void setTeamID(final int teamID) { + this.teamID = teamID; + } + + public int getRematchID() { + return this.rematchID; + } + + public void setRematchID(final int rematchID) { + this.rematchID = rematchID; + } + + public int getMissedPots() { + return this.missedPots; + } + + public void setMissedPots(final int missedPots) { + this.missedPots = missedPots; + } + + public int getLongestCombo() { + return this.longestCombo; + } + + public void setLongestCombo(final int longestCombo) { + this.longestCombo = longestCombo; + } + + public int getCombo() { + return this.combo; + } + + public void setCombo(final int combo) { + this.combo = combo; + } + + public int getHits() { + return this.hits; + } + + public void setHits(final int hits) { + this.hits = hits; + } + + public int getOitcEventKills() { + return this.oitcEventKills; + } + + public void setOitcEventKills(final int oitcEventKills) { + this.oitcEventKills = oitcEventKills; + } + + public int getOitcEventDeaths() { + return this.oitcEventDeaths; + } + + public void setOitcEventDeaths(final int oitcEventDeaths) { + this.oitcEventDeaths = oitcEventDeaths; + } + + public int getOitcEventWins() { + return this.oitcEventWins; + } + + public void setOitcEventWins(final int oitcEventWins) { + this.oitcEventWins = oitcEventWins; + } + + public int getOitcEventLosses() { + return this.oitcEventLosses; + } + + public void setOitcEventLosses(final int oitcEventLosses) { + this.oitcEventLosses = oitcEventLosses; + } + + public int getSumoEventWins() { + return this.sumoEventWins; + } + + public void setSumoEventWins(final int sumoEventWins) { + this.sumoEventWins = sumoEventWins; + } + + public int getSumoEventLosses() { + return this.sumoEventLosses; + } + + public void setSumoEventLosses(final int sumoEventLosses) { + this.sumoEventLosses = sumoEventLosses; + } + + public int getParkourEventWins() { + return this.parkourEventWins; + } + + public void setParkourEventWins(final int parkourEventWins) { + this.parkourEventWins = parkourEventWins; + } + + public int getParkourEventLosses() { + return this.parkourEventLosses; + } + + public void setParkourEventLosses(final int parkourEventLosses) { + this.parkourEventLosses = parkourEventLosses; + } + + public int getRedroverEventWins() { + return this.redroverEventWins; + } + + public void setRedroverEventWins(final int redroverEventWins) { + this.redroverEventWins = redroverEventWins; + } + + public int getRedroverEventLosses() { + return this.redroverEventLosses; + } + + public void setRedroverEventLosses(final int redroverEventLosses) { + this.redroverEventLosses = redroverEventLosses; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/player/PlayerState.java b/dPractice/src/main/java/me/devkevin/practice/player/PlayerState.java new file mode 100644 index 0000000..abfd122 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/player/PlayerState.java @@ -0,0 +1,12 @@ +package me.devkevin.practice.player; + +public enum PlayerState { + LOADING, + SPAWN, + EDITING, + SPECTATING, + QUEUE, + FIGHTING, + FFA, + EVENT +} diff --git a/dPractice/src/main/java/me/devkevin/practice/queue/QueueEntry.java b/dPractice/src/main/java/me/devkevin/practice/queue/QueueEntry.java new file mode 100644 index 0000000..6b0eb7c --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/queue/QueueEntry.java @@ -0,0 +1,31 @@ +package me.devkevin.practice.queue; + +public class QueueEntry { + private final QueueType queueType; + private final String kitName; + private final int elo; + private final boolean party; + + public QueueEntry(final QueueType queueType, final String kitName, final int elo, final boolean party) { + this.queueType = queueType; + this.kitName = kitName; + this.elo = elo; + this.party = party; + } + + public QueueType getQueueType() { + return this.queueType; + } + + public String getKitName() { + return this.kitName; + } + + public int getElo() { + return this.elo; + } + + public boolean isParty() { + return this.party; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/queue/QueueType.java b/dPractice/src/main/java/me/devkevin/practice/queue/QueueType.java new file mode 100644 index 0000000..433b66c --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/queue/QueueType.java @@ -0,0 +1,20 @@ +package me.devkevin.practice.queue; + +public enum QueueType { + UNRANKED("Unranked"), + RANKED("Ranked"); + + private final String name; + + QueueType(final String name) { + this.name = name; + } + + public boolean isRanked() { + return this != QueueType.UNRANKED; + } + + public String getName() { + return this.name; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/ArenaCommandRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/ArenaCommandRunnable.java new file mode 100644 index 0000000..16112fd --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/ArenaCommandRunnable.java @@ -0,0 +1,66 @@ +package me.devkevin.practice.runnable; + +import me.devkevin.practice.CustomLocation; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; +import me.devkevin.practice.arena.StandaloneArena; + +public class ArenaCommandRunnable implements Runnable { + private final Practice plugin; + private final Arena copiedArena; + private int times; + + public ArenaCommandRunnable(final Practice plugin, final Arena copiedArena, final int times) { + this.plugin = plugin; + this.copiedArena = copiedArena; + this.times = times; + } + + @Override + public void run() { + this.duplicateArena(this.copiedArena, 10000, 10000); + } + + private void duplicateArena(final Arena arena, final int offsetX, final int offsetZ) { + new DuplicateArenaRunnable(this.plugin, arena, offsetX, offsetZ, 500, 500) { + @Override + public void onComplete() { + final double minX = arena.getMin().getX() + this.getOffsetX(); + final double minZ = arena.getMin().getZ() + this.getOffsetZ(); + final double maxX = arena.getMax().getX() + this.getOffsetX(); + final double maxZ = arena.getMax().getZ() + this.getOffsetZ(); + final double aX = arena.getA().getX() + this.getOffsetX(); + final double aZ = arena.getA().getZ() + this.getOffsetZ(); + final double bX = arena.getB().getX() + this.getOffsetX(); + final double bZ = arena.getB().getZ() + this.getOffsetZ(); + final CustomLocation min = new CustomLocation(minX, arena.getMin().getY(), minZ, arena.getMin().getYaw(), arena.getMin().getPitch()); + final CustomLocation max = new CustomLocation(maxX, arena.getMax().getY(), maxZ, arena.getMax().getYaw(), arena.getMax().getPitch()); + final CustomLocation a = new CustomLocation(aX, arena.getA().getY(), aZ, arena.getA().getYaw(), arena.getA().getPitch()); + final CustomLocation b = new CustomLocation(bX, arena.getB().getY(), bZ, arena.getA().getYaw(), arena.getA().getPitch()); + final StandaloneArena standaloneArena = new StandaloneArena(a, b, min, max); + arena.addStandaloneArena(standaloneArena); + arena.addAvailableArena(standaloneArena); + if (--ArenaCommandRunnable.this.times > 0) { + ArenaCommandRunnable.this.plugin.getServer().getLogger().info("Placed a standalone arena of " + arena.getName() + " at " + (int) minX + ", " + (int) minZ + ". " + ArenaCommandRunnable.this.times + " arenas remaining."); + ArenaCommandRunnable.this.duplicateArena(arena, (int) Math.round(maxX), (int) Math.round(maxZ)); + } else { + ArenaCommandRunnable.this.plugin.getServer().getLogger().info("Finished pasting " + ArenaCommandRunnable.this.copiedArena.getName() + "'s standalone arenas."); + ArenaCommandRunnable.this.plugin.getArenaManager().setGeneratingArenaRunnables(ArenaCommandRunnable.this.plugin.getArenaManager().getGeneratingArenaRunnables() - 1); + this.getPlugin().getArenaManager().reloadArenas(); + } + } + }.run(); + } + + public Practice getPlugin() { + return this.plugin; + } + + public Arena getCopiedArena() { + return this.copiedArena; + } + + public int getTimes() { + return this.times; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/BlockPlaceRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/BlockPlaceRunnable.java new file mode 100644 index 0000000..34f4d47 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/BlockPlaceRunnable.java @@ -0,0 +1,86 @@ +package me.devkevin.practice.runnable; + +import com.boydti.fawe.util.EditSessionBuilder; +import com.boydti.fawe.util.TaskManager; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BaseBlock; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +public abstract class BlockPlaceRunnable extends BukkitRunnable { + private final ConcurrentMap blocks; + private final int totalBlocks; + private final Iterator iterator; + private World world; + private int blockIndex; + private int blocksPlaced; + private boolean completed; + + public BlockPlaceRunnable(final World world, final Map blocks) { + this.blockIndex = 0; + this.blocksPlaced = 0; + this.completed = false; + this.world = world; + (this.blocks = new ConcurrentHashMap()).putAll(blocks); + this.totalBlocks = blocks.keySet().size(); + this.iterator = blocks.keySet().iterator(); + } + + public void run() { + if (this.blocks.isEmpty() || !this.iterator.hasNext()) { + this.finish(); + this.completed = true; + this.cancel(); + return; + } + TaskManager.IMP.async(() -> { + EditSession editSession = new EditSessionBuilder(this.world.getName()).fastmode(true).allowedRegionsEverywhere().autoQueue(false).limitUnlimited().build(); + for (Map.Entry entry : this.blocks.entrySet()) { + try { + editSession.setBlock(new Vector((double)((Location)entry.getKey()).getBlockX(), (double)((Location)entry.getKey()).getBlockY(), ((Location)entry.getKey()).getZ()), new BaseBlock(((Block)entry.getValue()).getTypeId(), (int)((Block)entry.getValue()).getData())); + } + catch (Exception exception) {} + } + editSession.flushQueue(); + TaskManager.IMP.task(this.blocks::clear); + }); + } + + public abstract void finish(); + + public World getWorld() { + return this.world; + } + + public ConcurrentMap getBlocks() { + return this.blocks; + } + + public int getTotalBlocks() { + return this.totalBlocks; + } + + public Iterator getIterator() { + return this.iterator; + } + + public int getBlockIndex() { + return this.blockIndex; + } + + public int getBlocksPlaced() { + return this.blocksPlaced; + } + + public boolean isCompleted() { + return this.completed; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/DuplicateArenaRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/DuplicateArenaRunnable.java new file mode 100644 index 0000000..309a413 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/DuplicateArenaRunnable.java @@ -0,0 +1,123 @@ +package me.devkevin.practice.runnable; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.Practice; +import me.devkevin.practice.arena.Arena; + +import java.util.HashMap; +import java.util.Map; + +public abstract class DuplicateArenaRunnable extends BukkitRunnable { + private final Practice plugin; + private Arena copiedArena; + private int offsetX; + private int offsetZ; + private int incrementX; + private int incrementZ; + private Map paste; + + public DuplicateArenaRunnable(final Practice plugin, final Arena copiedArena, final int offsetX, final int offsetZ, final int incrementX, final int incrementZ) { + this.plugin = plugin; + this.copiedArena = copiedArena; + this.offsetX = offsetX; + this.offsetZ = offsetZ; + this.incrementX = incrementX; + this.incrementZ = incrementZ; + } + + public void run() { + if (this.paste == null) { + final Map copy = this.blocksFromTwoPoints(this.copiedArena.getMin().toBukkitLocation(), this.copiedArena.getMax().toBukkitLocation()); + this.paste = new HashMap(); + for (final Location loc : copy.keySet()) { + if (copy.get(loc).getType() != Material.AIR) { + this.paste.put(loc.clone().add((double) this.offsetX, 0.0, (double) this.offsetZ), copy.get(loc)); + } + } + copy.clear(); + } else { + final Map newPaste = new HashMap(); + for (final Location loc : this.paste.keySet()) { + if (this.paste.get(loc).getType() != Material.AIR) { + newPaste.put(loc.clone().add((double) this.incrementX, 0.0, (double) this.incrementZ), this.paste.get(loc)); + } + } + this.paste.clear(); + this.paste.putAll(newPaste); + } + boolean safe = true; + for (final Location loc : this.paste.keySet()) { + final Block block = loc.getBlock(); + if (block.getType() != Material.AIR) { + safe = false; + break; + } + } + if (!safe) { + this.offsetX += this.incrementX; + this.offsetZ += this.incrementZ; + this.run(); + return; + } + new BlockPlaceRunnable(this.copiedArena.getA().toBukkitLocation().getWorld(), this.paste) { + @Override + public void finish() { + DuplicateArenaRunnable.this.onComplete(); + } + }.runTaskTimer(this.plugin, 0L, 5L); + } + + public Map blocksFromTwoPoints(final Location loc1, final Location loc2) { + final Map blocks = new HashMap(); + final int topBlockX = (loc1.getBlockX() < loc2.getBlockX()) ? loc2.getBlockX() : loc1.getBlockX(); + final int bottomBlockX = (loc1.getBlockX() > loc2.getBlockX()) ? loc2.getBlockX() : loc1.getBlockX(); + final int topBlockY = (loc1.getBlockY() < loc2.getBlockY()) ? loc2.getBlockY() : loc1.getBlockY(); + final int bottomBlockY = (loc1.getBlockY() > loc2.getBlockY()) ? loc2.getBlockY() : loc1.getBlockY(); + final int topBlockZ = (loc1.getBlockZ() < loc2.getBlockZ()) ? loc2.getBlockZ() : loc1.getBlockZ(); + final int bottomBlockZ = (loc1.getBlockZ() > loc2.getBlockZ()) ? loc2.getBlockZ() : loc1.getBlockZ(); + for (int x = bottomBlockX; x <= topBlockX; ++x) { + for (int z = bottomBlockZ; z <= topBlockZ; ++z) { + for (int y = bottomBlockY; y <= topBlockY; ++y) { + final Block block = loc1.getWorld().getBlockAt(x, y, z); + if (block.getType() != Material.AIR) { + blocks.put(new Location(loc1.getWorld(), (double) x, (double) y, (double) z), block); + } + } + } + } + return blocks; + } + + public abstract void onComplete(); + + public Practice getPlugin() { + return this.plugin; + } + + public Arena getCopiedArena() { + return this.copiedArena; + } + + public int getOffsetX() { + return this.offsetX; + } + + public int getOffsetZ() { + return this.offsetZ; + } + + public int getIncrementX() { + return this.incrementX; + } + + public int getIncrementZ() { + return this.incrementZ; + } + + public Map getPaste() { + return this.paste; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/ExpBarRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/ExpBarRunnable.java new file mode 100644 index 0000000..8c88dff --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/ExpBarRunnable.java @@ -0,0 +1,63 @@ +package me.devkevin.practice.runnable; + +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.events.PracticeEvent; +import me.devkevin.practice.events.oitc.OITCEvent; +import me.devkevin.practice.events.oitc.OITCPlayer; +import me.devkevin.practice.events.parkour.ParkourEvent; +import me.devkevin.practice.events.parkour.ParkourPlayer; +import me.devkevin.practice.util.timer.impl.EnderpearlTimer; + +import java.util.UUID; + +public class ExpBarRunnable implements Runnable { + private final Practice plugin; + + public ExpBarRunnable() { + this.plugin = Practice.getInstance(); + } + + @Override + public void run() { + final EnderpearlTimer timer = Practice.getInstance().getTimerManager().getTimer(EnderpearlTimer.class); + for (final UUID uuid : timer.getCooldowns().keySet()) { + final Player player = this.plugin.getServer().getPlayer(uuid); + if (player != null) { + final long time = timer.getRemaining(player); + final int seconds = (int) Math.round((double) time / 1000.0); + player.setLevel(seconds); + player.setExp((float) time / 15000.0f); + } + } + for (final Player player2 : this.plugin.getServer().getOnlinePlayers()) { + final PracticeEvent event = this.plugin.getEventManager().getEventPlaying(player2); + if (event != null && event instanceof OITCEvent) { + final OITCEvent oitcEvent = (OITCEvent) event; + final OITCPlayer oitcPlayer = oitcEvent.getPlayer(player2.getUniqueId()); + if (oitcPlayer == null || oitcPlayer.getState() == OITCPlayer.OITCState.WAITING || oitcEvent.getGameTask() == null) { + continue; + } + final int seconds = oitcEvent.getGameTask().getTime(); + if (seconds < 0) { + continue; + } + player2.setLevel(seconds); + } else { + if (event == null || !(event instanceof ParkourEvent)) { + continue; + } + final ParkourEvent parkourEvent = (ParkourEvent) event; + final ParkourPlayer parkourPlayer = parkourEvent.getPlayer(player2.getUniqueId()); + if (parkourPlayer == null || parkourPlayer.getState() == ParkourPlayer.ParkourState.WAITING || parkourEvent.getGameTask() == null) { + continue; + } + final int seconds = parkourEvent.getGameTask().getTime(); + if (seconds < 0) { + continue; + } + player2.setLevel(seconds); + } + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/ItemDespawnRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/ItemDespawnRunnable.java new file mode 100644 index 0000000..aa4485e --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/ItemDespawnRunnable.java @@ -0,0 +1,27 @@ +package me.devkevin.practice.runnable; + +import org.bukkit.entity.Item; +import me.devkevin.practice.Practice; + +import java.util.Iterator; + +public class ItemDespawnRunnable implements Runnable { + private final Practice plugin; + + public ItemDespawnRunnable() { + this.plugin = Practice.getInstance(); + } + + @Override + public void run() { + final Iterator it = this.plugin.getFfaManager().getItemTracker().keySet().iterator(); + while (it.hasNext()) { + final Item item = it.next(); + final long l = this.plugin.getFfaManager().getItemTracker().get(item); + if (l + 15000L < System.currentTimeMillis()) { + item.remove(); + it.remove(); + } + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/MatchResetRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/MatchResetRunnable.java new file mode 100644 index 0000000..ad3354d --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/MatchResetRunnable.java @@ -0,0 +1,44 @@ +package me.devkevin.practice.runnable; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.Practice; +import me.devkevin.practice.match.Match; + +public class MatchResetRunnable extends BukkitRunnable { + private final Practice plugin; + private final Match match; + + public MatchResetRunnable(final Match match) { + this.plugin = Practice.getInstance(); + this.match = match; + } + + public void run() { + int count = 0; + if (this.match.getKit().isBuild()) { + for (final Location location : this.match.getPlacedBlockLocations()) { + if (++count > 15) { + break; + } + location.getBlock().setType(Material.AIR); + this.match.removePlacedBlockLocation(location); + } + } else { + for (final BlockState blockState : this.match.getOriginalBlockChanges()) { + if (++count > 15) { + break; + } + blockState.getLocation().getBlock().setType(blockState.getType()); + this.match.removeOriginalBlockChange(blockState); + } + } + if (count < 15) { + this.match.getArena().addAvailableArena(this.match.getStandaloneArena()); + this.plugin.getArenaManager().removeArenaMatchUUID(this.match.getStandaloneArena()); + this.cancel(); + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/MatchRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/MatchRunnable.java new file mode 100644 index 0000000..8935422 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/MatchRunnable.java @@ -0,0 +1,64 @@ +package me.devkevin.practice.runnable; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.Practice; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchState; + +public class MatchRunnable extends BukkitRunnable { + private final Practice plugin; + private final Match match; + + public MatchRunnable(final Match match) { + this.plugin = Practice.getInstance(); + this.match = match; + } + + public void run() { + switch (this.match.getMatchState()) { + case STARTING: + if (this.match.decrementCountdown() != 0) { + this.match.broadcast(ChatColor.GREEN + "Starting in " + ChatColor.YELLOW + this.match.getCountdown() + ChatColor.GREEN + " seconds!"); + break; + } + this.match.setMatchState(MatchState.FIGHTING); + this.match.broadcast(ChatColor.GREEN + "The match has started, good luck!"); + if (this.match.isRedrover()) { + this.plugin.getMatchManager().pickPlayer(this.match); + break; + } + break; + case SWITCHING: + if (this.match.decrementCountdown() == 0) { + this.match.getEntitiesToRemove().forEach(Entity::remove); + this.match.clearEntitiesToRemove(); + this.match.setMatchState(MatchState.FIGHTING); + this.plugin.getMatchManager().pickPlayer(this.match); + break; + } + break; + case ENDING: + if (this.match.decrementCountdown() == 0) { + this.plugin.getTournamentManager().removeTournamentMatch(this.match); + this.match.getRunnables().forEach(id -> this.plugin.getServer().getScheduler().cancelTask(id)); + this.match.getEntitiesToRemove().forEach(Entity::remove); + this.match.getTeams().forEach(team -> team.alivePlayers().forEach(this.plugin.getPlayerManager()::sendToSpawnAndReset)); + this.match.spectatorPlayers().forEach(this.plugin.getMatchManager()::removeSpectator); + this.match.getPlacedBlockLocations().forEach(location -> location.getBlock().setType(Material.AIR)); + this.match.getOriginalBlockChanges().forEach(blockState -> blockState.getLocation().getBlock().setType(blockState.getType())); + if (this.match.getKit().isBuild() || this.match.getKit().isSpleef()) { + this.match.getArena().addAvailableArena(this.match.getStandaloneArena()); + this.plugin.getArenaManager().removeArenaMatchUUID(this.match.getStandaloneArena()); + } + this.plugin.getMatchManager().removeMatch(this.match); + new MatchResetRunnable(this.match).runTaskTimer(this.plugin, 20L, 20L); + this.cancel(); + break; + } + break; + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/RematchRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/RematchRunnable.java new file mode 100644 index 0000000..8437c4a --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/RematchRunnable.java @@ -0,0 +1,32 @@ +package me.devkevin.practice.runnable; + +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; + +import java.util.UUID; + +public class RematchRunnable implements Runnable { + private final Practice plugin; + private final UUID playerUUID; + + public RematchRunnable(final UUID playerUUID) { + this.plugin = Practice.getInstance(); + this.playerUUID = playerUUID; + } + + @Override + public void run() { + final Player player = this.plugin.getServer().getPlayer(this.playerUUID); + if (player != null) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData != null && playerData.getPlayerState() == PlayerState.SPAWN && this.plugin.getMatchManager().isRematching(player.getUniqueId()) && this.plugin.getPartyManager().getParty(player.getUniqueId()) == null) { + player.getInventory().setItem(3, null); + player.updateInventory(); + playerData.setRematchID(-1); + } + this.plugin.getMatchManager().removeRematch(this.playerUUID); + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/SaveDataRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/SaveDataRunnable.java new file mode 100644 index 0000000..d779684 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/SaveDataRunnable.java @@ -0,0 +1,19 @@ +package me.devkevin.practice.runnable; + +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; + +public class SaveDataRunnable implements Runnable { + private final Practice plugin; + + public SaveDataRunnable() { + this.plugin = Practice.getInstance(); + } + + @Override + public void run() { + for (final PlayerData playerData : this.plugin.getPlayerManager().getAllData()) { + this.plugin.getPlayerManager().saveData(playerData); + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/runnable/TournamentRunnable.java b/dPractice/src/main/java/me/devkevin/practice/runnable/TournamentRunnable.java new file mode 100644 index 0000000..26dccb4 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/runnable/TournamentRunnable.java @@ -0,0 +1,120 @@ +package me.devkevin.practice.runnable; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.Practice; +import me.devkevin.practice.kit.Kit; +import me.devkevin.practice.match.Match; +import me.devkevin.practice.match.MatchTeam; +import me.devkevin.practice.party.Party; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.player.PlayerState; +import me.devkevin.practice.queue.QueueType; +import me.devkevin.practice.tournament.Tournament; +import me.devkevin.practice.tournament.TournamentState; +import me.devkevin.practice.tournament.TournamentTeam; + +import java.util.*; + +public class TournamentRunnable extends BukkitRunnable { + private final Practice plugin; + private final Tournament tournament; + + public TournamentRunnable(final Tournament tournament) { + this.plugin = Practice.getInstance(); + this.tournament = tournament; + } + + public void run() { + if (this.tournament.getTournamentState() == TournamentState.STARTING) { + final int countdown = this.tournament.decrementCountdown(); + if (countdown == 0) { + if (this.tournament.getCurrentRound() == 1) { + final Set players = (Set) Sets.newConcurrentHashSet((Iterable) this.tournament.getPlayers()); + for (final UUID player : players) { + final Party party = this.plugin.getPartyManager().getParty(player); + if (party != null) { + final TournamentTeam team = new TournamentTeam(party.getLeader(), Lists.newArrayList((Iterable) party.getMembers())); + this.tournament.addAliveTeam(team); + for (final UUID member : party.getMembers()) { + players.remove(member); + this.tournament.setPlayerTeam(member, team); + } + } + } + List currentTeam = null; + for (final UUID player2 : players) { + if (currentTeam == null) { + currentTeam = new ArrayList(); + } + currentTeam.add(player2); + if (currentTeam.size() == this.tournament.getTeamSize()) { + final TournamentTeam team = new TournamentTeam(currentTeam.get(0), currentTeam); + this.tournament.addAliveTeam(team); + for (final UUID teammate : team.getPlayers()) { + this.tournament.setPlayerTeam(teammate, team); + } + currentTeam = null; + } + } + } + final List teams = this.tournament.getAliveTeams(); + Collections.shuffle(teams); + for (int i = 0; i < teams.size(); i += 2) { + final TournamentTeam teamA = teams.get(i); + if (teams.size() > i + 1) { + final TournamentTeam teamB = teams.get(i + 1); + for (final UUID playerUUID : teamA.getAlivePlayers()) { + this.removeSpectator(playerUUID); + } + for (final UUID playerUUID : teamB.getAlivePlayers()) { + this.removeSpectator(playerUUID); + } + final MatchTeam matchTeamA = new MatchTeam(teamA.getLeader(), new ArrayList(teamA.getAlivePlayers()), 0); + final MatchTeam matchTeamB = new MatchTeam(teamB.getLeader(), new ArrayList(teamB.getAlivePlayers()), 1); + final Kit kit = this.plugin.getKitManager().getKit(this.tournament.getKitName()); + final Match match = new Match(this.plugin.getArenaManager().getRandomArena(kit), kit, QueueType.UNRANKED, matchTeamA, matchTeamB); + final Player leaderA = this.plugin.getServer().getPlayer(teamA.getLeader()); + final Player leaderB = this.plugin.getServer().getPlayer(teamB.getLeader()); + match.broadcast(ChatColor.YELLOW + "Starting tournament match. " + ChatColor.GREEN + "(" + leaderA.getName() + " vs " + leaderB.getName() + ")"); + this.plugin.getServer().getScheduler().runTask(this.plugin, () -> { + this.plugin.getMatchManager().createMatch(match); + this.tournament.addMatch(match.getMatchId()); + this.plugin.getTournamentManager().addTournamentMatch(match.getMatchId(), this.tournament.getId()); + return; + }); + } else { + for (final UUID playerUUID2 : teamA.getAlivePlayers()) { + final Player player3 = this.plugin.getServer().getPlayer(playerUUID2); + player3.sendMessage(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"); + player3.sendMessage(ChatColor.YELLOW + "You have been skipped to the next round."); + player3.sendMessage(ChatColor.YELLOW + "There was no matching team for you."); + player3.sendMessage(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"); + } + } + } + this.tournament.broadcast(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"); + this.tournament.broadcast(ChatColor.YELLOW.toString() + ChatColor.BOLD + "TOURNAMENT (" + this.tournament.getTeamSize() + "v" + this.tournament.getTeamSize() + ") " + this.tournament.getKitName()); + this.tournament.broadcast(ChatColor.GOLD.toString() + ChatColor.BOLD + "* " + ChatColor.WHITE + "Starting Round #" + this.tournament.getCurrentRound()); + this.tournament.broadcast(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "----------------------------------------------------"); + this.tournament.setTournamentState(TournamentState.FIGHTING); + } else if (countdown <= 5) { + final String announce = ChatColor.YELLOW + "(Tournament) " + ChatColor.GREEN + "Round #" + this.tournament.getCurrentRound() + " is starting in " + ChatColor.YELLOW + countdown + ChatColor.GREEN + "."; + this.tournament.broadcast(announce); + } + } + } + + private void removeSpectator(final UUID playerUUID) { + final Player player = this.plugin.getServer().getPlayer(playerUUID); + if (player != null) { + final PlayerData playerData = this.plugin.getPlayerManager().getPlayerData(player.getUniqueId()); + if (playerData.getPlayerState() == PlayerState.SPECTATING) { + this.plugin.getMatchManager().removeSpectator(player); + } + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/settings/ProfileOptions.java b/dPractice/src/main/java/me/devkevin/practice/settings/ProfileOptions.java new file mode 100644 index 0000000..e3243c9 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/settings/ProfileOptions.java @@ -0,0 +1,77 @@ +package me.devkevin.practice.settings; + +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; +import me.devkevin.practice.settings.item.ProfileOptionsItem; +import me.devkevin.practice.settings.item.ProfileOptionsItemState; + +public class ProfileOptions { + private boolean duelRequests; + private boolean partyInvites; + private boolean spectators; + private ProfileOptionsItemState scoreboard; + private ProfileOptionsItemState time; + + public ProfileOptions() { + this.duelRequests = true; + this.partyInvites = true; + this.spectators = true; + this.scoreboard = ProfileOptionsItemState.SHOW_PING; + this.time = ProfileOptionsItemState.DAY; + } + + public Inventory getInventory() { + final Inventory toReturn = Bukkit.createInventory(null, 9, "Settings"); + toReturn.setItem(0, ProfileOptionsItem.DUEL_REQUESTS.getItem(this.duelRequests ? ProfileOptionsItemState.ENABLED : ProfileOptionsItemState.DISABLED)); + toReturn.setItem(2, ProfileOptionsItem.PARTY_INVITES.getItem(this.partyInvites ? ProfileOptionsItemState.ENABLED : ProfileOptionsItemState.DISABLED)); + toReturn.setItem(4, ProfileOptionsItem.ALLOW_SPECTATORS.getItem(this.spectators ? ProfileOptionsItemState.ENABLED : ProfileOptionsItemState.DISABLED)); + toReturn.setItem(6, ProfileOptionsItem.TOGGLE_SCOREBOARD.getItem(this.scoreboard)); + toReturn.setItem(8, ProfileOptionsItem.TOGGLE_TIME.getItem(this.time)); + return toReturn; + } + + public boolean isDuelRequests() { + return this.duelRequests; + } + + public ProfileOptions setDuelRequests(final boolean duelRequests) { + this.duelRequests = duelRequests; + return this; + } + + public boolean isPartyInvites() { + return this.partyInvites; + } + + public ProfileOptions setPartyInvites(final boolean partyInvites) { + this.partyInvites = partyInvites; + return this; + } + + public boolean isSpectators() { + return this.spectators; + } + + public ProfileOptions setSpectators(final boolean spectators) { + this.spectators = spectators; + return this; + } + + public ProfileOptionsItemState getScoreboard() { + return this.scoreboard; + } + + public ProfileOptions setScoreboard(final ProfileOptionsItemState scoreboard) { + this.scoreboard = scoreboard; + return this; + } + + public ProfileOptionsItemState getTime() { + return this.time; + } + + public ProfileOptions setTime(final ProfileOptionsItemState time) { + this.time = time; + return this; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/settings/ProfileOptionsListeners.java b/dPractice/src/main/java/me/devkevin/practice/settings/ProfileOptionsListeners.java new file mode 100644 index 0000000..7b15398 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/settings/ProfileOptionsListeners.java @@ -0,0 +1,65 @@ +package me.devkevin.practice.settings; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.Practice; +import me.devkevin.practice.player.PlayerData; +import me.devkevin.practice.settings.item.ProfileOptionsItem; +import me.devkevin.practice.settings.item.ProfileOptionsItemState; + +import java.util.Arrays; + +public class ProfileOptionsListeners implements Listener { + @EventHandler + public void onInventoryInteractEvent(final InventoryClickEvent event) { + final Player player = (Player) event.getWhoClicked(); + final PlayerData profile = Practice.getInstance().getPlayerManager().getPlayerData(player.getUniqueId()); + final Inventory inventory = event.getInventory(); + final ItemStack itemStack = event.getCurrentItem(); + if (itemStack != null && itemStack.getType() != Material.AIR) { + final Inventory options = profile.getOptions().getInventory(); + if (inventory.getTitle().equals(options.getTitle()) && Arrays.equals(inventory.getContents(), options.getContents())) { + event.setCancelled(true); + final ProfileOptionsItem item = ProfileOptionsItem.fromItem(itemStack); + if (item != null) { + if (item == ProfileOptionsItem.DUEL_REQUESTS) { + profile.getOptions().setDuelRequests(!profile.getOptions().isDuelRequests()); + inventory.setItem(event.getRawSlot(), item.getItem(profile.getOptions().isDuelRequests() ? ProfileOptionsItemState.ENABLED : ProfileOptionsItemState.DISABLED)); + } else if (item == ProfileOptionsItem.PARTY_INVITES) { + profile.getOptions().setPartyInvites(!profile.getOptions().isPartyInvites()); + inventory.setItem(event.getRawSlot(), item.getItem(profile.getOptions().isPartyInvites() ? ProfileOptionsItemState.ENABLED : ProfileOptionsItemState.DISABLED)); + } else if (item == ProfileOptionsItem.TOGGLE_SCOREBOARD) { + if (profile.getOptions().getScoreboard() == ProfileOptionsItemState.ENABLED) { + profile.getOptions().setScoreboard(ProfileOptionsItemState.SHOW_PING); + } else if (profile.getOptions().getScoreboard() == ProfileOptionsItemState.SHOW_PING) { + profile.getOptions().setScoreboard(ProfileOptionsItemState.DISABLED); + } else if (profile.getOptions().getScoreboard() == ProfileOptionsItemState.DISABLED) { + profile.getOptions().setScoreboard(ProfileOptionsItemState.ENABLED); + } + inventory.setItem(event.getRawSlot(), item.getItem(profile.getOptions().getScoreboard())); + } else if (item == ProfileOptionsItem.ALLOW_SPECTATORS) { + profile.getOptions().setSpectators(!profile.getOptions().isSpectators()); + inventory.setItem(event.getRawSlot(), item.getItem(profile.getOptions().isSpectators() ? ProfileOptionsItemState.ENABLED : ProfileOptionsItemState.DISABLED)); + } else if (item == ProfileOptionsItem.TOGGLE_TIME) { + if (profile.getOptions().getTime() == ProfileOptionsItemState.DAY) { + profile.getOptions().setTime(ProfileOptionsItemState.SUNSET); + player.performCommand("sunset"); + } else if (profile.getOptions().getTime() == ProfileOptionsItemState.SUNSET) { + profile.getOptions().setTime(ProfileOptionsItemState.NIGHT); + player.performCommand("night"); + } else if (profile.getOptions().getTime() == ProfileOptionsItemState.NIGHT) { + profile.getOptions().setTime(ProfileOptionsItemState.DAY); + player.performCommand("day"); + } + inventory.setItem(event.getRawSlot(), item.getItem(profile.getOptions().getTime())); + } + } + } + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/settings/item/ProfileOptionsItem.java b/dPractice/src/main/java/me/devkevin/practice/settings/item/ProfileOptionsItem.java new file mode 100644 index 0000000..a246934 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/settings/item/ProfileOptionsItem.java @@ -0,0 +1,107 @@ +package me.devkevin.practice.settings.item; + +import org.apache.commons.lang3.StringEscapeUtils; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.util.ItemBuilder; +import me.devkevin.practice.util.inventory.UtilItem; + +import java.util.ArrayList; +import java.util.List; + +public enum ProfileOptionsItem { + DUEL_REQUESTS(UtilItem.createItem(Material.LEASH, 1, (short) 1, ChatColor.WHITE.toString() + ChatColor.BOLD + "Duel Requests"), "Do you want to accept duel requests?"), + PARTY_INVITES(UtilItem.createItem(Material.PAPER, 1, (short) 1, ChatColor.WHITE.toString() + ChatColor.BOLD + "Party Invites"), "Do you want to accept party invitations?"), + TOGGLE_SCOREBOARD(UtilItem.createItem(Material.EMPTY_MAP, 1, (short) 8, ChatColor.WHITE.toString() + ChatColor.BOLD + "Toggle Scoreboard"), "Toggle your scoreboard"), + ALLOW_SPECTATORS(UtilItem.createItem(Material.COMPASS, 1, (short) 1, ChatColor.WHITE.toString() + ChatColor.BOLD + "Allow Spectators"), "Allow players to spectate your matches?"), + TOGGLE_TIME(UtilItem.createItem(Material.SLIME_BALL, 1, (short) 1, ChatColor.WHITE.toString() + ChatColor.BOLD + "Toggle Time"), "Toggle between day, sunset & night"); + + private ItemStack item; + private List description; + + ProfileOptionsItem(final ItemStack item, final String description) { + this.item = item; + (this.description = new ArrayList()).add(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "------------------------"); + String parts = ""; + for (int i = 0; i < description.split(" ").length; ++i) { + final String part = description.split(" ")[i]; + parts = parts + part + " "; + if (i == 4 || i + 1 == description.split(" ").length) { + this.description.add(ChatColor.GRAY + parts.trim()); + parts = ""; + } + } + this.description.add(" "); + } + + public static ProfileOptionsItem fromItem(final ItemStack itemStack) { + for (final ProfileOptionsItem item : values()) { + for (final ProfileOptionsItemState state : ProfileOptionsItemState.values()) { + if (item.getItem(state).isSimilar(itemStack)) { + return item; + } + } + } + return null; + } + + public ItemStack getItem(final ProfileOptionsItemState state) { + if (this == ProfileOptionsItem.DUEL_REQUESTS || this == ProfileOptionsItem.PARTY_INVITES || this == ProfileOptionsItem.ALLOW_SPECTATORS) { + final List lore = new ArrayList(this.description); + lore.add(" " + ((state == ProfileOptionsItemState.ENABLED) ? (ChatColor.GREEN + StringEscapeUtils.unescapeHtml4("►") + " ") : " ") + ChatColor.GRAY + this.getOptionDescription(ProfileOptionsItemState.ENABLED)); + lore.add(" " + ((state == ProfileOptionsItemState.DISABLED) ? (ChatColor.RED + StringEscapeUtils.unescapeHtml4("►") + " ") : " ") + ChatColor.GRAY + this.getOptionDescription(ProfileOptionsItemState.DISABLED)); + lore.add(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "------------------------"); + return new ItemBuilder(this.item).lore(lore).build(); + } + if (this == ProfileOptionsItem.TOGGLE_TIME) { + final List lore = new ArrayList(this.description); + lore.add(" " + ((state == ProfileOptionsItemState.DAY) ? (ChatColor.YELLOW + StringEscapeUtils.unescapeHtml4("►") + " ") : " ") + ChatColor.GRAY + this.getOptionDescription(ProfileOptionsItemState.DAY)); + lore.add(" " + ((state == ProfileOptionsItemState.SUNSET) ? (ChatColor.GOLD + StringEscapeUtils.unescapeHtml4("►") + " ") : " ") + ChatColor.GRAY + this.getOptionDescription(ProfileOptionsItemState.SUNSET)); + lore.add(" " + ((state == ProfileOptionsItemState.NIGHT) ? (ChatColor.BLUE + StringEscapeUtils.unescapeHtml4("►") + " ") : " ") + ChatColor.GRAY + this.getOptionDescription(ProfileOptionsItemState.NIGHT)); + lore.add(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "------------------------"); + return new ItemBuilder(this.item).lore(lore).build(); + } + if (this == ProfileOptionsItem.TOGGLE_SCOREBOARD) { + final List lore = new ArrayList(this.description); + lore.add(" " + ((state == ProfileOptionsItemState.ENABLED) ? (ChatColor.GREEN + StringEscapeUtils.unescapeHtml4("►") + " ") : " ") + ChatColor.GRAY + this.getOptionDescription(ProfileOptionsItemState.ENABLED)); + lore.add(" " + ((state == ProfileOptionsItemState.SHOW_PING) ? (ChatColor.YELLOW + StringEscapeUtils.unescapeHtml4("►") + " ") : " ") + ChatColor.GRAY + this.getOptionDescription(ProfileOptionsItemState.SHOW_PING)); + lore.add(" " + ((state == ProfileOptionsItemState.DISABLED) ? (ChatColor.RED + StringEscapeUtils.unescapeHtml4("►") + " ") : " ") + ChatColor.GRAY + this.getOptionDescription(ProfileOptionsItemState.DISABLED)); + lore.add(ChatColor.DARK_GRAY.toString() + ChatColor.STRIKETHROUGH + "------------------------"); + return new ItemBuilder(this.item).lore(lore).build(); + } + return this.getItem(ProfileOptionsItemState.DISABLED); + } + + public String getOptionDescription(final ProfileOptionsItemState state) { + if (this == ProfileOptionsItem.DUEL_REQUESTS || this == ProfileOptionsItem.PARTY_INVITES || this == ProfileOptionsItem.ALLOW_SPECTATORS) { + if (state == ProfileOptionsItemState.ENABLED) { + return "Enable"; + } + if (state == ProfileOptionsItemState.DISABLED) { + return "Disable"; + } + } else if (this == ProfileOptionsItem.TOGGLE_TIME) { + if (state == ProfileOptionsItemState.DAY) { + return "Day"; + } + if (state == ProfileOptionsItemState.SUNSET) { + return "Sunset"; + } + if (state == ProfileOptionsItemState.NIGHT) { + return "Night"; + } + } else if (this == ProfileOptionsItem.TOGGLE_SCOREBOARD) { + if (state == ProfileOptionsItemState.ENABLED) { + return "Enable"; + } + if (state == ProfileOptionsItemState.SHOW_PING) { + return "Show Ping"; + } + if (state == ProfileOptionsItemState.DISABLED) { + return "Disable"; + } + } + return this.getOptionDescription(ProfileOptionsItemState.DISABLED); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/settings/item/ProfileOptionsItemState.java b/dPractice/src/main/java/me/devkevin/practice/settings/item/ProfileOptionsItemState.java new file mode 100644 index 0000000..e5e75a6 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/settings/item/ProfileOptionsItemState.java @@ -0,0 +1,10 @@ +package me.devkevin.practice.settings.item; + +public enum ProfileOptionsItemState { + ENABLED, + DISABLED, + SHOW_PING, + DAY, + SUNSET, + NIGHT +} diff --git a/dPractice/src/main/java/me/devkevin/practice/team/KillableTeam.java b/dPractice/src/main/java/me/devkevin/practice/team/KillableTeam.java new file mode 100644 index 0000000..5ece8e5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/team/KillableTeam.java @@ -0,0 +1,63 @@ +package me.devkevin.practice.team; + +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.Stream; + +public class KillableTeam { + protected final Practice plugin; + private final List players; + private final List alivePlayers; + private final String leaderName; + private UUID leader; + + public KillableTeam(final UUID leader, final List players) { + this.plugin = Practice.getInstance(); + this.alivePlayers = new ArrayList(); + this.leader = leader; + this.leaderName = this.plugin.getServer().getPlayer(leader).getName(); + this.players = players; + this.alivePlayers.addAll(players); + } + + public void killPlayer(final UUID playerUUID) { + this.alivePlayers.remove(playerUUID); + } + + public Stream alivePlayers() { + return this.alivePlayers.stream().map(this.plugin.getServer()::getPlayer).filter(Objects::nonNull); + } + + public Stream players() { + return this.players.stream().map(this.plugin.getServer()::getPlayer).filter(Objects::nonNull); + } + + public Practice getPlugin() { + return this.plugin; + } + + public List getPlayers() { + return this.players; + } + + public List getAlivePlayers() { + return this.alivePlayers; + } + + public String getLeaderName() { + return this.leaderName; + } + + public UUID getLeader() { + return this.leader; + } + + public void setLeader(final UUID leader) { + this.leader = leader; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/tournament/Tournament.java b/dPractice/src/main/java/me/devkevin/practice/tournament/Tournament.java new file mode 100644 index 0000000..fcc35f2 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/tournament/Tournament.java @@ -0,0 +1,157 @@ +package me.devkevin.practice.tournament; + +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; + +import java.util.*; + +public class Tournament { + private final Practice plugin; + private final Set players; + private final Set matches; + private final List aliveTeams; + private final Map playerTeams; + private final int id; + private final int teamSize; + private final int size; + private final String kitName; + private TournamentState tournamentState; + private int currentRound; + private int countdown; + private int tokens; + + public Tournament(final int id, final int teamSize, final int size, final String kitName) { + this.plugin = Practice.getInstance(); + this.players = new HashSet(); + this.matches = new HashSet(); + this.aliveTeams = new ArrayList(); + this.playerTeams = new HashMap(); + this.tournamentState = TournamentState.WAITING; + this.currentRound = 1; + this.countdown = 31; + this.tokens = 0; + this.id = id; + this.teamSize = teamSize; + this.size = size; + this.kitName = kitName; + } + + public void addPlayer(final UUID uuid) { + this.players.add(uuid); + } + + public void addAliveTeam(final TournamentTeam team) { + this.aliveTeams.add(team); + } + + public void killTeam(final TournamentTeam team) { + this.aliveTeams.remove(team); + } + + public void setPlayerTeam(final UUID uuid, final TournamentTeam team) { + this.playerTeams.put(uuid, team); + } + + public TournamentTeam getPlayerTeam(final UUID uuid) { + return this.playerTeams.get(uuid); + } + + public void removePlayer(final UUID uuid) { + this.players.remove(uuid); + } + + public void addMatch(final UUID uuid) { + this.matches.add(uuid); + } + + public void removeMatch(final UUID uuid) { + this.matches.remove(uuid); + } + + public void broadcast(final String message) { + for (final UUID uuid : this.players) { + final Player player = this.plugin.getServer().getPlayer(uuid); + player.sendMessage(message); + } + } + + public void broadcastWithSound(final String message, final Sound sound) { + for (final UUID uuid : this.players) { + final Player player = this.plugin.getServer().getPlayer(uuid); + player.sendMessage(message); + player.playSound(player.getLocation(), sound, 10.0f, 1.0f); + } + } + + public int decrementCountdown() { + if (this.countdown <= 0) { + return 0; + } + return --this.countdown; + } + + public Set getPlayers() { + return this.players; + } + + public Set getMatches() { + return this.matches; + } + + public List getAliveTeams() { + return this.aliveTeams; + } + + public Map getPlayerTeams() { + return this.playerTeams; + } + + public int getId() { + return this.id; + } + + public int getTeamSize() { + return this.teamSize; + } + + public int getSize() { + return this.size; + } + + public String getKitName() { + return this.kitName; + } + + public TournamentState getTournamentState() { + return this.tournamentState; + } + + public void setTournamentState(final TournamentState tournamentState) { + this.tournamentState = tournamentState; + } + + public int getCurrentRound() { + return this.currentRound; + } + + public void setCurrentRound(final int currentRound) { + this.currentRound = currentRound; + } + + public int getCountdown() { + return this.countdown; + } + + public void setCountdown(final int countdown) { + this.countdown = countdown; + } + + public int getTokens() { + return this.tokens; + } + + public void setTokens(final int tokens) { + this.tokens = tokens; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/tournament/TournamentState.java b/dPractice/src/main/java/me/devkevin/practice/tournament/TournamentState.java new file mode 100644 index 0000000..470e015 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/tournament/TournamentState.java @@ -0,0 +1,7 @@ +package me.devkevin.practice.tournament; + +public enum TournamentState { + WAITING, + STARTING, + FIGHTING +} diff --git a/dPractice/src/main/java/me/devkevin/practice/tournament/TournamentTeam.java b/dPractice/src/main/java/me/devkevin/practice/tournament/TournamentTeam.java new file mode 100644 index 0000000..267e86d --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/tournament/TournamentTeam.java @@ -0,0 +1,32 @@ +package me.devkevin.practice.tournament; + +import me.devkevin.practice.team.KillableTeam; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class TournamentTeam extends KillableTeam { + private final Map playerNames; + + public TournamentTeam(final UUID leader, final List players) { + super(leader, players); + this.playerNames = new HashMap(); + for (final UUID playerUUID : players) { + this.playerNames.put(playerUUID, this.plugin.getServer().getPlayer(playerUUID).getName()); + } + } + + public void broadcast(final String message) { + this.alivePlayers().forEach(player -> player.sendMessage(message)); + } + + public String getPlayerName(final UUID playerUUID) { + return this.playerNames.get(playerUUID); + } + + public Map getPlayerNames() { + return this.playerNames; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/BlockUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/BlockUtil.java new file mode 100644 index 0000000..fdd5f45 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/BlockUtil.java @@ -0,0 +1,250 @@ +package me.devkevin.practice.util; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; + +import java.util.HashSet; +import java.util.Set; + +public class BlockUtil { + private static Set blockSolidPassSet; + private static Set blockStairsSet; + private static Set blockLiquidsSet; + private static Set blockWebsSet; + private static Set blockIceSet; + private static Set blockCarpetSet; + + static { + BlockUtil.blockSolidPassSet = new HashSet(); + BlockUtil.blockStairsSet = new HashSet(); + BlockUtil.blockLiquidsSet = new HashSet(); + BlockUtil.blockWebsSet = new HashSet(); + BlockUtil.blockIceSet = new HashSet(); + BlockUtil.blockCarpetSet = new HashSet(); + BlockUtil.blockSolidPassSet.add((byte) 0); + BlockUtil.blockSolidPassSet.add((byte) 6); + BlockUtil.blockSolidPassSet.add((byte) 8); + BlockUtil.blockSolidPassSet.add((byte) 9); + BlockUtil.blockSolidPassSet.add((byte) 10); + BlockUtil.blockSolidPassSet.add((byte) 11); + BlockUtil.blockSolidPassSet.add((byte) 27); + BlockUtil.blockSolidPassSet.add((byte) 28); + BlockUtil.blockSolidPassSet.add((byte) 30); + BlockUtil.blockSolidPassSet.add((byte) 31); + BlockUtil.blockSolidPassSet.add((byte) 32); + BlockUtil.blockSolidPassSet.add((byte) 37); + BlockUtil.blockSolidPassSet.add((byte) 38); + BlockUtil.blockSolidPassSet.add((byte) 39); + BlockUtil.blockSolidPassSet.add((byte) 40); + BlockUtil.blockSolidPassSet.add((byte) 50); + BlockUtil.blockSolidPassSet.add((byte) 51); + BlockUtil.blockSolidPassSet.add((byte) 55); + BlockUtil.blockSolidPassSet.add((byte) 59); + BlockUtil.blockSolidPassSet.add((byte) 63); + BlockUtil.blockSolidPassSet.add((byte) 66); + BlockUtil.blockSolidPassSet.add((byte) 68); + BlockUtil.blockSolidPassSet.add((byte) 69); + BlockUtil.blockSolidPassSet.add((byte) 70); + BlockUtil.blockSolidPassSet.add((byte) 72); + BlockUtil.blockSolidPassSet.add((byte) 75); + BlockUtil.blockSolidPassSet.add((byte) 76); + BlockUtil.blockSolidPassSet.add((byte) 77); + BlockUtil.blockSolidPassSet.add((byte) 78); + BlockUtil.blockSolidPassSet.add((byte) 83); + BlockUtil.blockSolidPassSet.add((byte) 90); + BlockUtil.blockSolidPassSet.add((byte) 104); + BlockUtil.blockSolidPassSet.add((byte) 105); + BlockUtil.blockSolidPassSet.add((byte) 115); + BlockUtil.blockSolidPassSet.add((byte) 119); + BlockUtil.blockSolidPassSet.add((byte) (-124)); + BlockUtil.blockSolidPassSet.add((byte) (-113)); + BlockUtil.blockSolidPassSet.add((byte) (-81)); + BlockUtil.blockStairsSet.add((byte) 53); + BlockUtil.blockStairsSet.add((byte) 67); + BlockUtil.blockStairsSet.add((byte) 108); + BlockUtil.blockStairsSet.add((byte) 109); + BlockUtil.blockStairsSet.add((byte) 114); + BlockUtil.blockStairsSet.add((byte) (-128)); + BlockUtil.blockStairsSet.add((byte) (-122)); + BlockUtil.blockStairsSet.add((byte) (-121)); + BlockUtil.blockStairsSet.add((byte) (-120)); + BlockUtil.blockStairsSet.add((byte) (-100)); + BlockUtil.blockStairsSet.add((byte) (-93)); + BlockUtil.blockStairsSet.add((byte) (-92)); + BlockUtil.blockStairsSet.add((byte) (-76)); + BlockUtil.blockStairsSet.add((byte) 126); + BlockUtil.blockStairsSet.add((byte) (-74)); + BlockUtil.blockStairsSet.add((byte) 44); + BlockUtil.blockStairsSet.add((byte) 78); + BlockUtil.blockStairsSet.add((byte) 99); + BlockUtil.blockStairsSet.add((byte) (-112)); + BlockUtil.blockStairsSet.add((byte) (-115)); + BlockUtil.blockStairsSet.add((byte) (-116)); + BlockUtil.blockStairsSet.add((byte) (-105)); + BlockUtil.blockStairsSet.add((byte) (-108)); + BlockUtil.blockStairsSet.add((byte) 100); + BlockUtil.blockLiquidsSet.add((byte) 8); + BlockUtil.blockLiquidsSet.add((byte) 9); + BlockUtil.blockLiquidsSet.add((byte) 10); + BlockUtil.blockLiquidsSet.add((byte) 11); + BlockUtil.blockWebsSet.add((byte) 30); + BlockUtil.blockIceSet.add((byte) 79); + BlockUtil.blockIceSet.add((byte) (-82)); + BlockUtil.blockCarpetSet.add((byte) (-85)); + } + + public static boolean isStandingOn(final Player player, final Material material) { + final Block legs = player.getLocation().getBlock(); + final Block head = legs.getRelative(BlockFace.UP); + return legs.getType() == material || head.getType() == material; + } + + public static boolean isSameLocation(final Location location, final Location check) { + return location.getWorld().getName().equalsIgnoreCase(check.getWorld().getName()) && location.getBlockX() == check.getBlockX() && location.getBlockY() == check.getBlockY() && location.getBlockZ() == check.getBlockZ(); + } + + public static boolean isOnStairs(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockStairsSet, down); + } + + public static boolean isOnLiquid(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockLiquidsSet, down); + } + + public static boolean isOnWeb(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockWebsSet, down); + } + + public static boolean isOnIce(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockIceSet, down); + } + + public static boolean isOnCarpet(final Location location, final int down) { + return isUnderBlock(location, BlockUtil.blockCarpetSet, down); + } + + private static boolean isUnderBlock(final Location location, final Set itemIDs, final int down) { + final double posX = location.getX(); + final double posZ = location.getZ(); + final double fracX = (posX % 1.0 > 0.0) ? Math.abs(posX % 1.0) : (1.0 - Math.abs(posX % 1.0)); + final double fracZ = (posZ % 1.0 > 0.0) ? Math.abs(posZ % 1.0) : (1.0 - Math.abs(posZ % 1.0)); + final int blockX = location.getBlockX(); + final int blockY = location.getBlockY() - down; + final int blockZ = location.getBlockZ(); + final World world = location.getWorld(); + if (itemIDs.contains(world.getBlockAt(blockX, blockY, blockZ).getTypeId())) { + return true; + } + if (fracX < 0.3) { + if (itemIDs.contains(world.getBlockAt(blockX - 1, blockY, blockZ).getTypeId())) { + return true; + } + if (fracZ < 0.3) { + if (itemIDs.contains(world.getBlockAt(blockX - 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (itemIDs.contains(world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + return itemIDs.contains(world.getBlockAt(blockX + 1, blockY, blockZ - 1).getTypeId()); + } else if (fracZ > 0.7) { + if (itemIDs.contains(world.getBlockAt(blockX - 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (itemIDs.contains(world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + return itemIDs.contains(world.getBlockAt(blockX + 1, blockY, blockZ + 1).getTypeId()); + } + } else if (fracX > 0.7) { + if (itemIDs.contains(world.getBlockAt(blockX + 1, blockY, blockZ).getTypeId())) { + return true; + } + if (fracZ < 0.3) { + if (itemIDs.contains(world.getBlockAt(blockX - 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (itemIDs.contains(world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + return itemIDs.contains(world.getBlockAt(blockX + 1, blockY, blockZ - 1).getTypeId()); + } else if (fracZ > 0.7) { + if (itemIDs.contains(world.getBlockAt(blockX - 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (itemIDs.contains(world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + return itemIDs.contains(world.getBlockAt(blockX + 1, blockY, blockZ + 1).getTypeId()); + } + } else if (fracZ < 0.3) { + return itemIDs.contains(world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId()); + } else return fracZ > 0.7 && itemIDs.contains(world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId()); + return false; + } + + public static boolean isOnGround(final Location location, final int down) { + final double posX = location.getX(); + final double posZ = location.getZ(); + final double fracX = (posX % 1.0 > 0.0) ? Math.abs(posX % 1.0) : (1.0 - Math.abs(posX % 1.0)); + final double fracZ = (posZ % 1.0 > 0.0) ? Math.abs(posZ % 1.0) : (1.0 - Math.abs(posZ % 1.0)); + final int blockX = location.getBlockX(); + final int blockY = location.getBlockY() - down; + final int blockZ = location.getBlockZ(); + final World world = location.getWorld(); + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX, blockY, blockZ).getTypeId())) { + return true; + } + if (fracX < 0.3) { + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX - 1, blockY, blockZ).getTypeId())) { + return true; + } + if (fracZ < 0.3) { + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX - 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + return !BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX + 1, blockY, blockZ - 1).getTypeId()); + } else if (fracZ > 0.7) { + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX - 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + return !BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX + 1, blockY, blockZ + 1).getTypeId()); + } + } else if (fracX > 0.7) { + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX + 1, blockY, blockZ).getTypeId())) { + return true; + } + if (fracZ < 0.3) { + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX - 1, blockY, blockZ - 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId())) { + return true; + } + return !BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX + 1, blockY, blockZ - 1).getTypeId()); + } else if (fracZ > 0.7) { + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX - 1, blockY, blockZ + 1).getTypeId())) { + return true; + } + if (!BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId())) { + return true; + } + return !BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX + 1, blockY, blockZ + 1).getTypeId()); + } + } else if (fracZ < 0.3) { + return !BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX, blockY, blockZ - 1).getTypeId()); + } else + return fracZ > 0.7 && !BlockUtil.blockSolidPassSet.contains(world.getBlockAt(blockX, blockY, blockZ + 1).getTypeId()); + return false; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/CC.java b/dPractice/src/main/java/me/devkevin/practice/util/CC.java new file mode 100644 index 0000000..9c898f5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/CC.java @@ -0,0 +1,170 @@ +package me.devkevin.practice.util; + +import org.bukkit.ChatColor; + +public final class CC +{ + public static final String PRIMARY; + public static final String SECONDARY; + public static final String B_PRIMARY; + public static final String B_SECONDARY; + public static final String BLUE; + public static final String AQUA; + public static final String YELLOW; + public static final String RED; + public static final String GRAY; + public static final String GOLD; + public static final String GREEN; + public static final String WHITE; + public static final String BLACK; + public static final String BOLD; + public static final String ITALIC; + public static final String STRIKE_THROUGH; + public static final String RESET; + public static final String MAGIC; + public static final String OBFUSCATED; + public static final String B; + public static final String M; + public static final String O; + public static final String I; + public static final String S; + public static final String R; + public static final String DARK_BLUE; + public static final String DARK_AQUA; + public static final String DARK_GRAY; + public static final String DARK_GREEN; + public static final String DARK_PURPLE; + public static final String DARK_RED; + public static final String D_BLUE; + public static final String D_AQUA; + public static final String D_GRAY; + public static final String D_GREEN; + public static final String D_PURPLE; + public static final String D_RED; + public static final String LIGHT_PURPLE; + public static final String L_PURPLE; + public static final String PINK; + public static final String B_BLUE; + public static final String B_AQUA; + public static final String B_YELLOW; + public static final String B_RED; + public static final String B_GRAY; + public static final String B_GOLD; + public static final String B_GREEN; + public static final String B_WHITE; + public static final String B_BLACK; + public static final String BD_BLUE; + public static final String BD_AQUA; + public static final String BD_GRAY; + public static final String BD_GREEN; + public static final String BD_PURPLE; + public static final String BD_RED; + public static final String BL_PURPLE; + public static final String I_BLUE; + public static final String I_AQUA; + public static final String I_YELLOW; + public static final String I_RED; + public static final String I_GRAY; + public static final String I_GOLD; + public static final String I_GREEN; + public static final String I_WHITE; + public static final String I_BLACK; + public static final String ID_RED; + public static final String ID_BLUE; + public static final String ID_AQUA; + public static final String ID_GRAY; + public static final String ID_GREEN; + public static final String ID_PURPLE; + public static final String IL_PURPLE; + public static final String VAPE = "��8 ��8 ��1 ��3 ��3 ��7 ��8 ��r"; + public static final String BLANK_LINE = "��8 ��8 ��1 ��3 ��3 ��7 ��8 ��r"; + public static final String BL = "��8 ��8 ��1 ��3 ��3 ��7 ��8 ��r"; + public static final String SEPARATOR; + public static final String[] SEPARATORS; + + private CC() { + throw new RuntimeException("Cannot instantiate a utility class."); + } + + static { + PRIMARY = ChatColor.GOLD.toString(); + SECONDARY = ChatColor.YELLOW.toString(); + B_PRIMARY = CC.PRIMARY + ChatColor.BOLD; + B_SECONDARY = CC.SECONDARY + ChatColor.BOLD; + BLUE = ChatColor.BLUE.toString(); + AQUA = ChatColor.AQUA.toString(); + YELLOW = ChatColor.YELLOW.toString(); + RED = ChatColor.RED.toString(); + GRAY = ChatColor.GRAY.toString(); + GOLD = ChatColor.GOLD.toString(); + GREEN = ChatColor.GREEN.toString(); + WHITE = ChatColor.WHITE.toString(); + BLACK = ChatColor.BLACK.toString(); + BOLD = ChatColor.BOLD.toString(); + ITALIC = ChatColor.ITALIC.toString(); + STRIKE_THROUGH = ChatColor.STRIKETHROUGH.toString(); + RESET = ChatColor.RESET.toString(); + MAGIC = ChatColor.MAGIC.toString(); + OBFUSCATED = CC.MAGIC; + B = CC.BOLD; + M = CC.MAGIC; + O = CC.MAGIC; + I = CC.ITALIC; + S = CC.STRIKE_THROUGH; + R = CC.RESET; + DARK_BLUE = ChatColor.DARK_BLUE.toString(); + DARK_AQUA = ChatColor.DARK_AQUA.toString(); + DARK_GRAY = ChatColor.DARK_GRAY.toString(); + DARK_GREEN = ChatColor.DARK_GREEN.toString(); + DARK_PURPLE = ChatColor.DARK_PURPLE.toString(); + DARK_RED = ChatColor.DARK_RED.toString(); + D_BLUE = CC.DARK_BLUE; + D_AQUA = CC.DARK_AQUA; + D_GRAY = CC.DARK_GRAY; + D_GREEN = CC.DARK_GREEN; + D_PURPLE = CC.DARK_PURPLE; + D_RED = CC.DARK_RED; + LIGHT_PURPLE = ChatColor.LIGHT_PURPLE.toString(); + L_PURPLE = CC.LIGHT_PURPLE; + PINK = CC.L_PURPLE; + B_BLUE = CC.BLUE + CC.B; + B_AQUA = CC.AQUA + CC.B; + B_YELLOW = CC.YELLOW + CC.B; + B_RED = CC.RED + CC.B; + B_GRAY = CC.GRAY + CC.B; + B_GOLD = CC.GOLD + CC.B; + B_GREEN = CC.GREEN + CC.B; + B_WHITE = CC.WHITE + CC.B; + B_BLACK = CC.BLACK + CC.B; + BD_BLUE = CC.D_BLUE + CC.B; + BD_AQUA = CC.D_AQUA + CC.B; + BD_GRAY = CC.D_GRAY + CC.B; + BD_GREEN = CC.D_GREEN + CC.B; + BD_PURPLE = CC.D_PURPLE + CC.B; + BD_RED = CC.D_RED + CC.B; + BL_PURPLE = CC.L_PURPLE + CC.B; + I_BLUE = CC.BLUE + CC.I; + I_AQUA = CC.AQUA + CC.I; + I_YELLOW = CC.YELLOW + CC.I; + I_RED = CC.RED + CC.I; + I_GRAY = CC.GRAY + CC.I; + I_GOLD = CC.GOLD + CC.I; + I_GREEN = CC.GREEN + CC.I; + I_WHITE = CC.WHITE + CC.I; + I_BLACK = CC.BLACK + CC.I; + ID_RED = CC.D_RED + CC.I; + ID_BLUE = CC.D_BLUE + CC.I; + ID_AQUA = CC.D_AQUA + CC.I; + ID_GRAY = CC.D_GRAY + CC.I; + ID_GREEN = CC.D_GREEN + CC.I; + ID_PURPLE = CC.D_PURPLE + CC.I; + IL_PURPLE = CC.L_PURPLE + CC.I; + SEPARATOR = CC.GRAY + CC.S + "---------------------"; + SEPARATORS = new String[22]; + int i = 0; + for (final ChatColor c : ChatColor.values()) { + CC.SEPARATORS[i] = CC.SEPARATOR + c.toString(); + ++i; + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/Clickable.java b/dPractice/src/main/java/me/devkevin/practice/util/Clickable.java new file mode 100644 index 0000000..816433d --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/Clickable.java @@ -0,0 +1,50 @@ +package me.devkevin.practice.util; + +import net.md_5.bungee.api.chat.*; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class Clickable { + private List components; + + public Clickable(final String msg) { + this.components = new ArrayList(); + final TextComponent message = new TextComponent(msg); + this.components.add(message); + } + + public Clickable(final String msg, final String hoverMsg, final String clickString) { + this.components = new ArrayList(); + this.add(msg, hoverMsg, clickString); + } + + public Clickable() { + this.components = new ArrayList(); + } + + public TextComponent add(final String msg, final String hoverMsg, final String clickString) { + final TextComponent message = new TextComponent(msg); + if (hoverMsg != null) { + message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverMsg).create())); + } + if (clickString != null) { + message.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, clickString)); + } + this.components.add(message); + return message; + } + + public void add(final String message) { + this.components.add(new TextComponent(message)); + } + + public void sendToPlayer(final Player player) { + player.sendMessage((BaseComponent[]) this.asComponents()); + } + + public TextComponent[] asComponents() { + return this.components.toArray(new TextComponent[0]); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/Color.java b/dPractice/src/main/java/me/devkevin/practice/util/Color.java new file mode 100644 index 0000000..5236936 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/Color.java @@ -0,0 +1,21 @@ +package me.devkevin.practice.util; + +import com.google.common.collect.Lists; +import org.bukkit.ChatColor; + +import java.util.List; +import java.util.stream.Collectors; + +public class Color { + + public static String translate( String str ){ + return ChatColor.translateAlternateColorCodes('&', str); + } + + + public static List translate(List list){ + + return list.stream().map(Color::translate).collect(Collectors.toList()); + } + +} \ No newline at end of file diff --git a/dPractice/src/main/java/me/devkevin/practice/util/DateUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/DateUtil.java new file mode 100644 index 0000000..f247290 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/DateUtil.java @@ -0,0 +1,21 @@ +package me.devkevin.practice.util; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateUtil { + + public static String formatDate(Date date) { + /* + This is ugly as fuck + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + return calendar.getTime().toString(); + */ + + SimpleDateFormat format = new SimpleDateFormat ("hh:mm:ss z 'on' dd//MM/yyyy"); + return format.format (date); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/EloUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/EloUtil.java new file mode 100644 index 0000000..2b9e7df --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/EloUtil.java @@ -0,0 +1,46 @@ +package me.devkevin.practice.util; + +public class EloUtil { + private static final KFactor[] K_FACTORS; + private static final int DEFAULT_K_FACTOR = 25; + private static final int WIN = 1; + private static final int LOSS = 0; + + static { + K_FACTORS = new KFactor[]{new KFactor(0, 1000, 25.0), new KFactor(1001, 1400, 20.0), new KFactor(1401, 1800, 15.0), new KFactor(1801, 2200, 10.0)}; + } + + public static int getNewRating(final int rating, final int opponentRating, final boolean won) { + if (won) { + return getNewRating(rating, opponentRating, 1); + } + return getNewRating(rating, opponentRating, 0); + } + + public static int getNewRating(final int rating, final int opponentRating, final int score) { + final double kFactor = getKFactor(rating); + final double expectedScore = getExpectedScore(rating, opponentRating); + int newRating = calculateNewRating(rating, score, expectedScore, kFactor); + if (score == 1 && newRating == rating) { + ++newRating; + } + return newRating; + } + + private static int calculateNewRating(final int oldRating, final int score, final double expectedScore, final double kFactor) { + return oldRating + (int) (kFactor * (score - expectedScore)); + } + + private static double getKFactor(final int rating) { + for (int i = 0; i < EloUtil.K_FACTORS.length; ++i) { + if (rating >= EloUtil.K_FACTORS[i].getStartIndex() && rating <= EloUtil.K_FACTORS[i].getEndIndex()) { + return EloUtil.K_FACTORS[i].getValue(); + } + } + return 25.0; + } + + private static double getExpectedScore(final int rating, final int opponentRating) { + return 1.0 / (1.0 + Math.pow(10.0, (double) (opponentRating - rating) / 400.0)); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/ItemBuilder.java b/dPractice/src/main/java/me/devkevin/practice/util/ItemBuilder.java new file mode 100644 index 0000000..7379b7f --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/ItemBuilder.java @@ -0,0 +1,114 @@ +package me.devkevin.practice.util; + +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.material.MaterialData; + +import java.util.ArrayList; +import java.util.List; + +public class ItemBuilder implements Listener { + private final ItemStack is; + + public ItemBuilder(final Material mat) { + this.is = new ItemStack(mat); + } + + public ItemBuilder(final ItemStack is) { + this.is = is; + } + + public ItemBuilder amount(final int amount) { + this.is.setAmount(amount); + return this; + } + + public ItemBuilder name(final String name) { + final ItemMeta meta = this.is.getItemMeta(); + meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); + this.is.setItemMeta(meta); + return this; + } + + public ItemBuilder lore(final String name) { + final ItemMeta meta = this.is.getItemMeta(); + List lore = meta.getLore(); + if (lore == null) { + lore = new ArrayList(); + } + lore.add(name); + meta.setLore(lore); + this.is.setItemMeta(meta); + return this; + } + + public ItemBuilder lore(final List lore) { + final List toSet = new ArrayList(); + final ItemMeta meta = this.is.getItemMeta(); + for (final String string : lore) { + toSet.add(ChatColor.translateAlternateColorCodes('&', string)); + } + meta.setLore(toSet); + this.is.setItemMeta(meta); + return this; + } + + public ItemBuilder durability(final int durability) { + this.is.setDurability((short) durability); + return this; + } + + public ItemBuilder data(final int data) { + this.is.setData(new MaterialData(this.is.getType(), (byte) data)); + return this; + } + + public ItemBuilder enchantment(final Enchantment enchantment, final int level) { + this.is.addUnsafeEnchantment(enchantment, level); + return this; + } + + public ItemBuilder enchantment(final Enchantment enchantment) { + this.is.addUnsafeEnchantment(enchantment, 1); + return this; + } + + public ItemBuilder type(final Material material) { + this.is.setType(material); + return this; + } + + public ItemBuilder clearLore() { + final ItemMeta meta = this.is.getItemMeta(); + meta.setLore(new ArrayList()); + this.is.setItemMeta(meta); + return this; + } + + public ItemBuilder clearEnchantments() { + for (final Enchantment e : this.is.getEnchantments().keySet()) { + this.is.removeEnchantment(e); + } + return this; + } + + public ItemBuilder color(final Color color) { + if (this.is.getType() == Material.LEATHER_BOOTS || this.is.getType() == Material.LEATHER_CHESTPLATE || this.is.getType() == Material.LEATHER_HELMET || this.is.getType() == Material.LEATHER_LEGGINGS) { + final LeatherArmorMeta meta = (LeatherArmorMeta) this.is.getItemMeta(); + meta.setColor(color); + this.is.setItemMeta(meta); + return this; + } + throw new IllegalArgumentException("color() only applicable for leather armor!"); + } + + public ItemStack build() { + return this.is; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/ItemUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/ItemUtil.java new file mode 100644 index 0000000..d68b752 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/ItemUtil.java @@ -0,0 +1,134 @@ +package me.devkevin.practice.util; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +public final class ItemUtil { + private ItemUtil() { + throw new RuntimeException("Cannot instantiate a utility class."); + } + + public static String formatMaterial(final Material material) { + String name = material.toString(); + name = name.replace('_', ' '); + String result = "" + name.charAt(0); + for (int i = 1; i < name.length(); ++i) { + if (name.charAt(i - 1) == ' ') { + result += name.charAt(i); + } else { + result += Character.toLowerCase(name.charAt(i)); + } + } + return result; + } + + public static ItemStack enchantItem(final ItemStack itemStack, final ItemEnchant... enchantments) { + Arrays.asList(enchantments).forEach(enchantment -> itemStack.addUnsafeEnchantment(enchantment.enchantment, enchantment.level)); + return itemStack; + } + + public static ItemStack createItem(final Material material, final String name) { + final ItemStack item = new ItemStack(material); + final ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + item.setItemMeta(meta); + return item; + } + + public static ItemStack createItem(final Material material, final String name, final int amount) { + final ItemStack item = new ItemStack(material, amount); + final ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + item.setItemMeta(meta); + return item; + } + + public static ItemStack createItem(final Material material, final String name, final int amount, final short damage) { + final ItemStack item = new ItemStack(material, amount, damage); + final ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + item.setItemMeta(meta); + return item; + } + + public static ItemStack hideEnchants(final ItemStack item) { + final ItemMeta meta = item.getItemMeta(); + meta.addItemFlags(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_UNBREAKABLE); + item.setItemMeta(meta); + return item; + } + + public static ItemStack setUnbreakable(final ItemStack item) { + final ItemMeta meta = item.getItemMeta(); + meta.spigot().setUnbreakable(true); + meta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + item.setItemMeta(meta); + return item; + } + + public static ItemStack renameItem(final ItemStack item, final String name) { + final ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + item.setItemMeta(meta); + return item; + } + + public static ItemStack reloreItem(final ItemStack item, final String... lores) { + return reloreItem(ReloreType.OVERWRITE, item, lores); + } + + public static ItemStack reloreItem(final ReloreType type, final ItemStack item, final String... lores) { + final ItemMeta meta = item.getItemMeta(); + List lore = meta.getLore(); + if (lore == null) { + lore = new LinkedList(); + } + switch (type) { + case APPEND: + lore.addAll(Arrays.asList(lores)); + meta.setLore(lore); + break; + case PREPEND: { + final List nLore = new LinkedList(Arrays.asList(lores)); + nLore.addAll(lore); + meta.setLore(nLore); + break; + } + case OVERWRITE: + meta.setLore(Arrays.asList(lores)); + break; + } + item.setItemMeta(meta); + return item; + } + + public static ItemStack addItemFlag(final ItemStack item, final ItemFlag flag) { + final ItemMeta meta = item.getItemMeta(); + meta.addItemFlags(flag); + item.setItemMeta(meta); + return item; + } + + public enum ReloreType { + OVERWRITE, + PREPEND, + APPEND + } + + public static class ItemEnchant { + private final Enchantment enchantment; + private final int level; + + public ItemEnchant(final Enchantment enchantment, final int level) { + this.enchantment = enchantment; + this.level = level; + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/KFactor.java b/dPractice/src/main/java/me/devkevin/practice/util/KFactor.java new file mode 100644 index 0000000..29337d7 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/KFactor.java @@ -0,0 +1,25 @@ +package me.devkevin.practice.util; + +public class KFactor { + private final int startIndex; + private final int endIndex; + private final double value; + + public KFactor(final int startIndex, final int endIndex, final double value) { + this.startIndex = startIndex; + this.endIndex = endIndex; + this.value = value; + } + + public int getStartIndex() { + return this.startIndex; + } + + public int getEndIndex() { + return this.endIndex; + } + + public double getValue() { + return this.value; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/MathUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/MathUtil.java new file mode 100644 index 0000000..c2163b1 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/MathUtil.java @@ -0,0 +1,32 @@ +package me.devkevin.practice.util; + +public final class MathUtil { + public static String convertTicksToMinutes(final int ticks) { + final long minute = ticks / 1200L; + final long second = ticks / 20L - minute * 60L; + String secondString = Math.round((float) second) + ""; + if (second < 10L) { + secondString = 0 + secondString; + } + String minuteString = Math.round((float) minute) + ""; + if (minute == 0L) { + minuteString = "0"; + } + return minuteString + ":" + secondString; + } + + public static String convertToRomanNumeral(final int number) { + switch (number) { + case 1: + return "I"; + case 2: + return "II"; + default: + return null; + } + } + + public static double roundToHalves(final double d) { + return Math.round(d * 2.0) / 2.0; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/PlayerUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/PlayerUtil.java new file mode 100644 index 0000000..17cc8a7 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/PlayerUtil.java @@ -0,0 +1,114 @@ +package me.devkevin.practice.util; + +import org.bukkit.*; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.scheduler.BukkitRunnable; +import me.devkevin.practice.Practice; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Set; + +public final class PlayerUtil { + public static void setFirstSlotOfType(final Player player, final Material type, final ItemStack itemStack) { + for (int i = 0; i < player.getInventory().getContents().length; ++i) { + final ItemStack itemStack2 = player.getInventory().getContents()[i]; + if (itemStack2 == null || itemStack2.getType() == type || itemStack2.getType() == Material.AIR) { + player.getInventory().setItem(i, itemStack); + break; + } + } + } + + public static int getPing(final Player player) { + final int ping = ((CraftPlayer) player).getHandle().ping; + return ping; + } + + public static void clearPlayer(final Player player) { + player.setHealth(20.0); + player.setFoodLevel(20); + player.setSaturation(12.8f); + player.setMaximumNoDamageTicks(20); + player.setFireTicks(0); + player.setFallDistance(0.0f); + player.setLevel(0); + player.setExp(0.0f); + player.setWalkSpeed(0.2f); + player.getInventory().setHeldItemSlot(0); + player.setAllowFlight(false); + player.getInventory().clear(); + player.getInventory().setArmorContents(null); + player.closeInventory(); + player.setGameMode(GameMode.SURVIVAL); + player.getActivePotionEffects().stream().map(PotionEffect::getType).forEach(player::removePotionEffect); + ((CraftPlayer) player).getHandle().getDataWatcher().watch(9, (byte) 0); + player.updateInventory(); + } + + public static void sendMessage(final String message, final Player... players) { + for (final Player player : players) { + player.sendMessage(message); + } + } + + public static void sendMessage(final String message, final Set players) { + for (final Player player : players) { + player.sendMessage(message); + } + } + + public static void sendFirework(final FireworkEffect effect, final Location location) { + final Firework f = (Firework) location.getWorld().spawn(location, (Class) Firework.class); + final FireworkMeta fm = f.getFireworkMeta(); + fm.addEffect(effect); + f.setFireworkMeta(fm); + try { + final Class entityFireworkClass = getClass("net.minecraft.server.", "EntityFireworks"); + final Class craftFireworkClass = getClass("org.bukkit.craftbukkit.", "entity.CraftFirework"); + final Object firework = craftFireworkClass.cast(f); + final Method handle = firework.getClass().getMethod("getHandle", (Class[]) new Class[0]); + final Object entityFirework = handle.invoke(firework); + final Field expectedLifespan = entityFireworkClass.getDeclaredField("expectedLifespan"); + final Field ticksFlown = entityFireworkClass.getDeclaredField("ticksFlown"); + ticksFlown.setAccessible(true); + ticksFlown.setInt(entityFirework, expectedLifespan.getInt(entityFirework) - 1); + ticksFlown.setAccessible(false); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + public static void respawnPlayer(final PlayerDeathEvent event) { + new BukkitRunnable() { + public void run() { + try { + final Object nmsPlayer = event.getEntity().getClass().getMethod("getHandle", (Class[]) new Class[0]).invoke(event.getEntity()); + final Object con = nmsPlayer.getClass().getDeclaredField("playerConnection").get(nmsPlayer); + final Class EntityPlayer = Class.forName(nmsPlayer.getClass().getPackage().getName() + ".EntityPlayer"); + final Field minecraftServer = con.getClass().getDeclaredField("minecraftServer"); + minecraftServer.setAccessible(true); + final Object mcserver = minecraftServer.get(con); + final Object playerlist = mcserver.getClass().getDeclaredMethod("getPlayerList", (Class[]) new Class[0]).invoke(mcserver); + final Method moveToWorld = playerlist.getClass().getMethod("moveToWorld", EntityPlayer, Integer.TYPE, Boolean.TYPE); + moveToWorld.invoke(playerlist, nmsPlayer, 0, false); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }.runTaskLater(Practice.getInstance(), 2L); + } + + private static Class getClass(final String prefix, final String nmsClassString) throws ClassNotFoundException { + final String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + "."; + final String name = prefix + version + nmsClassString; + final Class nmsClass = Class.forName(name); + return nmsClass; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/StringUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/StringUtil.java new file mode 100644 index 0000000..cc7d028 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/StringUtil.java @@ -0,0 +1,63 @@ +package me.devkevin.practice.util; + +import org.bukkit.ChatColor; + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +public final class StringUtil { + public static final String NO_PERMISSION; + public static final String PLAYER_ONLY; + public static final String PLAYER_NOT_FOUND; + public static final String LOAD_ERROR; + public static final String SPLIT_PATTERN; + private static final String MAX_LENGTH = "11111111111111111111111111111111111111111111111111111"; + private static final List VOWELS; + + static { + NO_PERMISSION = ChatColor.RED + "You don't enough permissions."; + PLAYER_ONLY = ChatColor.RED + "Only players can use this command."; + PLAYER_NOT_FOUND = ChatColor.RED + "%s not found."; + LOAD_ERROR = ChatColor.RED + "An error occured, please contact an administrator."; + SPLIT_PATTERN = Pattern.compile("\\s").pattern(); + VOWELS = Arrays.asList("a", "e", "u", "i", "o"); + } + + private StringUtil() { + throw new RuntimeException("Cannot instantiate a utility class."); + } + + public static String toNiceString(String string) { + string = ChatColor.stripColor(string).replace('_', ' ').toLowerCase(); + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < string.toCharArray().length; ++i) { + char c = string.toCharArray()[i]; + if (i > 0) { + final char prev = string.toCharArray()[i - 1]; + if ((prev == ' ' || prev == '[' || prev == '(') && (i == string.toCharArray().length - 1 || c != 'x' || !Character.isDigit(string.toCharArray()[i + 1]))) { + c = Character.toUpperCase(c); + } + } else if (c != 'x' || !Character.isDigit(string.toCharArray()[i + 1])) { + c = Character.toUpperCase(c); + } + sb.append(c); + } + return sb.toString(); + } + + public static String buildMessage(final String[] args, final int start) { + if (start >= args.length) { + return ""; + } + return ChatColor.stripColor(String.join(" ", (CharSequence[]) Arrays.copyOfRange(args, start, args.length))); + } + + public static String getFirstSplit(final String s) { + return s.split(StringUtil.SPLIT_PATTERN)[0]; + } + + public static String getAOrAn(final String input) { + return StringUtil.VOWELS.contains(input.substring(0, 1).toLowerCase()) ? "an" : "a"; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/TeamUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/TeamUtil.java new file mode 100644 index 0000000..7e08d43 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/TeamUtil.java @@ -0,0 +1,31 @@ +package me.devkevin.practice.util; + +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.team.KillableTeam; +import me.devkevin.practice.tournament.TournamentTeam; + +import java.util.UUID; + +public class TeamUtil { + public static String getNames(final KillableTeam team) { + String names = ""; + for (int i = 0; i < team.getPlayers().size(); ++i) { + final UUID teammateUUID = team.getPlayers().get(i); + final Player teammate = Practice.getInstance().getServer().getPlayer(teammateUUID); + String name = ""; + if (teammate == null) { + if (team instanceof TournamentTeam) { + name = ((TournamentTeam) team).getPlayerName(teammateUUID); + } + } else { + name = teammate.getName(); + } + final int players = team.getPlayers().size(); + if (teammate != null) { + names = names + name + ((players - 1 == i) ? "" : ((players - 2 == i) ? (((players > 2) ? "," : "") + " & ") : ", ")); + } + } + return names; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/TimeUtil.java b/dPractice/src/main/java/me/devkevin/practice/util/TimeUtil.java new file mode 100644 index 0000000..745e059 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/TimeUtil.java @@ -0,0 +1,117 @@ +package me.devkevin.practice.util; + +import java.text.DecimalFormat; +import java.util.Calendar; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TimeUtil { + + private static final String HOUR_FORMAT = "%02d:%02d:%02d"; + private static final String MINUTE_FORMAT = "%02d:%02d"; + private static final DecimalFormat SECONDS_FORMAT = new DecimalFormat ( "#0.0" ); + + public static String formatTime(long passed) { + long divided = passed / 1000L; + + return divided > 3600L ? String.format ( HOUR_FORMAT , divided / 3600L , divided % 3600L / 60L , divided % 60L ) : String.format ( MINUTE_FORMAT , divided / 60L , divided % 60L ); + } + + public static String formatSeconds(long time) { + return SECONDS_FORMAT.format ( time / 1000.0F ); + } + + public static String formatDateDiff(Calendar fromDate , Calendar toDate) { + boolean future = false; + + if (toDate.equals ( fromDate )) { + return "now"; + } else { + if (toDate.after ( fromDate )) { + future = true; + } + + StringBuilder sb = new StringBuilder (); + int[] types = new int[]{1 , 2 , 5 , 11 , 12 , 13}; + String[] names = new String[]{"year" , "years" , "month" , "months" , "day" , "days" , "hour" , "hours" , + "minute" , "minutes" , "second" , "seconds"}; + int accuracy = 0; + + for (int i = 0; i < types.length && accuracy <= 2; ++i) { + int diff = dateDiff ( types[i] , fromDate , toDate , future ); + + if (diff > 0) { + ++accuracy; + sb.append ( " " ).append ( diff ).append ( " " ).append ( names[i * 2 + (diff > 1 ? 1 : 0)] ); + } + } + + return sb.length () == 0 ? "now" : sb.toString ().trim (); + } + } + + private static int dateDiff(int type , Calendar fromDate , Calendar toDate , boolean future) { + int diff = 0; + + long savedDate; + + for (savedDate = fromDate.getTimeInMillis (); future && !fromDate.after ( toDate ) || !future && !fromDate.before + ( toDate ); ++diff) { + savedDate = fromDate.getTimeInMillis (); + fromDate.add ( type , future ? 1 : -1 ); + } + + --diff; + fromDate.setTimeInMillis ( savedDate ); + return diff; + } + + public static Long parseTime(String time) { + if (time.equalsIgnoreCase ( "permanent" ) || time.equalsIgnoreCase ( "perm" )) { + return ( long ) -1; + } + + long totalTime = 0L; + boolean found = false; + Matcher matcher = Pattern.compile ( "\\d+\\D+" ).matcher ( time ); + + while (matcher.find ()) { + String s = matcher.group (); + Long value = Long.parseLong ( s.split ( "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)" )[0] ); + String type = s.split ( "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)" )[1]; + + switch (type) { + case "s": + totalTime += value; + found = true; + break; + case "m": + totalTime += value * 60; + found = true; + break; + case "h": + totalTime += value * 60 * 60; + found = true; + break; + case "d": + totalTime += value * 60 * 60 * 24; + found = true; + break; + case "w": + totalTime += value * 60 * 60 * 24 * 7; + found = true; + break; + case "M": + totalTime += value * 60 * 60 * 24 * 30; + found = true; + break; + case "y": + totalTime += value * 60 * 60 * 24 * 365; + found = true; + break; + } + } + + return !found ? null : totalTime * 1000; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/TtlHandler.java b/dPractice/src/main/java/me/devkevin/practice/util/TtlHandler.java new file mode 100644 index 0000000..f62b383 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/TtlHandler.java @@ -0,0 +1,7 @@ +package me.devkevin.practice.util; + +public interface TtlHandler { + void onExpire(final E p0); + + long getTimestamp(final E p0); +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/TtlHashMap.java b/dPractice/src/main/java/me/devkevin/practice/util/TtlHashMap.java new file mode 100644 index 0000000..267183b --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/TtlHashMap.java @@ -0,0 +1,115 @@ +package me.devkevin.practice.util; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class TtlHashMap implements Map, TtlHandler { + private final HashMap timestamps; + private final HashMap store; + private final long ttl; + + public TtlHashMap(final TimeUnit ttlUnit, final long ttlValue) { + this.timestamps = new HashMap(); + this.store = new HashMap(); + this.ttl = ttlUnit.toNanos(ttlValue); + } + + @Override + public V get(final Object key) { + final V value = this.store.get(key); + if (value != null && this.expired(key, value)) { + this.store.remove(key); + this.timestamps.remove(key); + return null; + } + return value; + } + + private boolean expired(final Object key, final V value) { + return System.nanoTime() - this.timestamps.get(key) > this.ttl; + } + + @Override + public void onExpire(final K element) { + } + + @Override + public long getTimestamp(final K element) { + return this.timestamps.get(element); + } + + @Override + public V put(final K key, final V value) { + this.timestamps.put(key, System.nanoTime()); + return this.store.put(key, value); + } + + @Override + public int size() { + return this.store.size(); + } + + @Override + public boolean isEmpty() { + return this.store.isEmpty(); + } + + @Override + public boolean containsKey(final Object key) { + final V value = this.store.get(key); + if (value != null && this.expired(key, value)) { + this.store.remove(key); + this.timestamps.remove(key); + return false; + } + return this.store.containsKey(key); + } + + @Override + public boolean containsValue(final Object value) { + return this.store.containsValue(value); + } + + @Override + public V remove(final Object key) { + this.timestamps.remove(key); + return this.store.remove(key); + } + + @Override + public void putAll(final Map m) { + for (final Entry e : m.entrySet()) { + this.put(e.getKey(), e.getValue()); + } + } + + @Override + public void clear() { + this.timestamps.clear(); + this.store.clear(); + } + + @Override + public Set keySet() { + this.clearExpired(); + return Collections.unmodifiableSet(this.store.keySet()); + } + + @Override + public Collection values() { + this.clearExpired(); + return Collections.unmodifiableCollection(this.store.values()); + } + + @Override + public Set> entrySet() { + this.clearExpired(); + return Collections.unmodifiableSet(this.store.entrySet()); + } + + private void clearExpired() { + for (final K k : this.store.keySet()) { + this.get(k); + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/inventory/InventoryUI.java b/dPractice/src/main/java/me/devkevin/practice/util/inventory/InventoryUI.java new file mode 100644 index 0000000..f47a25e --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/inventory/InventoryUI.java @@ -0,0 +1,356 @@ +package me.devkevin.practice.util.inventory; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; +import me.devkevin.practice.util.ItemUtil; + +import java.util.LinkedList; +import java.util.List; + +public class InventoryUI { + private final List inventories; + private final String title; + private final int rowOffset; + private final int rows; + private int offset; + private int page; + + public InventoryUI(final String title, final int rows) { + this(title, rows, 0); + } + + public InventoryUI(final String title, final boolean bool, final int rows) { + this(title, rows, 0); + } + + public InventoryUI(final String title, final int rows, final int rowOffset) { + this.inventories = new LinkedList(); + this.title = title; + this.rows = rows; + this.rowOffset = rowOffset; + } + + public Inventory2D getCurrentUI() { + return this.inventories.get(this.page); + } + + public Inventory getCurrentPage() { + if (this.inventories.size() == 0) { + this.createNewInventory(); + } + return this.inventories.get(this.page).toInventory(); + } + + public ClickableItem getItem(final int slot) { + if (this.inventories.size() == 0) { + this.createNewInventory(); + } + final Inventory2D lastInventory = this.inventories.get(this.inventories.size() - 1); + return lastInventory.getItem(slot); + } + + public int getSize() { + return this.rows * 9; + } + + private void createNewInventory() { + final Inventory2D inventory = new Inventory2D(this.title, this.rows, this.rowOffset); + if (this.inventories.size() > 0) { + inventory.setItem(0, this.rows - 1, new AbstractClickableItem(ItemUtil.createItem(Material.ARROW, ChatColor.RED + "Page #" + this.inventories.size())) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryUI.this.page--; + try { + final Inventory2D inventory2D = InventoryUI.this.inventories.get(InventoryUI.this.page); + if (inventory2D == null) { + InventoryUI.this.page++; + } else { + event.getWhoClicked().openInventory(InventoryUI.this.getCurrentPage()); + } + } catch (IndexOutOfBoundsException e) { + InventoryUI.this.page++; + } + } + }); + if (inventory.currentY == this.rows - 1 && inventory.currentX == -1) { + inventory.currentX++; + } + } + this.inventories.add(inventory); + } + + public void setItem(final int x, final int y, final ClickableItem item) { + if (this.inventories.size() == 0) { + this.createNewInventory(); + } + final Inventory2D lastInventory = this.inventories.get(this.inventories.size() - 1); + lastInventory.setItem(x - 1, y - 1, item); + } + + public void setItem(final int slot, final ClickableItem item) { + if (this.inventories.size() == 0) { + this.createNewInventory(); + } + final Inventory2D lastInventory = this.inventories.get(this.inventories.size() - 1); + lastInventory.setItem(slot, item); + } + + public void addItem(final ClickableItem item) { + if (this.inventories.size() == 0) { + this.createNewInventory(); + } + final Inventory2D lastInventory = this.inventories.get(this.inventories.size() - 1); + if (lastInventory.currentY == this.rows - 1 && lastInventory.currentX >= 7 - this.offset) { + lastInventory.setItem(8, this.rows - 1, new AbstractClickableItem(ItemUtil.createItem(Material.ARROW, ChatColor.RED + "Page #" + (this.inventories.size() + 1))) { + @Override + public void onClick(final InventoryClickEvent event) { + InventoryUI.this.page++; + try { + final Inventory2D inventory2D = InventoryUI.this.inventories.get(InventoryUI.this.page); + if (inventory2D == null) { + InventoryUI.this.page--; + } else { + event.getWhoClicked().openInventory(InventoryUI.this.getCurrentPage()); + } + } catch (IndexOutOfBoundsException e) { + InventoryUI.this.page--; + } + } + }); + this.createNewInventory(); + this.addItem(item); + } else { + lastInventory.setItem(++lastInventory.currentX + this.offset, lastInventory.currentY, item); + } + if (lastInventory.currentX >= 8 - this.offset) { + lastInventory.currentX = this.offset - 1; + lastInventory.currentY++; + } + } + + public void removeItem(final int slot) { + final Inventory2D inventory2D = this.inventories.get(this.page); + this.setItem(slot, null); + for (int i = slot + 1; i < this.getSize(); ++i) { + final ClickableItem item = this.getItem(i); + this.setItem(i - 1, item); + this.setItem(i, null); + } + if (inventory2D.currentX >= 0) { + inventory2D.currentX--; + } else if (inventory2D.currentY > 0) { + inventory2D.currentY--; + inventory2D.currentX = 7; + } + } + + public String getTitle() { + return this.title; + } + + public int getRowOffset() { + return this.rowOffset; + } + + public int getRows() { + return this.rows; + } + + public int getOffset() { + return this.offset; + } + + public void setOffset(final int offset) { + this.offset = offset; + } + + public int getPage() { + return this.page; + } + + public List getInventories() { + return this.inventories; + } + + public interface ClickableItem { + void onClick(final InventoryClickEvent p0); + + ItemStack getItemStack(); + + void setItemStack(final ItemStack p0); + + ItemStack getDefaultItemStack(); + } + + public static class EmptyClickableItem implements ClickableItem { + private final ItemStack defaultItemStack; + private ItemStack itemStack; + + public EmptyClickableItem(final ItemStack itemStack) { + this.itemStack = itemStack; + this.defaultItemStack = itemStack; + } + + @Override + public void onClick(final InventoryClickEvent event) { + } + + @Override + public ItemStack getDefaultItemStack() { + return this.defaultItemStack; + } + + @Override + public ItemStack getItemStack() { + return this.itemStack; + } + + @Override + public void setItemStack(final ItemStack itemStack) { + this.itemStack = itemStack; + } + } + + public abstract static class AbstractClickableItem implements ClickableItem { + private final ItemStack defaultItemStack; + private ItemStack itemStack; + + public AbstractClickableItem(final ItemStack itemStack) { + this.itemStack = itemStack; + this.defaultItemStack = itemStack; + } + + @Override + public ItemStack getDefaultItemStack() { + return this.defaultItemStack; + } + + @Override + public ItemStack getItemStack() { + return this.itemStack; + } + + @Override + public void setItemStack(final ItemStack itemStack) { + this.itemStack = itemStack; + } + } + + public static class InventoryUIHolder implements InventoryHolder { + private InventoryUI inventoryUI; + private String title; + private int slots; + + private InventoryUIHolder(final InventoryUI inventoryUI, final String title, final int slots) { + this.inventoryUI = inventoryUI; + this.title = title; + this.slots = slots; + } + + public Inventory getInventory() { + return this.inventoryUI.getCurrentPage(); + } + + public InventoryUI getInventoryUI() { + return this.inventoryUI; + } + + public String getTitle() { + return this.title; + } + + public int getSlots() { + return this.slots; + } + } + + public class Inventory2D { + private final ClickableItem[][] items; + private final String title; + private final int rows; + private Inventory cachedInventory; + private int currentX; + private int currentY; + + public Inventory2D(final String title, final int rows, final int rowOffset) { + this.currentX = -1; + this.currentY = rowOffset; + this.title = title; + this.rows = rows; + this.items = new ClickableItem[9][this.rows]; + } + + public void setItem(final int x, final int y, final ClickableItem clickableItem) { + this.items[x][y] = clickableItem; + if (this.cachedInventory != null) { + final int slot = y * 9 + x; + this.cachedInventory.setItem(slot, (clickableItem != null) ? clickableItem.getItemStack() : null); + } + } + + public void setItem(final int slot, final ClickableItem clickableItem) { + final int y = Math.abs(slot / 9); + final int x = -(y * 9 - slot); + this.setItem(x, y, clickableItem); + } + + public ClickableItem getItem(final int slot) { + final int y = Math.abs(slot / 9); + final int x = -(y * 9 - slot); + if (this.items.length <= x) { + return null; + } + final ClickableItem[] items = this.items[x]; + if (items.length <= y) { + return null; + } + return items[y]; + } + + public Inventory toInventory() { + if (this.cachedInventory != null) { + return this.cachedInventory; + } + final Inventory inventory = Bukkit.getServer().createInventory(new InventoryUIHolder(InventoryUI.this, this.title, this.rows * 9), this.rows * 9, this.title); + for (int y = 0; y < this.rows; ++y) { + for (int x = 0; x < 9; ++x) { + final int slot = y * 9 + x; + final ClickableItem item = this.items[x][y]; + if (item != null) { + inventory.setItem(slot, item.getItemStack()); + } + } + } + return this.cachedInventory = inventory; + } + + public ClickableItem[][] getItems() { + return this.items; + } + + public String getTitle() { + return this.title; + } + + public int getRows() { + return this.rows; + } + + public Inventory getCachedInventory() { + return this.cachedInventory; + } + + public int getCurrentX() { + return this.currentX; + } + + public int getCurrentY() { + return this.currentY; + } + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/inventory/UIListener.java b/dPractice/src/main/java/me/devkevin/practice/util/inventory/UIListener.java new file mode 100644 index 0000000..d1c42b5 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/inventory/UIListener.java @@ -0,0 +1,31 @@ +package me.devkevin.practice.util.inventory; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class UIListener implements Listener { + @EventHandler + public void onClick(final InventoryClickEvent event) { + if (event.getInventory() == null) { + return; + } + if (!(event.getInventory().getHolder() instanceof InventoryUI.InventoryUIHolder)) { + return; + } + if (event.getCurrentItem() == null) { + return; + } + final InventoryUI.InventoryUIHolder inventoryUIHolder = (InventoryUI.InventoryUIHolder) event.getInventory().getHolder(); + event.setCancelled(true); + if (event.getClickedInventory() == null || !event.getInventory().equals(event.getClickedInventory())) { + return; + } + final InventoryUI ui = inventoryUIHolder.getInventoryUI(); + final InventoryUI.ClickableItem item = ui.getCurrentUI().getItem(event.getSlot()); + if (item == null) { + return; + } + item.onClick(event); + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/inventory/UtilItem.java b/dPractice/src/main/java/me/devkevin/practice/util/inventory/UtilItem.java new file mode 100644 index 0000000..3998219 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/inventory/UtilItem.java @@ -0,0 +1,82 @@ +package me.devkevin.practice.util.inventory; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.List; + +public class UtilItem { + public static ItemStack createItem(final Material m, final int amount) { + return new ItemStack(m, amount); + } + + public static ItemStack createItem(final Material m, final int amount, final short durability) { + return new ItemStack(m, amount, durability); + } + + public static ItemStack createItem(final Material m, final int amount, final short durability, final String name) { + ItemStack itemStack = new ItemStack(m, amount, durability); + if (name != null) { + itemStack = name(itemStack, name); + } + return itemStack; + } + + public static ItemStack createItem(final Material m, final int amount, final short durability, final String name, final Enchantment enchantment, final int level) { + ItemStack itemStack = new ItemStack(m, amount, durability); + if (name != null) { + itemStack = name(itemStack, name); + } + return enchantItem(itemStack, enchantment, level); + } + + public static ItemStack createItem(final Material m, final int amount, final short durability, final String name, final List lore) { + ItemStack itemStack = new ItemStack(m, amount, durability); + if (name != null) { + itemStack = name(itemStack, name); + } + if (lore != null) { + itemStack = lore(itemStack, lore); + } + return itemStack; + } + + public static ItemStack skull(final ItemStack itemStack, final String playerName) { + final SkullMeta meta = (SkullMeta) itemStack.getItemMeta(); + meta.setOwner(playerName); + itemStack.setItemMeta(meta); + return itemStack; + } + + public static ItemStack name(final ItemStack itemStack, final String itemName) { + final ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setDisplayName(itemName); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + public static ItemStack lore(final ItemStack itemStack, final List lore) { + final ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setLore(lore); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + public static ItemStack enchantItem(final ItemStack itemStack, final Enchantment enchantment, final int level) { + itemStack.addUnsafeEnchantment(enchantment, level); + return itemStack; + } + + public static ItemStack effectItem(final ItemStack itemStack, final PotionEffectType potionEffectType, final int time, final int amplifier) { + final PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta(); + potionMeta.addCustomEffect(new PotionEffect(potionEffectType, time * 20, amplifier), true); + itemStack.setItemMeta(potionMeta); + return itemStack; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/PlayerTimer.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/PlayerTimer.java new file mode 100644 index 0000000..75621f4 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/PlayerTimer.java @@ -0,0 +1,118 @@ +package me.devkevin.practice.util.timer; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import me.devkevin.practice.Practice; +import me.devkevin.practice.util.timer.event.TimerClearEvent; +import me.devkevin.practice.util.timer.event.TimerExtendEvent; +import me.devkevin.practice.util.timer.event.TimerPauseEvent; +import me.devkevin.practice.util.timer.event.TimerStartEvent; + +import java.util.Map; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Predicate; + +public abstract class PlayerTimer extends Timer { + protected final Map cooldowns; + + public PlayerTimer(final String name, final long defaultCooldown) { + super(name, defaultCooldown); + this.cooldowns = new ConcurrentHashMap(); + } + + protected void handleExpiry(final Player player, final UUID playerUUID) { + this.cooldowns.remove(playerUUID); + } + + public TimerCooldown clearCooldown(final UUID uuid) { + return this.clearCooldown(null, uuid); + } + + public TimerCooldown clearCooldown(final Player player) { + Objects.requireNonNull(player); + return this.clearCooldown(player, player.getUniqueId()); + } + + public TimerCooldown clearCooldown(final Player player, final UUID playerUUID) { + final TimerCooldown runnable = this.cooldowns.remove(playerUUID); + if (runnable != null) { + runnable.cancel(); + if (player == null) { + Practice.getInstance().getServer().getPluginManager().callEvent(new TimerClearEvent(playerUUID, this)); + } else { + Practice.getInstance().getServer().getPluginManager().callEvent(new TimerClearEvent(player, this)); + } + } + return runnable; + } + + public boolean isPaused(final Player player) { + return this.isPaused(player.getUniqueId()); + } + + public boolean isPaused(final UUID playerUUID) { + final TimerCooldown runnable = this.cooldowns.get(playerUUID); + return runnable != null && runnable.isPaused(); + } + + public void setPaused(final UUID playerUUID, final boolean paused) { + final TimerCooldown runnable = this.cooldowns.get(playerUUID); + if (runnable != null && runnable.isPaused() != paused) { + final TimerPauseEvent event = new TimerPauseEvent(playerUUID, this, paused); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + runnable.setPaused(paused); + } + } + } + + public long getRemaining(final Player player) { + return this.getRemaining(player.getUniqueId()); + } + + public long getRemaining(final UUID playerUUID) { + final TimerCooldown runnable = this.cooldowns.get(playerUUID); + return (runnable == null) ? 0L : runnable.getRemaining(); + } + + public boolean setCooldown(final Player player, final UUID playerUUID) { + return this.setCooldown(player, playerUUID, this.defaultCooldown, false); + } + + public boolean setCooldown(final Player player, final UUID playerUUID, final long duration, final boolean overwrite) { + return this.setCooldown(player, playerUUID, duration, overwrite, null); + } + + public boolean setCooldown(final Player player, final UUID playerUUID, final long duration, final boolean overwrite, final Predicate currentCooldownPredicate) { + TimerCooldown runnable = (duration > 0L) ? this.cooldowns.get(playerUUID) : this.clearCooldown(player, playerUUID); + if (runnable == null) { + Practice.getInstance().getServer().getPluginManager().callEvent(new TimerStartEvent(player, playerUUID, this, duration)); + runnable = new TimerCooldown(this, playerUUID, duration); + this.cooldowns.put(playerUUID, runnable); + return true; + } + final long remaining = runnable.getRemaining(); + if (!overwrite && remaining > 0L && duration <= remaining) { + return false; + } + final TimerExtendEvent event = new TimerExtendEvent(player, playerUUID, this, remaining, duration); + Practice.getInstance().getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; + } + boolean flag = true; + if (currentCooldownPredicate != null) { + flag = currentCooldownPredicate.test(remaining); + } + if (flag) { + runnable.setRemaining(duration); + } + return flag; + } + + public Map getCooldowns() { + return this.cooldowns; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/Timer.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/Timer.java new file mode 100644 index 0000000..44c50ae --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/Timer.java @@ -0,0 +1,23 @@ +package me.devkevin.practice.util.timer; + +public abstract class Timer { + protected final String name; + protected final long defaultCooldown; + + public Timer(final String name, final long defaultCooldown) { + this.name = name; + this.defaultCooldown = defaultCooldown; + } + + public final String getDisplayName() { + return this.name; + } + + public String getName() { + return this.name; + } + + public long getDefaultCooldown() { + return this.defaultCooldown; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/TimerCooldown.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/TimerCooldown.java new file mode 100644 index 0000000..3a6f2c7 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/TimerCooldown.java @@ -0,0 +1,102 @@ +package me.devkevin.practice.util.timer; + +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import me.devkevin.practice.Practice; +import me.devkevin.practice.util.timer.event.TimerExpireEvent; + +import java.util.UUID; + +public class TimerCooldown { + private final Timer timer; + private final UUID owner; + private BukkitTask eventNotificationTask; + private long expiryMillis; + private long pauseMillis; + + protected TimerCooldown(final Timer timer, final long duration) { + this.owner = null; + this.timer = timer; + this.setRemaining(duration); + } + + protected TimerCooldown(final Timer timer, final UUID playerUUID, final long duration) { + this.timer = timer; + this.owner = playerUUID; + this.setRemaining(duration); + } + + public long getRemaining() { + return this.getRemaining(false); + } + + protected void setRemaining(final long milliseconds) throws IllegalStateException { + if (milliseconds <= 0L) { + this.cancel(); + return; + } + final long expiryMillis = System.currentTimeMillis() + milliseconds; + if (expiryMillis != this.expiryMillis) { + this.expiryMillis = expiryMillis; + if (this.eventNotificationTask != null) { + this.eventNotificationTask.cancel(); + } + final long ticks = milliseconds / 50L; + this.eventNotificationTask = new BukkitRunnable() { + public void run() { + if (TimerCooldown.this.timer instanceof PlayerTimer && TimerCooldown.this.owner != null) { + ((PlayerTimer) TimerCooldown.this.timer).handleExpiry(Practice.getInstance().getServer().getPlayer(TimerCooldown.this.owner), TimerCooldown.this.owner); + } + Practice.getInstance().getServer().getPluginManager().callEvent(new TimerExpireEvent(TimerCooldown.this.owner, TimerCooldown.this.timer)); + } + }.runTaskLaterAsynchronously(JavaPlugin.getProvidingPlugin(this.getClass()), ticks); + } + } + + protected long getRemaining(final boolean ignorePaused) { + if (!ignorePaused && this.pauseMillis != 0L) { + return this.pauseMillis; + } + return this.expiryMillis - System.currentTimeMillis(); + } + + protected boolean isPaused() { + return this.pauseMillis != 0L; + } + + public void setPaused(final boolean paused) { + if (paused != this.isPaused()) { + if (paused) { + this.pauseMillis = this.getRemaining(true); + this.cancel(); + } else { + this.setRemaining(this.pauseMillis); + this.pauseMillis = 0L; + } + } + } + + protected void cancel() throws IllegalStateException { + if (this.eventNotificationTask != null) { + this.eventNotificationTask.cancel(); + this.eventNotificationTask = null; + } + } + + public Timer getTimer() { + return this.timer; + } + + public long getExpiryMillis() { + return this.expiryMillis; + } + + public long getPauseMillis() { + return this.pauseMillis; + } + + protected void setPauseMillis(final long pauseMillis) { + this.pauseMillis = pauseMillis; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/TimerManager.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/TimerManager.java new file mode 100644 index 0000000..0406aaf --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/TimerManager.java @@ -0,0 +1,98 @@ +package me.devkevin.practice.util.timer; + +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.LinkedHashSet; +import java.util.Set; + +public class TimerManager implements Listener { + private final Set timers; + private final JavaPlugin plugin; + + public TimerManager(final JavaPlugin plugin) { + this.timers = new LinkedHashSet(); + this.plugin = plugin; + } + + public void registerTimer(final Timer timer) { + this.timers.add(timer); + if (timer instanceof Listener) { + this.plugin.getServer().getPluginManager().registerEvents((Listener) timer, this.plugin); + } + } + + public void unregisterTimer(final Timer timer) { + this.timers.remove(timer); + } + + public T getTimer(final Class timerClass) { + for (final Timer timer : this.timers) { + if (timer.getClass().equals(timerClass)) { + return (T) timer; + } + } + return null; + } + + public JavaPlugin getPlugin() { + return this.plugin; + } + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + if (!(o instanceof TimerManager)) { + return false; + } + final TimerManager other = (TimerManager) o; + if (!other.canEqual(this)) { + return false; + } + final Object this$timers = this.getTimers(); + final Object other$timers = other.getTimers(); + Label_0065: + { + if (this$timers == null) { + if (other$timers == null) { + break Label_0065; + } + } else if (this$timers.equals(other$timers)) { + break Label_0065; + } + return false; + } + final Object this$plugin = this.getPlugin(); + final Object other$plugin = other.getPlugin(); + if (this$plugin == null) { + return other$plugin == null; + } else return this$plugin.equals(other$plugin); + } + + protected boolean canEqual(final Object other) { + return other instanceof TimerManager; + } + + @Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final Object $timers = this.getTimers(); + result = result * 59 + (($timers == null) ? 0 : $timers.hashCode()); + final Object $plugin = this.getPlugin(); + result = result * 59 + (($plugin == null) ? 0 : $plugin.hashCode()); + return result; + } + + @Override + public String toString() { + return "TimerManager(timers=" + this.getTimers() + ", plugin=" + this.getPlugin() + ")"; + } + + public Set getTimers() { + return this.timers; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerClearEvent.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerClearEvent.java new file mode 100644 index 0000000..a7defb2 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerClearEvent.java @@ -0,0 +1,63 @@ +package me.devkevin.practice.util.timer.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import me.devkevin.practice.Practice; +import me.devkevin.practice.util.timer.Timer; + +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +public class TimerClearEvent extends Event { + private static final HandlerList HANDLERS; + + static { + HANDLERS = new HandlerList(); + } + + private final Optional userUUID; + private final Timer timer; + private Optional player; + + public TimerClearEvent(final Timer timer) { + this.userUUID = Optional.empty(); + this.timer = timer; + } + + public TimerClearEvent(final UUID userUUID, final Timer timer) { + this.userUUID = Optional.of(userUUID); + this.timer = timer; + } + + public TimerClearEvent(final Player player, final Timer timer) { + Objects.requireNonNull(player); + this.player = Optional.of(player); + this.userUUID = Optional.of(player.getUniqueId()); + this.timer = timer; + } + + public static HandlerList getHandlerList() { + return TimerClearEvent.HANDLERS; + } + + public Optional getPlayer() { + if (this.player == null) { + this.player = (this.userUUID.isPresent() ? Optional.of(Practice.getInstance().getServer().getPlayer(this.userUUID.get())) : Optional.empty()); + } + return this.player; + } + + public Optional getUserUUID() { + return this.userUUID; + } + + public Timer getTimer() { + return this.timer; + } + + public HandlerList getHandlers() { + return TimerClearEvent.HANDLERS; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerExpireEvent.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerExpireEvent.java new file mode 100644 index 0000000..61b2411 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerExpireEvent.java @@ -0,0 +1,63 @@ +package me.devkevin.practice.util.timer.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import me.devkevin.practice.Practice; +import me.devkevin.practice.util.timer.Timer; + +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +public class TimerExpireEvent extends Event { + private static final HandlerList HANDLERS; + + static { + HANDLERS = new HandlerList(); + } + + private final Optional userUUID; + private final Timer timer; + private Optional player; + + public TimerExpireEvent(final Timer timer) { + this.userUUID = Optional.empty(); + this.timer = timer; + } + + public TimerExpireEvent(final UUID userUUID, final Timer timer) { + this.userUUID = Optional.ofNullable(userUUID); + this.timer = timer; + } + + public TimerExpireEvent(final Player player, final Timer timer) { + Objects.requireNonNull(player); + this.player = Optional.of(player); + this.userUUID = Optional.of(player.getUniqueId()); + this.timer = timer; + } + + public static HandlerList getHandlerList() { + return TimerExpireEvent.HANDLERS; + } + + public Optional getPlayer() { + if (this.player == null) { + this.player = (this.userUUID.isPresent() ? Optional.of(Practice.getInstance().getServer().getPlayer(this.userUUID.get())) : Optional.empty()); + } + return this.player; + } + + public Optional getUserUUID() { + return this.userUUID; + } + + public Timer getTimer() { + return this.timer; + } + + public HandlerList getHandlers() { + return TimerExpireEvent.HANDLERS; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerExtendEvent.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerExtendEvent.java new file mode 100644 index 0000000..dd77ca0 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerExtendEvent.java @@ -0,0 +1,82 @@ +package me.devkevin.practice.util.timer.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import me.devkevin.practice.util.timer.Timer; + +import javax.annotation.Nullable; +import java.util.Optional; +import java.util.UUID; + +public class TimerExtendEvent extends Event implements Cancellable { + private static final HandlerList HANDLERS; + + static { + HANDLERS = new HandlerList(); + } + + private final Optional player; + private final Optional userUUID; + private final Timer timer; + private final long previousDuration; + private boolean cancelled; + private long newDuration; + + public TimerExtendEvent(final Timer timer, final long previousDuration, final long newDuration) { + this.player = Optional.empty(); + this.userUUID = Optional.empty(); + this.timer = timer; + this.previousDuration = previousDuration; + this.newDuration = newDuration; + } + + public TimerExtendEvent(@Nullable final Player player, final UUID uniqueId, final Timer timer, final long previousDuration, final long newDuration) { + this.player = Optional.ofNullable(player); + this.userUUID = Optional.ofNullable(uniqueId); + this.timer = timer; + this.previousDuration = previousDuration; + this.newDuration = newDuration; + } + + public static HandlerList getHandlerList() { + return TimerExtendEvent.HANDLERS; + } + + public Optional getPlayer() { + return this.player; + } + + public Optional getUserUUID() { + return this.userUUID; + } + + public Timer getTimer() { + return this.timer; + } + + public long getPreviousDuration() { + return this.previousDuration; + } + + public long getNewDuration() { + return this.newDuration; + } + + public void setNewDuration(final long newDuration) { + this.newDuration = newDuration; + } + + public boolean isCancelled() { + return this.cancelled; + } + + public void setCancelled(final boolean cancelled) { + this.cancelled = cancelled; + } + + public HandlerList getHandlers() { + return TimerExtendEvent.HANDLERS; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerPauseEvent.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerPauseEvent.java new file mode 100644 index 0000000..8d5303a --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerPauseEvent.java @@ -0,0 +1,62 @@ +package me.devkevin.practice.util.timer.event; + +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import me.devkevin.practice.util.timer.Timer; + +import java.util.Optional; +import java.util.UUID; + +public class TimerPauseEvent extends Event implements Cancellable { + private static final HandlerList HANDLERS; + + static { + HANDLERS = new HandlerList(); + } + + private final boolean paused; + private final Optional userUUID; + private final Timer timer; + private boolean cancelled; + + public TimerPauseEvent(final Timer timer, final boolean paused) { + this.userUUID = Optional.empty(); + this.timer = timer; + this.paused = paused; + } + + public TimerPauseEvent(final UUID userUUID, final Timer timer, final boolean paused) { + this.userUUID = Optional.ofNullable(userUUID); + this.timer = timer; + this.paused = paused; + } + + public static HandlerList getHandlerList() { + return TimerPauseEvent.HANDLERS; + } + + public Optional getUserUUID() { + return this.userUUID; + } + + public Timer getTimer() { + return this.timer; + } + + public boolean isPaused() { + return this.paused; + } + + public HandlerList getHandlers() { + return TimerPauseEvent.HANDLERS; + } + + public boolean isCancelled() { + return this.cancelled; + } + + public void setCancelled(final boolean cancelled) { + this.cancelled = cancelled; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerStartEvent.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerStartEvent.java new file mode 100644 index 0000000..13c863d --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/event/TimerStartEvent.java @@ -0,0 +1,61 @@ +package me.devkevin.practice.util.timer.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import me.devkevin.practice.util.timer.Timer; + +import javax.annotation.Nullable; +import java.util.Optional; +import java.util.UUID; + +public class TimerStartEvent extends Event { + private static final HandlerList HANDLERS; + + static { + HANDLERS = new HandlerList(); + } + + private final Optional player; + private final Optional userUUID; + private final Timer timer; + private final long duration; + + public TimerStartEvent(final Timer timer, final long duration) { + this.player = Optional.empty(); + this.userUUID = Optional.empty(); + this.timer = timer; + this.duration = duration; + } + + public TimerStartEvent(@Nullable final Player player, final UUID uniqueId, final Timer timer, final long duration) { + this.player = Optional.ofNullable(player); + this.userUUID = Optional.ofNullable(uniqueId); + this.timer = timer; + this.duration = duration; + } + + public static HandlerList getHandlerList() { + return TimerStartEvent.HANDLERS; + } + + public Optional getPlayer() { + return this.player; + } + + public Optional getUserUUID() { + return this.userUUID; + } + + public Timer getTimer() { + return this.timer; + } + + public long getDuration() { + return this.duration; + } + + public HandlerList getHandlers() { + return TimerStartEvent.HANDLERS; + } +} diff --git a/dPractice/src/main/java/me/devkevin/practice/util/timer/impl/EnderpearlTimer.java b/dPractice/src/main/java/me/devkevin/practice/util/timer/impl/EnderpearlTimer.java new file mode 100644 index 0000000..977da56 --- /dev/null +++ b/dPractice/src/main/java/me/devkevin/practice/util/timer/impl/EnderpearlTimer.java @@ -0,0 +1,73 @@ +package me.devkevin.practice.util.timer.impl; + +import org.apache.commons.lang.time.DurationFormatUtils; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import me.devkevin.practice.util.timer.PlayerTimer; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class EnderpearlTimer extends PlayerTimer implements Listener { + public EnderpearlTimer() { + super("Enderpearl", TimeUnit.SECONDS.toMillis(15L)); + } + + @Override + protected void handleExpiry(final Player player, final UUID playerUUID) { + super.handleExpiry(player, playerUUID); + if (player == null) { + return; + } + player.sendMessage(ChatColor.RED + "(!) You can use Enderpearls again."); + } + + @EventHandler + public void onPlayerInteract(final PlayerInteractEvent event) { + if ((event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) || !event.hasItem()) { + return; + } + final Player player = event.getPlayer(); + if (event.getItem().getType() == Material.ENDER_PEARL) { + final long cooldown = this.getRemaining(player); + if (cooldown > 0L) { + event.setCancelled(true); + player.sendMessage(ChatColor.RED + "Enderpearl cooldown: " + ChatColor.GRAY + DurationFormatUtils.formatDurationWords(cooldown, true, true)); + player.updateInventory(); + } + } + } + + @EventHandler + public void onPearlLaunch(final ProjectileLaunchEvent event) { + if (event.getEntity().getShooter() instanceof Player && event.getEntity() instanceof EnderPearl) { + final Player player = (Player) event.getEntity().getShooter(); + this.setCooldown(player, player.getUniqueId()); + } + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerTeleportEvent(final PlayerTeleportEvent event) { + if (event.getCause() != PlayerTeleportEvent.TeleportCause.ENDER_PEARL) { + return; + } + final Player player = event.getPlayer(); + if (this.getRemaining(player) != 0L && event.isCancelled()) { + this.clearCooldown(player); + } + event.getTo().setX((double) event.getTo().getBlockX() + 0.5); + event.getTo().setZ((double) event.getTo().getBlockZ() + 0.5); + if (event.getTo().getBlock().getType() != Material.AIR) { + event.getTo().setY(event.getTo().getY() - (event.getTo().getY() - event.getTo().getBlockY())); + } + } +} diff --git a/dPractice/src/main/resources/plugin.yml b/dPractice/src/main/resources/plugin.yml new file mode 100644 index 0000000..f88602b --- /dev/null +++ b/dPractice/src/main/resources/plugin.yml @@ -0,0 +1,4 @@ +author: DevKevin +main: me.devkevin.practice.Practice +name: Practice +version: 1.0 diff --git a/dPractice/target/classes/me/devkevin/practice/CustomLocation.class b/dPractice/target/classes/me/devkevin/practice/CustomLocation.class new file mode 100644 index 0000000..4cdc921 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/CustomLocation.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/Practice.class b/dPractice/target/classes/me/devkevin/practice/Practice.class new file mode 100644 index 0000000..5f4a3fa Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/Practice.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/arena/Arena.class b/dPractice/target/classes/me/devkevin/practice/arena/Arena.class new file mode 100644 index 0000000..d57acf2 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/arena/Arena.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/arena/StandaloneArena.class b/dPractice/target/classes/me/devkevin/practice/arena/StandaloneArena.class new file mode 100644 index 0000000..3544f3b Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/arena/StandaloneArena.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/board/PracticeBoard$1.class b/dPractice/target/classes/me/devkevin/practice/board/PracticeBoard$1.class new file mode 100644 index 0000000..6eddd34 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/board/PracticeBoard$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/board/PracticeBoard.class b/dPractice/target/classes/me/devkevin/practice/board/PracticeBoard.class new file mode 100644 index 0000000..0b21ae8 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/board/PracticeBoard.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/cache/StatusCache.class b/dPractice/target/classes/me/devkevin/practice/cache/StatusCache.class new file mode 100644 index 0000000..e4e89c0 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/cache/StatusCache.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/FlyCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/FlyCommand.class new file mode 100644 index 0000000..ac5e087 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/FlyCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/InvCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/InvCommand.class new file mode 100644 index 0000000..ddba612 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/InvCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/PartyCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/PartyCommand.class new file mode 100644 index 0000000..87f072d Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/PartyCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/duel/AcceptCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/duel/AcceptCommand.class new file mode 100644 index 0000000..c0577f7 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/duel/AcceptCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/duel/DuelCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/duel/DuelCommand.class new file mode 100644 index 0000000..2e50ea3 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/duel/DuelCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/duel/SpectateCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/duel/SpectateCommand.class new file mode 100644 index 0000000..f933cf4 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/duel/SpectateCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/event/EventManagerCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/event/EventManagerCommand.class new file mode 100644 index 0000000..f31a294 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/event/EventManagerCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/event/HostCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/event/HostCommand.class new file mode 100644 index 0000000..1f1c8cf Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/event/HostCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/event/JoinEventCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/event/JoinEventCommand.class new file mode 100644 index 0000000..40e962a Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/event/JoinEventCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/event/LeaveEventCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/event/LeaveEventCommand.class new file mode 100644 index 0000000..cd372ae Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/event/LeaveEventCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/event/SpectateEventCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/event/SpectateEventCommand.class new file mode 100644 index 0000000..b0cbc10 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/event/SpectateEventCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/event/StatusEventCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/event/StatusEventCommand.class new file mode 100644 index 0000000..f4e2a5e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/event/StatusEventCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/management/ArenaCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/management/ArenaCommand.class new file mode 100644 index 0000000..0c9c903 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/management/ArenaCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/management/KitCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/management/KitCommand.class new file mode 100644 index 0000000..384ea7d Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/management/KitCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/management/ResetStatsCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/management/ResetStatsCommand.class new file mode 100644 index 0000000..c253c6c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/management/ResetStatsCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/management/SpawnsCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/management/SpawnsCommand.class new file mode 100644 index 0000000..386274f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/management/SpawnsCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/management/TournamentCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/management/TournamentCommand.class new file mode 100644 index 0000000..4e87c2c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/management/TournamentCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/time/DayCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/time/DayCommand.class new file mode 100644 index 0000000..05b1912 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/time/DayCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/time/NightCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/time/NightCommand.class new file mode 100644 index 0000000..ea3f76b Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/time/NightCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/time/SunsetCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/time/SunsetCommand.class new file mode 100644 index 0000000..81bb189 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/time/SunsetCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/toggle/SettingsCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/toggle/SettingsCommand.class new file mode 100644 index 0000000..98c1723 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/toggle/SettingsCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/commands/warp/WarpCommand.class b/dPractice/target/classes/me/devkevin/practice/commands/warp/WarpCommand.class new file mode 100644 index 0000000..2eaec82 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/commands/warp/WarpCommand.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/event/BaseEvent.class b/dPractice/target/classes/me/devkevin/practice/event/BaseEvent.class new file mode 100644 index 0000000..e30410d Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/event/BaseEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/event/EventStartEvent.class b/dPractice/target/classes/me/devkevin/practice/event/EventStartEvent.class new file mode 100644 index 0000000..e7e30a2 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/event/EventStartEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/event/PlayerDataRetrieveEvent.class b/dPractice/target/classes/me/devkevin/practice/event/PlayerDataRetrieveEvent.class new file mode 100644 index 0000000..7795f90 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/event/PlayerDataRetrieveEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/event/match/MatchEndEvent.class b/dPractice/target/classes/me/devkevin/practice/event/match/MatchEndEvent.class new file mode 100644 index 0000000..5709fec Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/event/match/MatchEndEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/event/match/MatchEvent.class b/dPractice/target/classes/me/devkevin/practice/event/match/MatchEvent.class new file mode 100644 index 0000000..21c9103 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/event/match/MatchEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/event/match/MatchStartEvent.class b/dPractice/target/classes/me/devkevin/practice/event/match/MatchStartEvent.class new file mode 100644 index 0000000..2ca3b8f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/event/match/MatchStartEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/EventCountdownTask.class b/dPractice/target/classes/me/devkevin/practice/events/EventCountdownTask.class new file mode 100644 index 0000000..78b3a23 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/EventCountdownTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/EventPlayer.class b/dPractice/target/classes/me/devkevin/practice/events/EventPlayer.class new file mode 100644 index 0000000..9ddee49 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/EventPlayer.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/EventState.class b/dPractice/target/classes/me/devkevin/practice/events/EventState.class new file mode 100644 index 0000000..ba455a6 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/EventState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/PracticeEvent.class b/dPractice/target/classes/me/devkevin/practice/events/PracticeEvent.class new file mode 100644 index 0000000..811114a Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/PracticeEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCCountdownTask.class b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCCountdownTask.class new file mode 100644 index 0000000..d5dcc67 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCCountdownTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$1.class b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$1.class new file mode 100644 index 0000000..11ed198 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$OITCGameTask.class b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$OITCGameTask.class new file mode 100644 index 0000000..9894f92 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$OITCGameTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$RespawnTask.class b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$RespawnTask.class new file mode 100644 index 0000000..fe8e621 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$RespawnTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$SortComparator.class b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$SortComparator.class new file mode 100644 index 0000000..43b1e83 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent$SortComparator.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent.class b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent.class new file mode 100644 index 0000000..cc76a6b Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCPlayer$OITCState.class b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCPlayer$OITCState.class new file mode 100644 index 0000000..e6d2215 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCPlayer$OITCState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCPlayer.class b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCPlayer.class new file mode 100644 index 0000000..5ed67d2 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/oitc/OITCPlayer.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourCountdownTask.class b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourCountdownTask.class new file mode 100644 index 0000000..e13ed8f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourCountdownTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent$ParkourGameTask.class b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent$ParkourGameTask.class new file mode 100644 index 0000000..c833117 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent$ParkourGameTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent$WaterCheckTask.class b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent$WaterCheckTask.class new file mode 100644 index 0000000..1058cb9 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent$WaterCheckTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent.class b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent.class new file mode 100644 index 0000000..7a8f4e2 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourPlayer$ParkourState.class b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourPlayer$ParkourState.class new file mode 100644 index 0000000..88e436a Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourPlayer$ParkourState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourPlayer.class b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourPlayer.class new file mode 100644 index 0000000..e5bfac1 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/parkour/ParkourPlayer.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverCountdownTask.class b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverCountdownTask.class new file mode 100644 index 0000000..d832dd9 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverCountdownTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$1.class b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$1.class new file mode 100644 index 0000000..c59d150 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$RedroverFightTask.class b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$RedroverFightTask.class new file mode 100644 index 0000000..402c130 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$RedroverFightTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$RedroverGameTask.class b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$RedroverGameTask.class new file mode 100644 index 0000000..b2866f9 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent$RedroverGameTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent.class b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent.class new file mode 100644 index 0000000..9b6096c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverPlayer$RedroverState.class b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverPlayer$RedroverState.class new file mode 100644 index 0000000..db6de0a Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverPlayer$RedroverState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverPlayer.class b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverPlayer.class new file mode 100644 index 0000000..d41dee5 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/redrover/RedroverPlayer.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoCountdownTask.class b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoCountdownTask.class new file mode 100644 index 0000000..61067f3 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoCountdownTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent$SumoFightTask.class b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent$SumoFightTask.class new file mode 100644 index 0000000..6eb2107 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent$SumoFightTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent$WaterCheckTask.class b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent$WaterCheckTask.class new file mode 100644 index 0000000..a7fba35 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent$WaterCheckTask.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent.class b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent.class new file mode 100644 index 0000000..7aea21c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoPlayer$SumoState.class b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoPlayer$SumoState.class new file mode 100644 index 0000000..7b7c8ec Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoPlayer$SumoState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoPlayer.class b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoPlayer.class new file mode 100644 index 0000000..3f43d00 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/events/sumo/SumoPlayer.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/ffa/FFAManager.class b/dPractice/target/classes/me/devkevin/practice/ffa/FFAManager.class new file mode 100644 index 0000000..8a3f831 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/ffa/FFAManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/KillStreak.class b/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/KillStreak.class new file mode 100644 index 0000000..72166fe Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/KillStreak.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/DebuffKillStreak.class b/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/DebuffKillStreak.class new file mode 100644 index 0000000..e22d21a Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/DebuffKillStreak.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/GappleKillStreak.class b/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/GappleKillStreak.class new file mode 100644 index 0000000..5a0d9ee Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/GappleKillStreak.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/GodAppleKillStreak.class b/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/GodAppleKillStreak.class new file mode 100644 index 0000000..e69ecdd Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/ffa/killstreak/impl/GodAppleKillStreak.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/file/Config.class b/dPractice/target/classes/me/devkevin/practice/file/Config.class new file mode 100644 index 0000000..4df96b3 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/file/Config.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/file/ConfigFile.class b/dPractice/target/classes/me/devkevin/practice/file/ConfigFile.class new file mode 100644 index 0000000..34d1a78 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/file/ConfigFile.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/handler/CustomMovementHandler.class b/dPractice/target/classes/me/devkevin/practice/handler/CustomMovementHandler.class new file mode 100644 index 0000000..1f80216 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/handler/CustomMovementHandler.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/inventory/InventorySnapshot$1.class b/dPractice/target/classes/me/devkevin/practice/inventory/InventorySnapshot$1.class new file mode 100644 index 0000000..c6d05cd Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/inventory/InventorySnapshot$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/inventory/InventorySnapshot.class b/dPractice/target/classes/me/devkevin/practice/inventory/InventorySnapshot.class new file mode 100644 index 0000000..a65b685 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/inventory/InventorySnapshot.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/kit/Kit.class b/dPractice/target/classes/me/devkevin/practice/kit/Kit.class new file mode 100644 index 0000000..972e668 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/kit/Kit.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/kit/PlayerKit.class b/dPractice/target/classes/me/devkevin/practice/kit/PlayerKit.class new file mode 100644 index 0000000..1afca86 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/kit/PlayerKit.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/leaderboards/LeaderBoardsManager.class b/dPractice/target/classes/me/devkevin/practice/leaderboards/LeaderBoardsManager.class new file mode 100644 index 0000000..9a1d3e5 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/leaderboards/LeaderBoardsManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/EnderpearlListener$1.class b/dPractice/target/classes/me/devkevin/practice/listeners/EnderpearlListener$1.class new file mode 100644 index 0000000..2e7ef63 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/EnderpearlListener$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/EnderpearlListener.class b/dPractice/target/classes/me/devkevin/practice/listeners/EnderpearlListener.class new file mode 100644 index 0000000..08734b0 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/EnderpearlListener.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/EntityListener$1.class b/dPractice/target/classes/me/devkevin/practice/listeners/EntityListener$1.class new file mode 100644 index 0000000..d8e1eca Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/EntityListener$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/EntityListener.class b/dPractice/target/classes/me/devkevin/practice/listeners/EntityListener.class new file mode 100644 index 0000000..39fc0aa Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/EntityListener.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/InventoryListener.class b/dPractice/target/classes/me/devkevin/practice/listeners/InventoryListener.class new file mode 100644 index 0000000..d1adf20 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/InventoryListener.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/MatchListener.class b/dPractice/target/classes/me/devkevin/practice/listeners/MatchListener.class new file mode 100644 index 0000000..ac65f05 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/MatchListener.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/PlayerListener$1.class b/dPractice/target/classes/me/devkevin/practice/listeners/PlayerListener$1.class new file mode 100644 index 0000000..0bf0de0 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/PlayerListener$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/PlayerListener.class b/dPractice/target/classes/me/devkevin/practice/listeners/PlayerListener.class new file mode 100644 index 0000000..b61e062 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/PlayerListener.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/listeners/WorldListener.class b/dPractice/target/classes/me/devkevin/practice/listeners/WorldListener.class new file mode 100644 index 0000000..1c348ab Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/listeners/WorldListener.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager$1$1.class b/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager$1$1.class new file mode 100644 index 0000000..48c2055 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager$1$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager$1.class b/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager$1.class new file mode 100644 index 0000000..e7077a2 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager.class b/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager.class new file mode 100644 index 0000000..bfebb5e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/ArenaManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/ChunkManager.class b/dPractice/target/classes/me/devkevin/practice/managers/ChunkManager.class new file mode 100644 index 0000000..05a67cd Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/ChunkManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/EditorManager.class b/dPractice/target/classes/me/devkevin/practice/managers/EditorManager.class new file mode 100644 index 0000000..e2f2837 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/EditorManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/EventManager.class b/dPractice/target/classes/me/devkevin/practice/managers/EventManager.class new file mode 100644 index 0000000..ae02657 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/EventManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$1.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$1.class new file mode 100644 index 0000000..4242f8c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$10.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$10.class new file mode 100644 index 0000000..35393c5 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$10.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$11.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$11.class new file mode 100644 index 0000000..d14a187 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$11.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$12.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$12.class new file mode 100644 index 0000000..b3db1bc Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$12.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$1.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$1.class new file mode 100644 index 0000000..7bbee57 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$2.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$2.class new file mode 100644 index 0000000..9322738 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$2.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$3.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$3.class new file mode 100644 index 0000000..116d808 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13$3.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13.class new file mode 100644 index 0000000..e1a11d6 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$13.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$14.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$14.class new file mode 100644 index 0000000..cb33a2d Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$14.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$15.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$15.class new file mode 100644 index 0000000..22d4488 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$15.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$16.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$16.class new file mode 100644 index 0000000..19275a9 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$16.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$2.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$2.class new file mode 100644 index 0000000..679a69c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$2.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$3.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$3.class new file mode 100644 index 0000000..4978e06 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$3.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$4.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$4.class new file mode 100644 index 0000000..e1255ba Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$4.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$5.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$5.class new file mode 100644 index 0000000..89a13fb Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$5.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$6.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$6.class new file mode 100644 index 0000000..d973926 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$6.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$7.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$7.class new file mode 100644 index 0000000..f64a602 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$7.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$8.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$8.class new file mode 100644 index 0000000..d16a06e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$8.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$9.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$9.class new file mode 100644 index 0000000..a19467a Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager$9.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager.class b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager.class new file mode 100644 index 0000000..c4cf05c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/InventoryManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/ItemManager.class b/dPractice/target/classes/me/devkevin/practice/managers/ItemManager.class new file mode 100644 index 0000000..044b3b4 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/ItemManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/KitManager.class b/dPractice/target/classes/me/devkevin/practice/managers/KitManager.class new file mode 100644 index 0000000..61bfc85 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/KitManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/MatchManager.class b/dPractice/target/classes/me/devkevin/practice/managers/MatchManager.class new file mode 100644 index 0000000..8153b6e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/MatchManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/PartyManager$1.class b/dPractice/target/classes/me/devkevin/practice/managers/PartyManager$1.class new file mode 100644 index 0000000..5862067 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/PartyManager$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/PartyManager.class b/dPractice/target/classes/me/devkevin/practice/managers/PartyManager.class new file mode 100644 index 0000000..bbdc71f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/PartyManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/PlayerManager.class b/dPractice/target/classes/me/devkevin/practice/managers/PlayerManager.class new file mode 100644 index 0000000..cb1ebd5 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/PlayerManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/QueueManager.class b/dPractice/target/classes/me/devkevin/practice/managers/QueueManager.class new file mode 100644 index 0000000..973ccef Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/QueueManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/SpawnManager.class b/dPractice/target/classes/me/devkevin/practice/managers/SpawnManager.class new file mode 100644 index 0000000..c52281d Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/SpawnManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/managers/TournamentManager.class b/dPractice/target/classes/me/devkevin/practice/managers/TournamentManager.class new file mode 100644 index 0000000..2388f57 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/managers/TournamentManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/match/Match.class b/dPractice/target/classes/me/devkevin/practice/match/Match.class new file mode 100644 index 0000000..16c28a0 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/match/Match.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/match/MatchRequest.class b/dPractice/target/classes/me/devkevin/practice/match/MatchRequest.class new file mode 100644 index 0000000..2a683d5 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/match/MatchRequest.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/match/MatchState.class b/dPractice/target/classes/me/devkevin/practice/match/MatchState.class new file mode 100644 index 0000000..b3bd671 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/match/MatchState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/match/MatchTeam.class b/dPractice/target/classes/me/devkevin/practice/match/MatchTeam.class new file mode 100644 index 0000000..5c50f9c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/match/MatchTeam.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/party/Party.class b/dPractice/target/classes/me/devkevin/practice/party/Party.class new file mode 100644 index 0000000..362c956 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/party/Party.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/player/OfflinePlayerData.class b/dPractice/target/classes/me/devkevin/practice/player/OfflinePlayerData.class new file mode 100644 index 0000000..ca1c291 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/player/OfflinePlayerData.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/player/PlayerData.class b/dPractice/target/classes/me/devkevin/practice/player/PlayerData.class new file mode 100644 index 0000000..82e87b7 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/player/PlayerData.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/player/PlayerState.class b/dPractice/target/classes/me/devkevin/practice/player/PlayerState.class new file mode 100644 index 0000000..fab8b29 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/player/PlayerState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/queue/QueueEntry.class b/dPractice/target/classes/me/devkevin/practice/queue/QueueEntry.class new file mode 100644 index 0000000..a8791b6 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/queue/QueueEntry.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/queue/QueueType.class b/dPractice/target/classes/me/devkevin/practice/queue/QueueType.class new file mode 100644 index 0000000..9aa07bc Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/queue/QueueType.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/ArenaCommandRunnable$1.class b/dPractice/target/classes/me/devkevin/practice/runnable/ArenaCommandRunnable$1.class new file mode 100644 index 0000000..6beedd1 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/ArenaCommandRunnable$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/ArenaCommandRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/ArenaCommandRunnable.class new file mode 100644 index 0000000..45a3d00 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/ArenaCommandRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/BlockPlaceRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/BlockPlaceRunnable.class new file mode 100644 index 0000000..8374d92 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/BlockPlaceRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/DuplicateArenaRunnable$1.class b/dPractice/target/classes/me/devkevin/practice/runnable/DuplicateArenaRunnable$1.class new file mode 100644 index 0000000..2e772b7 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/DuplicateArenaRunnable$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/DuplicateArenaRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/DuplicateArenaRunnable.class new file mode 100644 index 0000000..efc3d7e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/DuplicateArenaRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/ExpBarRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/ExpBarRunnable.class new file mode 100644 index 0000000..2dccfc2 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/ExpBarRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/ItemDespawnRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/ItemDespawnRunnable.class new file mode 100644 index 0000000..def2ae2 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/ItemDespawnRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/MatchResetRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/MatchResetRunnable.class new file mode 100644 index 0000000..43e424e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/MatchResetRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/MatchRunnable$1.class b/dPractice/target/classes/me/devkevin/practice/runnable/MatchRunnable$1.class new file mode 100644 index 0000000..a3576ff Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/MatchRunnable$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/MatchRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/MatchRunnable.class new file mode 100644 index 0000000..626c173 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/MatchRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/RematchRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/RematchRunnable.class new file mode 100644 index 0000000..0ed2f39 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/RematchRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/SaveDataRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/SaveDataRunnable.class new file mode 100644 index 0000000..133b9ef Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/SaveDataRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/runnable/TournamentRunnable.class b/dPractice/target/classes/me/devkevin/practice/runnable/TournamentRunnable.class new file mode 100644 index 0000000..655af50 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/runnable/TournamentRunnable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/settings/ProfileOptions.class b/dPractice/target/classes/me/devkevin/practice/settings/ProfileOptions.class new file mode 100644 index 0000000..7d1f8fc Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/settings/ProfileOptions.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/settings/ProfileOptionsListeners.class b/dPractice/target/classes/me/devkevin/practice/settings/ProfileOptionsListeners.class new file mode 100644 index 0000000..8424e05 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/settings/ProfileOptionsListeners.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/settings/item/ProfileOptionsItem.class b/dPractice/target/classes/me/devkevin/practice/settings/item/ProfileOptionsItem.class new file mode 100644 index 0000000..db2186f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/settings/item/ProfileOptionsItem.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/settings/item/ProfileOptionsItemState.class b/dPractice/target/classes/me/devkevin/practice/settings/item/ProfileOptionsItemState.class new file mode 100644 index 0000000..4a153a3 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/settings/item/ProfileOptionsItemState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/team/KillableTeam.class b/dPractice/target/classes/me/devkevin/practice/team/KillableTeam.class new file mode 100644 index 0000000..5732d1e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/team/KillableTeam.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/tournament/Tournament.class b/dPractice/target/classes/me/devkevin/practice/tournament/Tournament.class new file mode 100644 index 0000000..23c5167 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/tournament/Tournament.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/tournament/TournamentState.class b/dPractice/target/classes/me/devkevin/practice/tournament/TournamentState.class new file mode 100644 index 0000000..2d4bc7d Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/tournament/TournamentState.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/tournament/TournamentTeam.class b/dPractice/target/classes/me/devkevin/practice/tournament/TournamentTeam.class new file mode 100644 index 0000000..ad1f3f4 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/tournament/TournamentTeam.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/BlockUtil.class b/dPractice/target/classes/me/devkevin/practice/util/BlockUtil.class new file mode 100644 index 0000000..8f77b37 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/BlockUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/CC.class b/dPractice/target/classes/me/devkevin/practice/util/CC.class new file mode 100644 index 0000000..b846c4a Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/CC.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/Clickable.class b/dPractice/target/classes/me/devkevin/practice/util/Clickable.class new file mode 100644 index 0000000..8601f3e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/Clickable.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/Color.class b/dPractice/target/classes/me/devkevin/practice/util/Color.class new file mode 100644 index 0000000..a5ba881 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/Color.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/DateUtil.class b/dPractice/target/classes/me/devkevin/practice/util/DateUtil.class new file mode 100644 index 0000000..6ae464d Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/DateUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/EloUtil.class b/dPractice/target/classes/me/devkevin/practice/util/EloUtil.class new file mode 100644 index 0000000..6605dc9 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/EloUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/ItemBuilder.class b/dPractice/target/classes/me/devkevin/practice/util/ItemBuilder.class new file mode 100644 index 0000000..1fc1ea8 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/ItemBuilder.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$1.class b/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$1.class new file mode 100644 index 0000000..14b8b50 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$ItemEnchant.class b/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$ItemEnchant.class new file mode 100644 index 0000000..a162384 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$ItemEnchant.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$ReloreType.class b/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$ReloreType.class new file mode 100644 index 0000000..2fa9a31 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/ItemUtil$ReloreType.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/ItemUtil.class b/dPractice/target/classes/me/devkevin/practice/util/ItemUtil.class new file mode 100644 index 0000000..8a65bee Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/ItemUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/KFactor.class b/dPractice/target/classes/me/devkevin/practice/util/KFactor.class new file mode 100644 index 0000000..9b8a495 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/KFactor.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/MathUtil.class b/dPractice/target/classes/me/devkevin/practice/util/MathUtil.class new file mode 100644 index 0000000..2f31a92 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/MathUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/PlayerUtil$1.class b/dPractice/target/classes/me/devkevin/practice/util/PlayerUtil$1.class new file mode 100644 index 0000000..911145f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/PlayerUtil$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/PlayerUtil.class b/dPractice/target/classes/me/devkevin/practice/util/PlayerUtil.class new file mode 100644 index 0000000..a9045a1 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/PlayerUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/StringUtil.class b/dPractice/target/classes/me/devkevin/practice/util/StringUtil.class new file mode 100644 index 0000000..ffb1e10 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/StringUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/TeamUtil.class b/dPractice/target/classes/me/devkevin/practice/util/TeamUtil.class new file mode 100644 index 0000000..ddddea9 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/TeamUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/TimeUtil.class b/dPractice/target/classes/me/devkevin/practice/util/TimeUtil.class new file mode 100644 index 0000000..f5f8b43 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/TimeUtil.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/TtlHandler.class b/dPractice/target/classes/me/devkevin/practice/util/TtlHandler.class new file mode 100644 index 0000000..a4cee50 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/TtlHandler.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/TtlHashMap.class b/dPractice/target/classes/me/devkevin/practice/util/TtlHashMap.class new file mode 100644 index 0000000..fd9c70e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/TtlHashMap.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$1.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$1.class new file mode 100644 index 0000000..6f15724 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$2.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$2.class new file mode 100644 index 0000000..c0b634c Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$2.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$AbstractClickableItem.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$AbstractClickableItem.class new file mode 100644 index 0000000..58cd737 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$AbstractClickableItem.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$ClickableItem.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$ClickableItem.class new file mode 100644 index 0000000..c98a39a Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$ClickableItem.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$EmptyClickableItem.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$EmptyClickableItem.class new file mode 100644 index 0000000..e44c432 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$EmptyClickableItem.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$Inventory2D.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$Inventory2D.class new file mode 100644 index 0000000..b9f2c1f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$Inventory2D.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$InventoryUIHolder.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$InventoryUIHolder.class new file mode 100644 index 0000000..bddda22 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI$InventoryUIHolder.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI.class new file mode 100644 index 0000000..d867501 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/InventoryUI.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/UIListener.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/UIListener.class new file mode 100644 index 0000000..9e9f34f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/UIListener.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/inventory/UtilItem.class b/dPractice/target/classes/me/devkevin/practice/util/inventory/UtilItem.class new file mode 100644 index 0000000..8e0bc64 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/inventory/UtilItem.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/PlayerTimer.class b/dPractice/target/classes/me/devkevin/practice/util/timer/PlayerTimer.class new file mode 100644 index 0000000..51802cb Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/PlayerTimer.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/Timer.class b/dPractice/target/classes/me/devkevin/practice/util/timer/Timer.class new file mode 100644 index 0000000..8ff0c4e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/Timer.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/TimerCooldown$1.class b/dPractice/target/classes/me/devkevin/practice/util/timer/TimerCooldown$1.class new file mode 100644 index 0000000..a54da5b Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/TimerCooldown$1.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/TimerCooldown.class b/dPractice/target/classes/me/devkevin/practice/util/timer/TimerCooldown.class new file mode 100644 index 0000000..42523c6 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/TimerCooldown.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/TimerManager.class b/dPractice/target/classes/me/devkevin/practice/util/timer/TimerManager.class new file mode 100644 index 0000000..91be5f8 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/TimerManager.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerClearEvent.class b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerClearEvent.class new file mode 100644 index 0000000..3f814bb Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerClearEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerExpireEvent.class b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerExpireEvent.class new file mode 100644 index 0000000..7e4c91f Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerExpireEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerExtendEvent.class b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerExtendEvent.class new file mode 100644 index 0000000..804ab9e Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerExtendEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerPauseEvent.class b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerPauseEvent.class new file mode 100644 index 0000000..7813929 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerPauseEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerStartEvent.class b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerStartEvent.class new file mode 100644 index 0000000..921ff39 Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/event/TimerStartEvent.class differ diff --git a/dPractice/target/classes/me/devkevin/practice/util/timer/impl/EnderpearlTimer.class b/dPractice/target/classes/me/devkevin/practice/util/timer/impl/EnderpearlTimer.class new file mode 100644 index 0000000..7c347ab Binary files /dev/null and b/dPractice/target/classes/me/devkevin/practice/util/timer/impl/EnderpearlTimer.class differ diff --git a/dPractice/target/classes/plugin.yml b/dPractice/target/classes/plugin.yml new file mode 100644 index 0000000..f88602b --- /dev/null +++ b/dPractice/target/classes/plugin.yml @@ -0,0 +1,4 @@ +author: DevKevin +main: me.devkevin.practice.Practice +name: Practice +version: 1.0